# greetignore.pl
# Gets rid of annoying "greet messages".
#####
# >>> [email protected] has joined #channel
# [Nick] This is a shitty greet message.
# Sigh, I wish I just could ignore those...
#####
# With this script:
#####
# >>> [email protected] has joined #channel
# 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.",
license => "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 " [$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 / 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");