Python/Twisted IRC 机器人日志记录问题

Posted

技术标签:

【中文标题】Python/Twisted IRC 机器人日志记录问题【英文标题】:Python/Twisted IRC bot logging problem 【发布时间】:2011-02-01 15:45:05 【问题描述】:

嘿。我最近才开始使用 Python,我的朋友建议使用 Twisted 作为创建这个 IRC 机器人的一种方法,因为它会简单得多。这是我到目前为止的代码(很大程度上基于 logbot.py 哈哈)

from twisted.internet import reactor, protocol
from twisted.words.protocols import irc
from twisted.python import log
import sys, time

class MessageLogger:
    def __init__(self, file):
        self.file = file

    def log(self, message):
        timestamp = time.strftime("[%H:%M:%S]", time.localtime(time.time()))
        self.file.write('%s %s\n' % (timestamp, message))
        self.file.flush()

    def close(self):
        self.file.close()

class IRCProtocol(irc.IRCClient):
    nickname = "3n7rar3"
    def connectionMade(self):
        irc.IRCClient.connectionMade(self)
        self.logger = MessageLogger(open(self.factory.filename, "a"))

    def signedOn(self):
        print 'Success! Connection established.'
        self.join(self.factory.channels)
        print 'Joined channel', self.factory.channels

    def privmsg(self, user, channel, msg):
        user = user.split('!', 1)[0]
        self.logger.log("<%s> %s" % (user, msg))

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

    def __init__(self, channel, filename):
        self.channel = channel
        self.filename = filename

    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__":
    log.startLogging(sys.stdout)
    host, port = "irc.freenode.net", 6667
    fact = IRCFactory(sys.argv[1],sys.argv[2])
    reactor.connectTCP(host, port, fact)
    reactor.run()

这个问题是机器人只记录频道消息,但我也希望它记录频道连接和部分。实现这一目标的最简单方法是什么?谢谢。

【问题讨论】:

【参考方案1】:

定义连接和部件的方法并在其中登录:

def userJoined(self, user, channel):
    log.msg('%s has joined %s' % (user, channel))

def userLeft(self, user, channel):
    log.msg('%s has left %s' % (user, channel))

def userQuit(self, user, quitMessage):
    log.msg('%s has quit. Reason: %s' % (user, quitMessage))

api documentation 和 source code 将来可能对你有用。

【讨论】:

【参考方案2】:

documentation 对我来说似乎很清楚。覆盖 userJoineduserLeft 方法,就像对 privmsg 所做的那样。

【讨论】:

我看错了文档哈哈。谢谢,不胜感激。

以上是关于Python/Twisted IRC 机器人日志记录问题的主要内容,如果未能解决你的问题,请参考以下文章

Python Twisted IRC,发送颜色信息

禁止登录 IRC 频道,以 twitch 为例

IRC 日志记录脚本

如何使用 Bash 编写的 IRC 机器人从 IRC 频道读取消息?

Python IRC 机器人不会加入

为啥我的 IRC 机器人无法连接?