use strict;
use warnings;
-use Scalar::Util qw/dualvar/;
+use Scalar::Util qw<dualvar>;
-use Xchat qw/:all/;
+use Xchat qw<:all>;
use lib get_info 'xchatdir';
use Xchat::XPI;
-use Xchat::XPI::Events qw/delay/;
+use Xchat::XPI::Events qw<delay>;
use constant {
JOIN_DELAY => 1000,
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 {
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;
}
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;
};
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)) {
help_text => 'Scan for clones in the current channel'
};
-$ph = new Xchat::XPI name => 'Clones scanner',
- tag => 'Clones',
- desc => 'Automatic & on-demand clones scanner',
- author => 'Vincent Pit (VPIT)',
- email => 'perl@profvince.com',
- url => 'http://www.profvince.com',
- unload => sub { undef %users };
+$ph = Xchat::XPI->new(
+ name => 'Clones scanner',
+ tag => 'Clones',
+ desc => 'Automatic & on-demand clones scanner',
+ author => 'Vincent Pit (VPIT)',
+ email => 'perl@profvince.com',
+ url => 'http://www.profvince.com',
+ unload => sub { undef %users },
+);
1;