■2012-05-01
* [近況] Hachioji.pm #16 と(」・ω・)」うー(/・ω・)/にゃーbot
Hachipji.pm #16の参加報告です。今回はハッカソンの方にも参加しました。他の方のレポートはHachiiojipm.orgからご覧下さい。
現在Hachipji.pmではYet Another IRC(仮)をつくっていています。IRCとの違いの一つとして、サーバ側でメッセージログを保存していて接続が切れたユーザーが後で再ログインするとメッセージがダーっと流れる機能があります。YAIRCについてはこちらの覚書を。実際に稼働しているものはuzullaさんが運営しているhttp://yairc.cfe.jp:3000/にあります。
さてこのシステム、socket.ioのPerl実装であるPocketIOを使っているのですが、PocketIOは基本的にサーバ側を書くためのパッケージで、クライアントの実装はないのです。同じような質問に対して作者は「クライアントつくるのは簡単だよ。でもPocketIOはサーバ側の実装だからクライアントのサンプルないよ!」てな感じのこといってるので、PocketIO::Client::IOをつくってみました。まあクライアントないとテスト書きづらいですしね。以下に簡単なbotのサンプルを
# ユーザーのメッセージに (」・ω・)」うー が含まれていると
# (/・ω・)/にゃー と返す
use strict;
use warnings;
use PocketIO::Client::IO;
use AnyEvent;
use utf8;
my $url = "http://localhost:3000/";
my $socket = PocketIO::Client::IO->connect( $url );
exit unless $socket;
my $time = $ARGV[0] || 3600;
my $cv = AnyEvent->condvar;
my $w = AnyEvent->timer( after => $time, cb => $cv );
$socket->on('ping pong', sub {
if ( $_[1] eq 'FAIL' ) {
print "ping pong FAIL\n";
$socket->emit('nickname', 'nyal_bot');
say_hello( $socket );
}
});
# サーバからemitされるイベントを登録
# github.com/vti/pocketio/
# にある最新のバージョンなら不要
$socket->on('join_tag', sub {});
$socket->on('nicknames', sub {});
$socket->on('announcement', sub {});
$socket->on('nickname', sub {});
$socket->on('user message log', sub {});
# このボット唯一の機能
$socket->on('user message', sub {
my $text = $_[1]->{text};
if ( $text =~ /\(」・ω・\)」うー/ ) {
$socket->emit('user message', '(/・ω・)/にゃー');
}
});
my $timer;
$socket->on('connect' => sub {
$socket->emit('nickname', 'nyal_bot');
$socket->emit('join_tag', { PUBLIC => 'PUBLIC' });
say_hello( $socket );
$timer = AnyEvent->timer( after => 5, interval => 10,
cb => sub {
$socket->emit('ping pong', 'ping');
}
);
});
$cv->wait;
sub say_hello {
shift->emit('user message',
"いつもニコニコあなたの隣に這いよる混沌"
."にゃるらとボットです! "
."どうぞにゃるボとお呼びくださいね"
)
}
運がよければ先程のサイトにてこのボットがいるのを見かけられるかもしれません。それから、現在のところPocketIO::Client::IOがサポートしているtransportはwebsocketのみです。パッチウエルカムでございます。
さて、Hachipji.pm本編ですが、今回のLTテーマは「(」・ω・)」うー(/・ω・)/にゃー」です。すいません、このテーマなら間口が広がるのではないかと思ったのですが、冷静に考えると間口が狭まってますね。私はワインのコルク抜きをもっていきました。スクリュー側を上にして回転させる側を上げ下げすると
| /|\ (」・ω・)」うー ○ ↓ \/ | (/・ω・)/にゃー ○……実際にやって楽しんでみてください。
なお、CPANには既にクトゥルフネタとしてAcme::Phlegethothがあります。useするとあなたのソースコードを禍々しいものにしてくれますね! 禍々しいものにしてくれますね! 大事なことなので二回言いました。

