秘書

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;