IRCBot не присоединится к каналу - PullRequest
1 голос
/ 29 июля 2010

Я сейчас пытаюсь создать очень простого ирк-бота, но, похоже, мой бот не присоединится к каналу. Может кто-нибудь указать, что не так со следующим кодом:

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()

Это вывод при запуске скрипта:

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.
]

Ответы [ 3 ]

3 голосов
/ 04 августа 2010

Одной из проблем вашего кода является то, что вы переопределяете connectionMade, не вызывая реализацию IRCClient.IRCClient.connectionMade выполняет несколько важных задач, таких как «регистрация» на сервере (предоставление псевдонима и т. Д.), Что необходимо перед тем, как сервер примет какие-либо дальнейшие команды.На самом деле, signedOn никогда не будет вызван при этих обстоятельствах;сервер, вероятно, ожидает регистрации вашего бота, а затем отключает его после заданного времени ожидания, когда регистрация никогда не происходит.

(Обратите внимание, что «регистрация», на которую я ссылаюсь выше, не является регистрацией в стиле NickServ;относится к процессу отправки команд USER и NICK при подключении к IRC-серверу. (

Кроме того, ваш код вызывает self.join(), чтобы присоединиться к каналу, а затем сразу же пытается отправить сообщение наэтот канал. Хотя это может работать, это не гарантируется, вместо этого вам следует переопределить joined, чтобы ваш код запускался после того, как бот фактически присоединился к каналу. Затем вы можете отправить сообщение "привет" (или сделать что-нибудь еще).

1 голос
/ 29 июля 2010

Попробуйте включить ведение журнала. Один из ваших методов, вероятно, вызывает исключение. Исключение будет зарегистрировано, но без включения журнала вы никогда его не увидите:

from sys import stdout
from twisted.python.log import startLogging
startLogging(stdout)
0 голосов
/ 23 февраля 2012

Как уже упоминалось @mithrandi, вы переопределяете connectionMade. Вот как это должно быть сделано:

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