AnyEventでirssiプラグインを書く

AnyEvent はその名の通りさまざまなイベントインタフェースに対応していて、その中に irssi が使用している Glib も含まれているため、irssiのプラグインの中で普通に AnyEvent を使用することができます。

キーワード反応を im.kayac.com で自分の IM に通知する higlith2im.pl プラグインを AnyEvent を使用するように書き換えたのが以下です。

use strict;
use warnings;

use Glib;

use Irssi;
use AnyEvent::HTTP;

use HTTP::Request::Common;

our $VERSION = '0.1';

our %IRSSI = (
    name        => 'hilight2im',
    description => 'notify hilight message to IM via im.kayac.com api',
    authors     => 'Daisuke Murase',
);

sub sig_printtext {
    my ($dest, $text, $stripped) = @_;

    if ( $dest->{level} & MSGLEVEL_HILIGHT ) {
        my $user = Irssi::settings_get_str('im_kayac_com_username') or return;
        my $msg  = sprintf('[irssi] %s', $stripped);

        my $req = POST "http://im.kayac.com/api/post/$user", [ message => $msg ];
        my %headers = map { $_ => $req->header($_), } $req->headers->header_field_names;

        my $r;
        $r = http_post $req->uri, $req->content, headers => \%headers, sub { undef $r };
    }
}

Irssi::signal_add('print text' => \&sig_printtext);
Irssi::settings_add_str('im_kayac_com', 'im_kayac_com_username', '');

fork する必要がなくなってシンプルですね!

...とおもいきや現状の AnyEvent::HTTP はなんと HTTP::Request オブジェクトからのリクエスト送信に対応していないため、自分ですべてのリクエストを組み立てる必要があるようです。これは不便。。

ですが、irssi の中で普通に AnyEvent を使うことができるのはなかなか便利です。お試しあれ!

AnyEvent 版は github にあげた。

by typester / at 2009-07-13T23:30:00 / perl · irssi / Comments(0)