1 package Onis::Plugins::Longterm;
8 use Onis::Config (qw(get_config));
9 use Onis::Html (qw(get_filehandle));
10 use Onis::Language (qw(translate));
11 use Onis::Data::Core (qw(register_plugin get_main_nick get_most_recent_time nick_to_ident nick_to_name));
12 use Onis::Data::Persistent ();
16 Onis::Plugins::Longterm
20 @Onis::Plugins::Longterm::EXPORT_OK = (qw(get_longterm));
21 @Onis::Plugins::Longterm::ISA = ('Exporter');
23 register_plugin ('TEXT', \&add);
24 register_plugin ('ACTION', \&add);
25 register_plugin ('OUTPUT', \&output);
27 our $LongtermLastSeen = Onis::Data::Persistent->new ('LongtermLastSeen', 'nick', 'day');
28 our $LongtermCache = Onis::Data::Persistent->new ('LongtermCache', 'key', qw(time0 time1 time2 time3));
29 our $LongtermData = {};
31 =head1 CONFIGURATION OPTIONS
35 =item B<vertical_images>: I<image0>, I<image1>, I<image2>, I<image3>;
37 Sets the images to use for vertical graphs.
41 our @VImages = get_config ('vertical_images');
42 if (scalar (@VImages) != 4)
44 @VImages = qw#images/ver0n.png images/ver1n.png images/ver2n.png images/ver3n.png#;
47 =item B<longterm_days>: I<31>;
49 Sets the number of days displayed by this plugin.
53 our $DisplayDays = 31;
54 if (get_config ('longterm_days'))
56 my $tmp = get_config ('longterm_days');
58 $DisplayDays = $tmp if ($tmp);
66 print STDERR $/, __FILE__, ": $VERSION" if ($::DEBUG);
73 my $nick = $data->{'nick'};
74 my $time = $data->{'epoch'};
75 my $hour = int ($data->{'hour'} / 6);
76 my $chars = length ($data->{'text'});
77 my $day = int ($time / 86400);
78 my $index = ($day * 4) + $hour;
80 my ($lastseen) = $LongtermLastSeen->get ($nick);
83 for (my $i = $lastseen; $i < $day; $i++)
85 my $last = $i - $DisplayDays;
86 $LongtermCache->del ($nick . ':' . $last);
90 $LongtermCache->put ($nick . ':' . $i, qw(0 0 0 0));
94 my @data = $LongtermCache->get ($nick . ':' . $day);
95 @data = (qw(0 0 0 0)) unless (@data);
96 $data[$hour] += $chars;
97 $LongtermCache->put ($nick . ':' . $day, @data);
99 $LongtermLastSeen->put ($nick, $day);
104 my $now_epoch = get_most_recent_time ();
105 my $now = int ($now_epoch / 86400);
106 return unless ($now);
108 my $old = 1 + $now - $DisplayDays;
112 for ($LongtermLastSeen->keys ())
115 my ($last) = $LongtermLastSeen->get ($nick);
119 $del->{$nick} = $last;
120 $LongtermLastSeen->del ($nick);
124 for ($LongtermCache->keys ())
127 my ($nick, $day) = split (m/:/, $key);
129 if (defined ($del->{$nick}) or ($day < $old))
131 $LongtermCache->del ($key);
135 my $idx = $day - $old;
136 my $main = get_main_nick ($nick);
137 my @data = $LongtermCache->get ($key);
139 if (!defined ($LongtermData->{$main}))
141 $LongtermData->{$main} = [];
142 $LongtermData->{$main}[$_] = [0, 0, 0, 0] for (0 .. ($DisplayDays - 1));
144 if (!defined ($LongtermData->{'<TOTAL>'}))
146 $LongtermData->{'<TOTAL>'} = [];
147 $LongtermData->{'<TOTAL>'}[$_] = [0, 0, 0, 0] for (0 .. ($DisplayDays - 1));
150 $LongtermData->{$main}[$idx][$_] += $data[$_] for (0 .. 3);
151 $LongtermData->{'<TOTAL>'}[$idx][$_] += $data[$_] for (0 .. 3);
158 return (undef) unless (%$LongtermData);
160 my $now_epoch = get_most_recent_time ();
161 my $now = int ($now_epoch / 86400);
162 return unless ($now);
164 my $old = 1 + $now - $DisplayDays;
166 my $data = $LongtermData->{'<TOTAL>'};
168 my @weekdays = (qw(sun mon tue wed thu fri sat sun));
170 my $fh = get_filehandle ();
175 for (my $i = 0; $i < $DisplayDays; $i++)
177 for (my $j = 0; $j < 4; $j++)
179 $max = $data->[$i][$j] if ($max < $data->[$i][$j]);
180 $total += $data->[$i][$j];
184 print $fh qq#<table class="plugin longterm">\n <tr class="bars">\n#;
185 for (my $i = 0; $i < $DisplayDays; $i++)
187 for (my $j = 0; $j < 4; $j++)
189 my $num = $data->[$i][$j];
190 my $height = sprintf ("%.2f", (95 * $num / $max));
191 my $img = $VImages[$j];
193 print $fh qq# <td class="bar vertical">#,
194 qq(<img src="$img" alt="" class="first last" style="height: ${height}%;" /></td>\n);
197 print $fh qq( </tr>\n <tr class="counter">\n);
198 for (my $i = 0; $i < $DisplayDays; $i++)
200 my $sum = $data->[$i][0] + $data->[$i][1] + $data->[$i][2] + $data->[$i][3];
201 my $percent = sprintf ("%.1f", 100 * $sum / $total);
203 print $fh qq( <td colspan="4" class="counter">$percent%</td>\n);
205 print $fh qq( </tr>\n <tr class="numeration">\n);
206 for (my $i = 0; $i < $DisplayDays; $i++)
208 my $epoch = ($old + $i) * 86400;
209 my ($day, $wd) = (localtime ($epoch))[3,6];
210 my $class = $weekdays[$wd];
212 print $fh qq( <td colspan="4" class="numeration $class">$day.</td>\n);
214 print $fh " </tr>\n</table>\n\n";
217 =head1 EXPORTED FUNCTIONS
221 =item B<get_longterm> (I<$nick>)
223 Returns the longterm-statistics for I<$nick>. The numbers are array-counters.
224 The format is as follows:
227 [0, 0, 0, 0], # oldest day
229 [0, 0, 0, 0], # yesterday
239 if (!defined ($LongtermData->{$nick}))
244 return ($LongtermData->{$nick});
251 Florian octo Forster E<lt>octo at verplant.orgE<gt>