特定のキーワードをim.kayac.comに通知するZNCモジュール書いた

IRCで自分の名前が呼ばれたときとかにiPhoneに通知してくれるようなやつ、いわゆるhilight2im的なもの。を、ZNCのモジュールとして作った。IRC Bouncer上で動かしておけば、weechatなどのクライアントからの接続が無い状態でも通知してくれるので便利。

使い方

NotifyImkayac.pm~/.znc/modules/以下に配置。clientからzncにコマンドを送って

/msg *status LoadMod NotifyImkayac username=sugyan keyword=sugyan,すぎゃーん

のように読み込ませるか、~/.znc/configs/znc.confなどの設定ファイル上で

<User hoge>
    ...
    LoadModule = NotifyImkayac username=sugyan keyword=sugyan,すぎゃーん
    ...
</User>

のように書いておいて読み込ませる。
引数で"username", "type", "password", "secret_key"などを指定することでim.kayac.comへの通知に使うパラメータを設定。"keyword"の指定はカンマ区切り、複数あればそれぞれマッチを試みて一つでもマッチすれば通知する。

ZNCのモジュールをPerlで使う

ドキュメントはこちら。 http://wiki.znc.in/Modperl
global moduleのmodeperlを使う必要がある。yumでzncを入れた場合にはznc-modperlを追加でインストールすれば使えるようになるはず。

ZNCのモジュールをPerlで書く
pakcage Hoge;
use base 'ZNC::Module';

sub description {
    "Example perl module for ZNC"
}

sub OnChanMsg {
    my $self = shift;
    my ($nick, $chan, $msg) = @_;
    ...
    return $ZNC::CONTINUE;
}

1;

のような形で書けるらしい。中身を詳しく知りたければソースのmodules/modperl/ZNC.pmmodules/modperl/startup.plなどを参照すれば大体わかると思う。C++用のAPIに揃えてあるようなのでそちらを見ると良い。

ちなみに通知モジュールとしてnotifoなどに通知できるC++モジュールは既に存在している。結構参考にした。

Perlモジュールの例はあまり探してない。

無駄にハマった話

yumでinstallした場合はsystem perlを使うことになるので別のモジュールに依存する場合はsystem perlにモジュールをインストールしていかないといけない。自分はそれがイヤだったのでperlbrewでインストールしたperlを使えるように、zncを自前でビルドすることにした。

$ mkdir ~/temp
$ cd ~/temp
$ wget http://znc.in/releases/znc-0.204.tar.gz
$ tar zxvf znc-0.204.tar.gz
$ cd znc-0.204
$ ./configure --prefix=$HOME/local --enable-perl
$ make

するとこける。

/usr/bin/ld: /home/sugyan/perl5/perlbrew/perls/perl-5.14.2/lib/5.14.2/x86_64-linux/CORE/libperl.a(op.o): relocation R_X86_64_32S against `PL_sv_yes' can not be used when making a shared object; recompile with -fPIC
/home/sugyan/perl5/perlbrew/perls/perl-5.14.2/lib/5.14.2/x86_64-linux/CORE/libperl.a: could not read symbols: Bad value

ググると色々出てくる。

mod_perlを使うために"-fPIC"オプションを追加してperlをビルドしなおす必要がありそう…

$ perlbrew install --as perl-5.14.2-fPIC -Accflags='-fPIC' perl-5.14.2

のような形で別のperlとしてビルド。。オプションの指定の仕方はよく分かっていない。
とりあえずコレを使うことでmod_perlも使えるzncをビルドできた。
素直にsystem perlにモジュール入れるとかlocal::libを上手く使うとかすれば良かったのかもしれない…。