1use strict; 2use Digest::MD5 'md5_hex'; 3 4use Irssi qw(settings_add_bool settings_get_bool signal_add signal_add_first signal_stop ); 5 6use 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 19our $norepeat_enabled = 1; 20settings_add_bool('misc', 'norepeat_enabled', $norepeat_enabled); 21 22signal_add('setup changed' => sub { 23 $norepeat_enabled = settings_get_bool('norepeat_enabled'); 24} ); 25 26our %last_message = (); 27our $last_timeout = 300; 28 29sub 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 39sub remove_last_message ($$$) { 40 my ($server, $target, $nick) = @_; 41 if ( my $ref = delete $last_message{$server->{tag}}{$target}{$nick} ) { 42 @{$ref} = (); 43 } 44} 45 46sub 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 55signal_add_first('message public', \&check_last_message); 56signal_add_first('message irc action', \&check_last_message); 57signal_add_first('message irc notice', \&check_last_message); 58 59signal_add('nicklist remove' => sub { 60 my ($chanrec, $nickrec) = @_; 61 remove_last_message($chanrec->{server}, lc $chanrec->{name}, lc $nickrec->{nick}); 62}); 63 64signal_add('nicklist new' => sub { 65 my ($chanrec, $nickrec) = @_; 66 remove_last_message($chanrec->{server}, lc $chanrec->{name}, lc $nickrec->{nick}); 67}); 68 69signal_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 75signal_add('channel created', \&last_message_clear); 76signal_add('channel destroyed', \&last_message_clear); 77