AnyEvent::IRCを試す

IRCbot動かすために使えるモジュールをざっと調べてみたところ、Net::IRC, Bot::BasicBot, POE::Component::IRC, AnyEvent::IRC::Clientあたりが使えそう。

時代はAnyEventってことで、AnyEvent::IRC::Clientを使ってnickname++したら、その数を覚えておいてIRCにPOSTしてくれるスクリプトを書いてみました(++, --の機能はKarmaっていうらしい)

use AnyEvent;
use AnyEvent::IRC::Client;

my %karma; 

my $cv = AnyEvent->condvar;
my $irc = AnyEvent::IRC::Client->new;
$irc->reg_cb(
    connect => sub {
        my ($irc, $err) = @_;
        if (defined $err) {
            warn "connect error: $err\n";
            $cv->send;
        }
    },
    publicmsg => sub {
        my ($irc, $channel, $ircmsg) = @_;
        my $msg = $ircmsg->{params}[1];

        if ($msg =~ m/^(\w+)(\+{2}|\-{2})/) {
            _karma($irc, $channel, $1, $2);
        }
    },
);

$irc->connect("irc.example.net", 6667, { nick => 'testbot'} );
$irc->send_srv("JOIN", '#test-channe,');
$cv->recv;
$irc->disconnect;

sub _karma {
    my ($irc, $channel, $nick, $ope) = @_;

    $karma{$channel}{$nick}++ if ($ope eq '++');
    $karma{$channel}{$nick}-- if ($ope eq '--');

    my $msg = sprintf "$nick:%d", $karma{$channel}{$nick};
    $irc->send_chan($channel, 'PRIVMSG', $channel, $msg);
}

scriptが落ちたらリセットされてしまうので、Storableとかも組み込みたいがひとまずAnyEvent::IRC試すのはできたので、続きは今度。