Permalink
Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
166 lines (143 sloc) 4.36 KB
use strict;
use Irssi 20020101.0250 ();
use vars qw($VERSION %IRSSI);
$VERSION = "0.2";
%IRSSI = (
authors => "Ian Peters",
contact => "itp\@ximian.com",
name => "Connect Command",
description => "run arbitrary shell commands while [dis]connecting to a server",
license => "Public Domain",
url => "http://irssi.org/",
changed => "2017-03-18"
);
my %preconn_actions;
my %postconn_actions;
my %disconn_actions;
sub load_actions {
my $fi;
open $fi, '<', "$ENV{HOME}/.irssi/connectcmd_actions";
while (<$fi>) {
my @lines = split "\n";
foreach my $line (@lines) {
my ($server, $type, $action) = split ":", $line;
if ($type eq "preconn") {
$preconn_actions{$server} = $action;
} elsif ($type eq "postconn") {
$postconn_actions{$server} = $action;
} elsif ($type eq "disconn") {
$disconn_actions{$server} = $action;
}
}
}
close $fi;
}
sub save_actions {
my $fa;
open $fa, q{>}, "$ENV{HOME}/.irssi/connectcmd_actions";
foreach my $server (keys %preconn_actions) {
print $fa "$server:preconn:$preconn_actions{$server}\n";
}
foreach my $server (keys %postconn_actions) {
print $fa "$server:postconn:$postconn_actions{$server}\n";
}
foreach my $server (keys %disconn_actions) {
print $fa "$server:disconn:$disconn_actions{$server}\n";
}
close $fa;
}
sub sig_server_looking {
my ($server) = @_;
if (my $action = $preconn_actions{$server->{'address'}}) {
system ($action);
}
}
sub sig_server_connected {
my ($server) = @_;
if (my $action = $postconn_actions{$server->{'address'}}) {
system ($action);
}
}
sub sig_server_disconnected {
my ($server) = @_;
if (my $action = $disconn_actions{$server->{'address'}}) {
system ($action);
}
}
sub cmd_connectcmd {
my ($data, $server, $witem) = @_;
#my ($op, $type, $server, $action) = split " ", $data;
$data =~ m/^(\S*)\s+(\S*)\s+(\S*)\s+(.*)$/;
my $op=$1;
my $type=$2;
my $server=$3;
my $action=$4;
$op = lc $op;
if (!$op) {
Irssi::print ("No operation given");
} elsif ($op eq "add") {
if (!$type) {
Irssi::print ("Type not specified [preconn|postconn|disconn]");
} elsif (!$server) {
Irssi::print ("Server not specified");
} elsif (!$action) {
Irssi::print ("Action not specified");
} else {
if ($type eq "preconn") {
$preconn_actions{$server} = $action;
Irssi::print ("Added preconnect action of $action on $server");
save_actions;
} elsif ($type eq "postconn") {
$postconn_actions{$server} = $action;
Irssi::print ("Added postconnect action of $action on $server");
save_actions;
} elsif ($type eq "disconn") {
$disconn_actions{$server} = $action;
Irssi::print ("Added disconnect action of $action on $server");
save_actions;
} else {
Irssi::print ("Unrecognized trigger $type [preconn|postconn|disconn]");
}
}
} elsif ($op eq "remove") {
if (!$type) {
Irssi::print ("Type not specified [preconn|postconn|disconn]");
} elsif (!$server) {
Irssi::print ("Server not specified");
} else {
if ($type eq "preconn") {
delete ($preconn_actions{$server});
Irssi::print ("Removed preconnect action on $server");
save_actions;
} elsif ($type eq "postconn") {
delete ($postconn_actions{$server});
Irssi::print ("Removed postconnect action on $server");
save_actions;
} elsif ($type eq "disconn") {
delete ($disconn_actions{$server});
Irssi::print ("Removed disconnect action on $server");
save_actions;
} else {
Irssi::print ("Unrecognized trigger $type [preconn|postconn|disconn]");
}
}
} elsif ($op eq "list") {
Irssi::print ("Preconnect Actions:");
foreach my $server (keys %preconn_actions) {
Irssi::print ("$server $preconn_actions{$server}");
}
Irssi::print ("Postconnect Actions:");
foreach my $server (keys %postconn_actions) {
Irssi::print ("$server $postconn_actions{$server}");
}
Irssi::print ("Disconnect Actions:");
foreach my $server (keys %disconn_actions) {
Irssi::print ("$server $disconn_actions{$server}");
}
}
}
load_actions();
Irssi::command_bind ('connectcmd', 'cmd_connectcmd');
Irssi::signal_add ('server looking', 'sig_server_looking');
Irssi::signal_add ('server connected', 'sig_server_connected');
Irssi::signal_add ('server disconnected', 'sig_server_disconnected');