2009-12-13 3 views
1

J'essaie de tester si un utilisateur est enregistré sur FreeNode. nick_info() ne semble pas retourner d'informations à ce sujet, donc je veux utiliser $ irc-> yield (whois => $ nick); puis récupérez 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 whois_result variable globale $ et a écrit un sous comme ceci:Comment vérifier si un utilisateur est authentifié avec NickServ en utilisant POE :: Component :: IRC :: State en Perl?

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 ressemblant à:

sub on_whois { 
    $whois_result = $_[ARG0]; 
    print "DEBUG: irc_whois fired.\n"; 
} 

Malheureusement, l'événement ne peut pas se déclencher tant que la boucle est en cours d'exécution. Je suis sûr qu'il y a une meilleure façon de le faire, mais je ne connais pas assez ce type de programmation pour le savoir. Toute aide serait grandement appréciée.

Répondre

0

Ce qui suit s'applique à FreeNode au moins (ou à tout serveur prenant en charge la fonction d'identification de message).

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. Ce sera vrai si l'utilisateur a identifié, faux sinon.

1

Je dirige un bot sur Freenode et résolu la question en demandant Nickserv la commande: ACC [pseudo] *

Nickserv alors répondre par un avis au format: [surnom] -> [ registerd nickservname] ACC [niveau]

Lorsque le niveau 3 signifie que l'utilisateur est identifié à nickserv.

+0

Merci, mais mon problème principal n'est pas sur la fin IRC, c'est sur la fin POE. Je veux demander si l'utilisateur est enregistré et ne rien faire d'autre jusqu'à ce que j'obtienne une réponse. Le problème que je rencontre est que tout cela est piloté par un événement, et la requête et la réponse sont des événements séparés. Cela signifie que je dois envoyer la demande, puis laisser le robot faire son travail pendant un certain temps, puis chaque fois qu'une réponse arrive, je dois le traiter. Ma solution ci-dessus consistait à demander au gestionnaire de réponse de définir une variable globale et d'interroger cette variable, mais elle a échoué. – Troy

+0

D'accord, j'ai trouvé une solution. Ce que j'ai fait, c'est que j'ai créé une file d'attente globale. Chaque fois que je fais un appel whois, je débloque une fonction anonyme sur la file d'attente qui va gérer les informations qui en résultent.Mon gestionnaire de réponse whois ressemble à ceci: sub on_whois { my $ function = pop (@whois_queue); $ function -> ($ _ [ARG0]); } – Troy

2

Sur le sous-état pour les états dans POE ... Vous devez céder ou l'appeler dans un autre état.

De même, lorsque vous avez des données de la commande IRC, cédez à un autre état pour le traiter.

_start - Démarrage d'une minuterie, etc. minuterie - Rendement on_whois

on_whois - qui est géré - données de l'ensemble - rendement à la prochaine minuterie

_stop - Kill the timer - vider les données

Questions connexes