2010-02-15 2 views
3

J'ai une classe MyJabber qui init un compte jabber de base qui imprime les messages entrants à stdout + les mettre dans une file d'attente.Comment initier le réacteur tordu dans le bon sens?

Le code qui ajoute le client au réacteur est ceci:

def addReactor(self): 
    print 'inside AddReactor' 
    factory = client.basicClientFactory(self.jid, self.option['jabber']['password']) 
    print "factory initialized" 
    factory.addBootstrap(xmlstream.STREAM_AUTHD_EVENT, self.authd) 
    print 'factory bootsraped' 
    reactor.connectTCP(self.option['jabber']['server'], 5222, factory) 

il est appelé ainsi:

jabber = MyJabber(options, to_irc) 
jabber.addReactor() 
reactor.run() 

Quand je lance l'application i voir le 'print' de addReactor mais après ça plus rien. je vois via « tcpdump » que quelque chose tente de se connecter à « jabber.org », mais rien lié à la définition authd:

def authd(self, xmlstream): 
    global thexmlstream 
    thexmlstream = xmlstream 
    # need to send presence so clients know we're 
    # actually online. 
    print 'Initializing...' 
    presence = domish.Element(('jabber:client', 'presence')) 
    presence.addElement('status').addContent('Online') 

    xmlstream.send(presence) 
    # add a callback for the messages 
    print 'Add gotMessaged callback' 
    xmlstream.addObserver('/message', gotMessage) 
    print 'Add * callback' 
    xmlstream.addObserver('/*', gotSomething) 

Répondre

4

Cela ne semble pas vraiment une question sur la façon de « init torsadé réacteur". Il semble plutôt s'agir plutôt de savoir comment utiliser le support XMPP de Twisted Words pour envoyer et répondre aux messages XMPP.

Vous pouvez trouver des exemples de couples qui font dans le répertoire des exemples Mots Twisted:

http://twistedmatrix.com/documents/current/words/examples/

Essayez xmpp_client.py et jabber_client.py.

+0

Remarque côté: si je change la définition de classe, et j'utiliser le code comme seule application, il fonctionne très bien. pas de problème avec le code du réacteur. comme je le souhaite, le composant de réacteur peut également être activé en dehors de la définition de classe car il s'agit d'un composant partagé par tous les protocoles. mais ça pend. Donc le point de la question est lié au réacteur :) le code xmpp fonctionne bien :) – giskard

+1

Il n'y a pas de différence fondamentale entre "en dehors de la définition de classe" ou (l'implicite) "dans la définition de classe". Si la version de votre code qui prend une approche fonctionne alors que la version qui adopte une approche différente ne fonctionne pas, alors vous avez introduit un bug lors de la conversion de l'un à l'autre. Cependant, il n'y a aucun moyen de savoir quel bogue juste en lisant le code que vous avez posté ici. –

0

Corrigé, il y avait 2 erreurs.

1) Je accidentellement oublié que JID est [email protected]/extra

2) a oublié d'ajouter self.-gotMessage/gotSomething

J'ai aussi fait addReactor retourner l'usine et dans la principale () a écrit:

jabber = MyJabber(options, to_irc) 
factory = jabber.addReactor() 
reactor.connectTCP(options['jabber']['server'], 5222, factory) 
reactor.run() 
Questions connexes