diff options
Diffstat (limited to 'scripts/cgrep.pl')
-rw-r--r-- | scripts/cgrep.pl | 192 |
1 files changed, 192 insertions, 0 deletions
diff --git a/scripts/cgrep.pl b/scripts/cgrep.pl new file mode 100644 index 0000000..e7afc7c --- /dev/null +++ b/scripts/cgrep.pl @@ -0,0 +1,192 @@ +################################################################################ +# +# Usage: /cgrep <regexp> +# +# Shows all WHO records matching that regexp in a friendly yet complete format +# Works on the active channel only +# +# This is a bit like c0ffee's ls command, except it matches ALL returned data. +# Since IRSSI doe snot cache realnames properly, this script calls WHO once +# and awaits the results. +# +# Also check out 'joininfo.pl' which shows lots of WHOIS info when a person +# joins the channel. +# +# FORMAT SETTINGS: +# cgrep_match Matching record +# cgrep_line Start and end line format +# +################################################################################ + +use strict; +use Irssi; +use vars qw($VERSION %IRSSI); +use integer; + +$VERSION = "1.0.0"; +%IRSSI = ( + authors => "Pieter-Bas IJdens", + contact => "irssi-scripts\@nospam.mi4.org.uk", + name => "cgrep", + description => "Lists users on the channel matching the specified regexp", + license => "GPLv2 or later", + url => "http://pieter-bas.ijdens.com/irssi/", + changed => "2005-03-10" +); + +################################################################################ + +my($busy) = 0; +my($regexp) = ""; +my($results) = 0; +my($debug) = 0; + +################################################################################ + +sub run_who +{ + my($server, $channel) = @_; + + $server->redirect_event( + "who", + 1, + $channel, + 0, + "redir who_default", + { + "event 352" => "redir cgrep_evt_who_result", + "event 315" => "redir cgrep_evt_who_end", + "" => "event empty" + } + ); + + $server->send_raw("WHO $channel"); +} + +################################################################################ + +sub event_who_result +{ + my ($server, $data) = @_; + + if ($busy) + { + my($start,$realname); + if ($data =~ /^(.*):([^:]{1,})$/) + { + $start = $1; + $realname = $2; + } + else + { + Irssi::print("$data can't be parsed"); + } + + # my($start,$realname) = split(":", $data); + + my($me, $channel, $ident, $host, $server, $nick, $mode) = + split(" ", $start); + my($hops) = -1; + + if ($realname =~ /^([0-9]{1,} )(.*$)$/i) + { + $hops = $1; + $realname = $2; + + $hops =~ s/[ ]{1,}$//g; + } + + my($string) = "$nick ($ident\@$host) \"$realname\" $channel " + . "($server, $hops)"; + + if ($string =~ /$regexp/i) + { + Irssi::printformat( + MSGLEVEL_CLIENTCRAP, + 'cgrep_match', + $nick, + "$ident\@$host", + "$realname", + $channel, + $server, + $hops + ); + + $results++; + } + } +} + +################################################################################ + +sub event_who_end +{ + my ($server, $data) = @_; + + Irssi::printformat( + MSGLEVEL_CLIENTCRAP, + 'cgrep_line', + "End of list. Found $results matches." + ); + + $busy = 0; + $regexp = ""; + $results = 0; +} + +################################################################################ + +sub cmd_cgrep +{ + my ($data, $server, $window) = @_; + + if (!$server) + { + Irssi::print("Not connected to a server in this window."); + return; + } + elsif ($window->{type} ne "CHANNEL") + { + Irssi::print("Not a channel window."); + return; + } + elsif ($busy) + { + Irssi::print("A request seems to be in progress."); + Irssi::print("Reload script if I'm wrong."); + } + + $busy = 1; + $regexp = $data; + $results = 0; + + Irssi::printformat( + MSGLEVEL_CLIENTCRAP, + 'cgrep_line', + "WHO on " . $window->{name} . " filtered on '$regexp'" + ); + + run_who($server, $window->{name}); +} + +################################################################################ + +Irssi::theme_register([ + 'cgrep_match', + '%GWHO:%n {channick_hilight $0} [{hilight $1}] is "{hilight $2}"%n on {channel $3} [server: {hilight $4}, hops: {hilight $5}]', + 'cgrep_line', + '%R------------%n {hilight $0} %R------------%n' +]); + +Irssi::signal_add( + { + 'redir cgrep_evt_who_result' => \&event_who_result, + 'redir cgrep_evt_who_end' => \&event_who_end + } +); + +################################################################################ + +Irssi::command_bind("cgrep", \&cmd_cgrep); + +################################################################################ |