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);