1 package Onis::Plugins::Bignumbers;
8 use Onis::Html (qw(get_filehandle));
9 use Onis::Language (qw(translate));
10 use Onis::Data::Core (qw(get_main_nick register_plugin));
11 use Onis::Data::Persistent ();
12 use Onis::Users (qw(nick_to_name));
13 use Onis::Plugins::Core (qw(get_core_nick_counters));
15 @Onis::Plugins::Bignumbers::EXPORT_OK = (qw(get_bignumbers));
16 @Onis::Plugins::Bignumbers::ISA = ('Exporter');
18 our $BigNumbers = Onis::Data::Persistent->new ('BigNumbers', 'nick', qw(questions uppercase smiley_happy smiley_sad));
21 register_plugin ('TEXT', \&add);
22 register_plugin ('ACTION', \&add);
23 register_plugin ('OUTPUT', \&output);
26 print STDERR $/, __FILE__, ": $VERSION" if ($::DEBUG);
34 my $nick = $data->{'nick'};
35 my $text = $data->{'text'};
39 my @nums = $BigNumbers->get ($nick);
52 if ((uc ($text) eq $text) and ($text =~ m/[A-Z]/))
58 if ($text =~ m/( |^)[;:]-?\)( |$)/)
64 if ($text =~ m/( |^):-?\(( |$)/)
72 $BigNumbers->put ($nick, @nums);
80 for ($BigNumbers->keys ())
83 my $main = get_main_nick ($nick);
84 my ($questions, $uppercase, $smiley_happy, $smiley_sad) = $BigNumbers->get ($nick);
86 next unless (defined ($smiley_sad));
88 if (!defined ($CalcData->{$main}))
90 my $core_data = get_core_nick_counters ($main);
91 next unless (%$core_data);
95 lines => $core_data->{'lines_total'},
96 words => $core_data->{'words_total'},
97 chars => $core_data->{'chars_total'},
105 $CalcData->{$main}{'questions'} += $questions;
106 $CalcData->{$main}{'uppercase'} += $uppercase;
107 $CalcData->{$main}{'smiley_happy'} += $smiley_happy;
108 $CalcData->{$main}{'smiley_sad'} += $smiley_sad;
120 my $fh = get_filehandle ();
122 $trans = translate ('Big Numbers');
124 <table class="plugin bignumbers">
129 ($first_nick, $second_nick) = sort_by_field ('questions');
132 my $percent = 100 * $CalcData->{$first_nick}{'questions'} / $CalcData->{$first_nick}{'lines'};
133 my $trans = translate ('questions0: %s %2.1f%%');
134 $first_name = nick_to_name ($first_nick) || $first_nick;
136 print $fh " <tr>\n <td>";
137 printf $fh ($trans, $first_name, $percent);
141 $percent = 100 * $CalcData->{$second_nick}{'questions'} / $CalcData->{$second_nick}{'lines'};
142 $trans = translate ('questions1: %s %2.1f%%');
143 $second_name = nick_to_name ($second_nick) || $second_nick;
145 print $fh "<br />\n",
146 qq# <span class="small">#;
147 printf $fh ($trans, $second_name, $percent);
151 print $fh "</td>\n </tr>\n";
154 ($first_nick, $second_nick) = sort_by_field ('uppercase');
157 my $percent = 100 * $CalcData->{$first_nick}{'uppercase'} / $CalcData->{$first_nick}{'lines'};
158 my $trans = translate ('yells0: %s %2.1f%%');
159 $first_name = nick_to_name ($first_nick) || $first_nick;
161 print $fh " <tr>\n <td>";
162 printf $fh ($trans, $first_name, $percent);
166 $percent = 100 * $CalcData->{$second_nick}{'uppercase'} / $CalcData->{$second_nick}{'lines'};
167 $trans = translate ('yells1: %s %2.1f%%');
168 $second_name = nick_to_name ($second_nick) || $second_nick;
170 print $fh "<br />\n",
171 qq# <span class="small">#;
172 printf $fh ($trans, $second_name, $percent);
176 print $fh "</td>\n </tr>\n";
179 ($first_nick, $second_nick) = sort_by_field ('smiley_happy');
182 my $percent = 100 * $CalcData->{$first_nick}{'smiley_happy'} / $CalcData->{$first_nick}{'lines'};
183 my $trans = translate ('happy0: %s %2.1f%%');
184 $first_name = nick_to_name ($first_nick) || $first_nick;
186 print $fh " <tr>\n <td>";
187 printf $fh ($trans, $first_name, $percent);
191 $percent = 100 * $CalcData->{$second_nick}{'smiley_happy'} / $CalcData->{$second_nick}{'lines'};
192 $trans = translate ('happy1: %s %2.1f%%');
193 $second_name = nick_to_name ($second_nick) || $second_nick;
195 print $fh "<br />\n",
196 qq# <span class="small">#;
197 printf $fh ($trans, $second_name, $percent);
201 print $fh "</td>\n </tr>\n";
204 ($first_nick, $second_nick) = sort_by_field ('smiley_sad');
207 my $percent = 100 * $CalcData->{$first_nick}{'smiley_sad'} / $CalcData->{$first_nick}{'lines'};
208 my $trans = translate ('sad0: %s %2.1f%%');
209 $first_name = nick_to_name ($first_nick) || $first_nick;
211 print $fh " <tr>\n <td>";
212 printf $fh ($trans, $first_name, $percent);
216 $percent = 100 * $CalcData->{$second_nick}{'smiley_sad'} / $CalcData->{$second_nick}{'lines'};
217 $trans = translate ('sad1: %s %2.1f%%');
218 $second_name = nick_to_name ($second_nick) || $second_nick;
220 print $fh "<br />\n",
221 qq# <span class="small">#;
222 printf $fh ($trans, $second_name, $percent);
226 print $fh "</td>\n </tr>\n";
230 my @names = sort_by_field ('chars');
242 $chan_chars += $CalcData->{$_}{'chars'} || 0;
243 $chan_lines += $CalcData->{$_}{'lines'} || 0;
248 $longest = shift (@names);
252 $longest2 = shift (@names);
256 $shortest = pop (@names);
260 $shortest2 = pop (@names);
265 my $avg = $CalcData->{$longest}{'chars'} / $CalcData->{$longest}{'lines'};
266 my $trans = translate ('max chars0: %s %1.1f');
267 $first_name = nick_to_name ($longest) || $longest;
269 print $fh " <tr>\n <td>";
270 printf $fh ($trans, $first_name, $avg);
274 $avg = $CalcData->{$longest2}{'chars'} / $CalcData->{$longest2}{'lines'};
275 $trans = translate ('max chars1: %s %1.1f');
276 $second_name = nick_to_name ($longest2) || $longest2;
278 print $fh "<br />\n",
279 qq# <span class="small">#;
280 printf $fh ($trans, $second_name, $avg);
284 $avg = $chan_chars / $chan_lines;
285 $trans = translate ('chars avg: %1.1f');
287 print $fh "<br />\n",
288 qq# <span class="small">#;
289 printf $fh ($trans, $avg);
290 print $fh "</span></td>\n </tr>\n";
295 my $avg = $CalcData->{$shortest}{'chars'} / $CalcData->{$shortest}{'lines'};
296 my $trans = translate ('min chars0: %s %1.1f');
297 $first_name = nick_to_name ($shortest) || $shortest;
299 print $fh " <tr>\n <td>";
300 printf $fh ($trans, $first_name, $avg);
304 $avg = $CalcData->{$shortest2}{'chars'} / $CalcData->{$shortest2}{'lines'};
305 $trans = translate ('min chars1: %s %1.1f');
306 $second_name = nick_to_name ($shortest2) || $shortest2;
308 print $fh "<br />\n",
309 qq# <span class="small">#;
310 printf $fh ($trans, $second_name, $avg);
313 print $fh "</td>\n </tr>\n";
318 my @names = sort_by_field ('words');
328 $chan_words += $CalcData->{$_}{'words'} || 0;
329 $chan_lines += $CalcData->{$_}{'lines'} || 0;
334 $first_nick = shift (@names);
338 $second_nick = shift (@names);
343 my $avg = $CalcData->{$first_nick}{'words'} / $CalcData->{$first_nick}{'lines'};
344 my $trans = translate ('max words0: %s %1.1f');
345 $first_name = nick_to_name ($first_nick) || $first_nick;
347 print $fh " <tr>\n <td>";
348 printf $fh ($trans, $first_name, $avg);
352 $avg = $CalcData->{$second_nick}{'words'} / $CalcData->{$second_nick}{'lines'};
353 $trans = translate ('max words1: %s %1.1f');
354 $second_name = nick_to_name ($second_nick) || $second_nick;
356 print $fh "<br />\n",
357 qq# <span class="small">#;
358 printf $fh ($trans, $second_name, $avg);
362 $avg = $chan_words / $chan_lines;
363 $trans = translate ('words avg: %1.1f');
365 print $fh "<br />\n",
366 qq# <span class="small">#;
367 printf $fh ($trans, $avg);
368 print $fh "</span></td>\n </tr>\n";
372 print $fh "</table>\n\n";
381 ($CalcData->{$b}{$field} / $CalcData->{$b}{'lines'})
383 ($CalcData->{$a}{$field} / $CalcData->{$a}{'lines'})
386 defined ($CalcData->{$_}{'lines'})
387 and ($CalcData->{$_}{'lines'} != 0)
388 and defined ($CalcData->{$_}{$field})
392 while (scalar (@retval) < 2)
404 if (!defined ($CalcData->{$nick}))
409 return ($CalcData->{$nick});