]> git.vpit.fr Git - perl/scripts/xchat.git/blobdiff - clones.pl
Style nits
[perl/scripts/xchat.git] / clones.pl
index c735c884a45c1ad388c65b06fe388e2ee60f9d52..d47b0279475c41539c6d51b45c22ac728aa4ddd5 100755 (executable)
--- a/clones.pl
+++ b/clones.pl
@@ -45,18 +45,17 @@ sub clone_list_str {
 
 sub host {
  my $userhost = lc $_[0];
- my ($host) = $userhost =~ /@([^@]+)$/;
- return $host || $userhost;
+ return $userhost =~ /@([^@]+)$/ ? $1 : $userhost;
 }
 
 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 {
@@ -179,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;
  }
@@ -229,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;
 };
@@ -237,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)) {