Bot-IRC-X-Feeds
view release on metacpan or search on metacpan
lib/Bot/IRC/X/Feeds.pm view on Meta::CPAN
if ( grep { $_->{url} eq $url } @urls ) {
$bot->reply_to(q{I'm already tracking that feed.});
}
else {
push( @urls, {
url => $url,
forums => [ split( ',', lc $m->{forums} ) ],
} );
$bot->reply_to(q{OK. I'll report changes from the feed you provided.});
$bot->store->set( 'urls' => \@urls );
}
}
elsif ( $m->{action} eq 'list' ) {
if (@urls) {
$bot->reply($_) for ( map {
( @{ $_->{forums} } )
? $_->{url} . ' (' . join( ', ', @{ $_->{forums} } ) . ')'
: $_->{url}
} @urls );
}
else {
$bot->reply_to(q{I'm currently not tracking any feeds.});
}
}
elsif ( $m->{action} eq 'remove' ) {
my $url = lc( $m->{url} );
if ( $url eq 'all' ) {
$bot->reply_to(q{OK. I'll stop reporting on all the feeds I've been tracking.});
$bot->store->set( 'urls' => [] );
}
elsif ( grep { $_->{url} eq $url } @urls ) {
$bot->reply_to(q{OK. I'll stop reporting on the feed you provided.});
$bot->store->set( 'urls' => [ grep { $_->{url} ne $url } @urls ] );
}
else {
$bot->reply_to(qq{I wasn't able to find the feed you specified. ($url)});
}
}
return 1;
},
);
my $ua = LWP::UserAgent->new;
my $rss = XML::RSS->new;
my $interval = ( $bot->vars->{interval} || 10 ) * 60;
my $max_per = $bot->vars->{max_per} || 5;
$bot->tick(
$interval,
sub {
my ($bot) = @_;
my $now = time;
my $channels = $bot->channels;
for my $url ( @{ $bot->store->get('urls') || [] } ) {
my $res = $ua->get( $url->{url} );
next unless ( $res->is_success );
eval {
$rss->parse( $res->decoded_content );
};
if ($@) {
warn $@;
next;
}
my $printed = 0;
for my $item ( @{ $rss->{items} } ) {
my $key = join( '|',
$url->{url},
$item->{title},
$item->{link},
);
next if ( $bot->store->get($key) );
$bot->store->set( $key => $now );
unless ( $printed++ >= $max_per ) {
my $msg =
'Feed: ' . $rss->channel('title') .
' [ ' . $item->{title} . ' ]' .
' (' . makeashorterlink( $item->{link} ) . ')';
$msg .= ' -- ' . $item->{comments} if ( $item->{comments} );
$bot->msg( $_, $msg ) for ( ( @{ $url->{forums} } ) ? @{ $url->{forums} } : @$channels );
}
}
}
},
);
$bot->helps( feeds =>
'Watch and notify on changes in RSS feeds. ' .
'Usage: bot feed add URL [FORUMS], bot feed list, bot feed remove URL. ' .
'See also: https://metacpan.org/pod/Bot::IRC::X::Feeds'
);
}
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
Bot::IRC::X::Feeds - Bot::IRC plugin to watch and notify on changes in RSS feeds
=head1 VERSION
version 1.10
=for markdown [](https://github.com/gryphonshafer/Bot-IRC-X-Feeds/actions?query=workflow%3Atest)
[](https://codecov.io/gh/gryphonshafer/Bot-IRC-X-Feeds)
=head1 SYNOPSIS
use Bot::IRC;
( run in 1.436 second using v1.01-cache-2.11-cpan-600a1bdf6e4 )