################################################################################
#
# Usage: /cgrep
#
# 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);
################################################################################