1 package Onis::Plugins::Longterm;
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 get_most_recent_time nick_to_ident nick_to_name));
10 use Onis::Data::Persistent ();
12 register_plugin ('TEXT', \&add);
13 register_plugin ('ACTION', \&add);
14 register_plugin ('OUTPUT', \&output);
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 our $LongtermData = {};
20 =head1 CONFIGURATION OPTIONS
24 =item B<vertical_images>: I<image0>, I<image1>, I<image2>, I<image3>;
26 Sets the images to use for vertical graphs.
30 our @VImages = get_config ('vertical_images');
31 if (scalar (@VImages) != 4)
33 @VImages = qw#images/ver0n.png images/ver1n.png images/ver2n.png images/ver3n.png#;
36 =item B<longterm_days>: I<31>;
38 Sets the number of days displayed by this plugin.
42 our $DisplayDays = 31;
43 if (get_config ('longterm_days'))
45 my $tmp = get_config ('longterm_days');
47 $DisplayDays = $tmp if ($tmp);
55 print STDERR $/, __FILE__, ": $VERSION" if ($::DEBUG);
62 my $nick = $data->{'nick'};
63 my $time = $data->{'epoch'};
64 my $hour = int ($data->{'hour'} / 6);
65 my $chars = length ($data->{'text'});
66 my $day = int ($time / 86400);
67 my $index = ($day * 4) + $hour;
69 my ($lastseen) = $LongtermLastSeen->get ($nick);
72 for (my $i = $lastseen; $i < $day; $i++)
74 my $last = $i - $DisplayDays;
75 $LongtermCache->del ($nick . ':' . $last);
79 $LongtermCache->put ($nick . ':' . $i, qw(0 0 0 0));
83 my @data = $LongtermCache->get ($nick . ':' . $day);
84 @data = (qw(0 0 0 0)) unless (@data);
85 $data[$hour] += $chars;
86 $LongtermCache->put ($nick . ':' . $day, @data);
88 $LongtermLastSeen->put ($nick, $day);
93 my $now_epoch = get_most_recent_time ();
94 my $now = int ($now_epoch / 86400);
97 my $old = 1 + $now - $DisplayDays;
101 for ($LongtermLastSeen->keys ())
104 my ($last) = $LongtermLastSeen->get ($nick);
108 $del->{$nick} = $last;
109 $LongtermLastSeen->del ($nick);
113 for ($LongtermCache->keys ())
116 my ($nick, $day) = split (m/:/, $key);
118 if (defined ($del->{$nick}) or ($day < $old))
120 $LongtermCache->del ($key);
124 my $idx = $day - $old;
125 my $main = get_main_nick ($nick);
126 my @data = $LongtermCache->get ($key);
128 if (!defined ($LongtermData->{$main}))
130 $LongtermData->{$main} = [];
131 $LongtermData->{$main}[$_] = [0, 0, 0, 0] for (0 .. ($DisplayDays - 1));
133 if (!defined ($LongtermData->{'<TOTAL>'}))
135 $LongtermData->{'<TOTAL>'} = [];
136 $LongtermData->{'<TOTAL>'}[$_] = [0, 0, 0, 0] for (0 .. ($DisplayDays - 1));
139 $LongtermData->{$main}[$idx][$_] += $data[$_] for (0 .. 3);
140 $LongtermData->{'<TOTAL>'}[$idx][$_] += $data[$_] for (0 .. 3);
147 return (undef) unless (%$LongtermData);
149 my $now_epoch = get_most_recent_time ();
150 my $now = int ($now_epoch / 86400);
151 return unless ($now);
153 my $old = 1 + $now - $DisplayDays;
155 my $data = $LongtermData->{'<TOTAL>'};
157 my @weekdays = (qw(sun mon tue wed thu fri sat sun));
159 my $fh = get_filehandle ();
164 for (my $i = 0; $i < $DisplayDays; $i++)
166 for (my $j = 0; $j < 4; $j++)
168 $max = $data->[$i][$j] if ($max < $data->[$i][$j]);
169 $total += $data->[$i][$j];
173 print $fh qq#<table class="plugin longterm">\n <tr class="bars">\n#;
174 for (my $i = 0; $i < $DisplayDays; $i++)
176 for (my $j = 0; $j < 4; $j++)
178 my $num = $data->[$i][$j];
179 my $height = sprintf ("%.2f", (95 * $num / $max));
180 my $img = $VImages[$j];
182 print $fh qq# <td class="bar vertical">#,
183 qq(<img src="$img" alt="" class="first last" style="height: ${height}%;" /></td>\n);
186 print $fh qq( </tr>\n <tr class="counter">\n);
187 for (my $i = 0; $i < $DisplayDays; $i++)
189 my $sum = $data->[$i][0] + $data->[$i][1] + $data->[$i][2] + $data->[$i][3];
190 my $percent = sprintf ("%.1f", 100 * $sum / $total);
192 print $fh qq( <td colspan="4" class="counter">$percent%</td>\n);
194 print $fh qq( </tr>\n <tr class="numeration">\n);
195 for (my $i = 0; $i < $DisplayDays; $i++)
197 my $epoch = ($old + $i) * 86400;
198 my ($day, $wd) = (localtime ($epoch))[3,6];
199 my $class = $weekdays[$wd];
201 print $fh qq( <td colspan="4" class="numeration $class">$day.</td>\n);
203 print $fh " </tr>\n</table>\n\n";