1 package Onis::Plugins::Interestingnumbers;
8 use Onis::Config (qw(get_config));
9 use Onis::Html (qw(html_escape get_filehandle));
10 use Onis::Language (qw(translate));
11 use Onis::Data::Core (qw(register_plugin get_main_nick nick_to_name));
12 use Onis::Data::Persistent;
14 @Onis::Plugins::Interestingnumbers::EXPORT_OK = (qw(get_interestingnumbers));
15 @Onis::Plugins::Interestingnumbers::ISA = ('Exporter');
17 register_plugin ('ACTION', \&add_action);
18 register_plugin ('JOIN', \&add_join);
19 register_plugin ('KICK', \&add_kick);
20 register_plugin ('MODE', \&add_mode);
21 register_plugin ('TEXT', \&add_text);
22 register_plugin ('OUTPUT', \&output);
24 our $InterestingNumbersCache = Onis::Data::Persistent->new ('InterestingNumbersCache', 'nick',
25 qw(actions joins kick_given kick_received op_given op_taken soliloquies));
26 our $InterestingNumbersData = {};
28 our $SoliloquiesNick = '';
29 our $SoliloquiesCount = 0;
31 our $SOLILOQUIES_COUNT = 5;
32 if (get_config ('soliloquies_count'))
34 my $tmp = get_config ('soliloquies_count');
37 $SOLILOQUIES_COUNT = $tmp if ($tmp);
41 print STDERR $/, __FILE__, ": $VERSION" if ($::DEBUG);
48 my @data = $InterestingNumbersCache->get ($nick);
49 @data = (0, 0, 0, 0, 0, 0, 0) unless (@data);
56 my $nick = $data->{'nick'};
58 my @data = get_or_empty ($nick);
60 $InterestingNumbersCache->put ($nick, @data);
66 my $nick = $data->{'nick'};
68 my @data = get_or_empty ($nick);
70 $InterestingNumbersCache->put ($nick, @data);
77 my $nick_g = $data->{'nick'};
78 my $nick_r = $data->{'nick_received'};
80 my @data = get_or_empty ($nick_g);
82 $InterestingNumbersCache->put ($nick_g, @data);
84 @data = get_or_empty ($nick_r);
86 $InterestingNumbersCache->put ($nick_r, @data);
93 my $nick = $data->{'nick'};
94 my $text = $data->{'mode'};
96 my ($mode) = split (m/\s+/, $text);
99 for (split (m//, $mode))
102 if (($tmp eq '-') or ($tmp eq '+'))
108 next unless ($modifier);
112 my @data = get_or_empty ($nick);
113 if ($modifier eq '-')
117 else # ($modifier eq '+')
121 $InterestingNumbersCache->put ($nick, @data);
132 my $nick = $data->{'nick'};
134 if ($nick eq $SoliloquiesNick)
138 if ($SoliloquiesCount == $SOLILOQUIES_COUNT)
140 my @data = get_or_empty ($nick);
142 $InterestingNumbersCache->put ($nick, @data);
147 $SoliloquiesNick = $nick;
148 $SoliloquiesCount = 1;
154 for ($InterestingNumbersCache->keys ())
157 my ($actions, $joins,
158 $kick_given, $kick_received,
159 $op_given, $op_taken,
160 $soliloquies) = $InterestingNumbersCache->get ($nick);
161 my $main = get_main_nick ($nick);
164 next unless (defined ($soliloquies)); # Person has not written a single line, eg. bots..
166 if (!defined ($InterestingNumbersData->{$main}))
168 $InterestingNumbersData->{$main} =
180 $InterestingNumbersData->{$main}{'actions'} += $actions;
181 $InterestingNumbersData->{$main}{'joins'} += $joins;
182 $InterestingNumbersData->{$main}{'kick_given'} += $kick_given;
183 $InterestingNumbersData->{$main}{'kick_received'} += $kick_received;
184 $InterestingNumbersData->{$main}{'op_given'} += $op_given;
185 $InterestingNumbersData->{$main}{'op_taken'} += $op_taken;
186 $InterestingNumbersData->{$main}{'soliloquies'} += $soliloquies;
202 my $fh = get_filehandle ();
204 my $trans = translate ('Interesting Numbers');
207 <table class="plugin interestingnumbers">
212 ($first_nick, $second_nick) = sort_by_field ('kick_received');
215 my $num = $InterestingNumbersData->{$first_nick}{'kick_received'};
216 $trans = translate ('kick_received0: %s %u');
217 $first_name = nick_to_name ($first_nick) || $first_nick;
219 print $fh " <tr>\n <td>";
220 printf $fh ($trans, $first_nick, $num);
224 $num = $InterestingNumbersData->{$second_nick}{'kick_received'};
225 $trans = translate ('kick_received1: %s %u');
226 $second_name = nick_to_name ($second_nick) || $second_nick;
228 print $fh "<br />\n",
229 qq# <span class="small">#;
230 printf $fh ($trans, $second_nick, $num);
234 print $fh "</td>\n </tr>\n";
237 ($first_nick, $second_nick) = sort_by_field ('kick_given');
240 my $num = $InterestingNumbersData->{$first_nick}{'kick_given'};
241 $trans = translate ('kick_given0: %s %u');
242 $first_name = nick_to_name ($first_nick) || $first_nick;
244 print $fh " <tr>\n <td>";
245 printf $fh ($trans, $first_name, $num);
249 $num = $InterestingNumbersData->{$second_nick}{'kick_given'};
250 $trans = translate ('kick_given1: %s %u');
251 $second_name = nick_to_name ($second_nick) || $second_nick;
253 print $fh "<br />\n",
254 qq# <span class="small">#;
255 printf $fh ($trans, $second_name, $num);
259 print $fh "</td>\n </tr>\n";
262 ($first_nick, $second_nick) = sort_by_field ('op_given');
265 my $num = $InterestingNumbersData->{$first_nick}{'op_given'};
266 $trans = translate ('op_given0: %s %u');
267 $first_name = nick_to_name ($first_nick) || $first_nick;
269 print $fh " <tr>\n <td>";
270 printf $fh ($trans, $first_name, $num);
274 $num = $InterestingNumbersData->{$second_nick}{'op_given'};
275 $trans = translate ('op_given1: %s %u');
276 $second_name = nick_to_name ($second_nick) || $second_nick;
278 print $fh "<br />\n",
279 qq# <span class="small">#;
280 printf $fh ($trans, $second_name, $num);
284 print $fh "</td>\n </tr>\n";
287 ($first_nick, $second_nick) = sort_by_field ('op_taken');
290 my $num = $InterestingNumbersData->{$first_nick}{'op_taken'};
291 $trans = translate ('op_taken0: %s %u');
292 $first_name = nick_to_name ($first_nick) || $first_nick;
294 print $fh " <tr>\n <td>";
295 printf $fh ($trans, $first_name, $num);
299 $num = $InterestingNumbersData->{$second_nick}{'op_taken'};
300 $trans = translate ('op_taken1: %s %u');
301 $second_name = nick_to_name ($second_nick) || $second_nick;
303 print $fh "<br />\n",
304 qq# <span class="small">#;
305 printf $fh ($trans, $second_name, $num);
309 print $fh "</td>\n </tr>\n";
312 ($first_nick, $second_nick) = sort_by_field ('actions');
315 my $num = $InterestingNumbersData->{$first_nick}{'actions'};
316 $trans = translate ('action0: %s %u');
317 $first_name = nick_to_name ($first_nick) || $first_nick;
319 print $fh " <tr>\n <td>";
320 printf $fh ($trans, $first_name, $num);
324 $num = $InterestingNumbersData->{$second_nick}{'actions'};
325 $trans = translate ('action1: %s %u');
326 $second_name = nick_to_name ($second_nick) || $second_nick;
328 print $fh "<br />\n",
329 qq# <span class="small">#;
330 printf $fh ($trans, $second_name, $num);
334 print $fh "</td>\n </tr>\n";
337 ($first_nick, $second_nick) = sort_by_field ('soliloquies');
340 my $num = $InterestingNumbersData->{$first_nick}{'soliloquies'};
341 $trans = translate ('soliloquies0: %s %u');
342 $first_name = nick_to_name ($first_nick) || $first_nick;
344 print $fh " <tr>\n <td>";
345 printf $fh ($trans, $first_name, $num);
349 $num = $InterestingNumbersData->{$second_nick}{'soliloquies'};
350 $trans = translate ('soliloquies1: %s %u');
351 $second_name = nick_to_name ($second_nick) || $second_nick;
353 print $fh "<br />\n",
354 qq# <span class="small">#;
355 printf $fh ($trans, $second_name, $num);
359 print $fh "</td>\n </tr>\n";
362 ($first_nick, $second_nick) = sort_by_field ('joins');
365 my $num = $InterestingNumbersData->{$first_nick}{'joins'};
366 $trans = translate ('joins0: %s %u');
367 $first_name = nick_to_name ($first_nick) || $first_nick;
369 print $fh " <tr>\n <td>";
370 printf $fh ($trans, $first_name, $num);
374 $num = $InterestingNumbersData->{$second_nick}{'joins'};
375 $trans = translate ('joins1: %s %u');
376 $second_name = nick_to_name ($second_nick) || $second_nick;
378 print $fh "<br />\n",
379 qq# <span class="small">#;
380 printf $fh ($trans, $second_name, $num);
384 print $fh "</td>\n </tr>\n";
387 print $fh "</table>\n\n";
396 $InterestingNumbersData->{$b}{$field}
398 $InterestingNumbersData->{$a}{$field}
399 } (keys (%$InterestingNumbersData));
401 while (scalar (@retval) < 2)
409 sub get_interestingnumbers
413 if (!defined ($InterestingNumbersData->{$nick}))
418 return ($InterestingNumbersData->{$nick});