summaryrefslogtreecommitdiffstats
path: root/scripts/grepbans.pl
diff options
context:
space:
mode:
authorNathan Handler2015-09-11 05:11:39 +0000
committerNathan Handler2015-09-11 05:11:39 +0000
commit9cc4ade9d5568daddf6ccd64956b427b651cb16c (patch)
treec42792a47f45687894dcbd156d65d10a62a58eda /scripts/grepbans.pl
parent0761746636c475b2d3afde5d6130ab31e467549f (diff)
downloadscripts.irssi.org-9cc4ade9d5568daddf6ccd64956b427b651cb16c.tar.bz2
Add grepbans.pl
Diffstat (limited to 'scripts/grepbans.pl')
-rw-r--r--scripts/grepbans.pl194
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;
+ }
+
+ &register_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', '');
+