html/norepeat.pl
1 use strict;
2 use Digest::MD5 'md5_hex';
3
4 use Irssi qw(settings_add_bool settings_get_bool signal_add signal_add_first signal_stop );
5
6 use vars qw($VERSION %IRSSI);
7 $VERSION = '0.5';
8 %IRSSI = (
9 authors => 'Marcin Rozycki',
10 contact => 'derwan@irssi.pl',
11 url => 'http://derwan.irssi.pl',
12 name => 'norepeat',
13 description => 'stops public repeating',
14 license => 'GNU GPL v2',
15 modules => 'Digest::MD5',
16 changed => 'Tue Sep 9 16:34:44 CEST 2003',
17 );
18
19 our $norepeat_enabled = 1;
20 settings_add_bool('misc', 'norepeat_enabled', $norepeat_enabled);
21
22 signal_add('setup changed' => sub {
23 $norepeat_enabled = settings_get_bool('norepeat_enabled');
24 } );
25
26 our %last_message = ();
27 our $last_timeout = 300;
28
29 sub check_last_message ($$$$$) {
30 my ($server, $data, $nick, $address, $target) = @_;
31 my ($time, $nick, $target, $md5) = (time, lc $nick, lc $target, md5_hex($data));
32 if ( $norepeat_enabled and my $ref = $last_message{$server->{tag}}{$target}{$nick} ) {
33 signal_stop(), return if ( $ref->[0] eq $md5 and $time - $ref->[1] <= $last_timeout );
34 }
35 remove_last_message($server, $target, $nick);
36 $last_message{$server->{tag}}{$target}{$nick} = [ $md5, $time ];
37 }
38
39 sub remove_last_message ($$$) {
40 my ($server, $target, $nick) = @_;
41 if ( my $ref = delete $last_message{$server->{tag}}{$target}{$nick} ) {
42 @{$ref} = ();
43 }
44 }
45
46 sub last_message_clear ($;$) {
47 my $chanrec = shift;
48 my $target = lc $chanrec->{name};
49 foreach my $nick ( keys %{$last_message{$chanrec->{server}->{tag}}{$target}} ) {
50 remove_last_message($chanrec->{server}, $target, $nick);
51 }
52 %{$last_message{$chanrec->{server}->{tag}}{$target}} = ();
53 }
54
55 signal_add_first('message public', \&check_last_message);
56 signal_add_first('message irc action', \&check_last_message);
57 signal_add_first('message irc notice', \&check_last_message);
58
59 signal_add('nicklist remove' => sub {
60 my ($chanrec, $nickrec) = @_;
61 remove_last_message($chanrec->{server}, lc $chanrec->{name}, lc $nickrec->{nick});
62 });
63
64 signal_add('nicklist new' => sub {
65 my ($chanrec, $nickrec) = @_;
66 remove_last_message($chanrec->{server}, lc $chanrec->{name}, lc $nickrec->{nick});
67 });
68
69 signal_add('nicklist changed' => sub {
70 my ($chanrec, $nickrec, $oldnick) = @_;
71 $last_message{$chanrec->{server}->{tag}}{lc $chanrec->{name}}{lc $nickrec->{nick}} =
72 delete $last_message{$chanrec->{server}->{tag}}{lc $chanrec->{name}}{lc $oldnick};
73 } );
74
75 signal_add('channel created', \&last_message_clear);
76 signal_add('channel destroyed', \&last_message_clear);