]> git.vpit.fr Git - perl/scripts/xchat.git/commitdiff
Stop adding wrong clones when there was a nick change or a kick before the first...
authorVincent Pit <vince@profvince.com>
Sat, 14 Aug 2010 22:21:05 +0000 (00:21 +0200)
committerVincent Pit <vince@profvince.com>
Sat, 14 Aug 2010 22:46:34 +0000 (00:46 +0200)
clones.pl

index 12150e80dda752f97de46a4cf8158e5aa14a25e8..421bbd40116d471ec8687358794db64dc0c3b70e 100755 (executable)
--- a/clones.pl
+++ b/clones.pl
@@ -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;
  }
@@ -236,8 +239,16 @@ 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;
 }