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 nick_to_name));
11 use Onis::Data::Persistent ();
12 use Onis::Plugins::Core (qw(get_core_nick_counters));
14 @Onis::Plugins::Bignumbers::EXPORT_OK = (qw(get_bignumbers));
15 @Onis::Plugins::Bignumbers::ISA = ('Exporter');
17 our $BigNumbers = Onis::Data::Persistent->new ('BigNumbers', 'nick', qw(questions uppercase smiley_happy smiley_sad));
20 register_plugin ('TEXT', \&add);
21 register_plugin ('ACTION', \&add);
22 register_plugin ('OUTPUT', \&output);
25 print STDERR $/, __FILE__, ": $VERSION" if ($::DEBUG);
33 my $nick = $data->{'nick'};
34 my $text = $data->{'text'};
38 my @nums = $BigNumbers->get ($nick);
51 if ((uc ($text) eq $text) and ($text =~ m/[A-Z]/))
57 if ($text =~ m/( |^)[;:]-?\)( |$)/)
63 if ($text =~ m/( |^):-?\(( |$)/)
71 $BigNumbers->put ($nick, @nums);
79 for ($BigNumbers->keys ())
82 my $main = get_main_nick ($nick);
83 my ($questions, $uppercase, $smiley_happy, $smiley_sad) = $BigNumbers->get ($nick);
85 next unless (defined ($smiley_sad));
87 if (!defined ($CalcData->{$main}))
89 my $core_data = get_core_nick_counters ($main);
90 next unless (%$core_data);
94 lines => $core_data->{'lines_total'},
95 words => $core_data->{'words_total'},
96 chars => $core_data->{'chars_total'},
104 $CalcData->{$main}{'questions'} += $questions;
105 $CalcData->{$main}{'uppercase'} += $uppercase;
106 $CalcData->{$main}{'smiley_happy'} += $smiley_happy;
107 $CalcData->{$main}{'smiley_sad'} += $smiley_sad;
119 my $fh = get_filehandle ();
121 $trans = translate ('Big Numbers');
123 <table class="plugin bignumbers">
128 ($first_nick, $second_nick) = sort_by_field ('questions');
131 my $percent = 100 * $CalcData->{$first_nick}{'questions'} / $CalcData->{$first_nick}{'lines'};
132 my $trans = translate ('questions0: %s %2.1f%%');
133 $first_name = nick_to_name ($first_nick) || $first_nick;
135 print $fh " <tr>\n <td>";
136 printf $fh ($trans, $first_name, $percent);
140 $percent = 100 * $CalcData->{$second_nick}{'questions'} / $CalcData->{$second_nick}{'lines'};
141 $trans = translate ('questions1: %s %2.1f%%');
142 $second_name = nick_to_name ($second_nick) || $second_nick;
144 print $fh "<br />\n",
145 qq# <span class="small">#;
146 printf $fh ($trans, $second_name, $percent);
150 print $fh "</td>\n </tr>\n";
153 ($first_nick, $second_nick) = sort_by_field ('uppercase');
156 my $percent = 100 * $CalcData->{$first_nick}{'uppercase'} / $CalcData->{$first_nick}{'lines'};
157 my $trans = translate ('yells0: %s %2.1f%%');
158 $first_name = nick_to_name ($first_nick) || $first_nick;
160 print $fh " <tr>\n <td>";
161 printf $fh ($trans, $first_name, $percent);
165 $percent = 100 * $CalcData->{$second_nick}{'uppercase'} / $CalcData->{$second_nick}{'lines'};
166 $trans = translate ('yells1: %s %2.1f%%');
167 $second_name = nick_to_name ($second_nick) || $second_nick;
169 print $fh "<br />\n",
170 qq# <span class="small">#;
171 printf $fh ($trans, $second_name, $percent);
175 print $fh "</td>\n </tr>\n";
178 ($first_nick, $second_nick) = sort_by_field ('smiley_happy');
181 my $percent = 100 * $CalcData->{$first_nick}{'smiley_happy'} / $CalcData->{$first_nick}{'lines'};
182 my $trans = translate ('happy0: %s %2.1f%%');
183 $first_name = nick_to_name ($first_nick) || $first_nick;
185 print $fh " <tr>\n <td>";
186 printf $fh ($trans, $first_name, $percent);
190 $percent = 100 * $CalcData->{$second_nick}{'smiley_happy'} / $CalcData->{$second_nick}{'lines'};
191 $trans = translate ('happy1: %s %2.1f%%');
192 $second_name = nick_to_name ($second_nick) || $second_nick;
194 print $fh "<br />\n",
195 qq# <span class="small">#;
196 printf $fh ($trans, $second_name, $percent);
200 print $fh "</td>\n </tr>\n";
203 ($first_nick, $second_nick) = sort_by_field ('smiley_sad');
206 my $percent = 100 * $CalcData->{$first_nick}{'smiley_sad'} / $CalcData->{$first_nick}{'lines'};
207 my $trans = translate ('sad0: %s %2.1f%%');
208 $first_name = nick_to_name ($first_nick) || $first_nick;
210 print $fh " <tr>\n <td>";
211 printf $fh ($trans, $first_name, $percent);
215 $percent = 100 * $CalcData->{$second_nick}{'smiley_sad'} / $CalcData->{$second_nick}{'lines'};
216 $trans = translate ('sad1: %s %2.1f%%');
217 $second_name = nick_to_name ($second_nick) || $second_nick;
219 print $fh "<br />\n",
220 qq# <span class="small">#;
221 printf $fh ($trans, $second_name, $percent);
225 print $fh "</td>\n </tr>\n";
229 my @names = sort_by_field ('chars');
241 $chan_chars += $CalcData->{$_}{'chars'} || 0;
242 $chan_lines += $CalcData->{$_}{'lines'} || 0;
247 $longest = shift (@names);
251 $longest2 = shift (@names);
255 $shortest = pop (@names);
259 $shortest2 = pop (@names);
264 my $avg = $CalcData->{$longest}{'chars'} / $CalcData->{$longest}{'lines'};
265 my $trans = translate ('max chars0: %s %1.1f');
266 $first_name = nick_to_name ($longest) || $longest;
268 print $fh " <tr>\n <td>";
269 printf $fh ($trans, $first_name, $avg);
273 $avg = $CalcData->{$longest2}{'chars'} / $CalcData->{$longest2}{'lines'};
274 $trans = translate ('max chars1: %s %1.1f');
275 $second_name = nick_to_name ($longest2) || $longest2;
277 print $fh "<br />\n",
278 qq# <span class="small">#;
279 printf $fh ($trans, $second_name, $avg);
283 $avg = $chan_chars / $chan_lines;
284 $trans = translate ('chars avg: %1.1f');
286 print $fh "<br />\n",
287 qq# <span class="small">#;
288 printf $fh ($trans, $avg);
289 print $fh "</span></td>\n </tr>\n";
294 my $avg = $CalcData->{$shortest}{'chars'} / $CalcData->{$shortest}{'lines'};
295 my $trans = translate ('min chars0: %s %1.1f');
296 $first_name = nick_to_name ($shortest) || $shortest;
298 print $fh " <tr>\n <td>";
299 printf $fh ($trans, $first_name, $avg);
303 $avg = $CalcData->{$shortest2}{'chars'} / $CalcData->{$shortest2}{'lines'};
304 $trans = translate ('min chars1: %s %1.1f');
305 $second_name = nick_to_name ($shortest2) || $shortest2;
307 print $fh "<br />\n",
308 qq# <span class="small">#;
309 printf $fh ($trans, $second_name, $avg);
312 print $fh "</td>\n </tr>\n";
317 my @names = sort_by_field ('words');
327 $chan_words += $CalcData->{$_}{'words'} || 0;
328 $chan_lines += $CalcData->{$_}{'lines'} || 0;
333 $first_nick = shift (@names);
337 $second_nick = shift (@names);
342 my $avg = $CalcData->{$first_nick}{'words'} / $CalcData->{$first_nick}{'lines'};
343 my $trans = translate ('max words0: %s %1.1f');
344 $first_name = nick_to_name ($first_nick) || $first_nick;
346 print $fh " <tr>\n <td>";
347 printf $fh ($trans, $first_name, $avg);
351 $avg = $CalcData->{$second_nick}{'words'} / $CalcData->{$second_nick}{'lines'};
352 $trans = translate ('max words1: %s %1.1f');
353 $second_name = nick_to_name ($second_nick) || $second_nick;
355 print $fh "<br />\n",
356 qq# <span class="small">#;
357 printf $fh ($trans, $second_name, $avg);
361 $avg = $chan_words / $chan_lines;
362 $trans = translate ('words avg: %1.1f');
364 print $fh "<br />\n",
365 qq# <span class="small">#;
366 printf $fh ($trans, $avg);
367 print $fh "</span></td>\n </tr>\n";
371 print $fh "</table>\n\n";
380 ($CalcData->{$b}{$field} / $CalcData->{$b}{'lines'})
382 ($CalcData->{$a}{$field} / $CalcData->{$a}{'lines'})
385 defined ($CalcData->{$_}{'lines'})
386 and ($CalcData->{$_}{'lines'} != 0)
387 and defined ($CalcData->{$_}{$field})
391 while (scalar (@retval) < 2)
403 if (!defined ($CalcData->{$nick}))
408 return ($CalcData->{$nick});