#!/usr/bin/python
# coding=utf8

# Copyright (c) Twisted Matrix Laboratories.


from twisted.words.protocols import irc
from twisted.internet import reactor, protocol
from twisted.python import log
import time, sys
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 LogBot(irc.IRCClient):
    nickname = "twistedbot"
    def connectionMade(self):
        irc.IRCClient.connectionMade(self)
        self.logger = MessageLogger(open(self.factory.filename, "a"))
        self.logger.log("[connected at %s]" %
                        time.asctime(time.localtime(time.time())))
    def connectionLost(self, reason):
        irc.IRCClient.connectionLost(self, reason)
        self.logger.log("[disconnected at %s]" %
                        time.asctime(time.localtime(time.time())))
        self.logger.close()
    def signedOn(self):
        self.join(self.factory.channel)
    def joined(self, channel):
        self.logger.log("[I have joined %s]" % channel)
    def privmsg(self, user, channel, msg):
        user = user.split('!', 1)[0]
        self.logger.log("<%s> %s" % (user, msg))
        if channel == self.nickname:
            msg = "It isn't nice to whisper!  Play nice with the group."
            self.msg(user, msg)
            return
        if msg.startswith(self.nickname + ":"):
            msg = "%s: I am a log bot" % user
            self.msg(channel, msg)
            self.logger.log("<%s> %s" % (self.nickname, msg))
    def action(self, user, channel, msg):
        user = user.split('!', 1)[0]
        self.logger.log("* %s %s" % (user, msg))
    def irc_NICK(self, prefix, params):
        old_nick = prefix.split('!')[0]
        new_nick = params[0]
        self.logger.log("%s is now known as %s" % (old_nick, new_nick))
    def alterCollidedNick(self, nickname):
        return nickname + '^'
class LogBotFactory(protocol.ClientFactory):
    def __init__(self, channel, filename):
        self.channel = channel
        self.filename = filename
    def buildProtocol(self, addr):
        p = LogBot()
        p.factory = self
        return p
    def clientConnectionLost(self, connector, reason):
        connector.connect()
    def clientConnectionFailed(self, connector, reason):
        print "connection failed:", reason
        reactor.stop()
if __name__ == '__main__':
    log.startLogging(sys.stdout)
    f = LogBotFactory(sys.argv[2], sys.argv[3])
    reactor.connectTCP(sys.argv[1], 6667, f)
    reactor.run()