AnyEvent::IRCを試す
IRCでbot動かすために使えるモジュールをざっと調べてみたところ、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試すのはできたので、続きは今度。