de71f277103d8d5049ddf3692d06c4775b29b482
[onis.git] / lib / Onis / Plugins / Interestingnumbers.pm
1 package Onis::Plugins::Interestingnumbers;
2
3 use strict;
4 use warnings;
5
6 use Exporter;
7
8 use Onis::Config (qw(get_config));
9 use Onis::Html (qw(html_escape get_filehandle));
10 use Onis::Language (qw(translate));
11 use Onis::Data::Core (qw(register_plugin get_main_nick nick_to_name));
12 use Onis::Data::Persistent;
13
14 @Onis::Plugins::Interestingnumbers::EXPORT_OK = (qw(get_interestingnumbers));
15 @Onis::Plugins::Interestingnumbers::ISA = ('Exporter');
16
17 register_plugin ('ACTION', \&add_action);
18 register_plugin ('JOIN', \&add_join);
19 register_plugin ('KICK', \&add_kick);
20 register_plugin ('MODE', \&add_mode);
21 register_plugin ('TEXT', \&add_text);
22 register_plugin ('OUTPUT', \&output);
23
24 our $InterestingNumbersCache = Onis::Data::Persistent->new ('InterestingNumbersCache', 'nick',
25         qw(actions joins kicks_given kicks_received ops_given ops_taken soliloquies));
26 our $InterestingNumbersData = {};
27
28 our $SoliloquiesNick = '';
29 our $SoliloquiesCount = 0;
30
31 our $SOLILOQUIES_COUNT = 5;
32 if (get_config ('soliloquies_count'))
33 {
34         my $tmp = get_config ('soliloquies_count');
35         $tmp =~ s/\D//g;
36
37         $SOLILOQUIES_COUNT = $tmp if ($tmp);
38 }
39                 
40 my $VERSION = '$Id$';
41 print STDERR $/, __FILE__, ": $VERSION" if ($::DEBUG);
42
43 return (1);
44
45 sub get_or_empty
46 {
47         my $nick = shift;
48         my @data = $InterestingNumbersCache->get ($nick);
49         @data = (0, 0, 0, 0, 0, 0, 0) unless (@data);
50         return (@data);
51 }
52
53 sub add_action
54 {
55         my $data = shift;
56         my $nick = $data->{'nick'};
57
58         my @data = get_or_empty ($nick);
59         $data[0]++;
60         $InterestingNumbersCache->put ($nick, @data);
61 }
62
63 sub add_join
64 {
65         my $data = shift;
66         my $nick = $data->{'nick'};
67
68         my @data = get_or_empty ($nick);
69         $data[1]++;
70         $InterestingNumbersCache->put ($nick, @data);
71 }
72
73 sub add_kick
74 {
75         my $data = shift;
76
77         my $nick_g = $data->{'nick'};
78         my $nick_r = $data->{'nick_received'};
79
80         my @data = get_or_empty ($nick_g);
81         $data[2]++;
82         $InterestingNumbersCache->put ($nick_g, @data);
83
84         @data = get_or_empty ($nick_r);
85         $data[3]++;
86         $InterestingNumbersCache->put ($nick_r, @data);
87 }
88
89 sub add_mode
90 {
91         my $data = shift;
92
93         my $nick = $data->{'nick'};
94         my $text = $data->{'mode'};
95         
96         my ($mode) = split (m/\s+/, $text);
97         my $modifier = '';
98
99         for (split (m//, $mode))
100         {
101                 my $tmp = $_;
102                 if (($tmp eq '-') or ($tmp eq '+'))
103                 {
104                         $modifier = $tmp;
105                         next;
106                 }
107
108                 next unless ($modifier);
109                 
110                 if ($tmp eq 'o')
111                 {
112                         my @data = get_or_empty ($nick);
113                         if ($modifier eq '-')
114                         {
115                                 $data[5]++;
116                         }
117                         else # ($modifier eq '+')
118                         {
119                                 $data[4]++;
120                         }
121                 }
122         }
123
124         return (1);
125 }
126
127 sub add_text
128 {
129         my $data = shift;
130
131         my $nick = $data->{'nick'};
132
133         if ($nick eq $SoliloquiesNick)
134         {
135                 $SoliloquiesCount++;
136
137                 if ($SoliloquiesCount == $SOLILOQUIES_COUNT)
138                 {
139                         my @data = get_or_empty ($nick);
140                         $data[6]++;
141                         $InterestingNumbersCache->put ($nick, @data);
142                 }
143         }
144         else
145         {
146                 $SoliloquiesNick = $nick;
147                 $SoliloquiesCount = 1;
148         }
149 }
150
151 sub calculate
152 {
153         for ($InterestingNumbersCache->keys ())
154         {
155                 my $nick = $_;
156                 my ($actions, $joins,
157                         $kicks_given, $kicks_received,
158                         $ops_given, $ops_taken,
159                         $soliloquies) = $InterestingNumbersCache->get ($nick);
160                 my $main = get_main_nick ($nick);
161
162                 next unless ($main);
163
164                 if (!defined ($InterestingNumbersData->{$main}))
165                 {
166                         $InterestingNumbersData->{$main} =
167                         {
168                                 actions         => 0,
169                                 joins           => 0,
170                                 kicks_given     => 0,
171                                 kicks_received  => 0,
172                                 ops_given       => 0,
173                                 ops_taken       => 0,
174                                 soliloquies     => 0
175                         };
176                 }
177
178                 $InterestingNumbersData->{$main}{'actions'}        += $actions;
179                 $InterestingNumbersData->{$main}{'joins'}          += $joins;
180                 $InterestingNumbersData->{$main}{'kicks_given'}    += $kicks_given;
181                 $InterestingNumbersData->{$main}{'kicks_received'} += $kicks_received;
182                 $InterestingNumbersData->{$main}{'ops_given'}      += $ops_given;
183                 $InterestingNumbersData->{$main}{'ops_taken'}      += $ops_taken;
184                 $InterestingNumbersData->{$main}{'soliloquies'}    += $soliloquies;
185         }
186 }
187
188
189
190
191 sub output
192 {
193         calculate ();
194         
195         my $first_nick;
196         my $first_name;
197         my $second_nick;
198         my $second_name;
199
200         my $fh = get_filehandle ();
201
202         my $trans = translate ('Interesting Numbers');
203         
204         print $fh <<EOF;
205 <table class="plugin interestingnumbers">
206   <tr>
207     <th>$trans</th>
208   </tr>
209 EOF
210         ($first_nick, $second_nick) = sort_by_field ('kick_received');
211         if ($first_nick)
212         {
213                 my $num = $InterestingNumbersData->{$first_nick}{'kick_received'};
214                 $trans = translate ('kick_received0: %s %u');
215                 $first_name = nick_to_name ($first_nick) || $first_nick;
216
217                 print $fh "  <tr>\n    <td>";
218                 printf $fh ($trans, $first_nick, $num);
219                 
220                 if ($second_nick)
221                 {
222                         $num = $InterestingNumbersData->{$second_nick}{'kick_received'};
223                         $trans = translate ('kick_received1: %s %u');
224                         $second_name = nick_to_name ($second_nick) || $second_nick;
225
226                         print $fh "<br />\n",
227                         qq#      <span class="small">#;
228                         printf $fh ($trans, $second_nick, $num);
229                         print $fh '</span>';
230                 }
231                 
232                 print $fh "</td>\n  </tr>\n";
233         }
234
235         ($first_nick, $second_nick) = sort_by_field ('kick_given');
236         if ($first_nick)
237         {
238                 my $num = $InterestingNumbersData->{$first_nick}{'kick_given'};
239                 $trans = translate ('kick_given0: %s %u');
240                 $first_name = nick_to_name ($first_nick) || $first_nick;
241
242                 print $fh "  <tr>\n    <td>";
243                 printf $fh ($trans, $first_name, $num);
244
245                 if ($second_nick)
246                 {
247                         $num = $InterestingNumbersData->{$second_nick}{'kick_given'};
248                         $trans = translate ('kick_given1: %s %u');
249                         $second_name = nick_to_name ($second_nick) || $second_nick;
250
251                         print $fh "<br />\n",
252                         qq#      <span class="small">#;
253                         printf $fh ($trans, $second_name, $num);
254                         print $fh '</span>';
255                 }
256
257                 print $fh "</td>\n  </tr>\n";
258         }
259
260         ($first_nick, $second_nick) = sort_by_field ('op_given');
261         if ($first_nick)
262         {
263                 my $num = $InterestingNumbersData->{$first_nick}{'op_given'};
264                 $trans = translate ('op_given0: %s %u');
265                 $first_name = nick_to_name ($first_nick) || $first_nick;
266
267                 print $fh "  <tr>\n    <td>";
268                 printf $fh ($trans, $first_name, $num);
269                 
270                 if ($second_nick)
271                 {
272                         $num = $InterestingNumbersData->{$second_nick}{'op_given'};
273                         $trans = translate ('op_given1: %s %u');
274                         $second_name = nick_to_name ($second_nick) || $second_nick;
275
276                         print $fh "<br />\n",
277                         qq#      <span class="small">#;
278                         printf $fh ($trans, $second_name, $num);
279                         print $fh '</span>';
280                 }
281                 
282                 print $fh "</td>\n  </tr>\n";
283         }
284
285         ($first_nick, $second_nick) = sort_by_field ('op_taken');
286         if ($first_nick)
287         {
288                 my $num = $InterestingNumbersData->{$first_nick}{'op_taken'};
289                 $trans = translate ('op_taken0: %s %u');
290                 $first_name = nick_to_name ($first_nick) || $first_nick;
291
292                 print $fh "  <tr>\n    <td>";
293                 printf $fh ($trans, $first_name, $num);
294                 
295                 if ($second_nick)
296                 {
297                         $num = $InterestingNumbersData->{$second_nick}{'op_taken'};
298                         $trans = translate ('op_taken1: %s %u');
299                         $second_name = nick_to_name ($second_nick) || $second_nick;
300
301                         print $fh "<br />\n",
302                         qq#      <span class="small">#;
303                         printf $fh ($trans, $second_name, $num);
304                         print $fh '</span>';
305                 }
306                 
307                 print $fh "</td>\n  </tr>\n";
308         }
309
310         ($first_nick, $second_nick) = sort_by_field ('actions');
311         if ($first_nick)
312         {
313                 my $num = $InterestingNumbersData->{$first_nick}{'actions'};
314                 $trans = translate ('action0: %s %u');
315                 $first_name = nick_to_name ($first_nick) || $first_nick;
316
317                 print $fh "  <tr>\n    <td>";
318                 printf $fh ($trans, $first_name, $num);
319                 
320                 if ($second_nick)
321                 {
322                         $num = $InterestingNumbersData->{$second_nick}{'actions'};
323                         $trans = translate ('action1: %s %u');
324                         $second_name = nick_to_name ($second_nick) || $second_nick;
325
326                         print $fh "<br />\n",
327                         qq#      <span class="small">#;
328                         printf $fh ($trans, $second_name, $num);
329                         print $fh '</span>';
330                 }
331
332                 print $fh "</td>\n  </tr>\n";
333         }
334         
335         ($first_nick, $second_nick) = sort_by_field ('soliloquies');
336         if ($first_nick)
337         {
338                 my $num = $InterestingNumbersData->{$first_nick}{'soliloquies'};
339                 $trans = translate ('soliloquies0: %s %u');
340                 $first_name = nick_to_name ($first_nick) || $first_nick;
341
342                 print $fh "  <tr>\n    <td>";
343                 printf $fh ($trans, $first_name, $num);
344                 
345                 if ($second_nick)
346                 {
347                         $num = $InterestingNumbersData->{$second_nick}{'soliloquies'};
348                         $trans = translate ('soliloquies1: %s %u');
349                         $second_name = nick_to_name ($second_nick) || $second_nick;
350
351                         print $fh "<br />\n",
352                         qq#      <span class="small">#;
353                         printf $fh ($trans, $second_name, $num);
354                         print $fh '</span>';
355                 }
356
357                 print $fh "</td>\n  </tr>\n";
358         }
359         
360         ($first_nick, $second_nick) = sort_by_field ('joins');
361         if ($first_nick)
362         {
363                 my $num = $InterestingNumbersData->{$first_nick}{'joins'};
364                 $trans = translate ('joins0: %s %u');
365                 $first_name = nick_to_name ($first_nick) || $first_nick;
366
367                 print $fh "  <tr>\n    <td>";
368                 printf $fh ($trans, $first_name, $num);
369                 
370                 if ($second_nick)
371                 {
372                         $num = $InterestingNumbersData->{$second_nick}{'joins'};
373                         $trans = translate ('joins1: %s %u');
374                         $second_name = nick_to_name ($second_nick) || $second_nick;
375
376                         print $fh "<br />\n",
377                         qq#      <span class="small">#;
378                         printf $fh ($trans, $second_name, $num);
379                         print $fh '</span>';
380                 }
381
382                 print $fh "</td>\n  </tr>\n";
383         }
384
385         print $fh "</table>\n\n";
386 }
387
388 sub sort_by_field
389 {
390         my $field = shift;
391         
392         my @retval = sort
393         {
394                 $InterestingNumbersData->{$b}{$field}
395                 <=>
396                 $InterestingNumbersData->{$a}{$field}
397         } (keys (%$InterestingNumbersData));
398
399         while (scalar (@retval) < 2)
400         {
401                 push (@retval, '');
402         }
403         
404         return (@retval);
405 }
406
407 sub get_interestingnumbers
408 {
409         my $nick = shift;
410
411         if (defined ($InterestingNumbersData->{$nick}))
412         {
413                 return ({});
414         }
415
416         return ($InterestingNumbersData->{$nick});
417 }