[Download]
# This does not handle target change too fast,
# but the 5 minute delay should be plenty if
# you successfully join the channel.
# /set irpg_username USERNAME
# /set irpg_password PASSWORD
# /set irpg_nickname YOUR_NICKNAME (optional)
# /set irpg_delay_cprivmsg MILLISECONDS (default 5000 - 5 seconds)
# /set irpg_delay_privmsg1 MILLISECONDS (default 60000 - 60 seconds)
# /set irpg_delay_privmsg2 MILLISECONDS (default 300000 - 5 minutes)
use Irssi;
use strict;
use vars qw($VERSION %IRSSI);
$VERSION = "3.50";
%IRSSI = (
authors => 'Byte',
name=> 'irpg',
description => 'irpg login script',
license => 'Public Domain',
);
my %timers = ();
sub cmd_irpg {
my ($data, $server, $witem) = @_;
irpg_login('reg');
}
sub irpg_login {
my ($valid) = @_;
my $server = Irssi::server_find_tag('GameSurge');
if (length(Irssi::settings_get_str('irpg_username')) == 0) {
Irssi::print('IRPG username not set');
if (defined($timers{'IRPG1'})) { Irssi::timeout_remove($timers{'IRPG1'}); delete $timers{'IRPG1'}; }
if (defined($timers{'IRPG2'})) { Irssi::timeout_remove($timers{'IRPG2'}); delete $timers{'IRPG2'}; }
if (defined($timers{'IRPG3'})) { Irssi::timeout_remove($timers{'IRPG3'}); delete $timers{'IRPG3'}; }
return;
}
if (length(Irssi::settings_get_str('irpg_password')) == 0) {
Irssi::print('IRPG password not set');
if (defined($timers{'IRPG1'})) { Irssi::timeout_remove($timers{'IRPG1'}); delete $timers{'IRPG1'}; }
if (defined($timers{'IRPG2'})) { Irssi::timeout_remove($timers{'IRPG2'}); delete $timers{'IRPG2'}; }
if (defined($timers{'IRPG3'})) { Irssi::timeout_remove($timers{'IRPG3'}); delete $timers{'IRPG3'}; }
return;
}
if ($server) {
my $channel = $server->channel_find("#irpg");
my $me = $server->{nick};
if ($channel) {
my $user = $channel->nick_find($me);
my $irpg = $channel->nick_find("IRPG");
if ($user && $irpg) {
my $type = 'PRIVMSG';
# CPRIVMSG can be used if opped or voiced
if ($user->{op} || $user->{voice}) {
$type = 'CPRIVMSG';
}
# check if PRIVMSG is allowed or if this run is op/voice-only
if ($valid eq 'reg' || $type eq 'CPRIVMSG') {
if ($type eq 'CPRIVMSG') {
Irssi::print("Logging into IRPG (cprivmsg)");
$server->command("/^quote CPRIVMSG IRPG #irpg :login ".Irssi::settings_get_str('irpg_username')." ".Irssi::settings_get_str('irpg_password'));
} else {
Irssi::print("Logging into IRPG");
$server->command("/^quote PRIVMSG IRPG :login ".Irssi::settings_get_str('irpg_username')." ".Irssi::settings_get_str('irpg_password'));
}
}
}
}
}
# don't want to try more than once on each timer
if (defined($timers{'IRPG1'})) {
Irssi::timeout_remove($timers{'IRPG1'}); delete $timers{'IRPG1'};
} elsif (defined($timers{'IRPG2'})) {
Irssi::timeout_remove($timers{'IRPG2'}); delete $timers{'IRPG2'};
} elsif (defined($timers{'IRPG3'})) {
Irssi::timeout_remove($timers{'IRPG3'}); delete $timers{'IRPG3'};
}
}
sub event_join {
my ($server, $channel, $nick, $address) = @_;
my $me = $server->{nick};
if (length(Irssi::settings_get_str('irpg_username')) == 0) {
Irssi::print('IRPG username not set');
return;
}
if (length(Irssi::settings_get_str('irpg_password')) == 0) {
Irssi::print('IRPG password not set');
return;
}
if (uc($server->{tag}) eq "GAMESURGE"
&& uc($channel) eq "#IRPG"
&& (length(Irssi::settings_get_str('irpg_nickname')) == 0
|| $me eq Irssi::settings_get_str('irpg_nickname'))) {
if ($nick eq $me) {
# remove existing timers
if (defined($timers{'IRPG1'})) { Irssi::timeout_remove($timers{'IRPG1'}); delete $timers{'IRPG1'}; }
if (defined($timers{'IRPG2'})) { Irssi::timeout_remove($timers{'IRPG2'}); delete $timers{'IRPG2'}; }
if (defined($timers{'IRPG3'})) { Irssi::timeout_remove($timers{'IRPG3'}); delete $timers{'IRPG3'}; }
# set timers to login
Irssi::print("Scheduling login to IRPG");
$timers{'IRPG1'} = Irssi::timeout_add(Irssi::settings_get_int('irpg_delay_cprivmsg'),'irpg_login','op');
$timers{'IRPG2'} = Irssi::timeout_add(Irssi::settings_get_int('irpg_delay_privmsg1'),'irpg_login','reg');
$timers{'IRPG3'} = Irssi::timeout_add(Irssi::settings_get_int('irpg_delay_privmsg2'),'irpg_login','reg');
} elsif (uc($nick) eq "IRPG") {
irpg_login('reg');
}
}
}
sub event_nick {
my ($server, $newnick, $oldnick, $address) = @_;
if (length(Irssi::settings_get_str('irpg_nickname')) == 0) { return; }
if (uc($server->{tag}) eq "GAMESURGE"
&& $newnick eq Irssi::settings_get_str('irpg_nickname')) {
# nickname is now correct, login
irpg_login('reg');
}
}
sub event_privmsg {
my ($server, $msg, $nick, $address) = @_;
if (uc($server->{tag}) eq "GAMESURGE" && uc($nick) eq "IRPG") {
if ($msg =~ /^Successfully logged you in/) {
if (defined($timers{'IRPG1'})) { Irssi::timeout_remove($timers{'IRPG1'}); delete $timers{'IRPG1'}; }
if (defined($timers{'IRPG2'})) { Irssi::timeout_remove($timers{'IRPG2'}); delete $timers{'IRPG2'}; }
if (defined($timers{'IRPG3'})) { Irssi::timeout_remove($timers{'IRPG3'}); delete $timers{'IRPG3'}; }
Irssi::print("Logged into IRPG");
} elsif ($msg =~ /^"([^ ]+)" is an invalid username/
&& length(Irssi::settings_get_str('irpg_username')) > 0
&& $1 eq Irssi::settings_get_str('irpg_username')) {
if (defined($timers{'IRPG1'})) { Irssi::timeout_remove($timers{'IRPG1'}); delete $timers{'IRPG1'}; }
if (defined($timers{'IRPG2'})) { Irssi::timeout_remove($timers{'IRPG2'}); delete $timers{'IRPG2'}; }
if (defined($timers{'IRPG3'})) { Irssi::timeout_remove($timers{'IRPG3'}); delete $timers{'IRPG3'}; }
Irssi::print("Failed to login to IRPG (invalid username)");
} elsif ($msg =~ /^You have entered an invalid password/) {
if (defined($timers{'IRPG1'})) { Irssi::timeout_remove($timers{'IRPG1'}); delete $timers{'IRPG1'}; }
if (defined($timers{'IRPG2'})) { Irssi::timeout_remove($timers{'IRPG2'}); delete $timers{'IRPG2'}; }
if (defined($timers{'IRPG3'})) { Irssi::timeout_remove($timers{'IRPG3'}); delete $timers{'IRPG3'}; }
Irssi::print("Failed to login to IRPG (invalid password)");
} elsif ($msg =~ /^You are already logged in/) {
if (defined($timers{'IRPG1'})) { Irssi::timeout_remove($timers{'IRPG1'}); delete $timers{'IRPG1'}; }
if (defined($timers{'IRPG2'})) { Irssi::timeout_remove($timers{'IRPG2'}); delete $timers{'IRPG2'}; }
if (defined($timers{'IRPG3'})) { Irssi::timeout_remove($timers{'IRPG3'}); delete $timers{'IRPG3'}; }
Irssi::print("Failed to login to IRPG (already logged in)");
}
}
}
sub event_notice {
my ($server, $msg, $nick, $address, $target) = @_;
my $me = $server->{nick};
if ($target eq $me) { event_privmsg($server, $msg, $nick, $address); }
}
Irssi::signal_add_first('message join', 'event_join');
Irssi::signal_add_first('message own_nick', 'event_nick');
Irssi::signal_add_first('message private', 'event_privmsg');
Irssi::signal_add_first('message irc notice', 'event_notice');
Irssi::settings_add_str('misc', 'irpg_username', "");
Irssi::settings_add_str('misc', 'irpg_password', "");
Irssi::settings_add_str('misc', 'irpg_nickname', "");
Irssi::settings_add_int('misc', 'irpg_delay_cprivmsg', 5000);
Irssi::settings_add_int('misc', 'irpg_delay_privmsg1', 60000);
Irssi::settings_add_int('misc', 'irpg_delay_privmsg2', 300000);
Irssi::command_bind('irpg', 'cmd_irpg');