File Coverage

blib/lib/App/Pocosi/Status.pm
Criterion Covered Total %
statement 20 281 7.1
branch 0 62 0.0
condition n/a
subroutine 8 37 21.6
pod 0 25 0.0
total 28 405 6.9


line stmt bran cond sub pod time code
1             package App::Pocosi::Status;
2             BEGIN {
3 1     1   908 $App::Pocosi::Status::AUTHORITY = 'cpan:HINRIK';
4             }
5             BEGIN {
6 1     1   19 $App::Pocosi::Status::VERSION = '0.03';
7             }
8              
9 1     1   11 use strict;
  1         2  
  1         38  
10 1     1   7 use warnings FATAL => 'all';
  1         13  
  1         49  
11 1     1   5 use Carp;
  1         1  
  1         85  
12 1     1   912 use IRC::Utils qw(decode_irc strip_color strip_formatting numeric_to_name);
  1         35291  
  1         98  
13 1     1   896 use POE::Component::Server::IRC::Plugin qw(PCSI_EAT_NONE);
  1         298  
  1         47  
14 1     1   5 use Scalar::Util qw(looks_like_number);
  1         2  
  1         3157  
15              
16             sub new {
17 0     0 0   my ($package) = shift;
18 0 0         croak "$package requires an even number of arguments" if @_ & 1;
19 0           return bless { @_ }, $package;
20             }
21              
22             sub PCSI_register {
23 0     0 0   my ($self, $ircd, %args) = @_;
24 0           $ircd->raw_events(1);
25 0           $ircd->plugin_register($self, 'SERVER', 'all');
26 0           return 1;
27             }
28              
29             sub PCSI_unregister {
30 0     0 0   return 1;
31             }
32              
33             sub verbose {
34 0     0 0   my ($self, $value) = @_;
35 0           $self->{Verbose} = $value;
36 0           return;
37             }
38              
39             sub trace {
40 0     0 0   my ($self, $value) = @_;
41 0           $self->{Trace} = $value;
42 0           return;
43             }
44              
45             sub _normalize {
46 0     0     my ($line) = @_;
47 0           $line = decode_irc($line);
48 0           $line = strip_color($line);
49 0           $line = strip_formatting($line);
50 0           return $line;
51             }
52              
53             sub _dump {
54 0     0     my ($arg) = @_;
55              
56 0 0         if (ref $arg eq 'ARRAY') {
    0          
    0          
    0          
57 0           my @elems;
58 0           for my $elem (@$arg) {
59 0           push @elems, _dump($elem);
60             }
61 0           return '['. join(', ', @elems) .']';
62             }
63             elsif (ref $arg eq 'HASH') {
64 0           my @pairs;
65 0           for my $key (keys %$arg) {
66 0           push @pairs, [$key, _dump($arg->{$key})];
67             }
68 0           return '{'. join(', ', map { "$_->[0] => $_->[1]" } @pairs) .'}';
  0            
69             }
70             elsif (ref $arg) {
71 0           require overload;
72 0           return overload::StrVal($arg);
73             }
74             elsif (defined $arg) {
75 0 0         return $arg if looks_like_number($arg);
76 0           return "'".decode_irc($arg)."'";
77             }
78             else {
79 0           return 'undef';
80             }
81             }
82              
83             sub _event_debug {
84 0     0     my ($self, $ircd, $args, $event) = @_;
85              
86 0 0         if (!defined $event) {
87 0           $event = (caller(1))[3];
88 0           $event =~ s/.*:://;
89             }
90              
91 0           pop @$args;
92 0           my @output;
93 0           for my $i (0..$#{ $args }) {
  0            
94 0           push @output, "ARG$i: " . _dump(${ $args->[$i] });
  0            
95             }
96              
97             $ircd->send_event_next(
98 0           'ircd_plugin_status',
99             $self,
100             'debug',
101             "$event: ".join(', ', @output),
102             );
103 0           return;
104             }
105              
106             sub IRCD_connected {
107 0     0 0   my ($self, $ircd) = splice @_, 0, 2;
108 0           my $addr = ${ $_[1] };
  0            
109 0           my $port = ${ $_[2] };
  0            
110 0           my $peer = ${ $_[5] };
  0            
111              
112 0           my $msg = "Connected to peer $peer on $addr:$port";
113 0 0         $self->_event_debug($ircd, \@_) if $self->{Trace};
114 0           $ircd->send_event_next('ircd_plugin_status', $self, 'normal', $msg);
115 0           return PCSI_EAT_NONE;
116             }
117              
118             sub IRCD_socketerr {
119 0     0 0   my ($self, $ircd) = splice @_, 0, 2;
120 0           my $args = ${ $_[0] };
  0            
121 0           my $op = ${ $_[1] };
  0            
122 0           my $error = ${ $_[3] };
  0            
123 0           my $addr = $args->{remoteaddress};
124 0           my $port = $args->{remoteport};
125 0           my $peer = $args->{name};
126              
127 0           my $msg = "Failed to connect to peer $peer on $addr:$port. Operation $op failed: $error";
128 0 0         $self->_event_debug($ircd, \@_) if $self->{Trace};
129 0           $ircd->send_event_next('ircd_plugin_status', $self, 'normal', $msg);
130 0           return PCSI_EAT_NONE;
131             }
132              
133             sub IRCD_listener_add {
134 0     0 0   my ($self, $ircd) = splice @_, 0, 2;
135 0           my $port = ${ $_[0] };
  0            
136 0           my $addr = ${ $_[2] };
  0            
137              
138 0           my $msg = "Started listening on $addr:$port";
139 0 0         $self->_event_debug($ircd, \@_) if $self->{Trace};
140 0           $ircd->send_event_next('ircd_plugin_status', $self, 'normal', $msg);
141 0           return PCSI_EAT_NONE;
142             }
143              
144             sub IRCD_listener_del {
145 0     0 0   my ($self, $ircd) = splice @_, 0, 2;
146 0           my $port = ${ $_[0] };
  0            
147 0           my $addr = ${ $_[2] };
  0            
148              
149 0           my $msg = "Stopped listening on $addr:$port";
150 0 0         $self->_event_debug($ircd, \@_) if $self->{Trace};
151 0           $ircd->send_event_next('ircd_plugin_status', $self, 'normal', $msg);
152 0           return PCSI_EAT_NONE;
153             }
154              
155             sub IRCD_listener_failure {
156 0     0 0   my ($self, $ircd) = splice @_, 0, 2;
157 0           my $op = ${ $_[1] };
  0            
158 0           my $error = ${ $_[3] };
  0            
159 0           my $port = ${ $_[4] };
  0            
160 0           my $addr = ${ $_[5] };
  0            
161              
162 0 0         $self->_event_debug($ircd, \@_) if $self->{Trace};
163 0           $self->{Pocosi}->shutdown("Failed to listen on $addr:$port. Operation $op failed: $error");
164 0           return PCSI_EAT_NONE;
165             }
166              
167             sub IRCD_compressed_conn {
168 0     0 0   my ($self, $ircd) = splice @_, 0, 2;
169 0           my $id = ${ $_[0] };
  0            
170 0           my ($addr, $port) = $ircd->connection_info($id);
171              
172 0           my $msg = "Compressed connection to peer $addr:$port";
173 0 0         $self->_event_debug($ircd, \@_) if $self->{Trace};
174 0           $ircd->send_event_next('ircd_plugin_status', $self, 'normal', $msg);
175 0           return PCSI_EAT_NONE;
176             }
177              
178             sub IRCD_daemon_error {
179 0     0 0   my ($self, $ircd) = splice @_, 0, 2;
180 0           my $peer = ${ $_[1] };
  0            
181 0           my $reason = ${ $_[2] };
  0            
182              
183 0           my $msg = "Failed to register with peer $peer: $reason";
184 0 0         $self->_event_debug($ircd, \@_) if $self->{Trace};
185 0           $ircd->send_event_next('ircd_plugin_status', $self, 'normal', $msg);
186 0           return PCSI_EAT_NONE;
187             }
188              
189             sub IRCD_daemon_server {
190 0     0 0   my ($self, $ircd) = splice @_, 0, 2;
191 0           my $new_server = ${ $_[0] };
  0            
192 0           my $by_server = ${ $_[1] };
  0            
193 0           my $hops = ${ $_[2] };
  0            
194              
195 0           my $msg = "Server $new_server (hops: $hops) introduced to the network by $by_server";
196 0 0         $self->_event_debug($ircd, \@_) if $self->{Trace};
197 0           $ircd->send_event_next('ircd_plugin_status', $self, 'normal', $msg);
198 0           return PCSI_EAT_NONE;
199             }
200              
201             sub IRCD_daemon_squit {
202 0     0 0   my ($self, $ircd) = splice @_, 0, 2;
203 0           my $server = ${ $_[0] };
  0            
204              
205 0           my $msg = "Server $server quit from the network";
206 0 0         $self->_event_debug($ircd, \@_) if $self->{Trace};
207 0           $ircd->send_event_next('ircd_plugin_status', $self, 'normal', $msg);
208 0           return PCSI_EAT_NONE;
209             }
210              
211             sub IRCD_daemon_rehash {
212 0     0 0   my ($self, $ircd) = splice @_, 0, 2;
213 0           my $oper = ${ $_[0] };
  0            
214              
215 0           my $msg = "Operator $oper issued a REHASH";
216 0 0         $self->_event_debug($ircd, \@_) if $self->{Trace};
217 0           $ircd->send_event_next('ircd_plugin_status', $self, 'normal', $msg);
218 0           return PCSI_EAT_NONE;
219             }
220              
221             sub IRCD_daemon_die {
222 0     0 0   my ($self, $ircd) = splice @_, 0, 2;
223 0           my $oper = ${ $_[0] };
  0            
224              
225 0           my $msg = "Operator $oper issued a DIE";
226 0 0         $self->_event_debug($ircd, \@_) if $self->{Trace};
227 0           $ircd->send_event_next('ircd_plugin_status', $self, 'normal', $msg);
228 0           return PCSI_EAT_NONE;
229             }
230              
231             sub IRCD_daemon_gline {
232 0     0 0   my ($self, $ircd) = splice @_, 0, 2;
233 0           my $oper = ${ $_[0] };
  0            
234 0           my $u_mask = ${ $_[1] };
  0            
235 0           my $h_mask = ${ $_[2] };
  0            
236 0           my $reason = _normalize(${ $_[3] });
  0            
237              
238 0           my $msg = "Operator $oper set a GLINE on $u_mask\@$h_mask because: $reason";
239 0 0         $self->_event_debug($ircd, \@_) if $self->{Trace};
240 0           $ircd->send_event_next('ircd_plugin_status', $self, 'normal', $msg);
241 0           return PCSI_EAT_NONE;
242             }
243              
244             sub IRCD_daemon_kline {
245 0     0 0   my ($self, $ircd) = splice @_, 0, 2;
246 0           my $oper = ${ $_[0] };
  0            
247 0           my $target = ${ $_[1] };
  0            
248 0           my $secs = ${ $_[2] };
  0            
249 0           my $u_mask = ${ $_[3] };
  0            
250 0           my $h_mask = ${ $_[4] };
  0            
251 0           my $reason = _normalize(${ $_[5] });
  0            
252              
253 0           my $msg = "Operator $oper set a KLINE on $target ($u_mask\@$h_mask) for $secs seconds because: $reason";
254 0 0         $self->_event_debug($ircd, \@_) if $self->{Trace};
255 0           $ircd->send_event_next('ircd_plugin_status', $self, 'normal', $msg);
256 0           return PCSI_EAT_NONE;
257             }
258              
259             sub IRCD_daemon_rkline {
260 0     0 0   my ($self, $ircd) = splice @_, 0, 2;
261 0           my $oper = ${ $_[0] };
  0            
262 0           my $target = ${ $_[1] };
  0            
263 0           my $secs = ${ $_[2] };
  0            
264 0           my $u_mask = ${ $_[3] };
  0            
265 0           my $h_mask = ${ $_[4] };
  0            
266 0           my $reason = _normalize(${ $_[5] });
  0            
267              
268 0           my $msg = "Operator $oper set an RKLINE on $target ($u_mask\@$h_mask) for $secs seconds because: $reason";
269 0           $ircd->send_event_next('ircd_plugin_status', $self, 'normal', $msg);
270 0           return PCSI_EAT_NONE;
271             }
272              
273             sub IRCD_daemon_unkline {
274 0     0 0   my ($self, $ircd) = splice @_, 0, 2;
275 0           my $oper = ${ $_[0] };
  0            
276 0           my $target = ${ $_[1] };
  0            
277 0           my $u_mask = ${ $_[2] };
  0            
278 0           my $h_mask = ${ $_[3] };
  0            
279              
280 0           my $msg = "Operator $oper removed KLINE on $target ($u_mask\@$h_mask)";
281 0 0         $self->_event_debug($ircd, \@_) if $self->{Trace};
282 0           $ircd->send_event_next('ircd_plugin_status', $self, 'normal', $msg);
283 0           return PCSI_EAT_NONE;
284             }
285              
286             sub IRCD_daemon_locops {
287 0     0 0   my ($self, $ircd) = splice @_, 0, 2;
288 0           my $oper = ${ $_[0] };
  0            
289 0           my $message = _normalize(${ $_[0] });
  0            
290              
291 0           my $msg = "LOCOPS message from $oper: $message";
292 0 0         $self->_event_debug($ircd, \@_) if $self->{Trace};
293 0           $ircd->send_event_next('ircd_plugin_status', $self, 'normal', $msg);
294 0           return PCSI_EAT_NONE;
295             }
296              
297             sub IRCD_daemon_operwall {
298 0     0 0   my ($self, $ircd) = splice @_, 0, 2;
299 0           my $oper = ${ $_[0] };
  0            
300 0           my $message = _normalize(${ $_[0] });
  0            
301              
302 0           my $msg = "OPERWALL message from $oper: $message";
303 0 0         $self->_event_debug($ircd, \@_) if $self->{Trace};
304 0           $ircd->send_event_next('ircd_plugin_status', $self, 'normal', $msg);
305 0           return PCSI_EAT_NONE;
306             }
307              
308             sub IRCD_daemon_wallops {
309 0     0 0   my ($self, $ircd) = splice @_, 0, 2;
310 0           my $oper = ${ $_[0] };
  0            
311 0           my $message = _normalize(${ $_[0] });
  0            
312              
313 0           my $msg = "WALLOPS message from $oper: $message";
314 0 0         $self->_event_debug($ircd, \@_) if $self->{Trace};
315 0           $ircd->send_event_next('ircd_plugin_status', $self, 'normal', $msg);
316 0           return PCSI_EAT_NONE;
317             }
318              
319             sub IRCD_raw_input {
320 0     0 0   my ($self, $ircd) = splice @_, 0, 2;
321 0 0         return PCSI_EAT_NONE if !$self->{Verbose};
322 0           my $id = ${ $_[0] };
  0            
323 0           my $raw = _normalize(${ $_[1] });
  0            
324 0           $ircd->send_event_next('ircd_plugin_status', $self, 'debug', "<<< $id: $raw");
325 0           return PCSI_EAT_NONE;
326             }
327              
328             sub IRCD_raw_output {
329 0     0 0   my ($self, $ircd) = splice @_, 0, 2;
330 0 0         return PCSI_EAT_NONE if !$self->{Verbose};
331 0           my $id = ${ $_[0] };
  0            
332 0           my $raw = _normalize(${ $_[1] });
  0            
333 0           $ircd->send_event_next('ircd_plugin_status', $self, 'debug', ">>> $id: $raw");
334 0           return PCSI_EAT_NONE;
335             }
336              
337             sub _default {
338 0     0     my ($self, $ircd, $event) = splice @_, 0, 3;
339 0 0         return PCSI_EAT_NONE if !$self->{Trace};
340 0 0         return PCSI_EAT_NONE if $event =~ /^IRCD_plugin_/;
341              
342 0 0         if (my ($numeric) = $event =~ /^IRCD_cmd_(\d+)$/) {
343 0           my $name = numeric_to_name($numeric);
344 0 0         $event .= " ($name)" if defined $name;
345             }
346              
347 0 0         $self->_event_debug($ircd, \@_, $event) if $self->{Trace};
348 0           return PCSI_EAT_NONE;
349             }
350              
351             1;
352              
353             =encoding utf8
354              
355             =head1 NAME
356              
357             App::Pocosi::Status - A PoCo-Server-IRC plugin which logs IRC status
358              
359             =head1 DESCRIPTION
360              
361             This plugin is used internally by L. No need for
362             you to use it.
363              
364             =head1 AUTHOR
365              
366             Hinrik Ern SigurEsson, hinrik.sig@gmail.com
367              
368             =cut