# 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');