Blob


1 #!/usr/bin/perl
2 use strict;
3 use warnings;
5 package RSSBot;
6 use base qw(Bot::BasicBot);
7 use XML::RSS::Parser;
9 my %feedURLs = (
10 "undeadly" => "http://undeadly.org/cgi?action=rss",
11 "eff" => "https://www.eff.org/rss/updates.xml",
12 "hackernews" => "https://news.ycombinator.com/rss",
13 "krebs" => "https://krebsonsecurity.com/feed",
14 "ircnow" => "https://wiki.ircnow.org/index.php?n=Site.AllRecentChanges?action=rss",
15 "schneier" => "https://www.schneier.com/blog/atom.xml",
16 "slashdot" => "http://rss.slashdot.org/Slashdot/slashdotMain",
17 "theregister" => "https://www.theregister.com/headlines.rss",
18 );
20 sub said {
21 my $self = shift;
22 my $arguments = shift;
23 if ($arguments->{body} =~ m{^!add\s+(\w+)\s+(https?://[[:print:]]+)$}) {
24 my ($name, $url) = ($1, $2);
25 $feedURLs{$name} = $url;
26 $self->say(
27 channel => $arguments->{channel},
28 body => "$name added.",
29 );
30 }
31 if ($arguments->{body} =~ m{^!delete\s+(\w+)$}) {
32 my $name = $1;
33 delete($feedURLs{$name});
34 $self->say(
35 channel => $arguments->{channel},
36 body => "$name deleted.",
37 );
38 }
39 if ($arguments->{body} =~ /^!(\w+)$/) {
40 my $name = $1;
41 if (!exists($feedURLs{$name})) {
42 $self->say(
43 channel => $arguments->{channel},
44 body => "Error: $name has not been added",
45 );
46 return;
47 }
48 my $p = XML::RSS::Parser->new;
49 my $url = $feedURLs{$name};
50 my $feed = $p->parse_uri($url);
51 my $qtitle = $feed->query('/channel/title');
52 my $feed_title = $qtitle->text_content;
53 my @qitems = $feed->query('//item');
54 for (my $i = 0; $i < scalar(@qitems) && $i < 5; $i++) {
55 my $qitem = $qitems[$i];
56 my %item;
57 $item{feed_title} = $feed_title;
58 foreach my $tag (qw(title dc:contributor link comments)) {
59 my $qtag = $qitem->query($tag);
60 if(defined($qtag)) {
61 $item{$tag} = $qtag->text_content;
62 } else {
63 $item{$tag} = "";
64 }
65 }
66 $self->say(
67 channel => $arguments->{channel},
68 body => "[\002$item{feed_title}\002] $item{title} ($item{'dc:contributor'}) $item{link}: $item{comments}",
69 );
70 }
71 }
72 }
74 package main;
76 my $bot = RSSBot->new(
77 server => 'irc.example.com',
78 port => '6667',
79 channels => ['#perl103'],
80 nick => 'nickname',
81 name => 'username',
82 );
83 $bot->run();