Improve connecting/nicking logic

Randomize nick when connecting and change to botnick after identifying.

Identify after receiving connection welcome message.

Ghost existing nick if it is already in use and then attempt to regain it.
This commit is contained in:
Pragmatic Software 2015-01-10 15:56:43 -08:00
parent 28bd6f3611
commit 7243832cc3
2 changed files with 33 additions and 34 deletions

View File

@ -43,8 +43,7 @@ sub initialize {
$self->{pbot}->{event_dispatcher}->register_handler('irc.kick', sub { $self->on_kick(@_) }); $self->{pbot}->{event_dispatcher}->register_handler('irc.kick', sub { $self->on_kick(@_) });
$self->{pbot}->{event_dispatcher}->register_handler('irc.quit', sub { $self->on_departure(@_) }); $self->{pbot}->{event_dispatcher}->register_handler('irc.quit', sub { $self->on_departure(@_) });
$self->{pbot}->{event_dispatcher}->register_handler('irc.nick', sub { $self->on_nickchange(@_) }); $self->{pbot}->{event_dispatcher}->register_handler('irc.nick', sub { $self->on_nickchange(@_) });
$self->{pbot}->{event_dispatcher}->register_handler('irc.bannickchange', sub { $self->on_bannickchange(@_) }); $self->{pbot}->{event_dispatcher}->register_handler('irc.nicknameinuse', sub { $self->on_nicknameinuse(@_) });
$self->{pbot}->{event_dispatcher}->register_handler('irc.notregistered', sub { $self->on_notregistered(@_) });
} }
sub default_handler { sub default_handler {
@ -69,6 +68,10 @@ sub on_connect {
my ($self, $event_type, $event) = @_; my ($self, $event_type, $event) = @_;
$self->{pbot}->{logger}->log("Connected!\n"); $self->{pbot}->{logger}->log("Connected!\n");
$event->{conn}->{connected} = 1; $event->{conn}->{connected} = 1;
$self->{pbot}->{logger}->log("Identifying with NickServ . . .\n");
$event->{conn}->privmsg("nickserv", "identify " . $self->{pbot}->{registry}->get_value('irc', 'botnick') . ' ' . $self->{pbot}->{registry}->get_value('irc', 'identify_password'));
return 0; return 0;
} }
@ -123,12 +126,12 @@ sub on_notice {
$self->{pbot}->{logger}->log("Received NOTICE from $nick $host '$text'\n"); $self->{pbot}->{logger}->log("Received NOTICE from $nick $host '$text'\n");
if($nick eq 'NickServ' && $text =~ m/This nickname is registered/) { if($nick eq 'NickServ') {
if($text =~ m/This nickname is registered/) {
$self->{pbot}->{logger}->log("Identifying with NickServ . . .\n"); $self->{pbot}->{logger}->log("Identifying with NickServ . . .\n");
$event->{conn}->privmsg("nickserv", "identify " . $self->{pbot}->{registry}->get_value('irc', 'identify_password')); $event->{conn}->privmsg("nickserv", "identify " . $self->{pbot}->{registry}->get_value('irc', 'identify_password'));
} } elsif($text =~ m/You are now identified/) {
$event->{conn}->nick($self->{pbot}->{registry}->get_value('irc', 'botnick'));
if($nick eq 'NickServ' && $text =~ m/You are now identified/) {
foreach my $chan (keys %{ $self->{pbot}->{channels}->{channels}->hash }) { foreach my $chan (keys %{ $self->{pbot}->{channels}->{channels}->hash }) {
if($self->{pbot}->{channels}->{channels}->hash->{$chan}{enabled}) { if($self->{pbot}->{channels}->{channels}->hash->{$chan}{enabled}) {
$self->{pbot}->{logger}->log("Joining channel: $chan\n"); $self->{pbot}->{logger}->log("Joining channel: $chan\n");
@ -136,6 +139,9 @@ sub on_notice {
} }
} }
$self->{pbot}->{joined_channels} = 1; $self->{pbot}->{joined_channels} = 1;
} elsif($text =~ m/has been ghosted/) {
$event->{conn}->nick($self->{pbot}->{registry}->get_value('irc', 'botnick'));
}
} }
return 0; return 0;
} }
@ -319,26 +325,13 @@ sub on_nickchange {
return 0; return 0;
} }
# todo: fix the following two subroutines so they work properly (e.g., change nick to randomly generated nick and await responses) sub on_nicknameinuse {
sub on_notregistered {
my ($self, $event_type, $event) = @_; my ($self, $event_type, $event) = @_;
my ($addr, $msg) = $event->{event}->args; my ($unused, $nick, $msg) = $event->{event}->args;
my $from = $event->{event}->from;
$self->{pbot}->{logger}->log("Received NOTREGISTERED from $addr: $msg\n"); $self->{pbot}->{logger}->log("Received nicknameinuse for nick $nick from $from: $msg\n");
$event->{conn}->privmsg("nickserv", "ghost " . $self->{pbot}->{registry}->get_value('irc', 'botnick') . ' ' . $self->{pbot}->{registry}->get_value('irc', 'identify_password')); $event->{conn}->privmsg("nickserv", "ghost $nick " . $self->{pbot}->{registry}->get_value('irc', 'identify_password'));
$event->{conn}->privmsg("nickserv", "release " . $self->{pbot}->{registry}->get_value('irc', 'botnick') . ' ' . $self->{pbot}->{registry}->get_value('irc', 'identify_password'));
$event->{conn}->privmsg("nickserv", "identify " . $self->{pbot}->{registry}->get_value('irc', 'botnick') . ' ' . $self->{pbot}->{registry}->get_value('irc', 'identify_password'));
return 0;
}
sub on_bannickchange {
my ($self, $event_type, $event) = @_;
my ($addr, $nick, $msg) = $event->{event}->args;
$self->{pbot}->{logger}->log("Received BANNICKCHANGE from $addr: $nick ($msg)\n");
$event->{conn}->privmsg("nickserv", "ghost " . $self->{pbot}->{registry}->get_value('irc', 'botnick') . ' ' . $self->{pbot}->{registry}->get_value('irc', 'identify_password'));
$event->{conn}->privmsg("nickserv", "release " . $self->{pbot}->{registry}->get_value('irc', 'botnick') . ' ' . $self->{pbot}->{registry}->get_value('irc', 'identify_password'));
$event->{conn}->privmsg("nickserv", "identify " . $self->{pbot}->{registry}->get_value('irc', 'botnick') . ' ' . $self->{pbot}->{registry}->get_value('irc', 'identify_password'));
return 0; return 0;
} }

View File

@ -151,8 +151,14 @@ sub initialize {
$self->{timer}->start(); $self->{timer}->start();
} }
# TODO: add disconnect subroutine sub random_nick {
my @chars = ("A".."Z", "a".."z", "0".."9");
my $nick;
$nick .= $chars[rand @chars] for 1..10;
return $nick;
}
# TODO: add disconnect subroutine
sub connect { sub connect {
my ($self, $server) = @_; my ($self, $server) = @_;
@ -165,7 +171,7 @@ sub connect {
$self->{logger}->log("Connecting to $server ...\n"); $self->{logger}->log("Connecting to $server ...\n");
while (not $self->{conn} = $self->{irc}->newconn( while (not $self->{conn} = $self->{irc}->newconn(
Nick => $self->{registry}->get_value('irc', 'botnick'), Nick => random_nick,
Username => $self->{registry}->get_value('irc', 'username'), Username => $self->{registry}->get_value('irc', 'username'),
Ircname => $self->{registry}->get_value('irc', 'ircname'), Ircname => $self->{registry}->get_value('irc', 'ircname'),
Server => $server, Server => $server,