秘書
http://d.hatena.ne.jp/xcezx/20080925/1222285415
そういえば、こんなのも実装してた。
サーバーの設定によって誤差でまくるんだけど、ping を利用して、スケジュールを登録しておいて、
その日時に連絡してくれるってやつです。多少誤差があるんだけど、それなりにいいとおもう。
コマンドを文章にすると忘れるのですが、もっと長い文章にして、間違えながら何回も秘書に頼むのがお勧めです。
package POE::Component::IRC::Plugin::Secretary; use warnings; use strict; use POE::Component::IRC::Plugin qw(:ALL); use Encode; use DateTime; our $VERSION = '0.01'; my $TRIGGERS = { kick => { regexp => '^きみ、(\w+)様がお帰りだ。$', }, where_is_my_naruto => { regexp => '^きみ、私のなるとしらんかね?$', }, yamadakun_naruto_totte =>{ regexp => '^きみ、(\w+)君になるとはいらんだろ。$', }, schedule => { regexp => '^きみ、(\d{4}-\d{2}-\d{2} \d{2}:\d{2})に、「(.+)」をいれといてくれ。$', } }; sub new { my $package = shift; my $self = shift; foreach my $key ( keys %{$TRIGGERS} ) { Encode::decode('utf8', $TRIGGERS->{$key}{regexp}) ; } return bless $self, $package; } sub PCI_register { my ( $self, $irc ) = splice @_, 0, 2; $irc->plugin_register( $self, 'SERVER', qw(public ping) ); return 1; } sub PCI_unregister { return 1; } my @schedules = (); sub S_ping { my ( $self, $irc, @args ) = @_; #FIXME my $channel = '#teranishi'; my $dt = DateTime->now( time_zone => 'local' ); my $now = sprintf( '%d%02d%02d%02d%02d' , $dt->year, $dt->month, $dt->day , $dt->hour , $dt->minute ); for ( my $i = 0 ; $i < scalar @schedules ; $i++ ) { if ( $now >= $schedules[$i]->{timestamp} ) { $irc->yield( privmsg => $channel => $schedules[$i]->{mes} ) ; delete $schedules[$i]; } } return PCI_EAT_NONE; } sub S_public { my ( $self, $irc, @args ) = @_; my $nick = ( split /!/, ${ $args[0] } )[0]; my $channel = ${ $args[1] }->[0]; my $msg = ${ $args[2] }; Encode::from_to( $msg, $self->{encoding} , "utf8" ) if $self->{encoding} ; Encode::decode( 'utf8' , $msg ); my $user = undef; if ( ($user ) = $msg =~ m/$TRIGGERS->{kick}{regexp}/ ) { $irc->yield( kick => $channel => $user ); } elsif( $msg =~ m/$TRIGGERS->{where_is_my_naruto}{regexp}/ ){ $irc->yield( mode => $channel => '+o' => $nick ); } elsif( ($user ) = $msg =~ m/$TRIGGERS->{yamadakun_naruto_totte}{regexp}/ ) { $irc->yield( mode => $channel => '-o' => $user ); } elsif( my ($date , $message ) = $msg =~ m/$TRIGGERS->{schedule}{regexp}/ ) { $date =~ s/-//g; $date =~ s/://g; $date =~s/ //g; $message = $nick .':'. $message ; Encode::from_to( $message, "utf8" , $self->{encoding} ) if $self->{encoding} ; push ( @schedules, { timestamp => $date , mes => $message } ); $irc->yield( notice => $channel => 'scheduled:' . $date . ':' . $message ) ; } return PCI_EAT_NONE; } 1;