Comment puis-je vérifier si un utilisateur est authentifié avec NickServ en utilisant POE :: Component IRC :: State en Perl?

StackOverflow https://stackoverflow.com/questions/1897335

  •  19-09-2019
  •  | 
  •  

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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top