キーワードに反応しシェルコマンドを実行するだけのTiarra用モジュール(Auto::RunCMD)
職場の業務連絡にはIRCを使用していますが、特定のキーワード(例えば名前やシステムの障害通知)が流れた際に、シェルスクリプトをキックして自動処理させるためのIRC Proxy Tiarra用モジュールを用意しました。
今回は面白法人カヤックさんのAuto::IMモジュールをひな形に、ごにょっとさせていただきました。ありがとうございます。
RunCMD.pm
tiarraを格納したディレクトリのmodule/Auto以下に保存します。
# ----------------------------------------------------------------------------- # $Id$ # ----------------------------------------------------------------------------- package Auto::RunCMD; use strict; use warnings; use base qw(Module); use Module::Use qw(Auto::AliasDB Auto::Utils); use Auto::AliasDB; use Auto::Utils; sub new { my ($class) = shift; my $this = $class->SUPER::new(@_); $this->config_reload(undef); return $this; } sub config_reload { my ($this, $old_config) = @_; my $regex = join '|', ( (map { "(?:$_)" } $this->config->regex_keyword('all')), (map { "(?i:\Q$_\E)" } map { split /,/ } $this->config->keyword('all')), ); eval { $this->{regex} = qr/$regex/; }; if ($@) { $this->_runloop->notify_error($@); } return $this; } sub message_arrived { my ($this,$msg,$sender) = @_; my @result = ($msg); # サーバーからのメッセージか? if ($sender->isa('IrcIO::Server')) { # PRIVMSGか? if ($msg->command eq 'PRIVMSG') { my $text = $msg->param(1); my $full_ch_name = $msg->param(0); if ($text =~ $this->{regex} && Mask::match_deep_chan( [Mask::array_or_all_chan($this->config->mask('all'))], $msg->prefix,$full_ch_name)) { my $run_command = system $this->config->command; } } } return @result; } 1; =pod info: 特定のキーワードが呼ばれると、指定のシェルコマンドを実行する。 default: off # 反応する人のマスクを指定します。 # 省略すると全員に反応します。 mask: * *!*@* # 反応するキーワードを正規表現で指定します。 # 複数指定したい時は複数行指定してください。 -regex-keyword: (?i:fugahoge) # 反応するキーワードを指定します。 # 複数指定したい時は,(コンマ)で区切るか、複数行指定してください。 keyword: hoge keyword: 日本語,テスト # 実行するシェルコマンドを指定します。 # コマンドは、ワンライナーで記述し、()で綴じてください。 # キーワードにマッチする度に何度でも実行されるので、困る場合は # スクリプトをキックするようにして、そちら側で制御してください。 command: (echo hogehoge >> /tmp/hoge.txt) =cut
tiarra.conf
下記を追記します。
+ Auto::RunCMD { # 特定のキーワードが呼ばれると、指定のシェルコマンドを実行する # 反応する人のマスクを指定します。 # 省略すると全員に反応します。 mask: * *!*@* # 反応するキーワードを正規表現で指定します。 # 複数指定したい時は複数行指定してください。 -regex-keyword: (?i:fugahoge) # 反応するキーワードを指定します。 # 複数指定したい時は,(コンマ)で区切るか、複数行指定してください。 keyword: hoge keyword: 日本語,テスト # 実行するシェルコマンドを指定します。 # コマンドは、ワンライナーで記述し、()で綴じてください。 # キーワードにマッチする度に何度でも実行されるので、困る場合は # スクリプトをキックするようにして、そちら側で制御してください。 command: (echo hogehoge >> /tmp/hoge.txt) }
以上