dd27ad9a449660059abe2ee27061df2a40ccd104
[onis.git] / lib / Onis / Plugins / Weekdays.pm
1 package Onis::Plugins::Weekdays;
2
3 use strict;
4 use warnings;
5
6 use Onis::Config (qw(get_config));
7 use Onis::Html (qw(get_filehandle));
8 use Onis::Language (qw(translate));
9 use Onis::Data::Core (qw(register_plugin get_main_nick nick_to_ident nick_to_name));
10 use Onis::Data::Persistent ();
11
12 register_plugin ('TEXT', \&add);
13 register_plugin ('ACTION', \&add);
14 register_plugin ('OUTPUT', \&output);
15
16 our $WeekdayCache = Onis::Data::Persistent->new ('WeekdayCache', 'nick',
17 qw(
18         sun0 sun1 sun2 sun3
19         mon0 mon1 mon2 mon3
20         tue0 tue1 tue2 tue3
21         wed0 wed1 wed2 wed3
22         thu0 thu1 thu2 thu3
23         fri0 fri1 fri2 fri3
24         sat0 sat1 sat2 sat3
25 ));
26 our $WeekdayData = {};
27 our @Weekdays = (qw(sun mon tue wed thu fri sat));
28
29 our $BarHeight = 130;
30 if (get_config ('bar_height'))
31 {
32         my $tmp = get_config ('bar_height');
33         $tmp =~ s/\D//g;
34         $BarHeight = $tmp if ($tmp >= 10);
35 }
36
37 our @VImages = get_config ('vertical_images');
38 if (scalar (@VImages) != 4)
39 {
40         @VImages = qw#images/ver0n.png images/ver1n.png images/ver2n.png images/ver3n.png#;
41 }
42
43 my $VERSION = '$Id$';
44 print STDERR $/, __FILE__, ": $VERSION" if ($::DEBUG);
45
46 return (1);
47
48 sub add
49 {
50         my $data = shift;
51         my $nick = $data->{'nick'};
52         my $time = $data->{'epoch'};
53         my $hour = int ($data->{'hour'} / 6);
54         my $chars = length ($data->{'text'});
55         my $day   = (localtime ($time))[6];
56         my $index = ($day * 4) + $hour;
57
58         my @data = $WeekdayCache->get ($nick);
59         @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);
60         $data[$index] += $chars;
61         $WeekdayCache->put ($nick, @data);
62         
63         @data = $WeekdayCache->get ('<TOTAL>');
64         @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);
65         $data[$index] += $chars;
66         $WeekdayCache->put ('<TOTAL>', @data);
67 }
68
69 sub calculate
70 {
71         for ($WeekdayCache->keys ())
72         {
73                 my $nick = $_;
74                 my $main = $nick eq '<TOTAL>' ? '<TOTAL>' : get_main_nick ($nick);
75                 my @data = $WeekdayCache->get ($nick);
76
77                 if (!defined ($WeekdayData->{$main}))
78                 {
79                         $WeekdayData->{$main} =
80                         {
81                                 sun => [0, 0, 0, 0],
82                                 mon => [0, 0, 0, 0],
83                                 tue => [0, 0, 0, 0],
84                                 wed => [0, 0, 0, 0],
85                                 thu => [0, 0, 0, 0],
86                                 fri => [0, 0, 0, 0],
87                                 sat => [0, 0, 0, 0]
88                         };
89                 }
90
91                 for (my $i = 0; $i < 7; $i++)
92                 {
93                         my $day = $Weekdays[$i];
94                         for (my $j = 0; $j < 4; $j++)
95                         {
96                                 my $idx = ($i * 4) + $j;
97                                 $WeekdayData->{$main}{$day}[$j] += $data[$idx];
98                         }
99                 }
100         }
101 }
102
103 sub output
104 {
105         calculate ();
106         return (undef) unless (%$WeekdayData);
107
108         my @order =
109         (
110                 [1, 'mon', 'Monday'],
111                 [2, 'tue', 'Tuesday'],
112                 [3, 'wed', 'Wednesday'],
113                 [4, 'thu', 'Thursday'],
114                 [5, 'fri', 'Friday'],
115                 [6, 'sat', 'Saturday'],
116                 [0, 'sun', 'Sunday']
117         );
118
119         my $data = $WeekdayData->{'<TOTAL>'};
120
121         my $fh = get_filehandle ();
122         
123         my $max = 0;
124         my $total = 0;
125         my $bar_factor = 0;
126
127         for (@order)
128         {
129                 my ($num, $abbr, $name) = @$_;
130
131                 for (my $i = 0; $i < 4; $i++)
132                 {
133                         $max = $data->{$abbr}[$i] if ($max < $data->{$abbr}[$i]);
134                         $total += $data->{$abbr}[$i];
135                 }
136         }
137         
138         $bar_factor = $BarHeight / $max;
139         
140         print $fh qq#<table class="plugin weekdays">\n  <tr class="bars">\n#;
141         for (@order)
142         {
143                 my ($num, $abbr, $name) = @$_;
144                 for (my $i = 0; $i < 4; $i++)
145                 {
146                         my $num = $data->{$abbr}[$i];
147                         my $height = sprintf ("%.2f", (95 * $num / $max));
148                         my $img = $VImages[$i];
149
150                         print $fh qq#    <td class="bar vertical $abbr">#,
151                         qq(<img src="$img" alt="" class="first last" style="height: ${height}%;" /></td>\n);
152                 }
153         }
154         print $fh qq(  </tr>\n  <tr class="counter">\n);
155         for (@order)
156         {
157                 my ($num, $abbr, $name) = @$_;
158                 my $sum = $data->{$abbr}[0] + $data->{$abbr}[1] + $data->{$abbr}[2] + $data->{$abbr}[3];
159                 my $pct = sprintf ("%.1f", (100 * $sum / $total));
160                 print $fh qq(    <td colspan="4" class="counter $abbr">$pct%</td>\n);
161         }
162         print $fh qq(  </tr>\n  <tr class="numeration">\n);
163         for (@order)
164         {
165                 my ($num, $abbr, $name) = @$_;
166                 print $fh qq(    <td colspan="4" class="numeration $abbr">$name</td>\n);
167         }
168         print $fh "  </tr>\n</table>\n\n";
169 }