package Xchat::VPIT::Opers;

use strict;
use warnings;

use Xchat qw/:all/;

use lib get_info 'xchatdir';
use Xchat::XPI;

our $VERSION = '0.03';

my ($ph, %opers);

sub print_op { print $ph "\002$_[0]\002 ($_[1]) \002is an IRC operator\n"; 1 }

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;
};

hook_print 'Disconnected', sub {
 my %servers = map { $_->{server} => 1 }
                grep { $_->{flags} & 9 && not $_->{flags} & 2 }
                 get_list 'channels';
 delete $opers{$_} for 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}) {
  $ops->{$new} = 1;
  delete $ops->{$old};
 }
 return EAT_NONE;
}

hook_print $_, \&nick_cb for ('Change Nick', 'Your Nick Changing');

hook_command 'OPSCAN', sub {
 my $serv = get_info 'server';
 if (!$opers{$serv}) {
  print $ph "No information for this network yet\n";
  return EAT_ALL;
 }
 my ($chan, $isnet) = (get_info('channel'), 0);
 for (get_list 'channels') {
  if ($_->{type} eq 1 && $_->{channel} eq $chan) {
   $isnet = 1;
   last;
  }
 }
 my ($name, @ops) = ($isnet) ? ('network', keys %{$opers{$serv}})
                             : ('channel', map $_->{nick},
                                            grep $opers{$serv}{$_->{nick}},
                                             get_list 'users');
 if (@ops) {
  print $ph 'IRC operators on this '.$name." : \002@ops\n";
 } else {
  print $ph 'No IRC operators on this '.$name."\n";
 }
 return EAT_ALL;
}, {
 help_text => 'OPSCAN, scan for IRC operators in the current channel'
};

$ph = Xchat::XPI->new(
 name   => 'Operators',
 tag    => 'Opers',
 desc   => 'IRC operators scanner',
 author => 'Vincent Pit (VPIT)',
 email  => 'perl@profvince.com',
 url    => 'http://www.profvince.com',
 unload => sub { undef %opers },
);

1;
