File Coverage

blib/lib/POE/Component/IRC/Plugin/RSS/Headlines.pm
Criterion Covered Total %
statement 16 18 88.8
branch n/a
condition n/a
subroutine 6 6 100.0
pod n/a
total 22 24 91.6


line stmt bran cond sub pod time code
1             package POE::Component::IRC::Plugin::RSS::Headlines;
2              
3 1     1   592592 use strict;
  1         3  
  1         37  
4 1     1   5 use warnings;
  1         2  
  1         29  
5 1     1   6 use POE;
  1         6  
  1         8  
6 1     1   1583 use POE::Component::Client::HTTP;
  1         292232  
  1         37  
7 1     1   10 use POE::Component::IRC::Plugin qw(:ALL);
  1         1  
  1         270  
8 1     1   546 use XML::RSS;
  0            
  0            
9             use HTTP::Request;
10             use vars qw($VERSION);
11              
12             $VERSION = '1.08';
13              
14             sub new {
15             my $package = shift;
16             my %args = @_;
17             $args{lc $_} = delete $args{$_} for keys %args;
18             return bless \%args, $package;
19             }
20              
21             sub PCI_register {
22             my ($self,$irc) = @_;
23             $self->{irc} = $irc;
24             $irc->plugin_register( $self, 'SERVER', qw(spoof) );
25             unless ( $self->{http_alias} ) {
26             $self->{http_alias} = join('-', 'ua-rss-headlines', $irc->session_id() );
27             $self->{follow_redirects} ||= 2;
28             POE::Component::Client::HTTP->spawn(
29             Alias => $self->{http_alias},
30             Timeout => 30,
31             FollowRedirects => $self->{follow_redirects},
32             );
33             }
34             $self->{session_id} = POE::Session->create(
35             object_states => [
36             $self => [ qw(_shutdown _start _get_headline _response) ],
37             ],
38             )->ID();
39             $poe_kernel->state( 'get_headline', $self );
40             return 1;
41             }
42              
43             sub PCI_unregister {
44             my ($self,$irc) = splice @_, 0, 2;
45             $poe_kernel->state( 'get_headline' );
46             $poe_kernel->call( $self->{session_id} => '_shutdown' );
47             delete $self->{irc};
48             return 1;
49             }
50              
51             sub _start {
52             my ($kernel,$self) = @_[KERNEL,OBJECT];
53             $self->{session_id} = $_[SESSION]->ID();
54             $kernel->refcount_increment( $self->{session_id}, __PACKAGE__ );
55             undef;
56             }
57              
58             sub _shutdown {
59             my ($kernel,$self) = @_[KERNEL,OBJECT];
60             $kernel->alarm_remove_all();
61             $kernel->refcount_decrement( $self->{session_id}, __PACKAGE__ );
62             $kernel->call( $self->{http_alias} => 'shutdown' );
63             undef;
64             }
65              
66             sub get_headline {
67             my ($kernel,$self,$session) = @_[KERNEL,OBJECT,SESSION];
68             $kernel->post( $self->{session_id}, '_get_headline', @_[ARG0..$#_] );
69             undef;
70             }
71              
72             sub _get_headline {
73             my ($kernel,$self) = @_[KERNEL,OBJECT];
74             my %args;
75             if ( ref $_[ARG0] eq 'HASH' ) {
76             %args = %{ $_[ARG0] };
77             } else {
78             %args = @_[ARG0..$#_];
79             }
80             $args{lc $_} = delete $args{$_} for grep { !/^_/ } keys %args;
81             return unless $args{url};
82             $args{irc_session} = $self->{irc}->session_id();
83             $kernel->post( $self->{http_alias}, 'request', '_response', HTTP::Request->new( GET => $args{url} ), \%args );
84             undef;
85             }
86              
87             sub _response {
88             my ($kernel,$self,$request,$response) = @_[KERNEL,OBJECT,ARG0,ARG1];
89             my $args = $request->[1];
90             my @params;
91             push @params, delete $args->{irc_session}, '__send_event';
92             my $result = $response->[0];
93             if ( $result->is_success ) {
94             my $str = $result->content;
95             my $rss = XML::RSS->new();
96             eval { $rss->parse($str); };
97             if ($@) {
98             push @params, 'irc_rssheadlines_error', $args, $@;
99             } else {
100             push @params, 'irc_rssheadlines_items', $args;
101             push @params, $_->{'title'} for @{ $rss->{'items'} };
102             }
103             } else {
104             push @params, 'irc_rssheadlines_error', $args, $result->status_line;
105             }
106             $kernel->post( @params );
107             undef;
108             }
109              
110             1;
111             __END__