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 nick_is_in_main_table));
16 Onis::Plugins::Bignumbers - Information about nick specific channel
21 This plugins detects questions, yelled text (all uppercase), (happy and sad)
22 smileys, characters and words per line. It stores this information for each
23 nick and prints a table containing the most significant nicks in each category.
27 @Onis::Plugins::Bignumbers::EXPORT_OK = (qw(get_bignumbers));
28 @Onis::Plugins::Bignumbers::ISA = ('Exporter');
30 our $BigNumbers = Onis::Data::Persistent->new ('BigNumbers', 'nick', qw(questions uppercase smiley_happy smiley_sad));
33 register_plugin ('TEXT', \&add);
34 register_plugin ('ACTION', \&add);
35 register_plugin ('OUTPUT', \&output);
38 print STDERR $/, __FILE__, ": $VERSION" if ($::DEBUG);
46 my $nick = $data->{'nick'};
47 my $text = $data->{'text'};
51 my @nums = $BigNumbers->get ($nick);
64 if ((uc ($text) eq $text) and ($text =~ m/[A-Z]/))
70 if ($text =~ m/( |^)[;:]-?\)( |$)/)
76 if ($text =~ m/( |^):-?\(( |$)/)
84 $BigNumbers->put ($nick, @nums);
92 for ($BigNumbers->keys ())
95 my $main = get_main_nick ($nick);
96 my ($questions, $uppercase, $smiley_happy, $smiley_sad) = $BigNumbers->get ($nick);
98 next unless (defined ($smiley_sad));
100 if (!defined ($CalcData->{$main}))
102 my $core_data = get_core_nick_counters ($main);
103 next unless (%$core_data);
107 lines => $core_data->{'lines_total'},
108 words => $core_data->{'words_total'},
109 chars => $core_data->{'chars_total'},
117 $CalcData->{$main}{'questions'} += $questions;
118 $CalcData->{$main}{'uppercase'} += $uppercase;
119 $CalcData->{$main}{'smiley_happy'} += $smiley_happy;
120 $CalcData->{$main}{'smiley_sad'} += $smiley_sad;
134 my $fh = get_filehandle ();
136 $trans = translate ('Big Numbers');
138 <table class="plugin bignumbers">
143 ($first_nick, $second_nick) = sort_by_field ('questions');
146 my $percent = 100 * $CalcData->{$first_nick}{'questions'} / $CalcData->{$first_nick}{'lines'};
147 my $trans = translate ('questions0: %s %2.1f%%');
148 $first_name = nick_to_name ($first_nick) || $first_nick;
150 print $fh " <tr>\n <td>";
151 printf $fh ($trans, $first_name, $percent);
155 $percent = 100 * $CalcData->{$second_nick}{'questions'} / $CalcData->{$second_nick}{'lines'};
156 $trans = translate ('questions1: %s %2.1f%%');
157 $second_name = nick_to_name ($second_nick) || $second_nick;
159 print $fh "<br />\n",
160 qq# <span class="small">#;
161 printf $fh ($trans, $second_name, $percent);
165 print $fh "</td>\n </tr>\n";
168 ($first_nick, $second_nick) = sort_by_field ('uppercase');
171 my $percent = 100 * $CalcData->{$first_nick}{'uppercase'} / $CalcData->{$first_nick}{'lines'};
172 my $trans = translate ('yells0: %s %2.1f%%');
173 $first_name = nick_to_name ($first_nick) || $first_nick;
175 print $fh " <tr>\n <td>";
176 printf $fh ($trans, $first_name, $percent);
180 $percent = 100 * $CalcData->{$second_nick}{'uppercase'} / $CalcData->{$second_nick}{'lines'};
181 $trans = translate ('yells1: %s %2.1f%%');
182 $second_name = nick_to_name ($second_nick) || $second_nick;
184 print $fh "<br />\n",
185 qq# <span class="small">#;
186 printf $fh ($trans, $second_name, $percent);
190 print $fh "</td>\n </tr>\n";
193 ($first_nick, $second_nick) = sort_by_field ('smiley_happy');
196 my $percent = 100 * $CalcData->{$first_nick}{'smiley_happy'} / $CalcData->{$first_nick}{'lines'};
197 my $trans = translate ('happy0: %s %2.1f%%');
198 $first_name = nick_to_name ($first_nick) || $first_nick;
200 print $fh " <tr>\n <td>";
201 printf $fh ($trans, $first_name, $percent);
205 $percent = 100 * $CalcData->{$second_nick}{'smiley_happy'} / $CalcData->{$second_nick}{'lines'};
206 $trans = translate ('happy1: %s %2.1f%%');
207 $second_name = nick_to_name ($second_nick) || $second_nick;
209 print $fh "<br />\n",
210 qq# <span class="small">#;
211 printf $fh ($trans, $second_name, $percent);
215 print $fh "</td>\n </tr>\n";
218 ($first_nick, $second_nick) = sort_by_field ('smiley_sad');
221 my $percent = 100 * $CalcData->{$first_nick}{'smiley_sad'} / $CalcData->{$first_nick}{'lines'};
222 my $trans = translate ('sad0: %s %2.1f%%');
223 $first_name = nick_to_name ($first_nick) || $first_nick;
225 print $fh " <tr>\n <td>";
226 printf $fh ($trans, $first_name, $percent);
230 $percent = 100 * $CalcData->{$second_nick}{'smiley_sad'} / $CalcData->{$second_nick}{'lines'};
231 $trans = translate ('sad1: %s %2.1f%%');
232 $second_name = nick_to_name ($second_nick) || $second_nick;
234 print $fh "<br />\n",
235 qq# <span class="small">#;
236 printf $fh ($trans, $second_name, $percent);
240 print $fh "</td>\n </tr>\n";
244 my @names = sort_by_field ('chars');
256 $chan_chars += $CalcData->{$_}{'chars'} || 0;
257 $chan_lines += $CalcData->{$_}{'lines'} || 0;
262 $longest = shift (@names);
266 $longest2 = shift (@names);
270 $shortest = pop (@names);
274 $shortest2 = pop (@names);
279 my $avg = $CalcData->{$longest}{'chars'} / $CalcData->{$longest}{'lines'};
280 my $trans = translate ('max chars0: %s %1.1f');
281 $first_name = nick_to_name ($longest) || $longest;
283 print $fh " <tr>\n <td>";
284 printf $fh ($trans, $first_name, $avg);
288 $avg = $CalcData->{$longest2}{'chars'} / $CalcData->{$longest2}{'lines'};
289 $trans = translate ('max chars1: %s %1.1f');
290 $second_name = nick_to_name ($longest2) || $longest2;
292 print $fh "<br />\n",
293 qq# <span class="small">#;
294 printf $fh ($trans, $second_name, $avg);
298 $avg = $chan_chars / $chan_lines;
299 $trans = translate ('chars avg: %1.1f');
301 print $fh "<br />\n",
302 qq# <span class="small">#;
303 printf $fh ($trans, $avg);
304 print $fh "</span></td>\n </tr>\n";
309 my $avg = $CalcData->{$shortest}{'chars'} / $CalcData->{$shortest}{'lines'};
310 my $trans = translate ('min chars0: %s %1.1f');
311 $first_name = nick_to_name ($shortest) || $shortest;
313 print $fh " <tr>\n <td>";
314 printf $fh ($trans, $first_name, $avg);
318 $avg = $CalcData->{$shortest2}{'chars'} / $CalcData->{$shortest2}{'lines'};
319 $trans = translate ('min chars1: %s %1.1f');
320 $second_name = nick_to_name ($shortest2) || $shortest2;
322 print $fh "<br />\n",
323 qq# <span class="small">#;
324 printf $fh ($trans, $second_name, $avg);
327 print $fh "</td>\n </tr>\n";
332 my @names = sort_by_field ('words');
342 $chan_words += $CalcData->{$_}{'words'} || 0;
343 $chan_lines += $CalcData->{$_}{'lines'} || 0;
348 $first_nick = shift (@names);
352 $second_nick = shift (@names);
357 my $avg = $CalcData->{$first_nick}{'words'} / $CalcData->{$first_nick}{'lines'};
358 my $trans = translate ('max words0: %s %1.1f');
359 $first_name = nick_to_name ($first_nick) || $first_nick;
361 print $fh " <tr>\n <td>";
362 printf $fh ($trans, $first_name, $avg);
366 $avg = $CalcData->{$second_nick}{'words'} / $CalcData->{$second_nick}{'lines'};
367 $trans = translate ('max words1: %s %1.1f');
368 $second_name = nick_to_name ($second_nick) || $second_nick;
370 print $fh "<br />\n",
371 qq# <span class="small">#;
372 printf $fh ($trans, $second_name, $avg);
376 $avg = $chan_words / $chan_lines;
377 $trans = translate ('words avg: %1.1f');
379 print $fh "<br />\n",
380 qq# <span class="small">#;
381 printf $fh ($trans, $avg);
382 print $fh "</span></td>\n </tr>\n";
386 print $fh "</table>\n\n";
395 ($CalcData->{$b}{$field} / $CalcData->{$b}{'lines'})
397 ($CalcData->{$a}{$field} / $CalcData->{$a}{'lines'})
400 defined ($CalcData->{$_}{'lines'})
401 and ($CalcData->{$_}{'lines'} != 0)
402 and defined ($CalcData->{$_}{$field})
403 and (nick_is_in_main_table ($_) > 0)
407 while (scalar (@retval) < 2)
415 =head1 EXPORTED FUNCTIONS
419 =item B<get_bignumbers> (I<$nick>)
421 Returns all the data that was used to calculate the bignumbers-data for this
422 nick. It's a hash-ref with the following fields. Each field holds a counter
423 that counts the total occurences of that "event".
439 if (!defined ($CalcData->{$nick}))
444 return ($CalcData->{$nick});
451 Florian Forster E<lt>octo at verplant.orgE<gt>