Converted Onis::Plugins::Urls.
[onis.git] / lib / Onis / Plugins / Nicks.pm
1 package Onis::Plugins::Nicks;
2
3 use strict;
4 use warnings;
5
6 use Onis::Html (qw(get_filehandle));
7 use Onis::Language (qw(translate));
8 use Onis::Data::Core (qw(register_plugin));
9 use Onis::Data::Persistent ();
10 use Onis::Users (qw(nick_to_name));
11
12 register_plugin ('TEXT', \&add);
13 register_plugin ('ACTION', \&add);
14 register_plugin ('OUTPUT', \&output);
15
16 our $MentionedNicksCache = Onis::Data::Persistent->new ('MentionedNicksCache', 'nick', qw(counter lastusedtime lastusedby));
17 our $MentionedNicksData = [];
18
19 my $VERSION = '$Id$';
20 print STDERR $/, __FILE__, ": $VERSION" if ($::DEBUG);
21
22 return (1);
23
24 sub add
25 {
26         my $data = shift;
27
28         my $nick = $data->{'nick'};
29         my $text = $data->{'text'};
30         my $time = $data->{'epoch'};
31
32         # All allowed chars according to RFC2812
33         my @potential_nicks = split (/[^a-zA-Z0-9\[\]\\`_^{|}]+/, $text);
34
35         for (@potential_nicks)
36         {
37                 my $pot_nick = $_;
38
39                 # Not allowed according to RFC2812
40                 if ($pot_nick =~ m/^[0-9\-]/)
41                 {
42                         next;
43                 }
44
45                 if (nick_to_ident ($pot_nick))
46                 {
47                         my ($counter) = $MentionedNicksCache->get ($pot_nick);
48                         $counter ||= 0;
49                         $counter++;
50                         $MentionedNicksCache->put ($pot_nick, $counter, $time, $nick);
51                 }
52         }
53 }
54
55 sub calculate
56 {
57         my $max = 10;
58         my @data = ();
59         if (get_config ('plugin_max'))
60         {
61                 my $tmp = get_config ('plugin_max');
62                 $tmp =~ s/\D//g;
63
64                 $max = $tmp if ($tmp);
65         }
66
67         for ($MentionedNicksData->keys ())
68         {
69                 my $nick = $_;
70                 my ($counter, $lastusedtime, $lastusedby) = $MentionedNicksData->get ($nick);
71                 die unless (defined ($lastusedby));
72                 
73                 $lastusedby = get_main_nick ($lastusedby);
74                 push (@data, [$nick, $counter, $lastusedby, $lastusedtime]);
75         }
76
77         @$MentionedNicksData = sort { $b->[1] <=> $a->[1] } (@data);
78         splice (@$MentionedNicksData, $max);
79 }
80
81 sub output
82 {
83         calculate ();
84
85         my $fh = get_filehandle ();
86
87         my $nick = translate ('Nick');
88         my $times = translate ('Times used');
89         my $last = translate ('Last used by');
90         
91         print $fh <<EOF;
92 <table class="plugin">
93   <tr>
94     <td class="invis">&nbsp;</td>
95     <th>$nick</th>
96     <th>$times</th>
97     <th>$last</th>
98   </tr>
99 EOF
100         my $i = 0;
101         foreach (@$MentionedNicksData)
102         {
103                 $i++;
104                 my ($nick, $count, $usedby) = @$_;
105                 my $usedby_name = nick_to_name ($usedby) || $usedby;
106
107                 print $fh "  <tr>\n",
108                 qq#    <td class="numeration">$i</td>\n#,
109                 qq#    <td>$nick</td>\n#,
110                 qq#    <td>$count</td>\n#,
111                 qq#    <td>$usedby_name</td>\n#,
112                 qq#  </tr>\n#;
113         }
114
115         print $fh "</table>\n\n";
116 }