my $chan = lc $_[0][2];
if (nickcmp get_info('nick'), $nick) {
my $userinfo = user_info $nick;
- return EAT_NONE unless $userinfo;
my $userhost = $userinfo->{host};
- my $clones = remove $nick, host($userhost), $serv, $chan;
- print $ph clone_leave_str $userhost, $nick, $clones if $clones > 0;
+ if (defined $userhost and length $userhost) {
+ # If this isn't true, the kick happened before the first WHO response was
+ # received and the nick isn't in the database yet.
+ my $clones = remove $nick, host($userhost), $serv, $chan;
+ print $ph clone_leave_str $userhost, $nick, $clones if $clones > 0;
+ }
} else {
flush $serv, $chan;
}
sub nick_cb {
my ($old, $new) = @{$_[0]};
my $userinfo = user_info $new;
- replace $old => $new, host($userinfo->{host}),
- get_info('server'), lc get_info('channel') if $userinfo;
+ $userinfo = user_info $old unless defined $userinfo;
+ my $userhost = $userinfo->{host};
+ if (defined $userhost and length $userhost) {
+ # If the host isn't defined, the first WHO response hasn't been received yet,
+ # so the old nick isn't even in our database.
+ # Otherwise, the new nick would be added right now, and the old one would be
+ # when the WHO responses arrives (which may still refer to the old nick).
+ replace $old => $new, host($userhost),
+ get_info('server'), lc get_info('channel');
+ }
return EAT_NONE;
}