diff options
Diffstat (limited to 'scripts/armeija.pl')
-rw-r--r-- | scripts/armeija.pl | 267 |
1 files changed, 267 insertions, 0 deletions
diff --git a/scripts/armeija.pl b/scripts/armeija.pl new file mode 100644 index 0000000..fc854c6 --- /dev/null +++ b/scripts/armeija.pl @@ -0,0 +1,267 @@ +#!/usr/bin/perl -w +# script to ignore boring messages in irc +# it has a list of keywords which on a public message will cause someone +# to be ignored for 60 seconds (changeable). also it ignores (tries to) +# every message back to ignored people. +# - flux@inside.org + +# check out my other irssi-stuff at http://xulfad.inside.org/~flux/software/irssi/ + +use strict; +use Irssi; + +use vars qw($VERSION %IRSSI); +$VERSION = "0.4"; +%IRSSI = ( + authors => "Erkki Seppälä", + contact => "flux\@inside.org", + name => "Armeija Ignore", + description => "Ignores people bringin up boring/repeated subjects, plus replies.", + license => "Public Domain", + url => "http://xulfad.inside.org/~flux/software/irssi/", + changed => "Tue Mar 5 00:06:35 EET 2002" +); + + +use Irssi::Irc; + +my $log = 0; +my $logFile = "$ENV{HOME}/.irssi/armeija.log"; + +my $retrigger = 0; +my $wordFile = "$ENV{HOME}/.irssi/armeija.words"; +my $channelFile = "$ENV{HOME}/.irssi/armeija.channels"; +my $overflowLimit = 3; + +my @channels = ("#linux.fi"); + +my @keywords = ( + +# armeija + "\\barmeija", "\\brynkky", "\\bintti", "\\bintissä", "\\bgines", "\\btj\\b" +, "\\bsaapumiserä", "\\bvarus(mies|nainen|täti)", "\\bvemppa", "\\bvempula" +, "\\bvempa", "\\bveksi", "\\bsulkeiset", "\\bsulkeisi" +, "\\bvlv\\b", "\\bhl\\b" + +# offtopic +, "\\bsalkkari", "\\bsalatut eläm". "\\bsalattuja eläm" + +# urheilu +,"\\bhiiht", "\\bhiihd", "\\bformula", "\\bolympia" + +); + +my %infected; +my $timeout = 60; + +my $who = ""; +my $why = ""; + +sub p0 { + my $a = $_[0]; + while (length($a) < 2) { + $a = "0$a"; + } + return $a; +} + +sub why { + if ($who ne "") { + Irssi::print "$who was ignored: $why"; + } +} + +sub public { + my ($server, $msg, $nick, $address, $target) = @_; + + local *F; + + my $now = time; + + my $skip = 1; + foreach my $channel (@channels) { + if (lc($target) eq lc($channel)) { + $skip = 0; + last; + } + } + + if ($skip) { + return 0; + } + + # check for keywords + + my $count = 0; + foreach my $word (@keywords) { + if ($msg =~ /$word/i) { + ++$count; + } + } + + if (($count >= 1) && ($count < $overflowLimit)) { + Irssi::print "Ignoring $nick"; + $why = $msg; + $who = $nick; + if ($log) { + open(F, q{>>}, $logFile); + my @t = localtime($now); + $t[5] += 1900; + print F "$t[5]-", p0($t[4] + 1), "-", p0($t[3]), " ", + p0($t[2]), ":", p0($t[1]), ":", p0($t[0]), " $who/$target: $why\n"; + close(F); + } + if ($retrigger || !exists $infected{$nick}) { + $infected{$nick} = $now + $timeout; + } + Irssi::signal_stop(); + return 1; + } + + # check and expire old ignores + if (exists $infected{$nick}) { + if ($infected{$nick} < $now) { + Irssi::print "Timed out: $nick"; + delete $infected{$nick}; + } else { + Irssi::signal_stop(); + return 1; + } + } + + # check for messages targetted to ignored people + foreach my $nick (keys %infected) { + if ($msg =~ /^$nick/i) { + # ignore messages to these people + Irssi::signal_stop(); + return 1; + } + } + + return 0; +} + +sub logging { + my (@args) = @_; + if (@args) { + if ($args[0] eq "on") { + $log = 1; + Irssi::print("Armeija-logging on to file $logFile"); + } elsif ($args[0] eq "off") { + $log = 0; + Irssi::print("Armeija-logging stopped"); + } else { + $logFile = $args[0]; + Irssi::print("Armeija-logfile set to $logFile"); + } + } else { + Irssi::print("usage: armeija log [on|off|new log file name]"); + Irssi::print("Log is " . ($log ? "on" : "off") . ", logfile is $logFile"); + } +} + +sub load { + local $/ = "\n"; + local *F; + if (open(F, q{<}, $wordFile)) { + @keywords = (); + while (<F>) { + chomp; + push @keywords, $_; + } + close(F); + } else { + Irssi::print("Failed to open wordfile $wordFile\n"); + } + if (open(F, q{<}, $channelFile)) { + @channels = (); + while (<F>) { + chomp; + push @channels, $_; + } + close(F); + } +} + +sub save { + local *F; + if (open(F, q{>}, $wordFile)) { + for (my $c = 0; $c < @keywords; ++$c) { + print F $keywords[$c], "\n"; + } + close(F); + } + if (open(F, q{>}, $channelFile)) { + for (my $c = 0; $c < @channels; ++$c) { + print F $channels[$c], "\n"; + } + close(F); + } +} + +sub retrigger { + if (@_ == 1) { + if ($_[0] eq "on") { + Irssi::print "Armeija retrigger on"; + $retrigger = 1; + } elsif ($_[0] eq "off") { + Irssi::print "Armeija retrigger off"; + $retrigger = 0; + } else { + Irssi::print("Invalid armeija trigger state"); + } + } else { + Irssi::print("usage: /armeija retrigger [on|off]"); + } +} + +sub armeija { + my (@args) = split(" ", $_[0]); + if (@args) { + if ($args[0] eq "why") { + why(); + } elsif ($args[0] eq "log") { + my @a = @args; + shift @a; + logging(@a); + } elsif ($args[0] eq "load") { + load(); + } elsif ($args[0] eq "save") { + save(); + } elsif ($args[0] eq "+word") { + my @a = @args; + shift @a; + push @keywords, join(" ", @a); + save(); + } elsif ($args[0] eq "-word") { + my @a = @args; + shift @a; + for (my $c = 0; $c < @keywords; ++$c) { + for (my $d = 0; $d < @a;) { + if ($a[$d] eq $keywords[$c]) { + splice @keywords, $c, 1; + } else { + ++$d; + } + } + } + save(); + } elsif ($args[0] eq "words") { + Irssi::print(join(", ", @keywords)); + } elsif ($args[0] eq "retrigger") { + my @a = @args; + shift @a; + retrigger(@a); + } else { + Irssi::print("Invalid armeija command"); + } + } else { + Irssi::print("Armeija usage: armeija [log [off|on|filename]|load|save|+word word|-word word|words]"); + } +} + +Irssi::signal_add("message public", "public"); +Irssi::command_bind("armeija", "armeija"); + +Irssi::print "Armeija-ignore v$VERSION by $IRSSI{contact}"; +load(); |