Comment puis-je faire mon Perl Jabber bot un programme événementiel?

voix
3

Je suis en train de faire un bot Jabber et je ne parviens pas à le garder en cours d'exécution en attendant des messages. Comment puis-je obtenir mon script pour fonctionner en continu? Je l'ai essayé d'appeler un sous-programme qui a une boucle while que je, en théorie, ont mis en place pour vérifier les messages et réagir en conséquence, mais mon script ne se comporte pas de cette façon.

Voici ma source: http://pastebin.com/03Habbvh

# set callbacks bot Jabber
$ JabberBot-> SetMessageCallBacks (chat => \ & le chat);
$ JabberBot-> SetPresenceCallBacks (disponible => \ & accueil, disponible => \ & Killbot);
$ JabberBot-> setCallbacks (réception => \ & prnt, iq => \ & gotIQ);

$ JabberBot-> PresenceSend (type => disponible);
$ JabberBot-> Processus (1);

sous accueil
{
    imprimer Bienvenue! \ n;
    $ JabberBot-> MessageSend (! À => $ jbrBoss-> GetJID (), subject => , body => Bonjour, type => chat, priorité => 10);
    &le maintenir;
}

sous prnt
{
    print $ _ [1] \ n.
}

# $ JabberBot-> MessageSend (! À => $ jbrBoss-> GetJID (), subject => , body => Bonjour global ..., type => chat, priorité => 10);
Processus (5) $ # jabberBot->;
#&le maintenir;

sous le chat
{
    mon ($ idSession, $ msg) = @_;
    $ Dump-> pl2xml ($ msg);
    si (msg- $> GetType () ne 'get' && $ msg-> GetType () ne 'set' && $ msg-> GetType () ne '')
    {
        my $ jbrCmd = & trimSpaces (msg- $> GetBody ());
        my $ dbQry = $ dbh-> préparer ( commande SELECT, accusé de réception de commandes WHERE message = ' .lc (jbrCmd $). ');
        $ DbQry-> execute ();
        if ($ dbQry-> lignes ()> 0 && jbrCmd $! ~ / ^ insert / si)
        {
            mon ref = $ dbQry-> fetchrow_hashref ();
            $ DbQry-> finish ();
            $ JabberBot-> MessageSend (à => $ msg-> GetFrom (), subject => , body => ref $ -> { 'reconnaissance'}, tapez => chat, priorité => 10);
            eval $ ref -> { 'commande'};
            &le maintenir;
        }
        autre
        {
            $ JabberBot-> MessageSend (! À => $ msg-> GetFrom (), subject => , body => Je n'ai pas compris, type => chat, priorité => 10);
            $ DbQry-> finish ();
            &le maintenir;
        }
    }
}

sous gotIQ
{
    imprimer iq \ n;
}

sous trimSpaces
{
    mon string $ = $ _ [0];
    $ string = ~ s / ^ \ s + //; #suppression espaces principaux
    $ string = ~ s / \ s + $ //; #suppression espaces de fin
    retour $ string;
}

sous keepItGoing
{

    print keepItGoing \ n;
    my $ proc = $ jabberBot-> Processus (1);
    while (défini (proc $) && proc $! = 1)
    {
        $ Proc = $ jabberBot-> Processus (1);
    }
}

sous Killbot
{
    print tuer \ n;
    $ JabberBot-> MessageSend (! À => $ _ [0] -> GetFrom (), subject => , body => Déconnexion, type => chat, priorité => 10);
    $ JabberBot-> Processus (1);
    $ JabberBot-> Se déconnecter ();
    Sortie;
}
Créé 29/03/2010 à 06:43
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
6

POE a de très bons cadres d'événements. Je ne sais pas à quel point celui de Jabber (POE :: Component :: Jabber) est, mais il est probablement intéressant de regarder.

Créé 29/03/2010 à 07:50
source utilisateur

voix
2

Je pense que vous pouvez faire votre exemple, le travail en faisant ceci:

0 while $jabber->Process

Cela dit, je recommande fortement d'utiliser un bon cadre de traitement des événements tels que AnyEvent (mon préféré) ou POE (le choix traditionnel).

Créé 29/03/2010 à 07:53
source utilisateur

voix
4

AnyEvent :: XMPP est ridiculement complet, et, puisqu'il utilise AnyEvent , peut être exécuté en toute application fonctionnant par une boucle pris en charge ( propre de AnyEvent , événement , EV , Tk , Glib / Gtk , même POE ).

Créé 29/03/2010 à 12:57
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more