職場の業務連絡には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)
=cuttiarra.conf
下記を追記します。
+ Auto::RunCMD {
# 特定のキーワードが呼ばれると、指定のシェルコマンドを実行する
# 反応する人のマスクを指定します。
# 省略すると全員に反応します。
mask: * *!*@*
# 反応するキーワードを正規表現で指定します。
# 複数指定したい時は複数行指定してください。
-regex-keyword: (?i:fugahoge)
# 反応するキーワードを指定します。
# 複数指定したい時は,(コンマ)で区切るか、複数行指定してください。
keyword: hoge
keyword: 日本語,テスト
# 実行するシェルコマンドを指定します。
# コマンドは、ワンライナーで記述し、()で綴じてください。
# キーワードにマッチする度に何度でも実行されるので、困る場合は
# スクリプトをキックするようにして、そちら側で制御してください。
command: (echo hogehoge >> /tmp/hoge.txt)
}以上