かの有名な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さんくらいだろーなーとという感じですが、 希望があればアップデートします。