0ca0f6b79cbf56720fbeca1efbd563cd1ae60dd1
[onis.git] / lib / Onis / Plugins / Longterm.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 $LongtermLastSeen = Onis::Data::Persistent->new ('LongtermLastSeen', 'nick', 'day');
17 our $LongtermCache    = Onis::Data::Persistent->new ('LongtermCache', 'key', qw(time0 time1 time2 time3));
18
19 =head1 CONFIGURATION OPTIONS
20
21 =over 4
22
23 =item B<vertical_images>: I<image0>, I<image1>, I<image2>, I<image3>;
24
25 Sets the images to use for vertical graphs.
26
27 =cut
28
29 our @VImages = get_config ('vertical_images');
30 if (scalar (@VImages) != 4)
31 {
32         @VImages = qw#images/ver0n.png images/ver1n.png images/ver2n.png images/ver3n.png#;
33 }
34
35 =item B<longterm_days>: I<31>;
36
37 Sets the number of days displayed by this plugin.
38
39 =cut
40
41 our $DisplayDays = 31;
42 if (get_config ('longterm_days'))
43 {
44         my $tmp = get_config ('longterm_days');
45         $tmp =~ s/\D//g;
46         $DisplayDays = $tmp if ($tmp);
47 }
48
49 =back
50
51 =cut
52
53 my $VERSION = '$Id$';
54 print STDERR $/, __FILE__, ": $VERSION" if ($::DEBUG);
55
56 return (1);
57
58 sub add
59 {
60         my $data = shift;
61         my $nick = $data->{'nick'};
62         my $time = $data->{'epoch'};
63         my $hour = int ($data->{'hour'} / 6);
64         my $chars = length ($data->{'text'});
65         my $day   = int ($time / 86400);
66         my $index = ($day * 4) + $hour;
67
68         my ($lastseen) = $LongtermLastSeen->get ($nick);
69         $lastseen ||= $day;
70         
71         for (my $i = $lastseen; $i < $day; $i++)
72         {
73                 my $last = $i - $DisplayDays;
74                 $LongtermCache->del ($nick . ':' . $last);
75
76                 if ($i != $lastseen)
77                 {
78                         $LongtermCache->put ($nick . ':' . $i, qw(0 0 0 0));
79                 }
80         }
81
82         my @data = $LongtermCache->get ($nick . ':' . $day);
83         @data = (qw(0 0 0 0)) unless (@data);
84         $data[$hour] += $chars;
85         $LongtermCache->put ($nick . ':' . $day, @data);
86
87         $LongtermLastSeen->put ($nick, $day);
88 }
89
90 sub calculate
91 {
92         for ($WeekdayCache->keys ())
93         {
94                 my $nick = $_;
95                 my $main = $nick eq '<TOTAL>' ? '<TOTAL>' : get_main_nick ($nick);
96                 my @data = $WeekdayCache->get ($nick);
97
98                 if (!defined ($WeekdayData->{$main}))
99                 {
100                         $WeekdayData->{$main} =
101                         {
102                                 sun => [0, 0, 0, 0],
103                                 mon => [0, 0, 0, 0],
104                                 tue => [0, 0, 0, 0],
105                                 wed => [0, 0, 0, 0],
106                                 thu => [0, 0, 0, 0],
107                                 fri => [0, 0, 0, 0],
108                                 sat => [0, 0, 0, 0]
109                         };
110                 }
111
112                 for (my $i = 0; $i < 7; $i++)
113                 {
114                         my $day = $Weekdays[$i];
115                         for (my $j = 0; $j < 4; $j++)
116                         {
117                                 my $idx = ($i * 4) + $j;
118                                 $WeekdayData->{$main}{$day}[$j] += $data[$idx];
119                         }
120                 }
121         }
122 }
123
124 sub output
125 {
126         calculate ();
127         return (undef) unless (%$WeekdayData);
128
129         my @order =
130         (
131                 [1, 'mon', 'Monday'],
132                 [2, 'tue', 'Tuesday'],
133                 [3, 'wed', 'Wednesday'],
134                 [4, 'thu', 'Thursday'],
135                 [5, 'fri', 'Friday'],
136                 [6, 'sat', 'Saturday'],
137                 [0, 'sun', 'Sunday']
138         );
139
140         my $data = $WeekdayData->{'<TOTAL>'};
141
142         my $fh = get_filehandle ();
143         
144         my $max = 0;
145         my $total = 0;
146         my $bar_factor = 0;
147
148         for (@order)
149         {
150                 my ($num, $abbr, $name) = @$_;
151
152                 for (my $i = 0; $i < 4; $i++)
153                 {
154                         $max = $data->{$abbr}[$i] if ($max < $data->{$abbr}[$i]);
155                         $total += $data->{$abbr}[$i];
156                 }
157         }
158         
159         $bar_factor = $BarHeight / $max;
160         
161         print $fh qq#<table class="plugin weekdays">\n  <tr class="bars">\n#;
162         for (@order)
163         {
164                 my ($num, $abbr, $name) = @$_;
165                 for (my $i = 0; $i < 4; $i++)
166                 {
167                         my $num = $data->{$abbr}[$i];
168                         my $height = sprintf ("%.2f", (95 * $num / $max));
169                         my $img = $VImages[$i];
170
171                         print $fh qq#    <td class="bar vertical $abbr">#,
172                         qq(<img src="$img" alt="" class="first last" style="height: ${height}%;" /></td>\n);
173                 }
174         }
175         print $fh qq(  </tr>\n  <tr class="counter">\n);
176         for (@order)
177         {
178                 my ($num, $abbr, $name) = @$_;
179                 my $sum = $data->{$abbr}[0] + $data->{$abbr}[1] + $data->{$abbr}[2] + $data->{$abbr}[3];
180                 my $pct = sprintf ("%.1f", (100 * $sum / $total));
181                 print $fh qq(    <td colspan="4" class="counter $abbr">$pct%</td>\n);
182         }
183         print $fh qq(  </tr>\n  <tr class="numeration">\n);
184         for (@order)
185         {
186                 my ($num, $abbr, $name) = @$_;
187                 print $fh qq(    <td colspan="4" class="numeration $abbr">$name</td>\n);
188         }
189         print $fh "  </tr>\n</table>\n\n";
190 }