Comment puis-je vérifier si un utilisateur est authentifié avec NickServ en utilisant POE :: Component IRC :: State en Perl?
Question
Je suis en train de vérifier si un utilisateur est enregistré sur freenode. nick_info () ne semble pas renvoyer des informations à ce sujet, donc je veux utiliser $ IRC-> rendement (whois => $ nick); puis saisir la réponse de l'événement irc_whois. Le problème est que je veux attendre que cet événement est tiré, donc je créé une variable globale whois_result de $ et a écrit un sous comme ceci:
sub whois {
my $nick = $_[0];
$whois_result = 0;
$irc->yield(whois => $nick);
while($whois_result == 0) { }
return $whois_result;
}
avec le gestionnaire de irc_whois ressembler à:
sub on_whois {
$whois_result = $_[ARG0];
print "DEBUG: irc_whois fired.\n";
}
Malheureusement, l'événement ne peut se déclencher pendant que la boucle est en cours d'exécution donc ce se bloque. Je suis sûr qu'il ya une meilleure façon de faire, mais je ne suis pas assez familier avec ce genre de programmation savoir. Toute aide serait grandement appréciée.
La solution
Concerne les FreeNode au moins (ou tout serveur prenant en charge la fonction d'identifier-msg).
Si vous réagissez à un message (irc_msg
, irc_public
ou irc_ctcp_action
) d'un utilisateur, vous pouvez dire s'il a identifié à NickServ en regardant le troisième argument ($_[ARG3]
) fourni au gestionnaire d'événements. Il est vrai que si l'utilisateur a identifié, sinon false.
Autres conseils
Dans le sous pour les Etats en POE ... Vous devez céder ou appeler dans un autre État.
En outre, lorsque vous avez des données de la commande IRC, céder à un autre État pour la traiter.
_start - Démarrez une minuterie, etc. minuteur - rendement on_whois
on_whois - qui est géré - Ensemble de données - rendement à la prochaine minuterie
_stop - Tuer la minuterie - rincer les données
Je lance un bot sur Freenode et résolu le problème en demandant Nickserv la commande: ACC [pseudo] *
Nickserv alors répondre par un avis dans le format suivant: [Surnom] -> [nickservname Registerd] ACC [niveau]
Si le niveau 3 signifie que l'utilisateur est identifié à NickServ.