diff options
Diffstat (limited to 'scripts/greetignore.pl')
| -rw-r--r-- | scripts/greetignore.pl | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/scripts/greetignore.pl b/scripts/greetignore.pl new file mode 100644 index 0000000..69f3920 --- /dev/null +++ b/scripts/greetignore.pl @@ -0,0 +1,103 @@ +# greetignore.pl +# Gets rid of annoying "greet messages". +##### +# >>> Nick!ident@hos.t has joined #channel +# <IdiotBot> [Nick] This is a shitty greet message. +# <nico> Sigh, I wish I just could ignore those... +##### +# With this script: +##### +# >>> Nick!ident@hos.t has joined #channel +# <nico> Way better. +##### +# It does this by remembering people who joined a channel for 1 second and +# ignoring any messages matching /^[$nick] / in this timeframe. +##### +# Settings: +# greetignore_networks (default: Rizon) +# - Set the network tags which this script should be looking at. + +# Shamelessly edited David 'phyber' O'Rourke's quakequit.pl. +# Most credits to him :p + +use strict; +use Irssi; +use vars qw($VERSION %IRSSI); +$VERSION = "1.1"; +%IRSSI = ( + authors => "David O\'Rourke, Nico R. Wohlgemuth", + contact => "nico\@lifeisabug.com", + name => "greetignore", + description => "Hide the stupid \"greet messages\" posted by some bots". + " after someone joins a channel.", + licence => "GPLv2", + changed => "20120914", +); + +# Output a few extra messages to the status window to help with +# any errors that might happen. +my $debug = 0; +# Array to store our temporary joins in. +my %joins; + +# Return 1 if we should process the tag, otherwise 0. +sub process_tag { + my ($tag) = @_; + my $netlist = Irssi::settings_get_str('greetignore_networks'); + foreach my $network (split /[, ]/, $netlist) { + if (lc $tag eq lc $network) { + return 1; + } + } + return 0; +} + +# Remove entries from the joins hash. +sub purge_nick { + my ($data) = @_; + my @tagnick = split /:/, $data; + delete $joins{$tagnick[0]}{$tagnick[1]}; + return 0; +} + +# Ignore lines like "<SomeBot> [$nick] This is a shitty greet message." +sub ignore_greet { + my ($server_rec, $msg, $nick, $addr, $target) = @_; + my $tag = $server_rec->{tag}; + # Don't proceed if the hash is empty. + # hash returns <elements>/<buckets> in scalar context and just 0 if it's empty. + if (!$joins{$tag} || !(keys(%{$joins{$tag}}))) { + return 0; + } + # Return if we don't care about this tag. + if (process_tag($tag) == 0) { + return 0; + } + # If the message matches a nick in our joins hash, don't show the greet message. + if ($msg =~ /^\[(.+?)\] / && $joins{$tag}{lc($1)} && $nick ne $1) { + Irssi::signal_stop(); + Irssi::print("Ignored: <$nick> $msg") if $debug; + return 0; + } +} + +# Process the 'message join' signal. (/JOIN) +sub message_join { + my ($server_rec, $channel, $nick, $addr) = @_; + my $tag = $server_rec->{tag}; + # Return if we don't care about this tag. + if (process_tag($tag) == 0) { + return 0; + } + $joins{$tag}{lc($nick)}++; + my $data = $tag.':'.lc($nick); + Irssi::timeout_add_once(2500, 'purge_nick', $data); + return 0; +} + +## Settings +# greetignore_networks: set the networks that you'd like this script to watch +Irssi::settings_add_str('greetignore', 'greetignore_networks', 'Rizon'); +# Signals to grab +Irssi::signal_add_first('message join', 'message_join'); +Irssi::signal_add_last("message public", "ignore_greet"); |
