Net::IPMessenger and Plagger Plugin

PerlIP Messenger プロトコル通信をするための module Net::IPMessenger を書いて CPAN に登録しました。

実は PerlIP 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 の説明
  • peeraddr : feed メッセージの送信先ホストの IP アドレス(default localhost)
  • peerport : feed メッセージの送信先ホストのポート番号(default 2425)
  • sendinterval : 複数の feed を送る時の間隔(default 0.25)
  • username: 自分(Plagger)の名前(default plagger)
  • hostname: 自分のホスト名(default Sys::Hostname::hostname() )
  • serverport: 自分のポート番号(default 2426)
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 はほとんど書く必要がないです。

とりあえずこんな感じです。