Net::IPMessenger and Plagger Plugin
Perl で IP Messenger プロトコル通信をするための module Net::IPMessenger を書いて CPAN に登録しました。
実は Perl で IP Messenger プロトコルを話すものは既に色々あって、僕が敢えて書く必要もなかったんだけど、他の source は CPAN には登録されていなかった(と思った)ので、わざわざアップロードしました。この module はまだ今は IP Messenger の機能を全然サポートしてなくて、単純なメッセージ送受信だけしかできません。
ところでなんでこんなものを今わざわざ書いたかというと、Plagger の更新を IP Messenger に配送する Plugin、Plagger::Plugin::Publish::IPMessenger を作りたかったからです。というわけで source。
package Plagger::Plugin::Publish::IPMessenger; use strict; use base qw( Plagger::Plugin ); our $VERSION = 0.01; use Encode; use Net::IPMessenger; use Sys::Hostname; use Time::HiRes qw( sleep ); sub register { my( $self, $context ) = @_; $context->register_hook( $self, 'publish.feed' => \&update, ); } sub update { my( $self, $context, $args ) = @_; my $peeraddr = $self->conf->{peeraddr} || 'localhost'; my $peerport = $self->conf->{peerport} || '2425'; my $ipmsg = Net::IPMessenger->new( UserName => $self->conf->{username} || 'plagger', HostName => $self->conf->{hostname} || hostname || 'plagger', Port => $self->conf->{serverport} || 2426, ); unless ($ipmsg) { $context->log( error => $! ); return; } $context->log( info => "Sending " . $args->{feed}->title . " to IPMessenger" ); my $sendinterval = $self->conf->{sendinterval} || 0.25; my $command = $ipmsg->messagecommand('SENDMSG')->set_secret; for my $entry ( $args->{feed}->entries ) { my $text = sprintf "title : %s\n", $args->{feed}->title; $text .= sprintf "author : %s\n", $entry->author; $text .= sprintf "link : %s\n", $entry->link; $text .= $entry->body_text; $text = encode( 'shiftjis', $text ); $ipmsg->send( $command, $text, '', $peeraddr, $peerport ); sleep $sendinterval; } } 1; __END__ =head1 NAME Plagger::Plugin::Publish::IPMessenger - Publish feed updates to IP Messenger =head1 SYNOPSIS - module: Publish::IPMessenger config: peeraddr: localhost peerport: 2425 sendinterval: 0.25 username: plagger hostname: plagger serverport: 2426 If you just want to send messages to the local IP Messenger(localhost:2425), you may not need to write any config. Just write like below. - module: Publish::IPMessenger =head1 DESCRIPTION This plugin publishes feed updates to IP Messenger client. =head1 AUTHOR C<< <massa.hara at gmail.com> >> =head1 SEE ALSO L<Plagger>, L<Net::IPMessenger> =cut
config の説明
config の例
localhost で動いている IP Messenger のクライアントにメッセージを渡す場合は config なしの
- module: Publish::IPMessenger
で動くはずです。デフォルトで 2426 番ポートでメッセージを送ろうとするので local の IP Messenger クライアントとポート番号が衝突しません。他のホストにメッセージを送る場合は
- module: Publish::IPMessenger config: peeraddr: another.some.host
と、peeraddr にホスト名か IP アドレスを指定すればメッセージが送られると思います。メッセージを受信するクライアントが DHCP だと、毎回 config とクライアントの IP アドレスをチェックする必要があって、あんまり良くないわけですが、IP アドレス以外にクライアントを特定する方法がわからなかったのでこんな感じになってます(IP Messenger のニックネームは unique ではない気がした。config に Shift JIS の文字列を書いていいかどうかもわからないし)。
peeraddr 以外の config はほとんど書く必要がないです。
とりあえずこんな感じです。