from twisted.internet import reactor, protocol
from twisted.python import log
import sys
import irc, api
class IRCFactory (protocol.ClientFactory) :
protocol = irc.BotProtocol
def __init__ (self, nexus) :
self.nexus = nexus
log.msg("Connecting to IRC at %s:%d" % (irc.HOSTNAME, irc.PORT))
reactor.connectTCP6(irc.HOSTNAME, irc.PORT, self)
self.connection = None
def connected (self, connection) :
self.connection = connection
class APIFactory (protocol.ServerFactory) :
protocol = api.ServerProtocol
def __init__ (self, nexus) :
self.nexus = nexus
log.msg("API listening on %s:%d" % (api.SERVER_HOST, api.PORT))
reactor.listenTCP(api.PORT, self, interface=api.SERVER_HOST)
class Nexus (object) :
def __init__ (self) :
self.modules = dict()
self.irc = IRCFactory(self)
self.api = APIFactory(self)
def registerModule (self, module, transport) :
self.modules[module.name] = (module, transport)
self.irc.connection.moduleConnected(module, transport.transport.getPeer())
def unregisterModule (self, module, reason) :
del self.modules[module.name]
self.irc.connection.moduleDisconnected(module, reason)
def handleEvent (self, event) :
self.irc.connection.sendEvent(event)
def getModules (self) :
return (module for (module, transport) in self.modules.itervalues())
def getModuleInfo (self, name) :
module, connection = self.modules[name]
return module, connection.transport.getPeer()
if __name__ == '__main__' :
log.startLogging(sys.stderr)
nexus = Nexus()
reactor.run()