summaryrefslogtreecommitdiffstats
path: root/scripts/nickserv.pl
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/nickserv.pl')
-rw-r--r--scripts/nickserv.pl502
1 files changed, 311 insertions, 191 deletions
diff --git a/scripts/nickserv.pl b/scripts/nickserv.pl
index c1d9ce8..ff2738d 100644
--- a/scripts/nickserv.pl
+++ b/scripts/nickserv.pl
@@ -24,7 +24,7 @@ use strict;
use Irssi;
use vars qw($VERSION %IRSSI);
-$VERSION = "1.10";
+$VERSION = "1.11";
%IRSSI = (
authors => 'Geert Hauwaerts',
@@ -32,37 +32,47 @@ $VERSION = "1.10";
name => 'nickserv.pl',
description => 'This script will authorize you into NickServ.',
license => 'GNU General Public License',
- url => 'http://irssi.hauwaerts.be/nickserv.pl',
+ url => 'https://github.com/irssi/scripts.irssi.org/blob/master/scripts/nickserv.pl',
+ changed => 'Di 17. Jan 19:32:45 CET 2017',
);
+my $irssidir = Irssi::get_irssi_dir();
+
my @nickservnet = ();
-my $nickservnet_file = "nickserv.networks";
+my $nickservnet_file = "$irssidir/nickserv.networks";
my @nickservauth = ();
-my $nickservauth_file = "nickserv.auth";
+my $nickservauth_file = "$irssidir/nickserv.auth";
-my $irssidir = Irssi::get_irssi_dir();
+my @nickservpostcmd = ();
+my $nickservpostcmd_file = "$irssidir/nickserv.postcmd";
my $help = <<EOF;
Usage: (all on one line)
/NICKSERV [addnet <ircnet> <services\@host>]
[addnick <ircnet> <nickname> <password>]
+ [addpostcmd <ircnet> <nickname> <command>]
[delnet <ircnet>]
[delnick <ircnet> <nick>]
- [help listnet listnick]
-
-addnet: Add a new network into the NickServ list.
-addnick: Add a new nickname into the NickServ list.
-delnet: Delete a network from the NickServ list.
-delnick: Delete a nickname from the NickServ list.
-listnet: Display the contents of the NickServ network list.
-listnick: Display the contents of the NickServ nickname list.
-help: Display this useful little helptext.
+ [delpostcmd <ircnet> <nick>]
+ [help listnet listnick listpostcmd]
+
+addnet: Add a new network into the NickServ list.
+addnick: Add a new nickname into the NickServ list.
+addpostcmd: Add a new post auth command for nickname into the NickServ list.
+delnet: Delete a network from the NickServ list.
+delnick: Delete a nickname from the NickServ list.
+delpostcmd: Deletes all post auth commands for the given nickame.
+listnet: Display the contents of the NickServ network list.
+listnick: Display the contents of the NickServ nickname list.
+listpostcmd: Display the contents of the NickServ postcmd list.
+help: Display this useful little helptext.
Examples: (all on one line)
/NICKSERV addnet Freenode NickServ\@services.
/NICKSERV addnick Freenode Geert mypass
+/NICKSERV addpostcmd Freenode Geert ^MSG ChanServ invite #heaven
/NICKSERV delnet Freenode
/NICKSERV delnick Freenode Geert
@@ -74,19 +84,25 @@ EOF
Irssi::theme_register([
'nickserv_usage_network', '%R>>%n %_NickServ:%_ Insufficient parameters: Usage "%_/NICKSERV addnet ircnet services@host%_".',
'nickserv_usage_nickname', '%R>>%n %_NickServ:%_ Insufficient parameters: Usage "%_/NICKSERV addnick ircnet nickname password%_".',
+ 'nickserv_usage_postcmd', '%R>>%n %_NickServ:%_ Insufficient parameters: Usage "%_/NICKSERV addpostcmd ircnet nickname command%_".',
'nickserv_delusage', '%R>>%n %_NickServ:%_ Insufficient parameters: Usage "%_/NICKSERV delnet ircnet%_".',
'nickserv_delnickusage', '%R>>%n %_NickServ:%_ Insufficient parameters: Usage "%_/NICKSERV delnick ircnet nickname%_".',
- 'nickserv_delled', '%R>>%n %_NickServ:%_ Deleted %_$0%_ and his nicknames from the NickServ ircnet list.',
- 'nickserv_delled_nick', '%R>>%n %_NickServ:%_ Deleted %_$1%_ from the NickServ list on $0.',
+ 'nickserv_delpostcmdusage', '%R>>%n %_NickServ:%_ Insufficient parameters: Usage "%_/NICKSERV delpostcmd ircnet nickname%_".',
+ 'nickserv_delled', '%R>>%n %_NickServ:%_ Deleted %_$0%_ and it\'s nicknames and post commands from the NickServ ircnet list.',
+ 'nickserv_delled_nick', '%R>>%n %_NickServ:%_ Deleted %_$1%_ and it\'s post commands from the NickServ list on $0.',
+ 'nickserv_delled_postcmd', '%R>>%n %_NickServ:%_ Deleted all entries for %_$1%_ from the NickServ postcmd list on $0.',
'nickserv_nfound', '%R>>%n %_NickServ:%_ The NickServ ircnet %_$0%_ could not be found.',
'nickserv_nfound_nick', '%R>>%n %_NickServ:%_ The NickServ nickname %_$0%_ could not be found on $1.',
+ 'nickserv_nfound_postcmd', '%R>>%n %_NickServ:%_ The NickServ post commands for nickname %_$1%_ could not be found on $0.',
'nickserv_usage', '%R>>%n %_NickServ:%_ Insufficient parameters: Use "%_/NICKSERV help%_" for further instructions.',
'nickserv_no_net', '%R>>%n %_NickServ:%_ Unknown Irssi ircnet %_$0%_.',
'nickserv_wrong_host', '%R>>%n %_NickServ:%_ Malformed services hostname %_$0%_.',
'already_loaded_network', '%R>>%n %_NickServ:%_ The ircnet %_$0%_ already exists in the NickServ ircnet list, please remove it first.',
'nickserv_loaded_nick', '%R>>%n %_NickServ:%_ The nickname %_$0%_ already exists in the NickServ authlist on %_$1%_, please remove it first.',
'nickserv_not_loaded_net', '%R>>%n %_NickServ:%_ The ircnet %_$0%_ doesn\'t exists in the NickServ ircnet list, please add it first.',
+ 'nickserv_not_loaded_nick', '%R>>%n %_NickServ:%_ The nickname %_$0%_ doesn\'t exists in the NickServ authlist on %_$1%_, please add it first.',
'saved_nickname', '%R>>%n %_NickServ:%_ Added nickname %_$1%_ on %_$0%_.',
+ 'saved_postcmd', '%R>>%n %_NickServ:%_ Added postcmd %_$1%_ on %_$0%_: %_%2%_.',
'network_print', '$[!-2]0 $[20]1 $2',
'password_request', '%R>>%n %_NickServ:%_ Auth Request from NickServ on %_$0%_.',
'password_accepted', '%R>>%n %_NickServ:%_ Password accepted on %_$0%_.',
@@ -96,6 +112,9 @@ Irssi::theme_register([
'nickname_print', '$[!-2]0 $[20]1 $[18]2 $3',
'nickname_info', '%_ # Ircnet Nickname Password%_',
'nickname_empty', '%R>>%n %_NickServ:%_ Your NickServ authlist is empty.',
+ 'postcmd_print', '$[!-2]0 $[20]1 $[18]2 $3',
+ 'postcmd_info', '%_ # Ircnet Nickname Postcmd%_',
+ 'postcmd_empty', '%R>>%n %_NickServ:%_ Your NickServ postcmd list is empty.',
'nickserv_help', '$0',
'saved_network', '%R>>%n %_NickServ:%_ Added services mask "%_$1%_" on %_$0%_.',
'nickserv_loaded', '%R>>%n %_Scriptinfo:%_ Loaded $0 version $1 by $2.'
@@ -105,139 +124,171 @@ sub load_nickservnet {
my ($file) = @_;
- @nickservnet = ();
+ @nickservnet = load_file($file, sub {
+ my $new_nsnet = new_nickserv_network(@_);
+ return undef if ($new_nsnet->{name} eq "" || $new_nsnet->{host} eq "");
+ return $new_nsnet;
+ });
+}
- if (-e $file) {
- local *F;
- open(F, "<", $file);
- local $/ = "\n";
+sub save_nickservnet {
- while (<F>) {
- chop;
- my $new_nsnet = new_nickserv_network(split("\t"));
-
- if (($new_nsnet->{name} ne "") && ($new_nsnet->{host} ne "")) {
- push(@nickservnet, $new_nsnet);
- }
- }
-
- close(F);
- }
+ save_file($nickservnet_file, \@nickservnet, \&nickservnet_as_list);
}
-sub save_nickservnet {
+sub new_nickserv_network {
- my ($file) = @_;
+ return {
+ name => shift,
+ host => shift
+ };
+}
- return unless scalar @nickservnet; # there's nothing to save
+sub nickservnet_as_list {
- if (-e $file) {
- local *F;
- open(F, ">", $file);
+ my $nickserv_net = shift;
- for (my $n = 0; $n < @nickservnet; ++$n) {
- print(F join("\t", $nickservnet[$n]->{name}, $nickservnet[$n]->{host}) . "\n");
- }
-
- close(F);
- } else {
- create_network_file($file);
- save_nickservnet($file);
- }
+ return (
+ $nickserv_net->{name},
+ $nickserv_net->{host}
+ );
}
-sub create_network_file {
-
+sub load_nickservnick {
+
my ($file) = @_;
-
- open(F, ">", $file) or die "Can't create $file. Reason: $!";
+
+ @nickservauth = load_file($file, sub {
+ my $new_nsnick = new_nickserv_nick(@_);
+
+ return undef if ($new_nsnick->{ircnet} eq "" || $new_nsnick->{nick} eq "" || $new_nsnick->{pass} eq "");
+ return $new_nsnick;
+ });
}
-sub new_nickserv_network {
+sub save_nickservnick {
- my $nsnet = {};
+ save_file($nickservauth_file, \@nickservauth, \&nickserv_nick_as_list);
+}
- $nsnet->{name} = shift;
- $nsnet->{host} = shift;
+sub new_nickserv_nick {
- return $nsnet;
+ return {
+ ircnet => shift,
+ nick => shift,
+ pass => shift
+ };
}
-sub load_nickservnick {
+sub nickserv_nick_as_list {
+
+ my $nickserv_nick = shift;
+ return (
+ $nickserv_nick->{ircnet},
+ $nickserv_nick->{nick},
+ $nickserv_nick->{pass}
+ );
+}
+
+sub load_nickservpostcmd {
my ($file) = @_;
- @nickservauth = ();
+ @nickservpostcmd = load_file($file, sub {
+ my $new_postcmd = new_postcmd(@_);
- if (-e $file) {
- local *F;
- open(F, "<" ,$file);
- local $/ = "\n";
+ return undef if ($new_postcmd->{ircnet} eq "" || $new_postcmd->{nick} eq "" || $new_postcmd->{postcmd} eq "");
+ return $new_postcmd;
+ });
+}
- while (<F>) {
- chop;
- my $new_nsnick = new_nickserv_nick(split("\t"));
-
- if (($new_nsnick->{ircnet} ne "") && ($new_nsnick->{nick} ne "") && ($new_nsnick->{pass} ne "")) {
- push(@nickservauth, $new_nsnick);
- }
- }
-
- close(F);
- }
+sub save_nickservpostcmd {
+
+ save_file($nickservpostcmd_file, \@nickservpostcmd, \&postcmd_as_list);
}
-sub save_nickservnick {
+sub new_postcmd {
- my ($file) = @_;
+ return {
+ ircnet => shift,
+ nick => shift,
+ postcmd => shift
+ };
+}
- return unless scalar @nickservauth; # there's nothing to save
+sub postcmd_as_list {
+ my $postcmd = shift;
- if (-e $file) {
- local *F;
- open(F, ">", $file);
+ return (
+ $postcmd->{ircnet},
+ $postcmd->{nick},
+ $postcmd->{postcmd}
+ );
+}
- for (my $n = 0; $n < @nickservauth; ++$n) {
- print(F join("\t", $nickservauth[$n]->{ircnet}, $nickservauth[$n]->{nick}, $nickservauth[$n]->{pass}) . "\n");
- }
-
- close(F);
- } else {
- create_nick_file($file);
- save_nickservnick($file);
+# file: filename to be read
+# parse_line_fn: receives array of entries of a single line as input, should
+# return parsed data object or undef in the data is incomplete
+# returns: parsed data array
+sub load_file {
+
+ my ($file, $parse_line_fn) = @_;
+ my @parsed_data = ();
+
+ if (-e $file) {
+ open(my $fh, "<", $file);
+ local $/ = "\n";
+
+ while (<$fh>) {
+ chomp;
+ my $data = $parse_line_fn->(split("\t"));
+ push(@parsed_data, $data) if $data;
}
-}
-sub create_nick_file {
-
- my ($file) = @_;
-
- my $umask = umask 0077; # save old umask
- open(F, ">", $file) or die "Can't create $file. Reason: $!";
- umask $umask;
+ close($fh);
+ }
+
+ return @parsed_data;
}
-sub new_nickserv_nick {
+# file: filename to be written, is created accessable only by the user
+# data_ref: array ref of data entries
+# serialize_fn: receives a data reference and should return an array or tuples
+# for that data that will be serialized into one line
+sub save_file {
+
+ my ($file, $data_ref, $serialize_fn) = @_;
+
+ create_private_file($file) unless -e $file;
- my $nsnick = {};
+ open(my $fh, ">", $file) or die "Can't create $file. Reason: $!";
- $nsnick->{ircnet} = shift;
- $nsnick->{nick} = shift;
- $nsnick->{pass} = shift;
+ for my $data (@$data_ref) {
+ print($fh join("\t", $serialize_fn->($data)), "\n");
+ }
+
+ close($fh);
+}
- return $nsnick;
+sub create_private_file {
+
+ my ($file) = @_;
+ my $umask = umask 0077; # save old umask
+ open(my $fh, ">", $file) or die "Can't create $file. Reason: $!";
+ close($fh);
+ umask $umask;
}
sub add_nickname {
-
+
my ($network, $nickname, $password) = split(" ", $_[0], 3);
- my ($correct_network, $correct_nickname, $correct_password);
+ my ($correct_network, $correct_nickname);
if ($network eq "" || $nickname eq "" || $password eq "") {
Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'nickserv_usage_nickname');
return;
}
-
+
if ($network) {
if (!already_loaded_net($network)) {
Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'nickserv_not_loaded_net', $network);
@@ -246,7 +297,7 @@ sub add_nickname {
$correct_network = 1;
}
}
-
+
if ($nickname) {
if (already_loaded_nick($nickname, $network)) {
Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'nickserv_loaded_nick', $nickname, $network);
@@ -255,28 +306,64 @@ sub add_nickname {
$correct_nickname = 1;
}
}
-
+
if ($correct_network && $correct_nickname) {
push(@nickservauth, new_nickserv_nick($network, $nickname, $password));
- save_nickservnick("$irssidir/$nickservauth_file");
-
+ save_nickservnick();
+
Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'saved_nickname', $network, $nickname);
}
}
+sub add_postcmd {
+
+ my ($network, $nickname, $postcmd) = split(" ", $_[0], 3);
+ my ($correct_network, $correct_nickname);
+
+ if ($network eq "" || $nickname eq "" || $postcmd eq "") {
+ Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'nickserv_usage_postcmd');
+ return;
+ }
+
+ if ($network) {
+ if (!already_loaded_net($network)) {
+ Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'nickserv_not_loaded_net', $network);
+ return;
+ } else {
+ $correct_network = 1;
+ }
+ }
+
+ if ($nickname) {
+ if (!already_loaded_nick($nickname, $network)) {
+ Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'nickserv_not_loaded_nick', $nickname, $network);
+ return;
+ } else {
+ $correct_nickname = 1;
+ }
+ }
+
+ if ($correct_network && $correct_nickname) {
+ push(@nickservpostcmd, new_postcmd($network, $nickname, $postcmd));
+ save_nickservpostcmd();
+
+ Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'saved_postcmd', $network, $nickname, $postcmd);
+ }
+}
+
sub add_network {
-
+
my ($network, $hostname) = split(" ", $_[0], 2);
my ($correct_net, $correct_host);
-
+
if ($network eq "" || $hostname eq "") {
Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'nickserv_usage_network');
return;
}
-
+
if ($network) {
my ($ircnet) = Irssi::chatnet_find($network);
-
+
if (!$ircnet) {
Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'nickserv_no_net', $network);
return;
@@ -287,7 +374,7 @@ sub add_network {
$correct_net = 1;
}
}
-
+
if ($hostname) {
if ($hostname !~ /^[.+a-zA-Z0-9_-]{1,}@[.+a-zA-Z0-9_-]{1,}$/) {
Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'nickserv_wrong_host', $hostname);
@@ -296,11 +383,11 @@ sub add_network {
$correct_host = 1;
}
}
-
+
if ($correct_net && $correct_host) {
push(@nickservnet, new_nickserv_network($network, $hostname));
- save_nickservnet("$irssidir/$nickservnet_file");
-
+ save_nickservnet();
+
Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'saved_network', $network, $hostname);
}
}
@@ -308,56 +395,32 @@ sub add_network {
sub already_loaded_net {
my ($ircnet) = @_;
- my $loaded = check_loaded_net($ircnet);
-
- if ($loaded > -1) {
- return 1;
- }
-
- return 0;
-}
-
-sub check_loaded_net {
-
- my ($ircnet) = @_;
$ircnet = lc($ircnet);
- for (my $loaded = 0; $loaded < @nickservnet; ++$loaded) {
- return $loaded if (lc($nickservnet[$loaded]->{name}) eq $ircnet);
+ for my $loaded (@nickservnet) {
+ return 1 if (lc($loaded->{name}) eq $ircnet);
}
-
- return -1;
+
+ return 0;
}
sub already_loaded_nick {
-
my ($nickname, $network) = @_;
- my $loaded = check_loaded_nick($nickname, $network);
-
- if ($loaded > -1) {
- return 1;
- }
-
- return 0
-}
-sub check_loaded_nick {
-
- my ($nickname, $network) = @_;
-
$nickname = lc($nickname);
$network = lc($network);
-
- for (my $loaded = 0; $loaded < @nickservauth; ++$loaded) {
- return $loaded if (lc($nickservauth[$loaded]->{nick}) eq $nickname && lc ($nickservauth[$loaded]->{ircnet}) eq $network);
+
+ for my $loaded (@nickservauth) {
+ return 1 if (lc($loaded->{nick}) eq $nickname &&
+ lc($loaded->{ircnet}) eq $network);
}
-
- return -1;
+
+ return 0;
}
sub list_net {
-
+
if (@nickservnet == 0) {
Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'network_empty');
} else {
@@ -370,7 +433,7 @@ sub list_net {
}
sub list_nick {
-
+
if (@nickservauth == 0) {
Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'nickname_empty');
} else {
@@ -382,8 +445,21 @@ sub list_nick {
}
}
+sub list_postcmd {
+
+ if (@nickservpostcmd == 0) {
+ Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'postcmd_empty');
+ } else {
+ Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'postcmd_info');
+
+ for (my $n = 0; $n < @nickservpostcmd ; ++$n) {
+ Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'postcmd_print', $n, $nickservpostcmd[$n]->{ircnet}, $nickservpostcmd[$n]->{nick}, $nickservpostcmd[$n]->{postcmd});
+ }
+ }
+}
+
sub nickserv_notice {
-
+
my ($server, $data, $nick, $address) = @_;
my ($target, $text) = $data =~ /^(\S*)\s:(.*)/;
@@ -392,14 +468,14 @@ sub nickserv_notice {
if ($text =~ /^(?:If this is your nickname, type|Please identify via|Type) \/msg NickServ (?i:identify)/ || $text =~ /^This nickname is registered and protected. If it is your/ || $text =~ /This nickname is registered\. Please choose a different nickname/) {
my $password = get_password($server->{tag}, $server->{nick});
-
+
if ($password == -1) {
Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'password_request', $server->{tag});
Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'nickserv_nfound_nick', $server->{nick}, $server->{tag});
Irssi::signal_stop();
return;
}
-
+
Irssi::signal_stop();
Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'password_request', $server->{tag});
$server->command("^MSG NickServ IDENTIFY $password");
@@ -442,6 +518,7 @@ sub nickserv_notice {
} elsif ($text =~ /^Password accepted - you are now recognized/ || $text =~ /^You are now identified for/) {
Irssi::signal_stop();
Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'password_accepted', $server->{tag});
+ run_postcmds($server, $server->{tag}, $server->{nick})
} elsif ($text =~ /^Password Incorrect/ || $text =~ /^Password incorrect./) {
Irssi::signal_stop();
Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'password_wrong', $server->{tag});
@@ -449,24 +526,39 @@ sub nickserv_notice {
}
}
+sub run_postcmds {
+ my ($server, $ircnet, $nick) = @_;
+ return if @nickservpostcmd == 0;
+
+ for my $cmd (@nickservpostcmd) {
+ if ($ircnet eq $cmd->{ircnet} &&
+ $nick eq $cmd->{nick} &&
+ $cmd->{postcmd}) {
+ $server->command($cmd->{postcmd});
+ }
+ }
+}
+
sub is_nickserv {
-
+
my ($net, $host) = @_;
for (my $loaded = 0; $loaded < @nickservnet; ++$loaded) {
- return 1 if (lc($nickservnet[$loaded]->{name}) eq lc($net) && lc($nickservnet[$loaded]->{host}) eq lc($host));
+ return 1 if (lc($nickservnet[$loaded]->{name}) eq lc($net) &&
+ lc($nickservnet[$loaded]->{host}) eq lc($host));
}
return 0;
}
sub get_password {
-
+
my ($ircnet, $nick) = @_;
-
+
for (my $loaded = 0; $loaded < @nickservauth; ++$loaded) {
- return $nickservauth[$loaded]->{pass} if (lc($nickservauth[$loaded]->{ircnet}) eq lc($ircnet) && lc($nickservauth[$loaded]->{nick}) eq lc($nick));
+ return $nickservauth[$loaded]->{pass} if (lc($nickservauth[$loaded]->{ircnet}) eq lc($ircnet) &&
+ lc($nickservauth[$loaded]->{nick}) eq lc($nick));
}
-
+
return -1;
}
@@ -485,47 +577,76 @@ sub del_network {
$ircnetindex = 1;
}
}
-
+
if ($ircnetindex) {
@nickservnet = grep {lc($_->{name}) ne lc($ircnet)} @nickservnet;
@nickservauth = grep {lc($_->{ircnet}) ne lc($ircnet)} @nickservauth;
+ @nickservpostcmd = grep {lc($_->{ircnet}) ne lc($ircnet)} @nickservpostcmd;
Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'nickserv_delled', $ircnet);
- save_nickservnet("$irssidir/$nickservnet_file");
- save_nickservnick("$irssidir/$nickservauth_file");
+ save_nickservnet();
+ save_nickservnick();
+ save_nickservpostcmd();
} else {
Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'nickserv_nfound', $ircnet);
}
}
sub del_nickname {
-
+
my ($ircnet, $nickname) = split(" ", $_[0], 2);
my ($nickindex);
-
+
if ($ircnet eq "" || $nickname eq "") {
Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'nickserv_delnickusage');
return;
}
for (my $index = 0; $index < @nickservauth; ++$index) {
- if (lc($nickservauth[$index]->{ircnet}) eq lc($ircnet) && lc($nickservauth[$index]->{nick}) eq lc($nickname)) {
+ if (lc($nickservauth[$index]->{ircnet}) eq lc($ircnet) &&
+ lc($nickservauth[$index]->{nick}) eq lc($nickname)) {
$nickindex = splice(@nickservauth, $index, 1);
- }
+ }
}
if ($nickindex) {
+ @nickservpostcmd = grep {lc($_->{ircnet}) ne lc($ircnet) ||
+ lc($_->{nick}) ne lc($nickname)}
+ @nickservpostcmd;
+
Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'nickserv_delled_nick', $ircnet, $nickname);
- save_nickservnick("$irssidir/$nickservauth_file");
+ save_nickservnick();
+ save_nickservpostcmd();
} else {
Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'nickserv_nfound_nick', $ircnet, $nickname);
}
}
+sub del_postcmd {
+
+ my ($ircnet, $nickname) = split(" ", $_[0], 2);
+
+ if ($ircnet eq "" || $nickname eq "") {
+ Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'nickserv_delpostcmdusage');
+ return;
+ }
+
+ my $size_before = scalar(@nickservpostcmd);
+ @nickservpostcmd = grep { !( lc($_->{ircnet}) eq lc($ircnet) && lc($_->{nick}) eq lc($nickname) )} @nickservpostcmd;
+ my $size_after = scalar(@nickservpostcmd);
+
+ if ($size_before != $size_after) {
+ Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'nickserv_delled_postcmd', $ircnet, $nickname);
+ save_nickservpostcmd();
+ } else {
+ Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'nickserv_nfound_postcmd', $ircnet, $nickname);
+ }
+}
+
sub nickserv_runsub {
-
+
my ($data, $server, $item) = @_;
$data =~ s/\s+$//g;
-
+
if ($data) {
Irssi::command_runsub('nickserv', $data, $server, $item);
} else {
@@ -533,32 +654,31 @@ sub nickserv_runsub {
}
}
-load_nickservnet("$irssidir/$nickservnet_file");
-load_nickservnick("$irssidir/$nickservauth_file");
+load_nickservnet($nickservnet_file);
+load_nickservnick($nickservauth_file);
+load_nickservpostcmd($nickservpostcmd_file);
Irssi::command_bind('nickserv', 'nickserv_runsub');
Irssi::command_bind('ns', 'nickserv_runsub');
-Irssi::command_bind('nickserv addnet', 'add_network');
-Irssi::command_bind('ns addnet', 'add_network');
-
-Irssi::command_bind('nickserv addnick', 'add_nickname');
-Irssi::command_bind('ns addnick', 'add_nickname');
-
-Irssi::command_bind('nickserv listnet', 'list_net');
-Irssi::command_bind('ns listnet', 'list_net');
-
-Irssi::command_bind('nickserv listnick', 'list_nick');
-Irssi::command_bind('ns listnick', 'list_nick');
-
-Irssi::command_bind('nickserv delnet', 'del_network');
-Irssi::command_bind('ns delnet', 'del_network');
-
-Irssi::command_bind('nickserv delnick', 'del_nickname');
-Irssi::command_bind('ns delnick', 'del_nickname');
-
Irssi::command_bind('nickserv help' => sub { Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'nickserv_help', $help) });
Irssi::command_bind('ns help' => sub { Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'nickserv_help', $help) });
+# "command binding" -> "function name" mapping
+for my $cmd ((
+ ['addnet' => 'add_network'],
+ ['addnick' => 'add_nickname'],
+ ['addpostcmd' => 'add_postcmd'],
+ ['listnet' => 'list_net'],
+ ['listnick' => 'list_nick'],
+ ['listpostcmd' => 'list_postcmd'],
+ ['delnet' => 'del_network'],
+ ['delnick' => 'del_nickname'],
+ ['delpostcmd' => 'del_postcmd'],
+)) {
+ Irssi::command_bind("nickserv $cmd->[0]", $cmd->[1]);
+ Irssi::command_bind("ns $cmd->[0]", $cmd->[1]);
+}
+
Irssi::signal_add('event notice', 'nickserv_notice');
Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'nickserv_loaded', $IRSSI{name}, $VERSION, $IRSSI{authors});