summaryrefslogtreecommitdiffstats
path: root/scripts/norepeat.pl
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/norepeat.pl')
-rw-r--r--scripts/norepeat.pl76
1 files changed, 76 insertions, 0 deletions
diff --git a/scripts/norepeat.pl b/scripts/norepeat.pl
new file mode 100644
index 0000000..02aec56
--- /dev/null
+++ b/scripts/norepeat.pl
@@ -0,0 +1,76 @@
+use strict;
+use Digest::MD5 'md5_hex';
+
+use Irssi qw(settings_add_bool settings_get_bool signal_add signal_add_first signal_stop );
+
+use vars qw($VERSION %IRSSI);
+$VERSION = '0.5';
+%IRSSI = (
+ authors => 'Marcin Rozycki',
+ contact => 'derwan@irssi.pl',
+ url => 'http://derwan.irssi.pl',
+ name => 'norepeat',
+ description => 'stops public repeating',
+ license => 'GNU GPL v2',
+ modules => 'Digest::MD5',
+ changed => 'Tue Sep 9 16:34:44 CEST 2003',
+);
+
+our $norepeat_enabled = 1;
+settings_add_bool('misc', 'norepeat_enabled', $norepeat_enabled);
+
+signal_add('setup changed' => sub {
+ $norepeat_enabled = settings_get_bool('norepeat_enabled');
+} );
+
+our %last_message = ();
+our $last_timeout = 300;
+
+sub check_last_message ($$$$$) {
+ my ($server, $data, $nick, $address, $target) = @_;
+ my ($time, $nick, $target, $md5) = (time, lc $nick, lc $target, md5_hex($data));
+ if ( $norepeat_enabled and my $ref = $last_message{$server->{tag}}{$target}{$nick} ) {
+ signal_stop(), return if ( $ref->[0] eq $md5 and $time - $ref->[1] <= $last_timeout );
+ }
+ remove_last_message($server, $target, $nick);
+ $last_message{$server->{tag}}{$target}{$nick} = [ $md5, $time ];
+}
+
+sub remove_last_message ($$$) {
+ my ($server, $target, $nick) = @_;
+ if ( my $ref = delete $last_message{$server->{tag}}{$target}{$nick} ) {
+ @{$ref} = ();
+ }
+}
+
+sub last_message_clear ($;$) {
+ my $chanrec = shift;
+ my $target = lc $chanrec->{name};
+ foreach my $nick ( keys %{$last_message{$chanrec->{server}->{tag}}{$target}} ) {
+ remove_last_message($chanrec->{server}, $target, $nick);
+ }
+ %{$last_message{$chanrec->{server}->{tag}}{$target}} = ();
+}
+
+signal_add_first('message public', \&check_last_message);
+signal_add_first('message irc action', \&check_last_message);
+signal_add_first('message irc notice', \&check_last_message);
+
+signal_add('nicklist remove' => sub {
+ my ($chanrec, $nickrec) = @_;
+ remove_last_message($chanrec->{server}, lc $chanrec->{name}, lc $nickrec->{nick});
+});
+
+signal_add('nicklist new' => sub {
+ my ($chanrec, $nickrec) = @_;
+ remove_last_message($chanrec->{server}, lc $chanrec->{name}, lc $nickrec->{nick});
+});
+
+signal_add('nicklist changed' => sub {
+ my ($chanrec, $nickrec, $oldnick) = @_;
+ $last_message{$chanrec->{server}->{tag}}{lc $chanrec->{name}}{lc $nickrec->{nick}} =
+ delete $last_message{$chanrec->{server}->{tag}}{lc $chanrec->{name}}{lc $oldnick};
+} );
+
+signal_add('channel created', \&last_message_clear);
+signal_add('channel destroyed', \&last_message_clear);