from subprocess import Popen, PIPE from twisted.internet import reactor, protocol, interfaces from twisted.words.protocols import irc import Zephyr import re IRC_NICK = 'Zirconium' IRC_PORT = 6667 IRC_SERVER = 'irc.freenode.net' IRC_CHANNEL = '#mit-minecraft' ZEPHYR_CLASS = 'glass-houses-chat' ZEPHYR_INSTANCE = IRC_CHANNEL ZEPHYR_SIG = 'IRC-Zephyr bridge' ZEPHYR_OPCODE = 'bot' MC_USER = re.compile(r'^<([^>]*)> (.*)$') def format(msg): return msg[:40] class IRCEngine(irc.IRCClient): nickname = IRC_NICK instance = None def __init__(self): IRCEngine.instance = self def signedOn(self): self.join(IRC_CHANNEL) def joined(self, channel): print "IRC: joined %s" % channel def privmsg(self, user, channel, msg): user = user.split('!', 1)[0] print 'IRC: message "%s" from %s in %s' % (format(msg), user, channel) if msg == '~quit': reactor.stop() return match = MC_USER.match(msg) if user == 'MIT-Minecraft' and match: user, msg = match.groups() if channel == IRC_CHANNEL and user.strip() and msg.strip(): cmd = [ './zsend', '-d', '-c', ZEPHYR_CLASS, '-i', ZEPHYR_INSTANCE, '-s', ZEPHYR_SIG, '-S', user, '-O', ZEPHYR_OPCODE, '-m', msg ] Popen(cmd).communicate() action = privmsg class IRCFactory(protocol.ClientFactory): protocol = IRCEngine def clientConnectionLost(self, connector, reason): print 'IRC: lost connection (%s)' % reason connector.connect() def clientConnectionFailed(self, connector, reason): print 'IRC: could not connect (%s)' % reason class ZephyrReader(object): def __init__(self): self.zobj = Zephyr.Zephyr() self.zobj.subscribe(( ZEPHYR_CLASS, '*', '*' )) def fileno(self): return self.zobj.getfd() def connectionLost(self, reason): print 'Zephyr: lost connection (%s)' % reason reactor.stop() def doRead(self): msg = self.zobj.check() while msg: self.process(**msg) msg = self.zobj.check() def process(self, message, zclass, sender, opcode, **kwargs): message = message.replace('\n', ' ') if opcode != ZEPHYR_OPCODE: print 'Zephyr: message "%s" from %s in %s' % (format(message), sender, zclass) IRCEngine.instance.msg(IRC_CHANNEL, '<%s> %s' % (sender.split('@')[0], message.strip())) def logPrefix(self): return 'Zephyr' def main(): reactor.connectTCP(IRC_SERVER, IRC_PORT, IRCFactory()) reactor.addReader(ZephyrReader()) reactor.run() if __name__ == '__main__': main()