Como posso verificar se um usuário é autenticado com NickServ usando POE :: Component :: IRC :: Estado em Perl?
Pergunta
Eu estou tentando testar se um usuário está registrado na rede Freenode. não nick_info () não parecem retornar informações sobre isso, então eu quero usar $ irc-> rendimento (whois => $ nick); e em seguida, pegue a resposta do evento irc_whois. O problema é que eu quero esperar até que este evento é acionado, então eu criei uma variável global $ whois_result e escreveu uma sub parecido com isto:
sub whois {
my $nick = $_[0];
$whois_result = 0;
$irc->yield(whois => $nick);
while($whois_result == 0) { }
return $whois_result;
}
com o manipulador irc_whois parecendo:
sub on_whois {
$whois_result = $_[ARG0];
print "DEBUG: irc_whois fired.\n";
}
Infelizmente, o evento não pode disparar enquanto o loop está sendo executado de modo que este trava. Eu tenho certeza que há uma maneira melhor de fazer isso, mas eu não sou o suficiente familiarizado com este tipo de programação para saber. Qualquer ajuda seria muito apreciada.
Solução
O seguinte diz respeito a FreeNode pelo menos (ou qualquer servidor de suporte o recurso de identificar-msg).
Se você está reagindo a uma mensagem (irc_msg
, irc_public
, ou irc_ctcp_action
) de um usuário, você pode dizer se ele identificou a NickServ, olhando para o terceiro argumento ($_[ARG3]
) fornecidos para o manipulador de eventos. Será verdade que o usuário tenha identificado, falso caso contrário.
Outras dicas
No sub para os estados em POE ... Você tem que produzir ou chamá-lo em outro estado.
Além disso, quando você tem dados do comando IRC, rendimento para outro estado para processá-lo.
_start - Iniciar um temporizador, etc. cronômetro - rendimento on_whois
on_whois - prazo que é - Conjunto de dados - rendimento para o próximo temporizador
_stop - Matar o temporizador - lave os dados
Eu corro um bot em Freenode e resolveu o problema, pedindo Nickserv o comando: ACC [nick] *
Nickserv irá então responder com um aviso no formato: [Apelido] -> [registerd nickservname] ACC [nível]
Onde 3 significa nível que o usuário é identificado para nickserv.