1 package Onis::Plugins::Userdetails;
6 use Onis::Config (qw(get_config));
7 use Onis::Html (qw(html_escape get_filehandle));
8 use Onis::Language (qw(translate));
9 use Onis::Data::Core (qw(get_main_nick register_plugin nick_to_name get_most_recent_time));
10 use Onis::Users (qw(get_link get_image));
12 use Onis::Plugins::Core (qw(get_core_nick_counters get_sorted_nicklist));
13 use Onis::Plugins::Weekdays (qw(get_weekdays));
14 use Onis::Plugins::Longterm (qw(get_longterm));
15 use Onis::Plugins::Conversations (qw(get_conversations));
16 use Onis::Plugins::Bignumbers (qw(get_bignumbers));
17 use Onis::Plugins::Interestingnumbers (qw(get_interestingnumbers));
19 our $DISPLAY_IMAGES = 0;
20 our $DEFAULT_IMAGE = '';
22 register_plugin ('OUTPUT', \&output);
24 our $SORT_BY = 'lines';
25 if (get_config ('sort_by'))
27 my $tmp = get_config ('sort_by');
30 if (($tmp eq 'lines') or ($tmp eq 'words') or ($tmp eq 'chars'))
36 # The Core plugin already complained about this..
40 if (get_config ('plugin_max'))
42 my $tmp = get_config ('plugin_max');
44 $PLUGIN_MAX = $tmp if ($tmp);
46 if (get_config ('display_images'))
48 my $tmp = get_config ('display_images');
50 if ($tmp =~ m/true|on|yes/i)
54 elsif ($tmp =~ m/false|off|no/i)
60 print STDERR $/, __FILE__, ": ``display_times'' has been set to the invalid value ``$tmp''. ",
61 $/, __FILE__, ": Valid values are ``true'' and ``false''. Using default value ``false''.";
64 if (get_config ('default_image'))
66 $DEFAULT_IMAGE = get_config ('default_image');
69 our @H_IMAGES = qw#dark-theme/h-red.png dark-theme/h-blue.png dark-theme/h-yellow.png dark-theme/h-green.png#;
70 if (get_config ('horizontal_images'))
72 my @tmp = get_config ('horizontal_images');
75 if (scalar (@tmp) != 4)
78 # The core-pligin already complained about this..
81 for ($i = 0; $i < 4; $i++)
83 if (!defined ($tmp[$i]))
88 $H_IMAGES[$i] = $tmp[$i];
92 our @V_IMAGES = qw#images/ver0n.png images/ver1n.png images/ver2n.png images/ver3n.png#;
93 if (get_config ('vertical_images'))
95 my @tmp = get_config ('vertical_images');
98 if (scalar (@tmp) != 4)
101 # Hopefully someone complained by now..
104 for ($i = 0; $i < 4; $i++)
106 if (!defined ($tmp[$i]))
111 $V_IMAGES[$i] = $tmp[$i];
115 our $BAR_HEIGHT = 130;
116 if (get_config ('bar_height'))
118 my $tmp = get_config ('bar_height');
120 $BAR_HEIGHT = $tmp if ($tmp >= 10);
122 #$BAR_HEIGHT = int ($BAR_HEIGHT / 2);
124 our $BAR_WIDTH = 100;
125 if (get_config ('bar_width'))
127 my $tmp = get_config ('bar_width');
129 $BAR_WIDTH = $tmp if ($tmp >= 10);
132 our $LongtermDays = 7;
133 if (get_config ('userdetails_longterm_days'))
135 my $tmp = get_config ('userdetails_longterm_days');
137 $LongtermDays = $tmp if ($tmp);
140 my $VERSION = '$Id: Userdetails.pm,v 1.5 2005/03/14 18:40:25 octo Exp $';
141 print STDERR $/, __FILE__, ": $VERSION" if ($::DEBUG);
147 my $nicks_ref = get_sorted_nicklist ();
149 my $fh = get_filehandle ();
151 my $trans = translate ('Detailed nick stats');
156 my $max_weekdays = 0;
157 my $max_longterm = 0;
159 my @nicks = @$nicks_ref;
162 splice (@nicks, $PLUGIN_MAX) if (scalar (@nicks) > $PLUGIN_MAX);
168 $nick_data->{$nick} = get_core_nick_counters ($nick);
169 $nick_data->{$nick}{'weekdays'} = get_weekdays ($nick);
170 $nick_data->{$nick}{'longterm'} = get_longterm ($nick);
171 $nick_data->{$nick}{'conversations'} = get_conversations ($nick);
172 $nick_data->{$nick}{'bignumbers'} = get_bignumbers ($nick);
173 $nick_data->{$nick}{'interestingnumbers'} = get_interestingnumbers ($nick);
175 for (my $i = 0; $i < 24; $i++)
177 $num = $nick_data->{$nick}{'chars'}[$i];
178 $max_time = $num if ($max_time < $num);
181 for (keys %{$nick_data->{$nick}{'conversations'}})
184 my $ptr = $nick_data->{$nick}{'conversations'}{$other}{'nicks'}{$nick};
185 $num = $ptr->[0] + $ptr->[1] + $ptr->[2] + $ptr->[3];
186 $max_conv = $num if ($max_conv < $num);
189 for (keys %{$nick_data->{$nick}{'weekdays'}})
191 my $ptr = $nick_data->{$nick}{'weekdays'}{$_};
192 for (my $i = 0; $i < 4; $i++)
194 $max_weekdays = $ptr->[$i] if ($max_weekdays < $ptr->[$i]);
198 if (@{$nick_data->{$nick}{'longterm'}})
200 my $num = scalar (@{$nick_data->{$nick}{'longterm'}});
201 $LongtermDays = $num if ($LongtermDays > $num);
203 for (my $i = $num - $LongtermDays; $i < $num; $i++)
205 my $ptr = $nick_data->{$nick}{'longterm'}[$i];
207 for (my $j = 0; $j < 4; $j++)
209 $max_longterm = $ptr->[$j] if ($max_longterm < $ptr->[$j]);
215 print $fh qq#<table class="plugin userdetails">\n#,
217 qq# <th colspan="#, $DISPLAY_IMAGES ? 4 : 3, qq#">$trans</th>\n#,
223 my $name = nick_to_name ($nick);
224 my $print = $name ? $name : $nick;
225 my $ptr = $nick_data->{$nick};
227 print $fh qq# <tr>\n#,
228 qq# <th colspan="#, $DISPLAY_IMAGES ? 4 : 3, qq#" class="nick">$print</th>\n#,
234 my $link = get_link ($name);
235 my $image = get_image ($name);
237 if ($DEFAULT_IMAGE and !$image)
239 $image = $DEFAULT_IMAGE;
242 print $fh qq# <td class="image" rowspan="2">#;
247 print $fh qq#<a href="$link">#;
249 print $fh qq#<img src="$image" alt="$print" />#;
262 print $fh qq# <td class="counters">\n#;
269 $lines = $ptr->{'lines_total'};
270 $trans = translate ('Has written %u lines');
271 printf $fh (" $trans<br />\n", $lines);
273 $words = $ptr->{'words_total'};
274 $trans = translate ('Has written %u words');
275 printf $fh (" $trans<br />\n", $words);
277 $chars = $ptr->{'chars_total'};
278 $trans = translate ('Has written %u chars');
279 printf $fh (" $trans<br />\n", $chars);
283 $num = $words / $lines;
284 $trans = translate ('Has written %.1f words per line');
285 printf $fh (" $trans<br />\n", $num);
287 $num = $chars / $lines;
288 $trans = translate ('Has written %.1f characters per line');
289 printf $fh (" $trans<br />\n", $num);
292 print $fh qq# </td>\n <td class="numbers">\n#;
294 if (%{$ptr->{'interestingnumbers'}})
296 $trans = translate ('Has given %u ops');
297 printf $fh (" $trans<br />\n", $ptr->{'interestingnumbers'}{'op_given'});
299 $trans = translate ('Has taken %u ops');
300 printf $fh (" $trans<br />\n", $ptr->{'interestingnumbers'}{'op_taken'});
302 $trans = translate ('Has kicked out %u people');
303 printf $fh (" $trans<br />\n", $ptr->{'interestingnumbers'}{'kick_given'});
305 $trans = translate ('Has been kicked out %u times');
306 printf $fh (" $trans<br />\n", $ptr->{'interestingnumbers'}{'kick_received'});
308 $trans = translate ('Has performed %u actions');
309 printf $fh (" $trans<br />\n", $ptr->{'interestingnumbers'}{'actions'});
312 if (%{$ptr->{'bignumbers'}})
314 $num = 100 * $ptr->{'bignumbers'}{'questions'} / $ptr->{'lines_total'};
315 $trans = translate ("Question ratio: %.1f%%");
316 printf $fh (" $trans<br />\n", $num);
318 $num = 100 * $ptr->{'bignumbers'}{'uppercase'} / $ptr->{'lines_total'};
319 $trans = translate ("Uppercase ratio: %.1f%%");
320 printf $fh (" $trans<br />\n", $num);
322 $num = 100 * $ptr->{'bignumbers'}{'smiley_happy'} / $ptr->{'lines_total'};
323 $trans = translate ("Happy smiley ratio: %.1f%%");
324 printf $fh (" $trans<br />\n", $num);
326 $num = 100 * $ptr->{'bignumbers'}{'smiley_sad'} / $ptr->{'lines_total'};
327 $trans = translate ("Sad smiley ratio: %.1f%%");
328 printf $fh (" $trans<br />\n", $num);
331 print $fh qq# </td>\n <td>\n#;
333 if (%{$ptr->{'conversations'}})
338 ($ptr->{'conversations'}{$b}{'nicks'}{$nick}[0]
339 + $ptr->{'conversations'}{$b}{'nicks'}{$nick}[1]
340 + $ptr->{'conversations'}{$b}{'nicks'}{$nick}[2]
341 + $ptr->{'conversations'}{$b}{'nicks'}{$nick}[3])
343 ($ptr->{'conversations'}{$a}{'nicks'}{$nick}[0]
344 + $ptr->{'conversations'}{$a}{'nicks'}{$nick}[1]
345 + $ptr->{'conversations'}{$a}{'nicks'}{$nick}[2]
346 + $ptr->{'conversations'}{$a}{'nicks'}{$nick}[3])
348 (keys %{$ptr->{'conversations'}});
350 $trans = translate ('Talks to');
353 <table class="conversations">
355 <td colspan="2">$trans:</td>
359 for (my $i = 0; $i < $PLUGIN_MAX and $i < scalar (@others); $i++)
361 my $other = $others[$i];
362 my $other_name = nick_to_name ($other) || $other;
366 qq# <td class="nick right">$other_name</td>\n#,
367 qq# <td class="bar horizontal right">#;
369 for (my $k = 0; $k < 4; $k++)
371 my $img = $H_IMAGES[$k];
372 my $num = $ptr->{'conversations'}{$other}{'nicks'}{$nick}[$k];
373 my $width = sprintf ("%.2f", 95 * $num / $max_conv);
375 print $fh qq#<img src="$img" alt="" #;
378 print $fh qq#class="first" #;
382 print $fh qq#class="last" #;
384 print $fh qq#style="width: $width\%;" />#;
387 print $fh "</td>\n </tr>\n";
390 print $fh " </table>\n";
396 print $fh qq# </td>\n </tr>\n#,
399 if (defined ($ptr->{'chars'}))
401 print $fh qq# <table class="hours">\n <tr class="bars">\n#;
403 for (my $i = 0; $i < 24; $i++)
407 my $img = $V_IMAGES[int ($i / 6)];
410 $num = $ptr->{'chars'}[$i];
412 $height = sprintf ("%.2f", 95 * $num / $max_time);
414 print $fh qq# <td class="bar vertical"><img src="$img" alt="$num chars" #,
415 qq#class="first last" style="height: $height\%;" /></td>\n#;
420 <tr class="numeration">
421 <td colspan="6" class="numeration">0-5</td>
422 <td colspan="6" class="numeration">6-11</td>
423 <td colspan="6" class="numeration">12-17</td>
424 <td colspan="6" class="numeration">18-23</td>
431 print $fh " \n";
434 print $fh qq# </td>\n <td>\n#;
437 if (%{$nick_data->{$nick}{'weekdays'}})
439 my $data = $nick_data->{$nick}{'weekdays'};
440 my @days = (qw(mon tue wed thu fri sat sun));
442 print $fh qq# <table class="weekdays">\n#,
443 qq# <tr class="bars">\n#;
448 for (my $i = 0; $i < 4; $i++)
450 my $num = $nick_data->{$nick}{'weekdays'}{$day}[$i];
451 my $height = sprintf ("%.2f", 95 * $num / $max_weekdays);
452 my $img = $V_IMAGES[$i];
454 print $fh qq# <td class="bar vertical">#,
455 qq#<img src="$img" alt="" class="first last" style="height: $height\%;" />#,
460 print $fh qq# </tr>\n#,
461 qq# <tr class="numeration">\n#;
466 my $trans = translate ($day);
468 print $fh qq# <td colspan="4" class="numeration $day">$trans</td>\n#;
471 print $fh qq# </tr>\n#,
476 print $fh " \n";
479 print $fh qq# </td>\n <td>\n#;
482 if (@{$nick_data->{$nick}{'longterm'}})
484 my $num_fields = scalar (@{$nick_data->{$nick}{'longterm'}});
485 my $now_epoch = get_most_recent_time ();
486 my $now_day = int ($now_epoch / 86400);
489 my @weekdays = (qw(sun mon tue wed thu fri sat));
491 $LongtermDays = $num_fields if ($LongtermDays > $num_fields);
492 $last_day = 1 + $now_day - $LongtermDays;
494 print $fh qq# <table class="longterm">\n#,
495 qq# <tr class="bars">\n#;
497 for (my $i = $num_fields - $LongtermDays; $i < $num_fields; $i++)
499 for (my $j = 0; $j < 4; $j++)
501 my $num = $nick_data->{$nick}{'longterm'}[$i][$j];
502 my $height = sprintf ("%.2f", 95 * $num / $max_longterm);
503 my $img = $V_IMAGES[$j];
505 print $fh qq# <td class="bar vertical">#,
506 qq#<img src="$img" alt="" class="first last" style="height: $height\%;" />#,
511 print $fh qq# </tr>\n#,
512 qq# <tr class="numeration">\n#;
514 for (my $i = 0; $i < $LongtermDays; $i++)
516 my $epoch = ($last_day + $i) * 86400;
517 my ($day, $wd) = (localtime ($epoch))[3,6];
518 $wd = $weekdays[$wd];
520 print $fh qq# <td colspan="4" class="numeration $wd">$day.</td>\n#;
523 print $fh qq# </tr>\n#,
528 print $fh " \n";
531 print $fh qq# </td>\n </tr>\n#;
534 print $fh "</table>\n\n";