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: I, I, I, I; 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 (''); @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 ('', @data); } sub calculate { for ($WeekdayCache->keys ()) { my $nick = $_; my $main = $nick eq '' ? '' : 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->{''}; 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#\n \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# \n); } } print $fh qq( \n \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( \n); } print $fh qq( \n \n); for (@order) { my ($num, $abbr, $name) = @$_; print $fh qq( \n); } print $fh " \n
#, qq(
$pct%
$name
\n\n"; } =head1 EXPORTED FUNCTIONS =over 4 =item B (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 Eocto at verplant.orgE =cut