File Coverage

blib/lib/POE/Component/IRC/Plugin/Trac/RSS.pm
Criterion Covered Total %
statement 10 12 83.3
branch n/a
condition n/a
subroutine 4 4 100.0
pod n/a
total 14 16 87.5


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