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 '+')
131 my $nick = $data->{'nick'};
133 if ($nick eq $SoliloquiesNick)
137 if ($SoliloquiesCount == $SOLILOQUIES_COUNT)
139 my @data = get_or_empty ($nick);
141 $InterestingNumbersCache->put ($nick, @data);
146 $SoliloquiesNick = $nick;
147 $SoliloquiesCount = 1;
153 for ($InterestingNumbersCache->keys ())
156 my ($actions, $joins,
157 $kick_given, $kick_received,
158 $op_given, $op_taken,
159 $soliloquies) = $InterestingNumbersCache->get ($nick);
160 my $main = get_main_nick ($nick);
163 next unless (defined ($soliloquies)); # Person has not written a single line, eg. bots..
165 if (!defined ($InterestingNumbersData->{$main}))
167 $InterestingNumbersData->{$main} =
179 $InterestingNumbersData->{$main}{'actions'} += $actions;
180 $InterestingNumbersData->{$main}{'joins'} += $joins;
181 $InterestingNumbersData->{$main}{'kick_given'} += $kick_given;
182 $InterestingNumbersData->{$main}{'kick_received'} += $kick_received;
183 $InterestingNumbersData->{$main}{'op_given'} += $op_given;
184 $InterestingNumbersData->{$main}{'op_taken'} += $op_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});