Bot-Cobalt-Plugin-RSS
view release on metacpan or search on metacpan
lib/Bot/Cobalt/Plugin/RSS.pm view on Meta::CPAN
$thistimer->{LastRun} = time;
}
}
$self->{POOLTIMERID} = $core->timer_set( 3,
{ Event => 'rssplug_check_timer_pool' }
);
return PLUGIN_EAT_NONE
}
sub Bot_rssplug_got_resp {
my ($self, $core) = splice @_, 0, 2;
my $response = ${ $_[1] };
my $args = ${ $_[2] };
my ($feedname) = @$args;
if ($response->is_success) {
my $feedmeta = $self->get_feed_meta($feedname)
|| return PLUGIN_EAT_NONE;
my $handler = $feedmeta->{obj};
local $SIG{__WARN__} = sub {};
if ( eval { $handler->parse($response->content); 1 } ) {
$self->_send_announce($feedname, $handler);
}
} else {
logger->warn(
"Unsuccessful HTTP request: $feedname: ".$response->status
);
return PLUGIN_EAT_NONE
}
return PLUGIN_EAT_NONE
}
sub _send_announce {
my ($self, $name, $handler) = @_;
my $title = $handler->title;
my $feedmeta = $self->get_feed_meta($name);
my $a_heap = $self->get_announce($name);
unless ($feedmeta->{hasrun}) {
$feedmeta->{hasrun} = 1;
$handler->init_headlines_seen(1);
## for some reason init_headlines_seen sometimes fails ...
$handler->late_breaking_news;
return
}
my $spacing = $feedmeta->{space};
my $spcount = 0;
my @headlines = $handler->late_breaking_news;
HEAD: while (my $headline = pop @headlines) {
my $this_line = $headline->headline;
my $this_url = $headline->url;
my $str = "RSS: "
.color('bold', $name)
.": $this_line ( $this_url )" ;
CONTEXT: for my $context (keys %$a_heap) {
my $irc = irc_object($context) || next CONTEXT;
for my $channel ( @{ $a_heap->{$context} } ) {
my $tid = core()->timer_set( 1 + $spcount,
{
Type => 'msg',
Context => $context,
Target => $channel,
Text => $str,
},
);
$self->{MSGTIMERS}->{$tid} = $name;
}
} ## CONTEXT
$spcount += $spacing;
} ## HEAD
}
sub _create_feed {
## _create_feed($name)
## create (and return) new XML::RSS::Feed based on get_feed_meta
my ($self, $feedname) = @_;
my $feedmeta = $self->get_feed_meta($feedname);
my %feedopts = (
name => $feedname,
url => $feedmeta->{url},
delay => $feedmeta->{delay},
init_headlines_seen => 0,
## tmpdir caching seems to result in memory leaks:
# tmpdir => File::Spec->tmpdir(),
);
if ( my $rss = XML::RSS::Feed->new(%feedopts) ) {
$feedmeta->{obj} = $rss;
} else {
logger->warn(
"Could not create XML::RSS::Feed obj for $feedname"
);
}
return $feedmeta->{obj}
}
sub _request {
my ($self, $feedname) = @_;
my $feedmeta = $self->get_feed_meta($feedname);
unless (core()->Provided->{www_request}) {
logger->warn("You seem to be missing Bot::Cobalt::Plugin::WWW!");
return PLUGIN_EAT_NONE
( run in 1.573 second using v1.01-cache-2.11-cpan-140bd7fdf52 )