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 )