#!/usr/bin/perl -w IRC::register("pass.pl","0.1",""); IRC::add_command_handler(addpass,addpass); IRC::add_message_handler('005',cachenetwork); IRC::add_message_handler(NOTICE,nickserv_check); IRC::add_command_handler(identify_nick,identify_nick); my %pass; my %network; my $nickserv_address = 'services@brasnet.org services@brasirc.net'; my $nickserv_trigger = 'escolha um nick diferente'; # Essa sub adiciona um par usuario/senha ao banco de dados # de senhas. sub addpass { my @parm = split(/\s+/,$_[0]); my $num = @parm; if ($num < 2) { IRC::command("/echo uso: /addpass nick senha"); return(1); } my $var = IRC::get_info('3'); unless ($var) { IRC::command("/echo Voce precisa estar conectado para usar esse comando."); return(1); } dbmopen(%network,"~/.xchat/networkdb",0666); dbmopen(%pass,"~/.xchat/passdb",0666); if ($network{$var}) { $pass{$network{$var}}{$parm[0]} = $parm[1]; IRC::command("/echo $parm[0] @ $network{$var} pass saved."); } else { $pass{$var}{$parm[0]} = $parm[1]; IRC::command("/echo $parm[0] @ $var pass saved."); } dbmclose(%network); dbmclose(%pass); return(1); } # Essa sub supre a falta dum $network no xchat, # cacheando a cada conexao nomes de redes a nomes # de servidores. Que deve ser de qualquer forma mais # ou menos o modo que o Khaled deve ter implementado o # $network no mIRC. sub cachenetwork { if (shift(@_) =~ /NETWORK=(\w+)/) { dbmopen(%network,"~/.xchat/networkdb",0666); $network{IRC::get_info('3')} = $1; dbmclose(%network); } } # Vamos fazer uma sub que identifica o nick # recebendo como parametros o nick e # o valor de IRC::get_info('3') como parametros sub idennick { local($nick,$server) = @_; dbmopen(%network,"~/.xchat/networkdb",0666); dbmopen(%pass,"~/.xchat/passdb",0666); $net = $network{$server}; unless ($net) { $net = $server; } if (!(defined($pass{$net}{$nick}))) { IRC::command("/echo nick/pass nao cadastrados."); dbmclose(%network); dbmclose(%pass); return(1); } IRC::command("/echo identifying $nick @ $net"); IRC::command("/quote identify $pass{$net}{$nick}"); dbmclose(%network); dbmclose(%pass); } # Essa sub deve checar por notices e verificar se eles sao o nickserv # pedindo identificacao sub nickserv_check { if (shift(@_) =~ /:(.*)\!(.*\@.*)\s+.*\s+(.*)\s+:(.*)/) { local($nick_nick,$address,$nick,$message) = ($1,$2,$3,$4); if (($nick_nick =~ /^nickserv$/i) && ($nickserv_address =~ /$address/i) && ($message =~ /$nickserv_trigger/i)) { idennick($nick,IRC::get_info('3')); } } } # Essa sub recebe o nick e o servidor e identifica ele. # sub identify_nick { local($nick,$server) = (IRC::get_info('1'),IRC::get_info('3')); idennick($nick,$server); return(1); }