use strict;
use warnings;
+use Carp (qw(confess));
+
=head1 NAME
Onis::Plugins::Core
use Onis::Config qw/get_config/;
use Onis::Html qw/html_escape get_filehandle/;
use Onis::Language qw/translate/;
-use Onis::Users qw/get_name get_link get_image nick_to_username/;
+use Onis::Users (qw(get_realname get_link get_image ident_to_name));
use Onis::Data::Core qw#get_all_nicks nick_to_ident ident_to_nick get_main_nick register_plugin#;
use Onis::Data::Persistent;
our $QuoteCache = {}; # Saves per-nick information without any modification
our $QuoteData = {}; # Is generated before output. Nicks are merged according to Data::Core.
+our $NickData = {}: # Same as above, but for nicks rather than quotes.
our @H_IMAGES = qw#dark-theme/h-red.png dark-theme/h-blue.png dark-theme/h-yellow.png dark-theme/h-green.png#;
-our $QuoteCache_SIZE = 10;
+our $QuoteCacheSize = 10;
our $QuoteMin = 30;
our $QuoteMax = 80;
our $WORD_LENGTH = 5;
our $DEFAULT_IMAGE = '';
our $BAR_HEIGHT = 130;
our $BAR_WIDTH = 100;
-our $LONGLINES = 50;
-our $SHORTLINES = 10;
+our $LongLines = 50;
+our $ShortLines = 10;
if (get_config ('quote_cache_size'))
{
my $tmp = get_config ('quote_cache_size');
$tmp =~ s/\D//g;
- $QuoteCache_SIZE = $tmp if ($tmp);
+ $QuoteCacheSize = $tmp if ($tmp);
}
if (get_config ('quote_min'))
{
{
my $tmp = get_config ('longlines');
$tmp =~ s/\D//g;
- $LONGLINES = $tmp if ($tmp);
+ $LongLines = $tmp if ($tmp);
}
if (get_config ('shortlines'))
{
$tmp =~ s/\D//g;
if ($tmp or ($tmp == 0))
{
- $SHORTLINES = $tmp;
+ $ShortLines = $tmp;
}
}
if (defined ($QuoteCache->{$nick}))
{
- while (scalar (@{$QuoteCache->{$nick}}) > $QuoteCache_SIZE)
+ while (scalar (@{$QuoteCache->{$nick}}) > $QuoteCacheSize)
{
shift (@{$QuoteCache->{$nick}});
}
{
lines => [qw(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)],
words => [qw(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)],
- chars => [qw(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)]
+ chars => [qw(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)],
+ lines_total => 0,
+ words_total => 0,
+ chars_total => 0
};
}
my @counter = $NickLinesCounter->get ($nick);
if (@counter)
{
+ my $sum = 0;
for (my $i = 0; $i < 24; $i++)
{
$NickData->{$main}{'lines'}[$i] += $counter[$i];
+ $sum += $counter[$i];
}
+ $NickData->{$main}{'lines_total'} = $sum;
}
@counter = $NickWordsCounter->get ($nick);
if (@counter)
{
+ my $sum = 0;
for (my $i = 0; $i < 24; $i++)
{
$NickData->{$main}{'words'}[$i] += $counter[$i];
+ $sum += $counter[$i];
}
+ $NickData->{$main}{'words_total'} = $sum;
}
@counter = $NickWordsCounter->get ($nick);
if (@counter)
{
+ my $sum = 0;
for (my $i = 0; $i < 24; $i++)
{
$NickData->{$main}{'words'}[$i] += $counter[$i];
+ $sum += $counter[$i];
}
+ $NickData->{$main}{'chars_total'} = $sum;
}
if (!defined ($QuoteData->{$main}))
if (defined ($QuoteCache->{$nick}))
{
my @new = sort (sub { $b->[0] <=> $a->[0] }, @{$QuoteCache->{$nick}}, @{$QuoteData->{$main}});
- splice (@new, $QuoteCache_SIZE) if (scalar (@new) > $QuoteCache_SIZE);
+ splice (@new, $QuoteCacheSize) if (scalar (@new) > $QuoteCacheSize);
$QuoteData->{$main} = \@new;
}
}
{
my $count = 0;
- my @names = grep
- {
- defined ($DATA->{'byname'}{$_}{'words'})
- } (keys (%{$DATA->{'byname'}}));
+ my @nicks = keys (%$NickData);
+
+ return unless (@nicks);
my $max_lines = 1;
my $max_words = 1;
my $trans;
my $tmp;
- ($tmp) = sort { $DATA->{'byname'}{$b}{'lines'} <=> $DATA->{'byname'}{$a}{'lines'} } (@names);
- $max_lines = $DATA->{'byname'}{$tmp}{'lines'} || 0;
+ ($tmp) = sort { $NickData->{$b}{'lines_total'} <=> $NickData->{$a}{'lines_total'} } (@nicks);
+ $max_lines = $NickData->{$tmp}{'lines_total'} || 0;
- ($tmp) = sort { $DATA->{'byname'}{$b}{'words'} <=> $DATA->{'byname'}{$a}{'words'} } (@names);
- $max_words = $DATA->{'byname'}{$tmp}{'words'} || 0;
+ ($tmp) = sort { $NickData->{$b}{'words_total'} <=> $NickData->{$a}{'words_total'} } (@nicks);
+ $max_words = $NickData->{$tmp}{'words_total'} || 0;
+
+ ($tmp) = sort { $NickData->{$b}{'chars_total'} <=> $NickData->{$a}{'chars_total'} } (@nicks);
+ $max_chars = $NickData->{$tmp}{'chars_total'} || 0;
- ($tmp) = sort { $DATA->{'byname'}{$b}{'chars'} <=> $DATA->{'byname'}{$a}{'chars'} } (@names);
- $max_chars = $DATA->{'byname'}{$tmp}{'chars'} || 0;
-
$trans = translate ('Most active nicks');
print $fh "<h2>$trans</h2>\n";
for (sort
{
- $DATA->{'byname'}{$b}{$sort_field} <=> $DATA->{'byname'}{$a}{$sort_field}
- } (@names))
+ $NickData->{$b}{"${sort_field}_total"} <=> $NickData->{$a}{"${sort_field}_total"}
+ } (@nicks))
{
- my $name = $_;
- my $ident = $name;
- my $nick = $name;
+ my $nick = $_;
+ my $ident = nick_to_ident ($nick);
+ my $name = ident_to_name ($ident);
- if (ident_to_nick ($name))
- {
- $nick = ident_to_nick ($name);
- }
- else
- {
- $ident = nick_to_ident ($name);
- }
-
$linescount++;
# As long as we didn't hit the
- # $LONGLINES-limit we continue
+ # $LongLines-limit we continue
# our table..
- if ($linescount <= $LONGLINES)
+ if ($linescount <= $LongLines)
{
my $quote = translate ('-- no quote available --');
- if (defined ($QuoteCache->{$nick}))
+ if (defined ($QuoteData->{$nick}))
{
- my $num = scalar (@{$QuoteCache->{$nick}});
+ my $num = scalar (@{$QuoteData->{$nick}});
my $rand = int (rand ($num));
- $quote = html_escape ($QuoteCache->{$nick}[$rand]);
+ $quote = html_escape ($QuoteData->{$nick}[$rand]);
}
my $link = '';
my $image = '';
- my $title = '';
- if ($name eq $ident)
+ my $realname = '';
+ if ($name)
{
- $link = get_link ($name);
- $image = get_image ($name);
- $title = get_name ($name);
+ $link = get_link ($name);
+ $image = get_image ($name);
+ $realname = get_realname ($name);
}
print $fh " <tr>\n",
print $fh "</td>\n";
}
+ my $title = $realname;
if (!$title)
{
- $title = "Ident: $ident";
+ $title = "User: $name; " if ($name);
+ $title .= "Ident: $ident";
}
print $fh qq# <td class="nick" title="$title">#;
print $fh qq# <td class="bar">#;
if (($DISPLAY_LINES eq 'BOTH') or ($DISPLAY_LINES eq 'BAR'))
{
- my $code = bar ($max_lines, $DATA->{'byname'}{$name}{'lines_time'});
+ my $code = bar ($max_lines, $NickData->{$nick}{'lines'});
print $fh $code;
}
print $fh ' ' if ($DISPLAY_LINES eq 'BOTH');
if (($DISPLAY_LINES eq 'BOTH') or ($DISPLAY_LINES eq 'NUMBER'))
{
- print $fh $DATA->{'byname'}{$name}{'lines'};
+ print $fh $NickData->{$nick}{'lines_total'};
}
print $fh "</td>\n";
}
print $fh qq# <td class="bar">#;
if (($DISPLAY_WORDS eq 'BOTH') or ($DISPLAY_WORDS eq 'BAR'))
{
- my $code = bar ($max_words, $DATA->{'byname'}{$name}{'words_time'});
+ my $code = bar ($max_words, $NickData->{$nick}{'words'});
print $fh $code;
}
print $fh ' ' if ($DISPLAY_WORDS eq 'BOTH');
if (($DISPLAY_WORDS eq 'BOTH') or ($DISPLAY_WORDS eq 'NUMBER'))
{
- print $fh $DATA->{'byname'}{$name}{'words'};
+ print $fh $NickData->{$nick}{'words_total'};
}
print $fh "</td>\n";
}
print $fh qq# <td class="bar">#;
if (($DISPLAY_CHARS eq 'BOTH') or ($DISPLAY_CHARS eq 'BAR'))
{
- my $code = bar ($max_chars, $DATA->{'byname'}{$name}{'chars_time'});
+ my $code = bar ($max_chars, $NickData->{$nick}{'chars'});
print $fh $code;
}
print $fh ' ' if ($DISPLAY_CHARS eq 'BOTH');
if (($DISPLAY_CHARS eq 'BOTH') or ($DISPLAY_CHARS eq 'NUMBER'))
{
- print $fh $DATA->{'byname'}{$name}{'chars'};
+ print $fh $NickData->{$nick}{'chars_total'};
}
print $fh "</td>\n";
}
if ($DISPLAY_TIMES)
{
- my $chars = $DATA->{'byname'}{$name}{'chars'};
- my $code = bar ($chars, $DATA->{'byname'}{$name}{'chars_time'});
-
+ my $code = bar ($NickData->{$nick}{'chars_total'}, $NickData->{$nick}{'chars'});
print $fh qq# <td class="bar">$code</td>\n#;
}
print $fh qq# <td class="quote">$quote</td>\n#,
qq# </tr>\n#;
- if ($linescount == $LONGLINES)
+ if ($linescount == $LongLines)
{
print $fh "</table>\n\n";
}
# list them all so we start a
# smaller table and just list the
# names.. (Six names per line..)
- elsif ($linescount <= ($LONGLINES + 6 * $SHORTLINES))
+ elsif ($linescount <= ($LongLines + 6 * $ShortLines))
{
- my $row_in_this_table = int (($linescount - $LONGLINES - 1) / 6);
- my $col_in_this_table = ($linescount - $LONGLINES - 1) % 6;
+ my $row_in_this_table = int (($linescount - $LongLines - 1) / 6);
+ my $col_in_this_table = ($linescount - $LongLines - 1) % 6;
my $total = 0;
if ($SORT_BY eq 'LINES')
print $fh " <td>$name ($total)</td>\n";
- if ($row_in_this_table == $SHORTLINES and $col_in_this_table == 5)
+ if ($row_in_this_table == $ShortLines and $col_in_this_table == 5)
{
print $fh " </tr>\n",
qq#</table>\n\n#;
# unmentioned nicks"-line..
}
- if (($linescount > $LONGLINES)
- and ($linescount <= ($LONGLINES + 6 * $SHORTLINES)))
+ if (($linescount > $LongLines)
+ and ($linescount <= ($LongLines + 6 * $ShortLines)))
{
- my $col = ($linescount - $LONGLINES - 1) % 6;
+ my $col = ($linescount - $LongLines - 1) % 6;
while ($col < 5)
{
print $fh " </tr>\n";
}
- if ($linescount != $LONGLINES)
+ if ($linescount != $LongLines)
{
print $fh "</table>\n\n";
}
my $source = shift;
+ confess unless (ref ($source eq 'ARRAY'));
+
# BAR_WIDTH is a least 10
my $max_width = $BAR_WIDTH - 4;
my $factor = 1;
for ($j = 0; $j < 6; $j++)
{
my $hour = ($i * 6) + $j;
-
- if (defined ($source->{$hour}))
- {
- $sum += $source->{$hour};
- }
+ $sum += $source->[$hour];
}
$width += int (0.5 + ($sum * $factor));