X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=clones.pl;h=d47b0279475c41539c6d51b45c22ac728aa4ddd5;hb=3bde6e3a4f228bb731c1719f7096a8474cfab82d;hp=12150e80dda752f97de46a4cf8158e5aa14a25e8;hpb=125e52ff2903768a9859f17b9e4b2dce157b4ea0;p=perl%2Fscripts%2Fxchat.git diff --git a/clones.pl b/clones.pl index 12150e8..d47b027 100755 --- a/clones.pl +++ b/clones.pl @@ -51,11 +51,11 @@ sub host { sub add { my ($nick, $host, $serv, $chan) = @_; my $hosts = $users{$serv}{$chan}; - $users{$serv}{$chan} = $hosts = { } if not defined $hosts; + $users{$serv}{$chan} = $hosts = { } unless defined $hosts; my $clones = $hosts->{$host}; $nick = PRE . $nick . POST; if (defined $clones) { - if ((index $clones, $nick) < $[) { + if (index($clones, $nick) < $[) { $hosts->{$host} = dualvar int($clones) + 1, $clones . $nick; } } else { @@ -178,10 +178,13 @@ hook_server 'KICK', sub { 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; } @@ -228,7 +231,7 @@ hook_print 'Disconnected', sub { my %servers = map { $_->{server} => 1 } grep { $_->{flags} & 9 && not $_->{flags} & 2 } get_list 'channels'; - delete $users{$_} for grep { !$servers{$_} } keys %users; + delete $users{$_} for grep { !$servers{$_} } keys %users; delete $fetched{$_} for grep { !$servers{$_} } keys %fetched; return EAT_NONE; }; @@ -236,15 +239,24 @@ hook_print 'Disconnected', sub { 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; } hook_print $_, \&nick_cb for ('Change Nick', 'Your Nick Changing'); hook_command 'CLSCAN', sub { - my ($serv, $chan) = (get_info('server'), lc get_info('channel')); + my $serv = get_info 'server'; + my $chan = lc get_info 'channel'; if (!$fetched{$serv}{$chan} && !fetch($serv, $chan)) { print $ph "Data still not available\n"; } elsif (!scan($serv, $chan)) {