my ($ph, %opers);
-sub print_op { print $ph "\002$_[0]\002 ($_[1]) \002is an IRC operator\n"; 1 }
+sub print_op { print $ph "\002$_[0]\002 ($_[1]) \002is an IRC operator\n" }
hook_server '352', sub {
return EAT_NONE unless 0 <= rindex $_[0][8], '*';
+
my $serv = get_info 'server';
my $nick = $_[0][7];
- if (!$opers{$serv}{$nick}) {
- $opers{$serv}{$nick} = 1;
- my $host = $_[0][4].'@'.$_[0][5];
- my %chans;
- push @{$chans{$_->{type}}}, $_ for grep $_->{server} eq $serv,
- get_list 'channels';
- my $oldctxt = get_context;
- my $onachan = grep $_, map {
- set_context $_->{context}
- and user_info $nick
- and print_op $nick, $host
- } @{$chans{2}};
- do {
- set_context $_->{context}
- and print_op $nick, $host
- } for ($onachan ? () : @{$chans{1}}),
- grep !nickcmp($_->{channel}, $nick), @{$chans{3}};
- set_context $oldctxt;
+ return EAT_NONE if $opers{$serv}{$nick};
+ $opers{$serv}{$nick} = 1;
+
+ my $host = $_[0][4] . '@' . $_[0][5];
+ my %chans;
+ push @{$chans{$_->{type}}}, $_ for grep $_->{server} eq $serv,
+ get_list 'channels';
+
+ my $oldctxt = get_context;
+
+ my $onachan;
+ for (@{$chans{2}}) {
+ set_context $_->{context} or next;
+ user_info $nick or next;
+ print_op $nick, $host;
+ ++$onachan;
+ }
+
+ my @opchans;
+ @opchans = @{$chans{1}} unless $onachan;
+ push @opchans, grep !nickcmp($_->{channel}, $nick), @{$chans{3}};
+ for (@opchans) {
+ set_context $_->{context} or next;
+ print_op $nick, $host;
}
+
+ set_context $oldctxt;
+
return EAT_NONE;
};
hook_print 'Disconnected', sub {
my %servers = map { $_->{server} => 1 }
- grep { $_->{flags} & 9 && not $_->{flags} & 2 }
+ grep { $_->{flags} & 9 and not($_->{flags} & 2) }
get_list 'channels';
- delete $opers{$_} for grep { !$servers{$_} } keys %opers;
+
+ delete @opers{grep !$servers{$_}, keys %opers};
+
return EAT_NONE;
};
hook_server 'QUIT', sub {
my ($nick) = $_[0][0] =~ /^:([^!]+)!/;
+
my $serv = get_info 'server';
delete $opers{$serv}{$nick};
+
return EAT_NONE;
};
sub nick_cb {
my ($old, $new) = @{$_[0]};
+
my $ops = $opers{get_info 'server'};
- if ($ops && $ops->{$old}) {
+ if ($ops and $ops->{$old}) {
$ops->{$new} = 1;
delete $ops->{$old};
}
+
return EAT_NONE;
}
-hook_print $_, \&nick_cb for ('Change Nick', 'Your Nick Changing');
+hook_print $_, \&nick_cb for 'Change Nick', 'Your Nick Changing';
hook_command 'OPSCAN', sub {
my $serv = get_info 'server';
print $ph "No information for this network yet\n";
return EAT_ALL;
}
- my ($chan, $isnet) = (get_info('channel'), 0);
+
+ my $chan = get_info 'channel';
+ my $isnet = 0;
for (get_list 'channels') {
- if ($_->{type} eq 1 && $_->{channel} eq $chan) {
+ if ($_->{type} == 1 and $_->{channel} eq $chan) {
$isnet = 1;
last;
}
}
- my ($name, @ops) = ($isnet) ? ('network', keys %{$opers{$serv}})
- : ('channel', map $_->{nick},
- grep $opers{$serv}{$_->{nick}},
- get_list 'users');
+
+ my ($name, @ops);
+ if ($isnet) {
+ $name = 'network';
+ @ops = keys %{$opers{$serv}};
+ } else {
+ $name = 'channel';
+ @ops = map $_->{nick},
+ grep $opers{$serv}{$_->{nick}},
+ get_list 'users';
+ }
+
if (@ops) {
- print $ph 'IRC operators on this '.$name." : \002@ops\n";
+ print $ph "IRC operators on this $name : \002@ops\n";
} else {
- print $ph 'No IRC operators on this '.$name."\n";
+ print $ph "No IRC operators on this $name\n";
}
+
return EAT_ALL;
}, {
help_text => 'OPSCAN, scan for IRC operators in the current channel'