#!/usr/bin/perl -w # vim:ts=4:sw=4:tw=78 BEGIN { use File::Basename qw(); use Cwd qw(); use vars qw($ROOT); $ROOT = chdir(File::Basename::dirname($0)) && Cwd::getcwd(); } use strict; use Colloquy::Bot::Simple qw(daemonize); use vars qw($VERSION $SELF $ROOT); ($SELF = $0) =~ s|^.*/||; $VERSION = sprintf('%d.%02d', q$Revision: 516 $ =~ /(\d+)/g); $SIG{'ALRM'} = sub { die "Alarm Caught; login took too long"; }; $SIG{'INT'} = sub { die "Interrupt caught"; }; # Connect alarm(10); my $talker = Colloquy::Bot::Simple->new( host => '127.0.0.1', port => 1236, username => 'CpanBot', password => 'topsecret', ); alarm(0); # Detach and loop daemonize("/tmp/$SELF.pid",1); chdir($ROOT) || die "Unable to change directory to $ROOT: $!"; $talker->listenLoop(\&event_callback, 600); $talker->quit; exit; sub event_callback { my $talker = shift; my $event = @_ % 2 ? { alarm => 1 } : { @_ }; if (exists $event->{alarm}) { print "Callback called as ALARM interrupt handler\n"; cpan_rss_callback($talker,$event); } elsif ($event->{msgtype} eq 'TELL') { $talker->whisper($event->{person}, 'Pardon?'); } return 0; } sub cpan_rss_callback { my ($talker,$event) = @_; use XML::RSS::Parser qw(); use Date::Parse qw(str2time); my $parser = new XML::RSS::Parser; my $feed = $parser->parse_uri('http://search.cpan.org/uploads.rdf'); my ($lastDate,$lastModule) = ('',''); if (open(FH,"); close(FH); } my $recentDate = 0; my $recentModule = ''; foreach my $item ($feed->query("//item")) { my $date = str2time($item->query("dc:date")->text_content()); my $module = $item->query("title")->text_content(); my $link = $item->query("link")->text_content(); my $desc = ''; eval { $desc = $item->query("description")->text_content(); }; $desc = " - $desc" if $desc; $recentDate ||= $date; $recentModule ||= $module; last if ($lastDate > $date || $lastModule eq $module); $talker->whisper('%cpan', "$module $desc"); } if (open(FH,">/var/tmp/lastCpanPkgDate.dat")) { print FH "$recentDate\t$recentModule"; close(FH); } }