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));
10 use Onis::Users (qw(ident_to_name get_link get_image));
12 use Onis::Plugin::Core (qw(get_core_nick_counters));
13 use Onis::Plugin::Conversations (qw(get_conversations));
15 our $DISPLAY_IMAGES = 0;
16 our $DEFAULT_IMAGE = '';
18 register_plugin ('OUTPUT', \&output);
20 our $SORT_BY = 'lines';
21 if (get_config ('sort_by'))
23 my $tmp = get_config ('sort_by');
26 if (($tmp eq 'lines') or ($tmp eq 'words') or ($tmp eq 'chars'))
32 # The Core plugin already complained about this..
36 if (get_config ('plugin_max'))
38 my $tmp = get_config ('plugin_max');
40 $PLUGIN_MAX = $tmp if ($tmp);
42 if (get_config ('display_images'))
44 my $tmp = get_config ('display_images');
46 if ($tmp =~ m/true|on|yes/i)
50 elsif ($tmp =~ m/false|off|no/i)
56 print STDERR $/, __FILE__, ": ``display_times'' has been set to the invalid value ``$tmp''. ",
57 $/, __FILE__, ": Valid values are ``true'' and ``false''. Using default value ``false''.";
60 if (get_config ('default_image'))
62 $DEFAULT_IMAGE = get_config ('default_image');
65 our @H_IMAGES = qw#dark-theme/h-red.png dark-theme/h-blue.png dark-theme/h-yellow.png dark-theme/h-green.png#;
66 if (get_config ('horizontal_images'))
68 my @tmp = get_config ('horizontal_images');
71 if (scalar (@tmp) != 4)
74 # The core-pligin already complained about this..
77 for ($i = 0; $i < 4; $i++)
79 if (!defined ($tmp[$i]))
84 $H_IMAGES[$i] = $tmp[$i];
88 our @V_IMAGES = qw#images/ver0n.png images/ver1n.png images/ver2n.png images/ver3n.png#;
89 if (get_config ('vertical_images'))
91 my @tmp = get_config ('vertical_images');
94 if (scalar (@tmp) != 4)
97 # Hopefully someone complained by now..
100 for ($i = 0; $i < 4; $i++)
102 if (!defined ($tmp[$i]))
107 $V_IMAGES[$i] = $tmp[$i];
111 our $BAR_HEIGHT = 130;
112 if (get_config ('bar_height'))
114 my $tmp = get_config ('bar_height');
116 $BAR_HEIGHT = $tmp if ($tmp >= 10);
118 #$BAR_HEIGHT = int ($BAR_HEIGHT / 2);
120 our $BAR_WIDTH = 100;
121 if (get_config ('bar_width'))
123 my $tmp = get_config ('bar_width');
125 $BAR_WIDTH = $tmp if ($tmp >= 10);
128 my $VERSION = '$Id: Userdetails.pm,v 1.5 2005/03/14 18:40:25 octo Exp $';
129 print STDERR $/, __FILE__, ": $VERSION" if ($::DEBUG);
135 my $nicks_ref = get_sorted_nicklist ();
137 my $max = $PLUGIN_MAX;
139 my $fh = get_filehandle ();
141 my $trans = translate ('Detailed nick stats');
147 my @nicks = $nicks_ref->[0 .. ($max - 1)];
154 $nick_data->{$nick} = get_core_nick_counters ($nick);
155 $nick_data->{$nick}{'conversations'} = get_conversations ($nick);
157 if (defined ($DATA->{'byname'}{$name}{'chars_time'}))
161 next unless (defined ($DATA->{'byname'}{$name}{'chars_time'}{$_}));
162 if ($DATA->{'byname'}{$name}{'chars_time'}{$_} > $max_time)
164 $max_time = $DATA->{'byname'}{$name}{'chars_time'}{$_};
168 if (defined ($DATA->{'byname'}{$name}{'conversations'}))
170 my @others = keys (%{$DATA->{'byname'}{$name}{'conversations'}});
178 $num += $DATA->{'byname'}{$name}{'conversations'}{$o}[$_];
181 if ($num > $max_conv)
194 $time_factor = $BAR_HEIGHT / $max_time;
199 $conv_factor = $BAR_WIDTH / $max_conv;
202 print $fh qq#<table class="plugin userdetails">\n#,
204 qq# <th colspan="#, $DISPLAY_IMAGES ? 3 : 2, qq#">$trans</th>\n#,
211 print $fh qq# <tr>\n#,
212 qq# <th colspan="#, $DISPLAY_IMAGES ? 3 : 2, qq#" class="nick">$name</th>\n#,
218 my $link = get_link ($name);
219 my $image = get_image ($name);
221 if ($DEFAULT_IMAGE and !$image)
223 $image = $DEFAULT_IMAGE;
226 print $fh qq# <td class="image" rowspan="2">#;
231 print $fh qq#<a href="$link">#;
233 print $fh qq#<img src="$image" alt="$name" />#;
246 print $fh qq# <td class="counters">\n#;
248 $num = $DATA->{'byname'}{$name}{'lines'};
249 $trans = translate ('Has written %u lines');
250 printf $fh (" $trans<br />\n", $num);
252 $num = $DATA->{'byname'}{$name}{'words'};
253 $trans = translate ('Has written %u words');
254 printf $fh (" $trans<br />\n", $num);
256 $num = $DATA->{'byname'}{$name}{'chars'};
257 $trans = translate ('Has written %u chars');
258 printf $fh (" $trans<br />\n", $num);
260 if ($DATA->{'byname'}{$name}{'lines'})
262 $num = $DATA->{'byname'}{$name}{'words'} / $DATA->{'byname'}{$name}{'lines'};
263 $trans = translate ('Has written %.1f words per line');
264 printf $fh (" $trans<br />\n", $num);
266 $num = $DATA->{'byname'}{$name}{'chars'} / $DATA->{'byname'}{$name}{'lines'};
267 $trans = translate ('Has written %.1f characters per line');
268 printf $fh (" $trans<br />\n", $num);
271 print $fh qq# </td>\n <td class="numbers">\n#;
273 if (defined ($DATA->{'byname'}{$name}{'op_given'}))
275 $num = $DATA->{'byname'}{$name}{'op_given'};
276 $trans = translate ('Has given %u ops');
278 printf $fh (" $trans<br />\n", $num);
281 if (defined ($DATA->{'byname'}{$name}{'op_taken'}))
283 $num = $DATA->{'byname'}{$name}{'op_taken'};
284 $trans = translate ('Has taken %u ops');
286 printf $fh (" $trans<br />\n", $num);
289 if (defined ($DATA->{'byname'}{$name}{'kick_given'}))
291 $num = $DATA->{'byname'}{$name}{'kick_given'};
292 $trans = translate ('Has kicked out %u people');
294 printf $fh (" $trans<br />\n", $num);
297 if (defined ($DATA->{'byname'}{$name}{'kick_received'}))
299 $num = $DATA->{'byname'}{$name}{'kick_received'};
300 $trans = translate ('Has been kicked out %u times');
302 printf $fh (" $trans<br />\n", $num);
305 if (defined ($DATA->{'byname'}{$name}{'questions'}))
307 $num = 100 * $DATA->{'byname'}{$name}{'questions'} / $DATA->{'byname'}{$name}{'lines'};
308 $trans = translate ("Question ratio: %.1f%%");
310 printf $fh (" $trans<br />\n", $num);
313 if (defined ($DATA->{'byname'}{$name}{'topics'}))
315 $num = $DATA->{'byname'}{$name}{'topics'};
316 $trans = translate ('Has set %u topics');
318 printf $fh (" $trans<br />\n", $num);
321 if (defined ($DATA->{'byname'}{$name}{'actions'}))
323 $num = $DATA->{'byname'}{$name}{'actions'};
324 $trans = translate ('Has performed %u actions');
326 printf $fh (" $trans<br />\n", $num);
330 # exclamation ratio # TODO
336 print $fh qq# </td>\n </tr>\n <tr>\n <td class="houractivity">\n#;
338 if (defined ($DATA->{'byname'}{$name}{'chars_time'}))
340 print $fh qq# <table class="hours_of_day">\n <tr>\n#;
347 my $img = $V_IMAGES[int ($hour / 6)];
350 if (defined ($DATA->{'byname'}{$name}{'chars_time'}{$hour}))
352 $num = $DATA->{'byname'}{$name}{'chars_time'}{$hour};
354 if (defined ($DATA->{'byname'}{$name}{'chars_time'}{1 + $hour}))
356 $num = $DATA->{'byname'}{$name}{'chars_time'}{1 + $hour};
359 $height = int (0.5 + ($time_factor * $num));
365 print $fh qq# <td><img src="$img" alt="$num chars" #,
366 qq#style="height: ${height}px;" /></td>\n#;
371 <tr class="hour_row">
372 <td colspan="3">0-5</td>
373 <td colspan="3">6-11</td>
374 <td colspan="3">12-17</td>
375 <td colspan="3">18-23</td>
385 print $fh qq# </td>\n <td class="convpartners">\n#;
387 if (defined ($DATA->{'byname'}{$name}{'conversations'}))
390 my $data = $DATA->{'byname'}{$name}{'conversations'};
393 ($data->{$b}[0] + $data->{$b}[1] + $data->{$b}[2] + $data->{$b}[3])
395 ($data->{$a}[0] + $data->{$a}[1] + $data->{$a}[2] + $data->{$a}[3])
399 $trans = translate ('Talks to');
404 <td colspan="2">$trans:</td>
415 qq# <td class="nick">$this_name</td>\n#,
416 qq# <td class="bar">#;
422 my $img = $H_IMAGES[$k];
423 my $width = int (0.5 + ($conv_factor * $data->{$this_name}[$_]));
429 print $fh qq#<img src="$img" alt="" #;
432 print $fh qq#class="first" #;
436 print $fh qq#class="last" #;
438 print $fh qq#style="width: ${width}px;" />#;
441 print $fh "</td>\n </tr>\n";
445 if ($i >= $PLUGIN_MAX)
451 print $fh " </table>\n";
465 print $fh "</table>\n\n";