2011-02-01 13 views
0

ねえ。私は最近Pythonを使い始めました。私の友人は、このIRCボットを作成する手段としてTwistedを使うことを提案しました。ここで私が持っているコードは、これまでに(重く笑logbot.pyオフに基づいている)Python/Twisted IRCボットロギングの問題

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は明らかです。 privmsgのようにuserJoineduserLeftメソッドをオーバーライドします。

+0

私は誤ったドキュメンテーションを見ていました。ありがとう、ありがとう。 – Felix