--- trunk/bin/irc-logger.pl 2008/03/12 18:21:03 118 +++ trunk/bin/irc-logger.pl 2008/03/14 00:17:49 119 @@ -18,6 +18,8 @@ use Carp qw/confess/; use XML::Feed; use DateTime::Format::Flexible; +use IPC::DirQueue; +use File::Slurp; =head1 NAME @@ -47,6 +49,8 @@ ## CONFIG +my $debug = 0; + my $irc_config = { nick => 'irc-logger', server => 'irc.freenode.net', @@ -54,6 +58,8 @@ ircname => 'Anna the bot: try /msg irc-logger help', }; +my $queue_dir = './queue'; + my $HOSTNAME = `hostname -f`; chomp($HOSTNAME); @@ -106,6 +112,7 @@ GetOptions( 'import-dircproxy:s' => \$import_dircproxy, 'log:s' => \$log_path, + 'queue:s' => \$queue_dir, ); #$SIG{__DIE__} = sub { @@ -118,6 +125,15 @@ open(STDOUT, '>', $log_path) && warn "log to $log_path: $!\n"; +# queue + +if ( ! -d $queue_dir ) { + warn "## creating queue directory $queue_dir"; + mkdir $queue_dir or die "can't create queue directory $queue_dir: $!"; +} + +my $dq = IPC::DirQueue->new({ dir => $queue_dir }); + # HTML formatters my %escape = ('<'=>'<', '>'=>'>', '&'=>'&', '"'=>'"'); @@ -654,6 +670,7 @@ sub rss_fetch { my ($args) = @_; + # how many messages to send out when feed is seen for the first time? my $send_rss_msgs = 1; @@ -709,13 +726,22 @@ $send_rss_msgs--; if ( ! $args->{private} ) { # FIXME bug! should be save_message -# save_message( channel => $args->{channel}, me => 1, nick => $NICK, message => $msg ); - $sth_insert_log->execute( $args->{channel}, 1, $NICK, $msg, 'now()' ); + save_message( channel => $args->{channel}, me => 1, nick => $NICK, message => $msg ); +# $sth_insert_log->execute( $args->{channel}, 1, $NICK, $msg, 'now()' ); } my ( $type, $to ) = ( 'notice', $args->{channel} ); ( $type, $to ) = ( 'privmsg', $args->{nick} ) if $args->{private}; + _log(">> $type $to", $msg); - $args->{kernel}->post( $irc => $type => $to, $msg ); +# $args->{kernel}->post( $irc => $type => $to, $msg ); + # XXX enqueue message to send later + sub enqueue_post { + my $post = dump( @_ ); + warn "## queue_post $post\n" if $debug; + $dq->enqueue_string( $post ); + } + enqueue_post( $type => $to => $msg ); + $updates++; } } @@ -755,15 +781,25 @@ my $kernel = shift; $_stat->{rss}->{last_poll} ||= time(); my $dt = time() - $_stat->{rss}->{last_poll}; - warn "## rss_check_updates $dt > $rss_min_delay\n"; if ( $dt > $rss_min_delay ) { + warn "## rss_check_updates $dt > $rss_min_delay\n"; $_stat->{rss}->{last_poll} = time(); _log rss_fetch_all( $kernel ); } + # XXX send queue messages + while ( my $job = $dq->pickup_queued_job() ) { + my $data = read_file( $job->get_data_path ) || die "can't load ", $job->get_data_path, ": $!"; +# $kernel->post( $irc => $type => $to, $msg ); + my @data = eval $data; + _log ">> post from queue ", $irc, @data; + $kernel->post( $irc => @data ); + $job->finish; + warn "## done queued job: ",dump( @data ) if $debug; + } } # seed rss seen cache so we won't send out all items on startup -_log rss_fetch_all; +_log rss_fetch_all if ! $debug; POE::Session->create( inline_states => { _start => sub { @@ -829,6 +865,7 @@ my $nick = (split /!/, $_[ARG0])[0]; my $msg = $_[ARG2]; my $channel = $_[ARG1]->[0]; + warn "# ARG = ",dump( @_[ARG0,ARG1,ARG2] ) if $debug; my $res = "unknown command '$msg', try /msg $NICK help!"; my @out; @@ -1073,7 +1110,7 @@ _log ">> registreted, so IDENTIFY"; $_[KERNEL]->post( $irc => privmsg => 'nickserv', "IDENTIFY $NICK" ); } else { - warn "## ignore $m\n"; + warn "## ignore $m\n" if $debug; } }, irc_snotice => sub {