Description: |
This XChat command grab, parse and print RSS newsfeed from sites defined in a configuration file
Since the configuration file is read each time the command is called, you can add/remove sites without having to reload the script
Usage in XChat: /rss channel count
'channel' is the name of the RSS channel you want to see, and 'count' is the number of item to display (default 10) |
#!/usr/bin/perl -w
use strict;
use LWP::Simple;
use XML::Parser;
use vars qw(%RSS $newsmax %inside $config);
$config = "/home/briac/.xchat/getRSS.conf";
IRC::print("** Loading RSS Alert **\n");
IRC::add_command_handler( "RSS", "rss_command_handler" );
sub rss_command_handler {
my ( $feed, $count ) = split ( /\s+/, shift () );
$newsmax = $count || 10;
do $config;
# Error checking
if ( !%RSS ) {
IRC::print("** Error reading config file\n");
return 1;
}
if ( !$feed ) {
IRC::print("usage: /rss channel [count]\n");
IRC::print( "Available channels: " . join (', ', keys %RSS) .
+"\n" );
return 1;
}
if ( !$RSS{lc($feed)} ) {
IRC::print("Channel '$feed' unknown.\n");
IRC::print( "Available channels: " . join (', ', keys %RSS) .
+"\n" );
return 1;
}
my $xml = get( $RSS{lc($feed)} );
if ( !$xml ) {
IRC::print("Can't fetch the RSS\n");
return 1;
}
my $parser = XML::Parser->new( Style => 'Stream' );
$parser->parse($xml);
IRC::print("---\n\n");
return 1;
}
sub StartTag {
my $elt = $_[1];
$newsmax-- if $elt eq 'item';
$inside{$elt}++;
}
sub EndTag {
my $elt = $_[1];
IRC::print("\n") if $elt eq 'channel';
$inside{$elt}--;
}
sub Text {
return unless /\S/;
return unless $newsmax >= 0;
# Channel infos
IRC::print("> $_") if ( $inside{channel} && $inside{title} );
IRC::print(" $_") if ( $inside{channel} && $inside{description}
+);
IRC::print(" ($_)") if ( $inside{channel} && $inside{link} );
# News Items
IRC::print("* $_\n") if ( $inside{item} && $inside{title} );
IRC::print(" $_\n") if ( $inside{item} && $inside{link} );
}
__END__
# Sample getRSS.conf file
%RSS = (
slashdot => 'http://www.slashdot.org/slashdot.rdf',
useperl => 'http://use.perl.org/useperl.rdf',
perlmonks => 'http://www.perlmonks.org/headlines.rdf',
cpan => 'http://search.cpan.org/recent.rdf',
theregister => 'http://www.theregister.co.uk/tonys/slashdot.rdf',
memepool => 'http://memepool.com/memepool.rss',
);
|