[cvs-annodex] commit (/annodex): +scripts/trunk/ircLogBot.py
conrad
nobody at lists.annodex.net
Mon Feb 21 19:28:04 EST 2005
Update of /annodex (new revision 918)
Added files:
scripts/trunk/ircLogBot.py
Log Message:
initial commit of ircLogBot.py; this is an unmodified copy of a standard text
logger from twisted's examples, by Matthew W. Lefkowitz. It can be found at
http://twistedmatrix.com/documents/current/examples/ircLogBot.py
Added: scripts/trunk/ircLogBot.py
===================================================================
--- scripts/trunk/ircLogBot.py 2005-02-17 20:32:08 UTC (rev 917)
+++ scripts/trunk/ircLogBot.py 2005-02-21 08:28:00 UTC (rev 918)
@@ -0,0 +1,150 @@
+# 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.
+
+If someone says the bot's name in the channel followed by a ':',
+e.g.
+
+ <foo> logbot: hello!
+
+the bot will reply:
+
+ <logbot> foo: I am a log bot
+
+Run this script with two arguments, the channel name the bot should
+connect to, and file to log to, e.g.:
+
+ $ python ircLogBot.py test test.log
+
+will log channel #test to the file 'test.log'.
+"""
+
+
+# twisted imports
+from twisted.protocols import irc
+from twisted.internet import reactor, protocol
+from twisted.python import log
+
+# system imports
+import time, sys
+
+
+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):
+ """Write a message to the file."""
+ 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.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()
+
+
+ # callbacks for events
+
+ def signedOn(self):
+ """Called when bot has succesfully signed on to server."""
+ self.join(self.factory.channel)
+
+ def joined(self, channel):
+ """This will get called when the bot joins the channel."""
+ self.logger.log("[I have joined %s]" % channel)
+
+ def privmsg(self, user, channel, msg):
+ """This will get called when the bot receives a message."""
+ user = user.split('!', 1)[0]
+ self.logger.log("<%s> %s" % (user, msg))
+ if msg.startswith("%s:" % self.nickname):
+ # someone is talking to me, lets respond:
+ msg = "%s: I am a log bot" % user
+ self.say(channel, msg)
+ self.logger.log("<%s> %s" % (self.nickname, msg))
+
+ def action(self, user, channel, msg):
+ """This will get called when the bot sees someone do an action."""
+ user = user.split('!', 1)[0]
+ self.logger.log("* %s %s" % (user, msg))
+
+ # irc callbacks
+
+ def irc_NICK(self, prefix, params):
+ """Called when an IRC user changes their nickname."""
+ old_nick = prefix.split('!')[0]
+ new_nick = params[0]
+ self.logger.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 when new connection is made
+ 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__':
+ # initialize logging
+ log.startLogging(sys.stdout)
+
+ # create factory protocol and application
+ 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()
Property changes on: scripts/trunk/ircLogBot.py
___________________________________________________________________
Name: svn:executable
+ *
--
conrad
More information about the cvs-annodex
mailing list