diff options
| author | Nathan Handler | 2015-09-11 05:11:39 +0000 | 
|---|---|---|
| committer | Nathan Handler | 2015-09-11 05:11:39 +0000 | 
| commit | 9cc4ade9d5568daddf6ccd64956b427b651cb16c (patch) | |
| tree | c42792a47f45687894dcbd156d65d10a62a58eda /scripts/grepbans.pl | |
| parent | 0761746636c475b2d3afde5d6130ab31e467549f (diff) | |
| download | scripts.irssi.org-9cc4ade9d5568daddf6ccd64956b427b651cb16c.tar.bz2 | |
Add grepbans.pl
Diffstat (limited to 'scripts/grepbans.pl')
| -rw-r--r-- | scripts/grepbans.pl | 194 | 
1 files changed, 194 insertions, 0 deletions
| diff --git a/scripts/grepbans.pl b/scripts/grepbans.pl new file mode 100644 index 0000000..4962cc3 --- /dev/null +++ b/scripts/grepbans.pl @@ -0,0 +1,194 @@ +#!/usr/bin/perl + +use strict; +use Irssi; +use Irssi::Irc; +use vars qw($VERSION %IRSSI); + +$VERSION = "1.0"; +%IRSSI = ( +    authors     => 'Nathan Handler', +    contact     => 'nathan.handler@gmail.com', +    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 <channel> 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', ''); + | 
