]> git.vpit.fr Git - perl/scripts/xchat.git/blobdiff - opers.pl
Make sure local_context() runs the code only when the context was found
[perl/scripts/xchat.git] / opers.pl
index 875abc9e63910213abd32ffce06082b96d62a67b..f8d178d59e3d870318c0943976bf487fdc01036b 100755 (executable)
--- a/opers.pl
+++ b/opers.pl
@@ -7,6 +7,7 @@ use Xchat qw<:all>;
 
 use lib get_info 'xchatdir';
 use Xchat::XPI;
+use Xchat::XPI::Utils qw<irc_lc save_context>;
 
 our $VERSION = '0.03';
 
@@ -19,15 +20,15 @@ hook_server '352', sub {
 
  my $serv = get_info 'server';
  my $nick = $_[0][7];
- return EAT_NONE if $opers{$serv}{$nick};
- $opers{$serv}{$nick} = 1;
+ return EAT_NONE if $opers{$serv}{irc_lc($nick)};
+ $opers{$serv}{irc_lc($nick)} = $nick;
 
- my $host = $_[0][4] . '@' . $_[0][5];
+ my $host = $_[0][4] . '@' . strip_code $_[0][5];
  my %chans;
  push @{$chans{$_->{type}}}, $_ for grep $_->{server} eq $serv,
                                      get_list 'channels';
 
- my $oldctxt = get_context;
+ my $guard = save_context;
 
  my $onachan;
  for (@{$chans{2}}) {
@@ -45,15 +46,13 @@ hook_server '352', sub {
   print_op $nick, $host;
  }
 
- set_context $oldctxt;
-
  return EAT_NONE;
 };
 
 hook_print 'Disconnected', sub {
- my %servers = map { $_->{server} => 1 }
-                grep { $_->{flags} & 9 and not($_->{flags} & 2) }
-                 get_list 'channels';
+ my %servers;
+ $servers{$_->{server}} = 1 for grep +($_->{flags} & 0b1011) == 0b1001,
+                                 get_list 'channels';
 
  delete @opers{grep !$servers{$_}, keys %opers};
 
@@ -64,7 +63,7 @@ hook_server 'QUIT', sub {
  my ($nick) = $_[0][0] =~ /^:([^!]+)!/;
 
  my $serv = get_info 'server';
- delete $opers{$serv}{$nick};
+ delete $opers{$serv}{irc_lc($nick)};
 
  return EAT_NONE;
 };
@@ -72,9 +71,11 @@ hook_server 'QUIT', sub {
 sub nick_cb {
  my ($old, $new) = @{$_[0]};
 
+ $old = irc_lc $old;
+
  my $ops = $opers{get_info 'server'};
  if ($ops and $ops->{$old}) {
-  $ops->{$new} = 1;
+  $ops->{irc_lc($new)} = $new;
   delete $ops->{$old};
  }
 
@@ -102,11 +103,11 @@ hook_command 'OPSCAN', sub {
  my ($name, @ops);
  if ($isnet) {
   $name = 'network';
-  @ops  = keys %{$opers{$serv}};
+  @ops  = values %{$opers{$serv}};
  } else {
   $name = 'channel';
   @ops  = map $_->{nick},
-           grep $opers{$serv}{$_->{nick}},
+           grep $opers{$serv}{irc_lc($_->{nick})},
             get_list 'users';
  }