#!/usr/bin/perl
use strict;
use Irssi;
use Irssi::Irc;
use vars qw($VERSION %IRSSI);
$VERSION = "1.0";
%IRSSI = (
authors => 'Nathan Handler',
contact => '[email protected]',
name => 'grepbans',
description => 'Greps the ban list for the specified pattern',
license => 'GPLv3+',
);
my($window, $channel, $pattern, $matches, $running);
$running=0;
sub grepbans {
my($data,$server,$witem) = @_;
if($running) {
Irssi::print("grepbans is already running.");
return;
}
$running=1;
#Clear variables and register redirects
&reset();
#Split command arguments into a nick and a channel separated by a space
($pattern,$channel)=split(/ /, $data, 2);
#If no channel is specified, use the current window if it is a channel
if($channel!~m/^#/ && $pattern!~m/^\s*$/ && $witem->{type} eq "CHANNEL") {
$channel=$witem->{name};
}
#Stop the script and display usage information if they did not specify a pattern or if we can't find a channel to use
if($channel!~m/^#/ || $pattern=~m/^\s*$/) {
$window->print("\x02Usage\x02: /grepbans pattern [#channel]");
$running=0;
return;
}
#Print the name of the channel we are running on
$window->print("\x02Channel\x02: $channel");
#Perform a /mode b
$server->redirect_event('mode b',1, $channel, 0, undef,
{
'event 367' => 'redir rpl_banlist',
'event 368' => 'redir rpl_endofbanlist',
'event 403' => 'redir err_nosuchchannel',
'' => 'event empty',
}
);
$server->send_raw("MODE $channel b");
}
#Irssi::signal_add('event empty', 'EMPTY');
Irssi::signal_add('redir err_nosuchchannel', 'ERR_NOSUCHCHANNEL');
Irssi::signal_add('redir rpl_banlist', sub { my($server,$data) = @_; RPL_BANLIST($server, "Ban $data"); });
Irssi::signal_add('redir rpl_endofbanlist', sub { my($server,$data) = @_; RPL_ENDOFBANLIST($server, "Ban $data"); });
Irssi::signal_add('redir rpl_quietlist', sub { my($server,$data) = @_; RPL_BANLIST($server, "Quiet $data"); });
Irssi::signal_add('redir rpl_endofquietlist', sub { my($server,$data) = @_; RPL_ENDOFBANLIST($server, "Quiet $data"); });
sub EMPTY {
my($server, $data) = @_;
return if(!$running);
Irssi::print("\x02EMPTY\x02: $data");
}
sub RPL_BANLIST {
my($server, $data) = @_;
return if(!$running);
my($type, $mask, $setby);
if($data=~m/^Ban/) {
($type, undef, undef, $mask, $setby, undef) = split(/ /, $data, 6);
}
elsif($data=~m/^Quiet/) {
($type, undef, undef, undef, $mask, $setby, undef) = split(/ /, $data, 7);
}
#We only want to display who set the ban/quiet if it is listed as a person
if($setby=~m/^.*?\.freenode\.net$/i) {
$setby='';
}
else {
$setby=" (Set by $setby)";
}
if($mask=~m/$pattern/i) {
$window->print("$type against \x02$mask\x02 matches $pattern" . $setby);
$matches++;
}
else {
# $window->print("$type against \x02$mask\x02 does NOT match $string" . $setby);
}
}
sub RPL_ENDOFBANLIST {
my($server, $data) = @_;
return if(!$running);
if($data=~m/^Ban/) {
$server->redirect_event('mode q',1, $channel, 0, undef,
{
'event 728' => 'redir rpl_quietlist',
'event 729' => 'redir rpl_endofquietlist',
'' => 'event empty',
}
);
$server->send_raw("MODE $channel q");
}
elsif($data=~m/^Quiet/) {
if($matches == 0) {
$window->print("No matches for $pattern in $channel");
}
elsif ($matches == 1) {
$window->print("There is \x02$matches match\x02 for $pattern in $channel");
}
else {
$window->print("There are \x02$matches matches\x02 for $pattern in $channel");
}
$running=0;
}
}
sub ERR_NOSUCHCHANNEL {
my($server, $data) = @_;
return if(!$running);
$window->print("$channel does not exist.");
$running=0;
}
sub reset {
return if(!$running);
$channel='';
$pattern='';
$matches=0;
$window=Irssi::settings_get_str('grepbans_window');
my $win = Irssi::window_find_name($window);
if(!defined($win)) {
$window=Irssi::active_win();
}
else {
$window=$win;
}
®ister_redirects();
}
sub register_redirects {
return if(!$running);
#mode b
Irssi::Irc::Server::redirect_register('mode b', 0, 0,
{ "event 367" => 1 }, # start events
{ # stop events
"event 368" => 1, # End of channel ban list
"event 403" => 1, # no such channel
"event 442" => 1, # "you're not on that channel"
"event 479" => 1 # "Cannot join channel (illegal name)"
},
undef, # optional events
);
#mode q
Irssi::Irc::Server::redirect_register('mode q', 0, 0,
{ "event 728" => 1 }, # start events
{ # stop events
"event 729" => 1, # End of channel quiet list
"event 403" => 1, # no such channel
"event 442" => 1, # "you're not on that channel"
"event 479" => 1, # "Cannot join channel (illegal name)"
},
undef, # optional events
);
}
Irssi::command_bind('grepbans', 'grepbans');
Irssi::settings_add_str('grepbans', 'grepbans_window', '');