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));
12 use Onis::Data::Persistent;
13 use Onis::Users (qw(nick_to_name));
15 @Onis::Plugins::Interestingnumbers::EXPORT_OK = (qw(get_interestingnumbers));
16 @Onis::Plugins::Interestingnumbers::ISA = ('Exporter');
18 register_plugin ('ACTION', \&add_action);
19 register_plugin ('JOIN', \&add_join);
20 register_plugin ('KICK', \&add_kick);
21 register_plugin ('MODE', \&add_mode);
22 register_plugin ('TEXT', \&add_text);
23 register_plugin ('OUTPUT', \&output);
25 our $InterestingNumbersCache = Onis::Data::Persistent->new ('InterestingNumbersCache', 'nick',
26 qw(actions joins kicks_given kicks_received ops_given ops_taken soliloquies));
27 our $InterestingNumbersData = {};
29 our $SoliloquiesNick = '';
30 our $SoliloquiesCount = 0;
32 our $SOLILOQUIES_COUNT = 5;
33 if (get_config ('soliloquies_count'))
35 my $tmp = get_config ('soliloquies_count');
38 $SOLILOQUIES_COUNT = $tmp if ($tmp);
42 print STDERR $/, __FILE__, ": $VERSION" if ($::DEBUG);
49 my @data = $InterestingNumbersCache->get ($nick);
50 @data = (0, 0, 0, 0, 0, 0) unless (@data);
57 my $nick = $data->{'nick'};
59 my @data = get_or_empty ($nick);
61 $InterestingNumbersCache->put ($nick, @data);
67 my $nick = $data->{'nick'};
69 my @data = get_or_empty ($nick);
71 $InterestingNumbersCache->put ($nick, @data);
78 my $nick_g = $data->{'nick'};
79 my $nick_r = $data->{'nick_received'};
81 my @data = get_or_empty ($nick_g);
83 $InterestingNumbersCache->put ($nick_g, @data);
85 @data = get_or_empty ($nick_r);
87 $InterestingNumbersCache->put ($nick_r, @data);
94 my $nick = $data->{'nick'};
95 my $text = $data->{'mode'};
97 my ($mode) = split (m/\s+/, $text);
100 for (split (m//, $mode))
103 if (($tmp eq '-') or ($tmp eq '+'))
109 next unless ($modifier);
113 my @data = get_or_empty ($nick);
114 if ($modifier eq '-')
118 else # ($modifier eq '+')
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 $kicks_given, $kicks_received,
159 $ops_given, $ops_taken,
160 $soliloquies) = $InterestingNumbersCache->get ($nick);
161 my $main = get_main_nick ($nick);
165 if (!defined ($InterestingNumbersData->{$main}))
167 $InterestingNumbersData->{$main} =
179 $InterestingNumbersData->{$main}{'actions'} += $actions;
180 $InterestingNumbersData->{$main}{'joins'} += $joins;
181 $InterestingNumbersData->{$main}{'kicks_given'} += $kicks_given;
182 $InterestingNumbersData->{$main}{'kicks_received'} += $kicks_received;
183 $InterestingNumbersData->{$main}{'ops_given'} += $ops_given;
184 $InterestingNumbersData->{$main}{'ops_taken'} += $ops_taken;
185 $InterestingNumbersData->{$main}{'soliloquies'} += $soliloquies;
201 my $fh = get_filehandle ();
203 my $trans = translate ('Interesting Numbers');
206 <table class="plugin interestingnumbers">
211 ($first_nick, $second_nick) = sort_by_field ('kick_received');
214 my $num = $InterestingNumbersData->{$first_nick}{'kick_received'};
215 $trans = translate ('kick_received0: %s %u');
216 $first_name = nick_to_name ($first_nick) || $first_nick;
218 print $fh " <tr>\n <td>";
219 printf $fh ($trans, $first_nick, $num);
223 $num = $InterestingNumbersData->{$second_nick}{'kick_received'};
224 $trans = translate ('kick_received1: %s %u');
225 $second_name = nick_to_name ($second_nick) || $second_nick;
227 print $fh "<br />\n",
228 qq# <span class="small">#;
229 printf $fh ($trans, $second_nick, $num);
233 print $fh "</td>\n </tr>\n";
236 ($first_nick, $second_nick) = sort_by_field ('kick_given');
239 my $num = $InterestingNumbersData->{$first_nick}{'kick_given'};
240 $trans = translate ('kick_given0: %s %u');
241 $first_name = nick_to_name ($first_nick) || $first_nick;
243 print $fh " <tr>\n <td>";
244 printf $fh ($trans, $first_name, $num);
248 $num = $InterestingNumbersData->{$second_nick}{'kick_given'};
249 $trans = translate ('kick_given1: %s %u');
250 $second_name = nick_to_name ($second_nick) || $second_nick;
252 print $fh "<br />\n",
253 qq# <span class="small">#;
254 printf $fh ($trans, $second_name, $num);
258 print $fh "</td>\n </tr>\n";
261 ($first_nick, $second_nick) = sort_by_field ('op_given');
264 my $num = $InterestingNumbersData->{$first_nick}{'op_given'};
265 $trans = translate ('op_given0: %s %u');
266 $first_name = nick_to_name ($first_nick) || $first_nick;
268 print $fh " <tr>\n <td>";
269 printf $fh ($trans, $first_name, $num);
273 $num = $InterestingNumbersData->{$second_nick}{'op_given'};
274 $trans = translate ('op_given1: %s %u');
275 $second_name = nick_to_name ($second_nick) || $second_nick;
277 print $fh "<br />\n",
278 qq# <span class="small">#;
279 printf $fh ($trans, $second_name, $num);
283 print $fh "</td>\n </tr>\n";
286 ($first_nick, $second_nick) = sort_by_field ('op_taken');
289 my $num = $InterestingNumbersData->{$first_nick}{'op_taken'};
290 $trans = translate ('op_taken0: %s %u');
291 $first_name = nick_to_name ($first_nick) || $first_nick;
293 print $fh " <tr>\n <td>";
294 printf $fh ($trans, $first_name, $num);
298 $num = $InterestingNumbersData->{$second_nick}{'op_taken'};
299 $trans = translate ('op_taken1: %s %u');
300 $second_name = nick_to_name ($second_nick) || $second_nick;
302 print $fh "<br />\n",
303 qq# <span class="small">#;
304 printf $fh ($trans, $second_name, $num);
308 print $fh "</td>\n </tr>\n";
311 ($first_nick, $second_nick) = sort_by_field ('actions');
314 my $num = $InterestingNumbersData->{$first_nick}{'actions'};
315 $trans = translate ('action0: %s %u');
316 $first_name = nick_to_name ($first_nick) || $first_nick;
318 print $fh " <tr>\n <td>";
319 printf $fh ($trans, $first_name, $num);
323 $num = $InterestingNumbersData->{$second_nick}{'actions'};
324 $trans = translate ('action1: %s %u');
325 $second_name = nick_to_name ($second_nick) || $second_nick;
327 print $fh "<br />\n",
328 qq# <span class="small">#;
329 printf $fh ($trans, $second_name, $num);
333 print $fh "</td>\n </tr>\n";
336 ($first_nick, $second_nick) = sort_by_field ('soliloquies');
339 my $num = $InterestingNumbersData->{$first_nick}{'soliloquies'};
340 $trans = translate ('soliloquies0: %s %u');
341 $first_name = nick_to_name ($first_nick) || $first_nick;
343 print $fh " <tr>\n <td>";
344 printf $fh ($trans, $first_name, $num);
348 $num = $InterestingNumbersData->{$second_nick}{'soliloquies'};
349 $trans = translate ('soliloquies1: %s %u');
350 $second_name = nick_to_name ($second_nick) || $second_nick;
352 print $fh "<br />\n",
353 qq# <span class="small">#;
354 printf $fh ($trans, $second_name, $num);
358 print $fh "</td>\n </tr>\n";
361 ($first_nick, $second_nick) = sort_by_field ('joins');
364 my $num = $InterestingNumbersData->{$first_nick}{'joins'};
365 $trans = translate ('joins0: %s %u');
366 $first_name = nick_to_name ($first_nick) || $first_nick;
368 print $fh " <tr>\n <td>";
369 printf $fh ($trans, $first_name, $num);
373 $num = $InterestingNumbersData->{$second_nick}{'joins'};
374 $trans = translate ('joins1: %s %u');
375 $second_name = nick_to_name ($second_nick) || $second_nick;
377 print $fh "<br />\n",
378 qq# <span class="small">#;
379 printf $fh ($trans, $second_name, $num);
383 print $fh "</td>\n </tr>\n";
386 print $fh "</table>\n\n";
395 $InterestingNumbersData->{$b}{$field}
397 $InterestingNumbersData->{$a}{$field}
398 } (keys (%$InterestingNumbersData));
400 while (scalar (@retval) < 2)
408 sub get_interestingnumbers
412 if (defined ($InterestingNumbersData->{$nick}))
417 return ($InterestingNumbersData->{$nick});