root/lang/perl/tiarra/trunk/module/Auto/Answer.pm @ 36774

Revision 36774, 3.4 kB (checked in by drry, 3 years ago)

恐らく誤植を修正。
ほか。

  • Property svn:mime-type set to text/x-perl; charset=UTF-8
  • Property svn:eol-style set to LF
  • Property svn:keywords set to Id URL Date Rev Author
Line 
1# -----------------------------------------------------------------------------
2# $Id$
3# -----------------------------------------------------------------------------
4package Auto::Answer;
5use strict;
6use warnings;
7use base qw(Module);
8use Module::Use qw(Auto::Utils);
9use Auto::Utils;
10use Mask;
11use Multicast;
12
13sub as_boolean
14{
15  my $val = shift;
16  if( $val && $val =~ /^(off|no|false)/i )
17  {
18    $val = 0;
19  }
20  $val;
21}
22
23sub message_arrived {
24  my ($this,$msg,$sender) = @_;
25  my @result = ($msg);
26
27  # PRIVMSG 以外は無視.
28  if( $msg->command ne 'PRIVMSG' )
29  {
30    return @result;
31  }
32
33  # サーバーから以外(自分の発言)は,
34  # 設定がなければ無視.
35  if( !$sender->isa('IrcIO::Server') )
36  {
37    if( !as_boolean( $this->config->answer_to_myself() ) )
38    {
39      return @result;
40    }
41  }
42
43      my ($get_ch_name,undef,undef,$reply_anywhere)
44        = Auto::Utils::generate_reply_closures($msg,$sender,\@result);
45      my $msgval = $msg->param(1);
46      my $msg_ch_full = Auto::Utils::get_full_ch_name($msg, 0);
47
48      # replyに設定されたものの中から、一致しているものがあれば発言。
49      # 一致にはMask::matchを用いる。
50      foreach ($this->config->reply('all')) {
51        my ($mask,$reply_msg) = m/^(.+?)\s+(.+)$/;
52        if (Mask::match($mask,$msgval)) {
53          # 一致していた。
54          $reply_anywhere->($reply_msg);
55        }
56      }
57
58      # channel-reply のチェック。
59      foreach ($this->config->channel_reply('all')) {
60        my ($chan_mask, $msg_mask, $reply_msg) = split(' ', $_, 3);
61        $chan_mask =~ s/\[([^\]]*)\]$//;
62        my @opts = split(/,/,$1||'');
63
64        defined($reply_msg) or next;
65        if( !Mask::match($msg_mask,$msgval) )
66        {
67          # メッセージがマッチしない.
68          next;
69        }
70        if( !Mask::match($chan_mask,$msg_ch_full)) {
71          # チャンネルがマッチしない.
72          next;
73        }
74        # マッチしたのでお返事.
75        $reply_anywhere->($reply_msg);
76
77        # [last] 指定があればここでおしまい.
78        if( grep{$_ eq 'last'} @opts )
79        {
80          last;
81        }
82      }
83
84  return @result;
85}
86
871;
88
89=pod
90info: 特定の発言に反応して対応する発言をする。
91default: off
92
93# Auto::Aliasを有効にしていれば、エイリアス置換を行ないます。
94
95# 反応する発言と、それに対する返事を定義します。
96# エイリアス置換が有効です。#(nick.now)と#(channel)はそれぞれ
97# 相手の現在のnickとチャンネル名に置換されます。
98#
99# コマンド: reply
100# 書式: <反応する発言のマスク> <それに対する返事>
101# 例:
102-reply: こんにちは* こんにちは、#(name|nick.now)さん。
103# この例では誰かが「こんにちは」で始まる発言をすると、
104# 発言した人のエイリアスを参照して「こんにちは、○○さん。」のように発言します。
105#
106# コマンド: channel-reply
107# 書式: <反応するチャンネルのマスク> <反応する発言のマスク> <それに対する返事>
108# 例:
109-channel-reply: #あいさつ@ircnet こんにちは* こんにちは、#(name|nick.now)さん。
110# この例では#あいさつ@ircnetで誰かが「こんにちは」で始まる発言をすると、
111# 発言した人のエイリアスを参照して「こんにちは、○○さん。」のように発言します。
112#
113# コマンド: answer-to-myself
114# 書式: <真偽値>
115# 例:
116-answer-to-myself: on
117# 自分の発言にも反応するようになります。
118# デフォルトは off です。
119
120=cut
Note: See TracBrowser for help on using the browser.