File Coverage

blib/lib/POE/Component/IRC/Plugin/ISupport.pm
Criterion Covered Total %
statement 89 95 93.6
branch 16 18 88.8
condition 3 5 60.0
subroutine 22 23 95.6
pod 3 7 42.8
total 133 148 89.8


line stmt bran cond sub pod time code
1             package POE::Component::IRC::Plugin::ISupport;
2             our $AUTHORITY = 'cpan:HINRIK';
3             $POE::Component::IRC::Plugin::ISupport::VERSION = '6.91';
4 79     79   527 use strict;
  79         160  
  79         2466  
5 79     79   379 use warnings FATAL => 'all';
  79         150  
  79         3006  
6 79     79   461 use POE::Component::IRC::Plugin qw(:ALL);
  79         142  
  79         109187  
7              
8             sub new {
9 116     116 1 838 return bless { }, shift;
10             }
11              
12             sub PCI_register {
13 116     116 0 5192 my ($self, $irc) = splice @_, 0, 2;
14              
15 116         454 $irc->plugin_register( $self => SERVER => qw(all) );
16 116         4051 $self->{irc} = $irc;
17             $self->{parser} = {
18             CASEMAPPING => sub {
19 90     90   251 my ($support, $key, $val) = @_;
20 90         281 $support->{$key} = $val;
21             },
22             CHANLIMIT => sub {
23 1     1   3 my ($support, $key, $val) = @_;
24 1         9 while ($val =~ /([^:]+):(\d+),?/g) {
25 1         6 my ($k, $v) = ($1, $2);
26 1         4 @{ $support->{$key} }{ split(//, $k) } = ($v) x length $k;
  1         6  
27             }
28             },
29             CHANMODES => sub {
30 90     90   280 my ($support, $key, $val) = @_;
31 90         531 $support->{$key} = [ split(/,/, $val) ];
32             },
33             CHANTYPES => sub {
34 90     90   318 my ($support, $key, $val) = @_;
35 90         460 $support->{$key} = [ split(//, $val) ];
36             },
37             ELIST => sub {
38 1     1   3 my ($support, $key, $val) = @_;
39 1         5 $support->{$key} = [ split(//, $val) ];
40             },
41             IDCHAN => sub {
42 0     0   0 my ($support, $key, $val) = @_;
43 0         0 while ($val =~ /([^:]+):(\d+),?/g) {
44 0         0 my ($k, $v) = ($1, $2);
45 0         0 @{ $support->{$key} }{ split(//, $k) } = ($v) x length $k;
  0         0  
46             }
47             },
48             MAXLIST => sub {
49 1     1   4 my ($support, $key, $val) = @_;
50 1         5 while ($val =~ /([^:]+):(\d+),?/g) {
51 1         15 my ($k, $v) = ($1, $2);
52 1         10 @{ $support->{$key} }{ split(//, $k) } = ($v) x length $k;
  1         16  
53             }
54             },
55             PREFIX => sub {
56 90     90   235 my ($support, $key, $val) = @_;
57 90 50       759 if (my ($k, $v) = $val =~ /\(([^)]+)\)(.*)/ ) {
58 90         299 @{ $support->{$key} }{ split(//, $k) } = split(//, $v);
  90         490  
59             }
60             },
61             STATUSMSG => sub {
62 1     1   3 my ($support, $key, $val) = @_;
63 1         4 $support->{$key} = [ split(//, $val) ];
64             },
65             TARGMAX => sub {
66 1     1   3 my ($support, $key, $val) = @_;
67 1         9 while ($val =~ /([^:]+):(\d*),?/g) {
68 8         19 my ($k, $v) = ($1, $2);
69 8         44 $support->{$key}->{$k} = $v;
70             }
71             },
72             EXCEPTS => sub {
73 90     90   262 my ($support, $flag) = @_;
74 90         345 $support->{$flag} = 'e';
75             },
76             INVEX => sub {
77 90     90   219 my ($support, $flag) = @_;
78 90         232 $support->{$flag} = 'I';
79             },
80 116         8070 };
81              
82 116         577 return 1;
83             }
84              
85             sub PCI_unregister {
86 116     116 0 18648 my ($self, $irc) = splice @_, 0, 2;
87 116         303 delete $self->{irc};
88 116         288 return 1;
89             }
90              
91             sub S_connected {
92 90     90 0 33895 my ($self, $irc) = splice @_, 0, 2;
93              
94 90         272 $self->{server} = { };
95 90         235 $self->{got_005} = 0;
96 90         221 $self->{done_005} = 0;
97 90         239 return PCI_EAT_NONE;
98             }
99              
100             sub S_005 {
101 181     181 0 46182 my ($self, $irc, @args) = @_;
102 181         339 my @vals = @{ ${ $args[2] } };
  181         297  
  181         565  
103 181         292 pop @vals;
104 181         364 my $support = $self->{server};
105              
106 181         423 for my $val (@vals) {
107 1364 100       3094 if ($val =~ /=/) {
108 999         1217 my $key;
109 999         2048 ($key, $val) = split(/=/, $val, 2);
110 999 100       1914 if (defined $self->{parser}->{$key}) {
111 365         931 $self->{parser}->{$key}->($support, $key, $val);
112             }
113             else {
114             # AWAYLEN CHANNELLEN CHIDLEN CHARSET EXCEPTS INVEX KICKLEN
115             # MAXBANS MAXCHANNELS MAXTARGETS MODES NETWORK NICKLEN STD
116             # TOPICLEN WATCH
117 634         1359 $support->{$key} = $val;
118             }
119             }
120             else {
121 365 100       867 if (defined $self->{parser}->{$val}) {
122 180         599 $self->{parser}->{$val}->($support, $val);
123             }
124             else {
125             # ACCEPT CALLERID CAPAB CNOTICE CPRIVMSG FNC KNOCK MAXNICKLEN
126             # NAMESX NOQUIT PENALTY RFC2812 SAFELIST UHNAMES USERIP
127             # VCHANS WALLCHOPS WALLVOICES WHOX
128 185         692 $support->{$val} = 'on';
129             }
130             }
131             }
132              
133 181         603 $self->{got_005}++;
134 181         620 return PCI_EAT_NONE;
135             }
136              
137             sub _default {
138 3645     3645   998755 my ($self, $irc, $event) = @_;
139              
140 3645 100       10186 return PCI_EAT_NONE if $self->{done_005};
141 1319 100       3832 return PCI_EAT_NONE if !$self->{got_005};
142              
143 107 100 66     1186 if ($event =~ /^S_(\d+)/ and $1 > 5) {
144 90         230 $self->{done_005} = 1;
145 90         531 $irc->send_event_now(irc_isupport => $self);
146             }
147              
148 107         10861 return PCI_EAT_NONE;
149             }
150              
151             sub isupport {
152 2041     2041 1 5319 my $self = shift;
153 2041   50     4481 my $value = uc ( $_[0] ) || return;
154              
155 2041 100       7509 return $self->{server}->{$value} if defined $self->{server}->{$value};
156 425         1513 return;
157             }
158              
159             sub isupport_dump_keys {
160 1     1 1 1333 my $self = shift;
161              
162 1 50       2 if ( keys %{ $self->{server} } > 0 ) {
  1         7  
163 1         3 return keys %{ $self->{server} };
  1         8  
164             }
165 0           return;
166             }
167              
168             1;
169              
170             =encoding utf8
171              
172             =head1 NAME
173              
174             POE::Component::IRC::Plugin::ISupport - A PoCo-IRC plugin that handles server
175             capabilities
176              
177             =head1 DESCRIPTION
178              
179             This handles the C messages that come from the server. They
180             define the capabilities support by the server.
181              
182             =head1 METHODS
183              
184             =head2 C
185              
186             Takes no arguments.
187              
188             Returns a plugin object suitable for feeding to
189             L's C method.
190              
191             =head2 C
192              
193             Takes one argument. the server capability to query. Returns a false value on
194             failure or a value representing the applicable capability. A full list of
195             capabilities is available at L.
196              
197             =head2 C
198              
199             Takes no arguments, returns a list of the available server capabilities,
200             which can be used with C.
201              
202             =head1 INPUT
203              
204             This module handles the following PoCo-IRC signals:
205              
206             =head2 C (RPL_ISUPPORT or RPL_PROTOCTL)
207              
208             Denotes the capabilities of the server.
209              
210             =head2 C
211              
212             Once the next signal is received that is I than C,
213             it emits an C signal.
214              
215             =head1 OUTPUT EVENTS
216              
217             =head2 C
218              
219             Emitted by: the first signal received after C
220              
221             C will be the plugin object itself for ease of use.
222              
223             This is emitted when the support report has finished.
224              
225             =head1 AUTHOR
226              
227             Jeff C Pinyan, F
228              
229             =head1 SEE ALSO
230              
231             L
232              
233             L
234              
235             =cut