Created
February 1, 2012 15:52
-
-
Save shnmorimoto/1717671 to your computer and use it in GitHub Desktop.
twisted irc bot sample(ssl)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Copyright (c) Twisted Matrix Laboratories. | |
# See LICENSE for details. | |
""" | |
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.words.protocols import irc | |
from twisted.internet import reactor, protocol, ssl | |
from twisted.python import log | |
# system imports | |
import time, sys, unicodedata | |
class MessageLogger: | |
""" | |
An independent 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): | |
nickname = '' # nickname | |
password = '' # server pass | |
def connectionMade(self): | |
irc.IRCClient.connectionMade(self) | |
print "connectionMade" | |
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]" % self.factory.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)) | |
# Check to see if they're sending me a private message | |
if channel == self.nickname: | |
msg = "It isn't nice to whisper! Play nice with the group." | |
self.msg(user, msg) | |
return | |
# Otherwise check to see if it is a message directed at me | |
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 alterCollidedNick(self, nickname): | |
return nickname+'_' | |
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)) | |
# For fun, override the method that determines how a nickname is changed on | |
# collisions. The default method appends an underscore. | |
def alterCollidedNick(self, nickname): | |
""" | |
Generate an altered version of a nickname that caused a collision in an | |
effort to create an unused related name for subsequent registration. | |
""" | |
return nickname + '^' | |
class LogBotFactory(protocol.ClientFactory): | |
"""A factory for LogBots. | |
A new protocol instance will be created each time we connect to the server. | |
""" | |
protocol = LogBot | |
def __init__(self, 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]) | |
# connect factory to this host and port | |
hostname = '' # irc-server-hostname | |
port = #port | |
reactor.connectSSL(hostname, port, f, ssl.ClientContextFactory()) | |
# run bot | |
reactor.run() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment