かの有名なsugyanの全裸ボット。適当に人の発言に対して「全裸で」を付けて発言するボットなんだけど... これと、似た様なボットをたくさん作ろうとすると... 例えば「全裸で」を「動詞」の前につけるという部分のロジック、 つまり「zenrize」の部分を重複して作ることになる。 「夜の」というのを「名詞」の前につけて「夜のボット」を作りたい時も...
なので、「zenrize」を汎用的に行うAcme::Zenraっていうモジュールをでっちあげてみた。 githubにおいてあります。
yusukebe's Acme-Zenra at master - GitHub
このモジュールを使えば、IRCの発言をzenrizeしてNOTICEで返すIRC botも簡単に作れます。
実行例。
11:51 yusukebe: お腹が空きました
11:51 zenra_bot: 「お腹が全裸で空きました」ですね。わかります
IRCボットのコード例。
#!/usr/bin/perl use Acme::Zenra; use AnyEvent; use AnyEvent::IRC::Client; use Encode; use utf8; my $channel = $ARGV[0] or die 'channel name is needed!'; my $appid = $ENV{YAHOO_APPID} or die 'set $ENV{YAHOO_APPID}'; my $zenra = Acme::Zenra->new( yahoo_appid => $appid ); my $c = AnyEvent->condvar; my $irc = new AnyEvent::IRC::Client; $irc->reg_cb( connect => sub { print "connected\n" } ); $irc->reg_cb( registered => sub { print "registered\n"; } ); $irc->reg_cb( disconnect => sub { print "disconnet\n"; } ); $irc->reg_cb( publicmsg => sub { my ( $irc, $chan, $msg ) = @_; my $message = decode_utf8( $msg->{params}->[1] ); my $result = $zenra->zenrize( $message ); if ($message ne $result ) { $message = encode_utf8( '「' . $result . '」ですね。わかります' ); $irc->send_chan( $channel, "NOTICE", $channel, $message ); } } ); $irc->connect( "chat.freenode.net", 6667, { nick => 'zenra_bot' } ); $irc->send_srv( "JOIN", $channel ); $c->recv;
このモジュールのいい点は先ほど言ったように「名詞」の前に「夜の」を付けて「nightize」させたいなんて時にも対応できる点です。newする時にこんな風に指定すればいいのです。
my $zenra = Acme::Zenra->new( yahoo_appid => $ENV{YAHOO_APPID}, position => '名詞', text => '夜の' ); my $result = $zenra->zenrize('お腹が空いたのでスパゲッティが食べたい'); print encode_utf8($result) # 夜のお腹が空いたので夜のスパゲッティが食べたい
作ってみたものの、誰得な気がして、watchするのもsugyanとmakamakaさんくらいだろーなーとという感じですが、 希望があればアップデートします。