2010-07-29 5 views
1

J'essaye de construire un bot irc très simple pour le moment mais il semble que mon bot ne rejoindra pas le canal. Quelqu'un peut-il pointer ce qui ne va pas avec le code suivant:IRCBot ne va pas rejoindre un canal

from twisted.internet import reactor, protocol 
from twisted.words.protocols import irc 

class IRCProtocol(irc.IRCClient): 
    nickname = "botnick" 

    def connectionMade(self): 
     print 'connectionMade!' 

    def signedOn(self): 
     print 'Signed On to server' 
     self.join(self.factory.channels) 
     print 'Joined channel' 
     self.say(self.factory.channels, "hello", 1024) 


class IRCFactory(protocol.ClientFactory): 
    protocol = IRCProtocol 
    channels = "#testingircbot" 

    def clientConnectionFailed(self, connector, reason): 
     print "Connection failed because of %s" % reason 
     reactor.stop() 

    def clientConnectionLost(self, connector, reason): 
     print "Connection lost: %s" % reason 
     connector.connect() 

if __name__ == "__main__": 
    host, port = "irc.freenode.net", 6667 
    fact = IRCFactory() 
    reactor.connectTCP(host, port, fact) 
    reactor.run() 

C'est la sortie quand je lance le script:

connectionMade! 
Connection lost: [Failure instance: Traceback (failure with no frames): <class 'twisted.internet.error.ConnectionDone'>: Connection was closed cleanly. 
] 
connectionMade! 
Connection lost: [Failure instance: Traceback (failure with no frames): <class 'twisted.internet.error.ConnectionDone'>: Connection was closed cleanly. 
] 
connectionMade! 
Connection lost: [Failure instance: Traceback (failure with no frames): <class 'twisted.internet.error.ConnectionDone'>: Connection was closed cleanly. 
] 

Répondre

1

Essayez d'activer la journalisation. Une de vos méthodes consiste probablement à lever une exception. L'exception sera enregistrée, mais sans la journalisation est activée, vous ne la verrez jamais:

from sys import stdout 
from twisted.python.log import startLogging 
startLogging(stdout) 
3

L'un des problèmes avec votre code est que vous surchargez connectionMade sans appeler la mise en œuvre IRCClient. IRCClient.connectionMade effectue plusieurs tâches importantes, telles que «s'enregistrer» auprès du serveur (en fournissant un surnom etc.) qui est nécessaire avant que le serveur accepte d'autres commandes. En fait, signedOn ne sera jamais appelé dans ces circonstances; le serveur attend probablement que votre robot s'enregistre, puis le déconnecte après un délai d'attente configuré lorsque l'enregistrement ne se produit jamais.

(Notez que le « enregistrement » Je me réfère à l'enregistrement de style Nickserv ci-dessus n'est pas, ce qui fait référence au processus d'envoi USER et NICK commandes lors de la connexion au serveur IRC (

En outre, vos appels de code. self.join() pour rejoindre un canal, puis il tente immédiatement d'envoyer un message à ce canal, bien que cela ne fonctionne pas, mais vous devez remplacer joined pour que votre code soit exécuté une fois que le robot a rejoint Vous pouvez ensuite envoyer votre message "Hello" (ou faire autre chose)

0

Tel que mentionné par @mi thrandi vous êtes en train de surcharger connectionMade. Voici comment cela doit être fait:

def connectionMade(self): 
    print 'connectionMade!' 
    irc.IRCClient.connectionMade(self)