from twisted.words.protocols import irc
from twisted.internet import reactor, protocol, threads
from twisted.python import log
import base64
import time, sys
class MessageLogger:
def __init__(self, bot):
self.bot = bot
self.user_queue = []
def get_message(self):
try:
inp = raw_input('irc> ')
return map(str.strip, inp.partition(':')[::2])
except (EOFError, KeyboardInterrupt):
reactor.callFromThread(reactor.stop)
return (None,None)
def send_message(self, res):
user, message = res
if user is not None:
print '<%s> %s: %s' % (self.bot.nickname, user, message)
self.user_queue.append(user)
reactor.callFromThread(self.bot.msg, user, message)
def handle(self, user, message):
handled = self.user_queue != [] and self.user_queue.pop(0) == user
if handled:
print '\r<%s> %s: %s' % (user, self.bot.nickname, message)
return handled
class LogBot(irc.IRCClient):
nickname = base64.encodestring('fiddlerwoaroof')[:len('fiddlerwoaroof')]
def connectionMade(self):
irc.IRCClient.connectionMade(self)
self.join('#lisp');
self.handler = MessageLogger(self)
d = threads.deferToThread(self.handler.get_message)
d.addCallback(self.handler.send_message)
reactor.callLater(5, self.changeNick)
def changeNick(self):
self.setNick(base64.encodestring(self.nickname)[:len(self.nickname)].strip())
reactor.callLater( (random.random()-0.5)*2.5 + 5, self.changeNick )
def privmsg(self, user, channel, msg):
user = user.split('!', 1)[0]
if channel == self.nickname:
handled = self.handler.handle(user, msg)
if handled:
d = threads.deferToThread(self.handler.get_message)
d.addCallback(self.handler.send_message)
def alterCollidedNick(self, nickname):
return base64.encodestring(nickname)[:len(nickname)].strip()
class LogBotFactory(protocol.ClientFactory):
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__':
f = LogBotFactory()
reactor.connectTCP("irc.freenode.net", 6667, f)
reactor.run()