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;
121 my $fh = get_filehandle ();
123 $trans = translate ('Big Numbers');
125 <table class="plugin bignumbers">
130 ($first_nick, $second_nick) = sort_by_field ('questions');
133 my $percent = 100 * $CalcData->{$first_nick}{'questions'} / $CalcData->{$first_nick}{'lines'};
134 my $trans = translate ('questions0: %s %2.1f%%');
135 $first_name = nick_to_name ($first_nick) || $first_nick;
137 print $fh " <tr>\n <td>";
138 printf $fh ($trans, $first_name, $percent);
142 $percent = 100 * $CalcData->{$second_nick}{'questions'} / $CalcData->{$second_nick}{'lines'};
143 $trans = translate ('questions1: %s %2.1f%%');
144 $second_name = nick_to_name ($second_nick) || $second_nick;
146 print $fh "<br />\n",
147 qq# <span class="small">#;
148 printf $fh ($trans, $second_name, $percent);
152 print $fh "</td>\n </tr>\n";
155 ($first_nick, $second_nick) = sort_by_field ('uppercase');
158 my $percent = 100 * $CalcData->{$first_nick}{'uppercase'} / $CalcData->{$first_nick}{'lines'};
159 my $trans = translate ('yells0: %s %2.1f%%');
160 $first_name = nick_to_name ($first_nick) || $first_nick;
162 print $fh " <tr>\n <td>";
163 printf $fh ($trans, $first_name, $percent);
167 $percent = 100 * $CalcData->{$second_nick}{'uppercase'} / $CalcData->{$second_nick}{'lines'};
168 $trans = translate ('yells1: %s %2.1f%%');
169 $second_name = nick_to_name ($second_nick) || $second_nick;
171 print $fh "<br />\n",
172 qq# <span class="small">#;
173 printf $fh ($trans, $second_name, $percent);
177 print $fh "</td>\n </tr>\n";
180 ($first_nick, $second_nick) = sort_by_field ('smiley_happy');
183 my $percent = 100 * $CalcData->{$first_nick}{'smiley_happy'} / $CalcData->{$first_nick}{'lines'};
184 my $trans = translate ('happy0: %s %2.1f%%');
185 $first_name = nick_to_name ($first_nick) || $first_nick;
187 print $fh " <tr>\n <td>";
188 printf $fh ($trans, $first_name, $percent);
192 $percent = 100 * $CalcData->{$second_nick}{'smiley_happy'} / $CalcData->{$second_nick}{'lines'};
193 $trans = translate ('happy1: %s %2.1f%%');
194 $second_name = nick_to_name ($second_nick) || $second_nick;
196 print $fh "<br />\n",
197 qq# <span class="small">#;
198 printf $fh ($trans, $second_name, $percent);
202 print $fh "</td>\n </tr>\n";
205 ($first_nick, $second_nick) = sort_by_field ('smiley_sad');
208 my $percent = 100 * $CalcData->{$first_nick}{'smiley_sad'} / $CalcData->{$first_nick}{'lines'};
209 my $trans = translate ('sad0: %s %2.1f%%');
210 $first_name = nick_to_name ($first_nick) || $first_nick;
212 print $fh " <tr>\n <td>";
213 printf $fh ($trans, $first_name, $percent);
217 $percent = 100 * $CalcData->{$second_nick}{'smiley_sad'} / $CalcData->{$second_nick}{'lines'};
218 $trans = translate ('sad1: %s %2.1f%%');
219 $second_name = nick_to_name ($second_nick) || $second_nick;
221 print $fh "<br />\n",
222 qq# <span class="small">#;
223 printf $fh ($trans, $second_name, $percent);
227 print $fh "</td>\n </tr>\n";
231 my @names = sort_by_field ('chars');
243 $chan_chars += $CalcData->{$_}{'chars'} || 0;
244 $chan_lines += $CalcData->{$_}{'lines'} || 0;
249 $longest = shift (@names);
253 $longest2 = shift (@names);
257 $shortest = pop (@names);
261 $shortest2 = pop (@names);
266 my $avg = $CalcData->{$longest}{'chars'} / $CalcData->{$longest}{'lines'};
267 my $trans = translate ('max chars0: %s %1.1f');
268 $first_name = nick_to_name ($longest) || $longest;
270 print $fh " <tr>\n <td>";
271 printf $fh ($trans, $first_name, $avg);
275 $avg = $CalcData->{$longest2}{'chars'} / $CalcData->{$longest2}{'lines'};
276 $trans = translate ('max chars1: %s %1.1f');
277 $second_name = nick_to_name ($longest2) || $longest2;
279 print $fh "<br />\n",
280 qq# <span class="small">#;
281 printf $fh ($trans, $second_name, $avg);
285 $avg = $chan_chars / $chan_lines;
286 $trans = translate ('chars avg: %1.1f');
288 print $fh "<br />\n",
289 qq# <span class="small">#;
290 printf $fh ($trans, $avg);
291 print $fh "</span></td>\n </tr>\n";
296 my $avg = $CalcData->{$shortest}{'chars'} / $CalcData->{$shortest}{'lines'};
297 my $trans = translate ('min chars0: %s %1.1f');
298 $first_name = nick_to_name ($shortest) || $shortest;
300 print $fh " <tr>\n <td>";
301 printf $fh ($trans, $first_name, $avg);
305 $avg = $CalcData->{$shortest2}{'chars'} / $CalcData->{$shortest2}{'lines'};
306 $trans = translate ('min chars1: %s %1.1f');
307 $second_name = nick_to_name ($shortest2) || $shortest2;
309 print $fh "<br />\n",
310 qq# <span class="small">#;
311 printf $fh ($trans, $second_name, $avg);
314 print $fh "</td>\n </tr>\n";
319 my @names = sort_by_field ('words');
329 $chan_words += $CalcData->{$_}{'words'} || 0;
330 $chan_lines += $CalcData->{$_}{'lines'} || 0;
335 $first_nick = shift (@names);
339 $second_nick = shift (@names);
344 my $avg = $CalcData->{$first_nick}{'words'} / $CalcData->{$first_nick}{'lines'};
345 my $trans = translate ('max words0: %s %1.1f');
346 $first_name = nick_to_name ($first_nick) || $first_nick;
348 print $fh " <tr>\n <td>";
349 printf $fh ($trans, $first_name, $avg);
353 $avg = $CalcData->{$second_nick}{'words'} / $CalcData->{$second_nick}{'lines'};
354 $trans = translate ('max words1: %s %1.1f');
355 $second_name = nick_to_name ($second_nick) || $second_nick;
357 print $fh "<br />\n",
358 qq# <span class="small">#;
359 printf $fh ($trans, $second_name, $avg);
363 $avg = $chan_words / $chan_lines;
364 $trans = translate ('words avg: %1.1f');
366 print $fh "<br />\n",
367 qq# <span class="small">#;
368 printf $fh ($trans, $avg);
369 print $fh "</span></td>\n </tr>\n";
373 print $fh "</table>\n\n";
382 ($CalcData->{$b}{$field} / $CalcData->{$b}{'lines'})
384 ($CalcData->{$a}{$field} / $CalcData->{$a}{'lines'})
387 defined ($CalcData->{$_}{'lines'})
388 and ($CalcData->{$_}{'lines'} != 0)
389 and defined ($CalcData->{$_}{$field})
393 while (scalar (@retval) < 2)
405 if (!defined ($CalcData->{$nick}))
410 return ($CalcData->{$nick});