# mangled from cmpusers.pl (unpublished, afaik) by Bazerka . # He is not to blame for any problems, contact me instead. use strict; use warnings; use Irssi; our $VERSION = "0.1"; our %IRSSI = ( authors => "shabble, Bazerka", contact => 'shabble+irssi@metavore.org, shabble@#irssi/Freenode,' . 'bazerka@quakenet.org', name => "signal_redir", description => "Demonstration showing how to redirect a remote WHOIS" . "command so the results can be captured by a script.", license => "BSD", url => "https://github.com/shabble/irssi-scripts/", changed => "Fri Apr 1 00:05:39 2011" ); my $running = 0; # flag to prevent overlapping requests. my $debug = 1; sub redir_init { # set up event to handler mappings Irssi::signal_add ({ 'redir test_redir_whois_user' => 'event_whois_user', 'redir test_redir_whois_channels' => 'event_whois_channels', 'redir test_redir_whois_end' => 'event_whois_end', 'redir test_redir_whois_nosuchnick' => 'event_whois_nosuchnick', 'redir test_redir_whois_timeout' => 'event_whois_timeout', }); } sub request_whois { my ($server, $nick) = @_; $server->redirect_event ( 'whois', 1, $nick, 0, # command, remote, arg, timeout 'redir test_redir_whois_timeout', # error handler { 'event 311' => 'redir test_redir_whois_user', # event mappings 'event 318' => 'redir test_redir_whois_end', 'event 319' => 'redir test_redir_whois_channels', 'event 401' => 'redir test_redir_whois_nosuchnick', '' => 'event empty', } ); Irssi::print("Sending Command: WHOIS $nick", MSGLEVEL_CLIENTCRAP) if $debug; # send the actual command directly to the server, rather than # with $server->command() $server->send_raw("WHOIS $nick"); } sub event_whois_user { my ($server, $data) = @_; my ($nick, $user, $host) = ( split / +/, $data, 6 )[ 1, 2, 3 ]; Irssi::print("test_redir whois_user: $nick!$user\@$host", MSGLEVEL_CLIENTCRAP); } sub event_whois_channels { my ($server, $data) = @_; my ($nick, $channels) = ( split / +/, $data, 3 )[ 1, 2 ]; my $prefix = 'cowu.be'; # server name my $args = "shabble"; # match criteria my $event = 'event 319'; # triggering event my $sig = $server->redirect_get_signal($prefix, $event, $args); Irssi::print("test_redir whois_channels: $nick, $channels", MSGLEVEL_CLIENTCRAP); Irssi::print("test_redir get_signal: $sig", MSGLEVEL_CLIENTCRAP); } sub event_whois_end { my ($server, $data) = @_; my ($nick) = ( split / +/, $data, 3 )[1]; Irssi::print("test_redir whois_end: $nick", MSGLEVEL_CLIENTCRAP); return if $running == 0; # catch 318 -> 401 (nosuchnick followed by endofwhois) $running = 0; } sub event_whois_nosuchnick { my ($server, $data) = @_; my $nick = ( split / +/, $data, 4)[1]; Irssi::active_win->print("test_redir error: no such nick $nick - aborting.", MSGLEVEL_CLIENTCRAP); $running = 0; } sub event_whois_timeout { my ($server, $data) = @_; Irssi::print("test_redir whois_timeout", MSGLEVEL_CLIENTCRAP); $running = 0; } sub cmd_test_redir { my ($args, $server, $witem) = @_; $args = lc $args; my @nicks = split /\s+/, $args; if ($running) { Irssi::active_win->print ("test_redir error: a request is currently being processed " . "- please try again shortly.", MSGLEVEL_CLIENTCRAP); return; } $running = 1; request_whois($server, $nicks[0]); } redir_init(); Irssi::command_bind("test_redir", \&cmd_test_redir);