--- trunk/bin/irc-logger.pl 2008/03/14 14:45:04 123 +++ trunk/bin/irc-logger.pl 2008/03/14 16:06:57 126 @@ -18,8 +18,6 @@ use Carp qw/confess/; use XML::Feed; use DateTime::Format::Flexible; -use IPC::DirQueue; -use File::Slurp; use Encode; =head1 NAME @@ -59,8 +57,6 @@ ircname => 'Anna the bot: try /msg irc-logger help', }; -my $queue_dir = './queue'; - my $HOSTNAME = `hostname -f`; chomp($HOSTNAME); @@ -113,7 +109,6 @@ GetOptions( 'import-dircproxy:s' => \$import_dircproxy, 'log:s' => \$log_path, - 'queue:s' => \$queue_dir, 'debug!' => \$debug, ); @@ -127,14 +122,6 @@ 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 @@ -618,7 +605,7 @@ $a->{me} ||= 0; $a->{time} ||= strftime($TIMESTAMP,localtime()); - _log + _log "ARCHIVE", $a->{channel}, " ", $a->{me} ? "***" . $a->{nick} : "<" . $a->{nick} . ">", " " . $a->{message}; @@ -673,15 +660,25 @@ Timeout => 30, ); +=head2 rss_parse_xml + + rss_parse_xml({ + url => 'http://www.example.com/rss', + send_rss_msgs => 42, + }); + +=cut + sub rss_parse_xml { - my ($args) = @_; + my ($kernel,$args) = @_; warn "## rss_parse_xml ",dump( @_ ) if $debug; # how many messages to send out when feed is seen for the first time? - my $send_rss_msgs = 1; + my $send_rss_msgs = $args->{send_rss_msgs}; + $send_rss_msgs = 1 if ! defined $send_rss_msgs; - _log "RSS fetch", $args->{url}; + warn "## RSS fetch first $send_rss_msgs items from", $args->{url} if $debug; my $feed = XML::Feed->parse( \$args->{xml} ); if ( ! $feed ) { @@ -741,14 +738,8 @@ my ( $type, $to ) = ( 'notice', $args->{channel} ); ( $type, $to ) = ( 'privmsg', $args->{nick} ) if $args->{private}; - _log("RSS generated $type to $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 ); + _log(">> RSS $type to $to:", $msg); + $kernel->post( $irc => $type => $to => $msg ); $updates++; } @@ -759,13 +750,14 @@ $sql .= qq{where id = } . $args->{id}; eval { $dbh->do( $sql ) }; - _log "RSS got $total items of which $updates new"; + _log "RSS $updates/$total new items from", $args->{url}; return $updates; } sub rss_fetch_all { - my $kernel = shift; + my ( $kernel, $send_rss_msgs ) = @_; + warn "## rss_fetch_all -- send_rss_msgs: $send_rss_msgs\n" if $debug; my $sql = qq{ select id, url, name, channel, nick, private from feeds @@ -778,7 +770,7 @@ warn "# ",$sth->rows," active RSS feeds\n"; my $count = 0; while (my $row = $sth->fetchrow_hashref) { - warn "## queued rss-fetch for ", $row->{url} if $debug; + $row->{send_rss_msgs} = $send_rss_msgs if defined $send_rss_msgs; $_stat->{rss}->{fetch}->{ $row->{url} } = $row; $kernel->post( 'rss-fetch', @@ -786,6 +778,7 @@ 'rss_response', HTTP::Request->new( GET => $row->{url} ), ); + warn "## queued rss-fetch ", dump( $row ) if $debug; } return "OK, scheduled " . $sth->rows . " feeds for refresh"; } @@ -800,16 +793,6 @@ $_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 "IRC post from queue:", @data; - $kernel->post( $irc => @data ); - $job->finish; - warn "## done queued job: ",dump( @data ) if $debug; - } } POE::Session->create( inline_states => { @@ -822,8 +805,8 @@ my $poco_object = $sender->get_heap(); _log "connected to",$poco_object->server_name(); $kernel->post( $sender => join => $_ ) for @channels; - # seen RSS cache - _log rss_fetch_all( $kernel ); + # seen RSS cache, so don't send out messages + _log rss_fetch_all( $kernel, 0 ); undef; }, # irc_255 => sub { # server is done blabbing @@ -1041,7 +1024,7 @@ if ($@) { $res = "ERROR: $@"; } else { - $res = "OK, RSS executed $command " . ( $sub ? "-$sub" : '' ) ."on $channel url $url"; + $res = "OK, RSS executed $command" . ( $sub ? "-$sub" : '' ) ." on $channel url $url"; if ( $command eq 'clean' ) { my $seen = $_stat->{rss}->{seen} || die "no seen?"; my $want_link = $_stat->{rss}->{url2link}->{$url} || warn "no url2link($url)"; @@ -1053,6 +1036,8 @@ _log "RSS removed seen $c $url $link"; } } + } elsif ( $command eq 'add' ) { + rss_fetch_all( $_[KERNEL] ); } } } else { @@ -1062,7 +1047,7 @@ # this makes sense because we didn't catch rss-clean http://... before! $_stat->{rss} = undef; $dbh->do( qq{ update feeds set last_update = now() - delay } ); - $res = "OK, cleaned RSS cache"; + $res = rss_fetch_all( $_[KERNEL] ); } if ($res) { @@ -1150,7 +1135,7 @@ my $row = delete( $_stat->{rss}->{fetch}->{ $request_object->uri } ); if ( $row ) { $row->{xml} = $response_object->content; - rss_parse_xml( $row ); + rss_parse_xml( $_[KERNEL], $row ); } else { warn "## can't find rss->fetch for ", $request_object->uri; }