# Twisted, the Framework of Your Internet
# Copyright (C) 2001 Matthew W. Lefkowitz
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of version 2.1 of the GNU Lesser General Public
# License as published by the Free Software Foundation.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
"""An example IRC log bot - logs a channel's events to a file."""
# twisted imports
from twisted.protocols import irc
from twisted.internet import reactor,protocol
# system imports
import string, time
class MessageLogger:
"""
An independant logger class (because separation of application
and protocol logic is a good thing).
"""
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):
"""A logging IRC bot."""
def __init__(self):
self.nickname = "twistedbot"
def connectionMade(self):
irc.IRCClient.connectionMade(self)
self.logger = MessageLogger(open(self.factory.filename, "a"))
self.log = self.logger.log
self.log("[connected at %s]" % time.asctime(time.localtime(time.time())))
def signedOn(self):
self.join(self.factory.channel)
def connectionLost(self, reason):
irc.IRCClient.connectionLost(self)
self.log("[disconnected at %s]" % time.asctime(time.localtime(time.time())))
self.logger.close()
# callbacks for events
def joined(self, channel):
self.log("[I have joined %s]" % channel)
def privmsg(self, user, channel, msg):
user = string.split(user, '!', 1)[0]
self.log("<%s> %s" % (user, msg))
def action(self, user, channel, msg):
user = string.split(user, '!', 1)[0]
self.log("* %s %s" % (user, msg))
# irc callbacks
def irc_NICK(self, prefix, params):
"""When an IRC user changes their nickname
"""
old_nick = string.split(prefix,'!')[0]
new_nick = params[0]
self.log("%s is now known as %s" % (old_nick, new_nick))
class LogBotFactory(protocol.ClientFactory):
"""A factory for LogBots.
A new protocol instance will be created each time we connect to the server.
"""
# the class of the protocol to build
protocol = LogBot
def __init__(self, channel, filename):
self.channel = channel
self.filename = filename
def clientConnectionLost(self, connector, reason):
"""If we get disconnected, reconnect to server."""
connector.connect()
def clientConnectionFailed(self, connector, reason):
print "connection failed:", reason
reactor.stop()
if __name__ == '__main__':
# create factory protocol and application
import sys
f = LogBotFactory(sys.argv[1], sys.argv[2])
# connect factory to this host and port
reactor.connectTCP("irc.freenode.net", 6667, f)
# run bot
reactor.run()
|