use Onis::Config (qw(get_config));
use Onis::Html (qw(html_escape get_filehandle));
use Onis::Language (qw(translate));
-use Onis::Data::Core (qw(get_main_nick register_plugin));
+use Onis::Data::Core (qw(get_main_nick register_plugin nick_to_name));
use Onis::Users (qw(ident_to_name get_link get_image));
-use Onis::Plugin::Core (qw(get_core_nick_counters));
-use Onis::Plugin::Conversations (qw(get_conversations));
+use Onis::Plugins::Core (qw(get_core_nick_counters get_sorted_nicklist));
+use Onis::Plugins::Weekdays (qw(get_weekdays));
+use Onis::Plugins::Conversations (qw(get_conversations));
+use Onis::Plugins::Bignumbers (qw(get_bignumbers));
+use Onis::Plugins::Interestingnumbers (qw(get_interestingnumbers));
our $DISPLAY_IMAGES = 0;
our $DEFAULT_IMAGE = '';
{
my $nicks_ref = get_sorted_nicklist ();
- my $max = $PLUGIN_MAX;
-
my $fh = get_filehandle ();
my $trans = translate ('Detailed nick stats');
my $max_time = 0;
my $max_conv = 0;
+ my $max_weekday = 0;
- my @nicks = $nicks_ref->[0 .. ($max - 1)];
+ my @nicks = @$nicks_ref;
my $nick_data = {};
+ splice (@nicks, $PLUGIN_MAX) if (scalar (@nicks) > $PLUGIN_MAX);
+
for (@nicks)
{
my $nick = $_;
$nick_data->{$nick} = get_core_nick_counters ($nick);
+ $nick_data->{$nick}{'weekdays'} = get_weekdays ($nick);
$nick_data->{$nick}{'conversations'} = get_conversations ($nick);
+ $nick_data->{$nick}{'bignumbers'} = get_bignumbers ($nick);
+ $nick_data->{$nick}{'interestingnumbers'} = get_interestingnumbers ($nick);
- if (defined ($DATA->{'byname'}{$name}{'chars_time'}))
+ for (my $i = 0; $i < 24; $i++)
{
- for (0..23)
- {
- next unless (defined ($DATA->{'byname'}{$name}{'chars_time'}{$_}));
- if ($DATA->{'byname'}{$name}{'chars_time'}{$_} > $max_time)
- {
- $max_time = $DATA->{'byname'}{$name}{'chars_time'}{$_};
- }
- }
+ $num = $nick_data->{$nick}{'chars'}[$i];
+ $max_time = $num if ($max_time < $num);
}
- if (defined ($DATA->{'byname'}{$name}{'conversations'}))
+
+ for (keys %{$nick_data->{$nick}{'conversations'}})
{
- my @others = keys (%{$DATA->{'byname'}{$name}{'conversations'}});
- for (@others)
- {
- my $o = $_;
- my $num = 0;
+ my $other = $_;
+ my $ptr = $nick_data->{$nick}{'conversations'}{$other}{'nicks'}{$nick};
+ $num = $ptr->[0] + $ptr->[1] + $ptr->[2] + $ptr->[3];
+ $max_conv = $num if ($max_conv < $num);
+ }
- for (0..3)
- {
- $num += $DATA->{'byname'}{$name}{'conversations'}{$o}[$_];
- }
+ for (keys %{$nick_data->{$nick}{'weekdays'}})
+ {
+ my $day = $_;
+ my $ptr = $nick_data->{$nick}{'weekdays'}{$day};
- if ($num > $max_conv)
- {
- $max_conv = $num;
- }
+ for (my $i = 0; $i < 4; $i++)
+ {
+ $max_weekday = $ptr->[$i] if ($max_weekday < $ptr->[$i]);
}
}
}
print $fh qq#<table class="plugin userdetails">\n#,
qq# <tr>\n#,
- qq# <th colspan="#, $DISPLAY_IMAGES ? 3 : 2, qq#">$trans</th>\n#,
+ qq# <th colspan="#, $DISPLAY_IMAGES ? 4 : 3, qq#">$trans</th>\n#,
qq# </tr>\n#;
- for (@names)
+ for (@nicks)
{
- my $name = $_;
+ my $nick = $_;
+ my $name = nick_to_name ($nick);
+ my $print = $name ? $name : $nick;
+ my $ptr = $nick_data->{$nick};
print $fh qq# <tr>\n#,
- qq# <th colspan="#, $DISPLAY_IMAGES ? 3 : 2, qq#" class="nick">$name</th>\n#,
+ qq# <th colspan="#, $DISPLAY_IMAGES ? 4 : 3, qq#" class="nick">$print</th>\n#,
qq# </tr>\n#,
qq# <tr>\n#;
{
print $fh qq#<a href="$link">#;
}
- print $fh qq#<img src="$image" alt="$name" />#;
+ print $fh qq#<img src="$image" alt="$print" />#;
if ($link)
{
print $fh "</a>";
print $fh qq# <td class="counters">\n#;
- $num = $DATA->{'byname'}{$name}{'lines'};
- $trans = translate ('Has written %u lines');
- printf $fh (" $trans<br />\n", $num);
+ {
+ my $lines;
+ my $words;
+ my $chars;
- $num = $DATA->{'byname'}{$name}{'words'};
- $trans = translate ('Has written %u words');
- printf $fh (" $trans<br />\n", $num);
+ $lines = $ptr->{'lines_total'};
+ $trans = translate ('Has written %u lines');
+ printf $fh (" $trans<br />\n", $lines);
- $num = $DATA->{'byname'}{$name}{'chars'};
- $trans = translate ('Has written %u chars');
- printf $fh (" $trans<br />\n", $num);
+ $words = $ptr->{'words_total'};
+ $trans = translate ('Has written %u words');
+ printf $fh (" $trans<br />\n", $words);
- if ($DATA->{'byname'}{$name}{'lines'})
- {
- $num = $DATA->{'byname'}{$name}{'words'} / $DATA->{'byname'}{$name}{'lines'};
+ $chars = $ptr->{'chars_total'};
+ $trans = translate ('Has written %u chars');
+ printf $fh (" $trans<br />\n", $chars);
+
+ $lines ||= 1;
+
+ $num = $words / $lines;
$trans = translate ('Has written %.1f words per line');
printf $fh (" $trans<br />\n", $num);
- $num = $DATA->{'byname'}{$name}{'chars'} / $DATA->{'byname'}{$name}{'lines'};
+ $num = $chars / $lines;
$trans = translate ('Has written %.1f characters per line');
printf $fh (" $trans<br />\n", $num);
}
print $fh qq# </td>\n <td class="numbers">\n#;
- if (defined ($DATA->{'byname'}{$name}{'op_given'}))
+ if (%{$ptr->{'interestingnumbers'}})
{
- $num = $DATA->{'byname'}{$name}{'op_given'};
$trans = translate ('Has given %u ops');
-
- printf $fh (" $trans<br />\n", $num);
- }
+ printf $fh (" $trans<br />\n", $ptr->{'interestingnumbers'}{'op_given'});
- if (defined ($DATA->{'byname'}{$name}{'op_taken'}))
- {
- $num = $DATA->{'byname'}{$name}{'op_taken'};
$trans = translate ('Has taken %u ops');
+ printf $fh (" $trans<br />\n", $ptr->{'interestingnumbers'}{'op_taken'});
- printf $fh (" $trans<br />\n", $num);
- }
-
- if (defined ($DATA->{'byname'}{$name}{'kick_given'}))
- {
- $num = $DATA->{'byname'}{$name}{'kick_given'};
$trans = translate ('Has kicked out %u people');
-
- printf $fh (" $trans<br />\n", $num);
- }
+ printf $fh (" $trans<br />\n", $ptr->{'interestingnumbers'}{'kick_given'});
- if (defined ($DATA->{'byname'}{$name}{'kick_received'}))
- {
- $num = $DATA->{'byname'}{$name}{'kick_received'};
$trans = translate ('Has been kicked out %u times');
+ printf $fh (" $trans<br />\n", $ptr->{'interestingnumbers'}{'kick_received'});
- printf $fh (" $trans<br />\n", $num);
+ $trans = translate ('Has performed %u actions');
+ printf $fh (" $trans<br />\n", $ptr->{'interestingnumbers'}{'actions'});
}
-
- if (defined ($DATA->{'byname'}{$name}{'questions'}))
+
+ if (%{$ptr->{'bignumbers'}})
{
- $num = 100 * $DATA->{'byname'}{$name}{'questions'} / $DATA->{'byname'}{$name}{'lines'};
+ $num = 100 * $ptr->{'bignumbers'}{'questions'} / $ptr->{'lines_total'};
$trans = translate ("Question ratio: %.1f%%");
-
printf $fh (" $trans<br />\n", $num);
- }
-
- if (defined ($DATA->{'byname'}{$name}{'topics'}))
- {
- $num = $DATA->{'byname'}{$name}{'topics'};
- $trans = translate ('Has set %u topics');
+ $num = 100 * $ptr->{'bignumbers'}{'uppercase'} / $ptr->{'lines_total'};
+ $trans = translate ("Uppercase ratio: %.1f%%");
printf $fh (" $trans<br />\n", $num);
- }
-
- if (defined ($DATA->{'byname'}{$name}{'actions'}))
- {
- $num = $DATA->{'byname'}{$name}{'actions'};
- $trans = translate ('Has performed %u actions');
+ $num = 100 * $ptr->{'bignumbers'}{'smiley_happy'} / $ptr->{'lines_total'};
+ $trans = translate ("Happy smiley ratio: %.1f%%");
printf $fh (" $trans<br />\n", $num);
- }
-
- # actions # TODO
- # exclamation ratio # TODO
- # # of nicks
- #
- # chats with
- # lines per day
-
- print $fh qq# </td>\n </tr>\n <tr>\n <td class="houractivity">\n#;
-
- if (defined ($DATA->{'byname'}{$name}{'chars_time'}))
- {
- print $fh qq# <table class="hours_of_day">\n <tr>\n#;
-
- for (0..11)
- {
- my $hour = 2 * $_;
- my $num = 0;
-
- my $img = $V_IMAGES[int ($hour / 6)];
- my $height;
-
- if (defined ($DATA->{'byname'}{$name}{'chars_time'}{$hour}))
- {
- $num = $DATA->{'byname'}{$name}{'chars_time'}{$hour};
- }
- if (defined ($DATA->{'byname'}{$name}{'chars_time'}{1 + $hour}))
- {
- $num = $DATA->{'byname'}{$name}{'chars_time'}{1 + $hour};
- }
- $height = int (0.5 + ($time_factor * $num));
- if (!$height)
- {
- $height = 1;
- }
-
- print $fh qq# <td><img src="$img" alt="$num chars" #,
- qq#style="height: ${height}px;" /></td>\n#;
- }
-
- print $fh <<EOF;
- </tr>
- <tr class="hour_row">
- <td colspan="3">0-5</td>
- <td colspan="3">6-11</td>
- <td colspan="3">12-17</td>
- <td colspan="3">18-23</td>
- </tr>
- </table>
-EOF
- }
- else
- {
- print $fh ' ';
+ $num = 100 * $ptr->{'bignumbers'}{'smiley_sad'} / $ptr->{'lines_total'};
+ $trans = translate ("Sad smiley ratio: %.1f%%");
+ printf $fh (" $trans<br />\n", $num);
}
- print $fh qq# </td>\n <td class="convpartners">\n#;
+ print $fh qq# </td>\n <td>\n#;
- if (defined ($DATA->{'byname'}{$name}{'conversations'}))
+ if (%{$ptr->{'conversations'}})
{
my $i;
- my $data = $DATA->{'byname'}{$name}{'conversations'};
- my @names = sort
+ my @others = sort
{
- ($data->{$b}[0] + $data->{$b}[1] + $data->{$b}[2] + $data->{$b}[3])
+ ($ptr->{'conversations'}{$b}{'nicks'}{$nick}[0]
+ + $ptr->{'conversations'}{$b}{'nicks'}{$nick}[1]
+ + $ptr->{'conversations'}{$b}{'nicks'}{$nick}[2]
+ + $ptr->{'conversations'}{$b}{'nicks'}{$nick}[3])
<=>
- ($data->{$a}[0] + $data->{$a}[1] + $data->{$a}[2] + $data->{$a}[3])
+ ($ptr->{'conversations'}{$a}{'nicks'}{$nick}[0]
+ + $ptr->{'conversations'}{$a}{'nicks'}{$nick}[1]
+ + $ptr->{'conversations'}{$a}{'nicks'}{$nick}[2]
+ + $ptr->{'conversations'}{$a}{'nicks'}{$nick}[3])
}
- keys (%$data);
+ (keys %{$ptr->{'conversations'}});
$trans = translate ('Talks to');
print $fh <<EOF;
- <table>
+ <table class="conversations">
<tr>
<td colspan="2">$trans:</td>
</tr>
EOF
- $i = 0;
- for (@names)
+ for (my $i = 0; $i < $PLUGIN_MAX and $i < scalar (@others); $i++)
{
- my $this_name = $_;
+ my $other = $others[$i];
+ my $other_name = nick_to_name ($other) || $other;
my $total = 0;
print $fh " <tr>\n",
- qq# <td class="nick">$this_name</td>\n#,
- qq# <td class="bar">#;
+ qq# <td class="nick right">$other_name</td>\n#,
+ qq# <td class="bar horizontal right">#;
- for (0..3)
+ for (my $k = 0; $k < 4; $k++)
{
- my $k = $_;
-
my $img = $H_IMAGES[$k];
- my $width = int (0.5 + ($conv_factor * $data->{$this_name}[$_]));
- if (!$width)
- {
- $width = 1;
- }
+ my $num = $ptr->{'conversations'}{$other}{'nicks'}{$nick}[$k];
+ my $width = sprintf ("%.2f", 95 * $num / $max_conv);
print $fh qq#<img src="$img" alt="" #;
if ($k == 0)
{
print $fh qq#class="last" #;
}
- print $fh qq#style="width: ${width}px;" />#;
+ print $fh qq#style="width: $width\%;" />#;
}
print $fh "</td>\n </tr>\n";
-
- $i++;
-
- if ($i >= $PLUGIN_MAX)
- {
- last;
- }
}
print $fh " </table>\n";
{
print $fh ' ';
}
+ print $fh qq# </td>\n </tr>\n#,
+ qq# <tr>\n <td>\n#;
+
+ if (defined ($ptr->{'chars'}))
+ {
+ print $fh qq# <table class="hours">\n <tr class="bars">\n#;
+
+ for (my $i = 0; $i < 24; $i++)
+ {
+ $num = 0;
+
+ my $img = $V_IMAGES[int ($i / 6)];
+ my $height;
+
+ $num = $ptr->{'chars'}[$i];
+
+ $height = sprintf ("%.2f", 95 * $num / $max_time);
+
+ print $fh qq# <td class="bar vertical"><img src="$img" alt="$num chars" #,
+ qq#class="first last" style="height: $height\%;" /></td>\n#;
+ }
+
+ print $fh <<EOF;
+ </tr>
+ <tr class="numeration">
+ <td colspan="6" class="numeration">0-5</td>
+ <td colspan="6" class="numeration">6-11</td>
+ <td colspan="6" class="numeration">12-17</td>
+ <td colspan="6" class="numeration">18-23</td>
+ </tr>
+ </table>
+EOF
+ }
+ else
+ {
+ print ' ';
+ }
+
+ print $fh qq# </td>\n <td>\n#;
- $max--;
- if ($max <= 0)
+ #weekly
+ if (%{$nick_data->{$nick}{'weekdays'}})
{
- last;
+ my $data = $nick_data->{$nick}{'weekdays'};
+ my @days = (qw(mon tue wed thu fri sat sun));
+
+ print $fh qq# <table class="weekdays">\n#,
+ qq# <tr class="bars">\n#;
+
+ for (@days)
+ {
+ my $day = $_;
+ for (my $i = 0; $i < 4; $i++)
+ {
+ my $num = $nick_data->{$nick}{'weekdays'}{$day}[$i];
+ my $height = sprintf ("%.2f", 95 * $num / $max_weekday);
+ my $class = '';
+ my $img = $V_IMAGES[$i];
+
+ print $fh qq# <td class="bar vertical">#,
+ qq#<img src="$img" alt="" class="first last" style="height: $height\%;" />#,
+ qq#</td>\n#;
+ }
+ }
+
+ print $fh qq# </tr>\n#,
+ qq# <tr class="numeration">\n#;
+
+ for (@days)
+ {
+ my $day = $_;
+ my $trans = translate ($day);
+
+ print $fh qq# <td colspan="4" class="numeration $day">$trans</td>\n#;
+ }
+
+ print $fh qq# </tr>\n#,
+ qq# </table>\n#;
}
+
+ print $fh qq# </td>\n <td>\n#;
+
+ #longterm
+ print $fh qq# \n#;
+
+ print $fh qq# </td>\n </tr>\n#;
}
print $fh "</table>\n\n";