# Completely ignores nicks with ALL event mask. Removes their nicks # from nicklists and from other people's messages (though messages # themselves are not ignored). # So, you could even forget about ignored user(s) completely. # Very evel script. Use it with care. use strict; use vars qw($VERSION %IRSSI); use Irssi; $VERSION = '1.00'; %IRSSI = ( authors => 'V. V. Pavluk', contact => 'vladvic_r@mail.ru', name => 'Forget ignored', description => 'This script allows you to remove ignored ' . 'nick from output of the /names command and '. 'from other users\' messages.', license => 'Public Domain', ); my @ignored; sub load_ignored { my @ignores = Irssi::ignores(); @ignored = map { $_->{level} == 4194303 ? $_->{mask} : () } @ignores; } sub add_ignored { my ($data, $server, $win) = @_; Irssi::command_unbind("ignore", 'add_ignored'); Irssi::command("ignore $data"); Irssi::command_bind("ignore", 'add_ignored'); Irssi::signal_stop(); load_ignored(); } sub del_ignored { my ($data, $server, $win) = @_; Irssi::command_unbind("unignore", 'del_ignored'); Irssi::command("unignore $data"); Irssi::command_bind("unignore", 'del_ignored'); Irssi::signal_stop(); load_ignored(); #Irssi::signal_emit("message join", $_->{server}, $_->{name}, $data, "") foreach Irssi::channels(); $_->{server}->send_raw("WHOIS :$data") foreach Irssi::channels(); } sub remove_ignored { my ($channel, $nick) = @_; my %ignored; @ignored{@ignored} = @ignored; if(!$channel->{names_got} && defined $ignored{$nick->{nick}}) { Irssi::Channel::nick_remove($channel, $nick); } } sub remove_ignored_join { my ($server, $chan, $nick) = @_; my %ignored; @ignored{@ignored} = @ignored; if(defined $ignored{$nick}) { my $channel = $server->channel_find($chan); $channel->nick_remove($channel->nick_find($nick)); Irssi::signal_stop(); return; } } sub remove_ignored_nicks ($$$) { my ($data, $server, $channel) = @_; if(!$channel) { return; } my %ignored; @ignored{@ignored} = @ignored; my @nicks = $channel->nicks(); foreach my $nick (@nicks) { if(defined $ignored{$nick->{nick}}) { $channel->nick_remove($nick); } } } sub skip_ignored_nicks { my ($SERVER, $msg, $nick, $address, $target) = @_; my $amendedmsg = $msg; foreach my $ignored (@ignored) { if($amendedmsg =~ /\Q$ignored\E/) { $amendedmsg =~ s/$ignored[:,]*\s*//gi; Irssi::signal_stop(); } } if($amendedmsg ne $msg) { Irssi::signal_emit("message public", $SERVER, $amendedmsg, $nick, $address, $target); } } load_ignored(); Irssi::signal_add_first("message public", 'skip_ignored_nicks'); Irssi::signal_add_first("command names", 'remove_ignored_nicks'); # first, to be before ignores Irssi::signal_add_first("message join", 'remove_ignored_join'); # first, to be before ignores Irssi::signal_add_first("nicklist new", 'remove_ignored'); Irssi::command_bind("ignore", 'add_ignored'); Irssi::command_bind("unignore", 'del_ignored');