package Onis::Plugins::Weekdays;
use strict;
use warnings;
use Exporter;
use Onis::Config (qw(get_config));
use Onis::Html (qw(get_filehandle));
use Onis::Language (qw(translate));
use Onis::Data::Core (qw(register_plugin get_main_nick nick_to_ident nick_to_name));
use Onis::Data::Persistent ();
=head1 NAME
Onis::Plugins::Weekdays - Activity based on weekdays
=cut
@Onis::Plugins::Weekdays::EXPORT_OK = (qw(get_weekdays));
@Onis::Plugins::Weekdays::ISA = ('Exporter');
register_plugin ('TEXT', \&add);
register_plugin ('ACTION', \&add);
register_plugin ('OUTPUT', \&output);
our $WeekdayCache = Onis::Data::Persistent->new ('WeekdayCache', 'nick',
qw(
sun0 sun1 sun2 sun3
mon0 mon1 mon2 mon3
tue0 tue1 tue2 tue3
wed0 wed1 wed2 wed3
thu0 thu1 thu2 thu3
fri0 fri1 fri2 fri3
sat0 sat1 sat2 sat3
));
our $WeekdayData = {};
our @Weekdays = (qw(sun mon tue wed thu fri sat));
=head1 CONFIGURATION OPTIONS
=over 4
=item B<vertical_images>: I<image0>, I<image1>, I<image2>, I<image3>;
Sets the images used for vertical bars.
=cut
our @VImages = get_config ('vertical_images');
if (scalar (@VImages) != 4)
{
@VImages = qw#images/ver0n.png images/ver1n.png images/ver2n.png images/ver3n.png#;
}
=back
=cut
my $VERSION = '$Id$';
print STDERR $/, __FILE__, ": $VERSION" if ($::DEBUG);
return (1);
sub add
{
my $data = shift;
my $nick = $data->{'nick'};
my $time = $data->{'epoch'};
my $hour = int ($data->{'hour'} / 6);
my $chars = length ($data->{'text'});
my $day = (localtime ($time))[6];
my $index = ($day * 4) + $hour;
my @data = $WeekdayCache->get ($nick);
@data = (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 0 0 0 0)) unless (@data);
$data[$index] += $chars;
$WeekdayCache->put ($nick, @data);
@data = $WeekdayCache->get ('<TOTAL>');
@data = (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 0 0 0 0)) unless (@data);
$data[$index] += $chars;
$WeekdayCache->put ('<TOTAL>', @data);
}
sub calculate
{
for ($WeekdayCache->keys ())
{
my $nick = $_;
my $main = $nick eq '<TOTAL>' ? '<TOTAL>' : get_main_nick ($nick);
my @data = $WeekdayCache->get ($nick);
if (!defined ($WeekdayData->{$main}))
{
$WeekdayData->{$main} =
{
sun => [0, 0, 0, 0],
mon => [0, 0, 0, 0],
tue => [0, 0, 0, 0],
wed => [0, 0, 0, 0],
thu => [0, 0, 0, 0],
fri => [0, 0, 0, 0],
sat => [0, 0, 0, 0]
};
}
for (my $i = 0; $i < 7; $i++)
{
my $day = $Weekdays[$i];
for (my $j = 0; $j < 4; $j++)
{
my $idx = ($i * 4) + $j;
$WeekdayData->{$main}{$day}[$j] += $data[$idx];
}
}
}
}
sub output
{
calculate ();
return (undef) unless (%$WeekdayData);
my @order =
(
[1, 'mon', 'Monday'],
[2, 'tue', 'Tuesday'],
[3, 'wed', 'Wednesday'],
[4, 'thu', 'Thursday'],
[5, 'fri', 'Friday'],
[6, 'sat', 'Saturday'],
[0, 'sun', 'Sunday']
);
my $data = $WeekdayData->{'<TOTAL>'};
my $fh = get_filehandle ();
my $max = 0;
my $total = 0;
for (@order)
{
my ($num, $abbr, $name) = @$_;
for (my $i = 0; $i < 4; $i++)
{
$max = $data->{$abbr}[$i] if ($max < $data->{$abbr}[$i]);
$total += $data->{$abbr}[$i];
}
}
print $fh qq#<table class="plugin weekdays">\n <tr class="bars">\n#;
for (@order)
{
my ($num, $abbr, $name) = @$_;
for (my $i = 0; $i < 4; $i++)
{
my $num = $data->{$abbr}[$i];
my $height = sprintf ("%.2f", (95 * $num / $max));
my $img = $VImages[$i];
print $fh qq# <td class="bar vertical $abbr">#,
qq(<img src="$img" alt="" class="first last" style="height: ${height}%;" /></td>\n);
}
}
print $fh qq( </tr>\n <tr class="counter">\n);
for (@order)
{
my ($num, $abbr, $name) = @$_;
my $sum = $data->{$abbr}[0] + $data->{$abbr}[1] + $data->{$abbr}[2] + $data->{$abbr}[3];
my $pct = sprintf ("%.1f", (100 * $sum / $total));
print $fh qq( <td colspan="4" class="counter $abbr">$pct%</td>\n);
}
print $fh qq( </tr>\n <tr class="numeration">\n);
for (@order)
{
my ($num, $abbr, $name) = @$_;
print $fh qq( <td colspan="4" class="numeration $abbr">$name</td>\n);
}
print $fh " </tr>\n</table>\n\n";
}
=head1 EXPORTED FUNCTIONS
=over 4
=item B<get_weekdays> (I<$nick>)
Returns a hashref with the weekday information for I<$nick>. Numbers are
character counters. The returned data has the following format:
{
sun => [0, 0, 0, 0],
mon => [0, 0, 0, 0],
tue => [0, 0, 0, 0],
wed => [0, 0, 0, 0],
thu => [0, 0, 0, 0],
fri => [0, 0, 0, 0],
sat => [0, 0, 0, 0]
}
=cut
sub get_weekdays
{
my $nick = shift;
if (!defined ($WeekdayData->{$nick}))
{
return ({});
}
return ($WeekdayData->{$nick});
}
=back
=head1 AUTHOR
Florian octo Forster E<lt>octo at verplant.orgE<gt>
=cut
syntax highlighted by Code2HTML, v. 0.9.1