2011-02-01 139 views
0

嘿。我最近才开始使用Python,而我的朋友建议使用Twisted作为创建此IRC bot的手段,因为它会简单得多。这里是我到目前为止(这在很大程度上基于关闭logbot.py哈哈)代码Python/Twisted IRC bot日志记录问题

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

这样做的问题是,机器人只记录频道的消息,但我也想它登录通道连接和部分。什么是最简单的方法来完成这一点?谢谢。

回答

2

定义和连接部分的方法和日志里面他们太多:

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 documentationsource code是你将来可能有用。

1

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

+0

我在看错文档哈哈。谢谢,感谢。 – Felix 2011-02-01 15:56:53