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 = new Xchat::XPI 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;