terom@21: from twisted.application import internet, service terom@21: from twisted.internet import reactor, protocol terom@21: from twisted.python import log terom@21: import sys terom@21: terom@21: import irc, api terom@21: terom@21: class Nexus (object) : terom@21: def __init__ (self) : terom@21: """ terom@21: Must set .irc/.api attrs to irc.Factory/api.ServerFactory instances terom@21: """ terom@21: terom@21: self.modules = dict() terom@21: terom@21: terom@21: def registerModule (self, module, transport) : terom@21: self.modules[module.name] = (module, transport) terom@21: terom@21: self.irc.connection.moduleConnected(module, transport.transport.getPeer()) terom@21: terom@21: def unregisterModule (self, module, reason) : terom@21: del self.modules[module.name] terom@21: terom@21: self.irc.connection.moduleDisconnected(module, reason) terom@21: terom@21: def handleEvent (self, event) : terom@21: self.irc.connection.sendEvent(event) terom@21: terom@21: def getModules (self) : terom@21: return (module for (module, transport) in self.modules.itervalues()) terom@21: terom@21: def getModuleInfo (self, name) : terom@21: module, connection = self.modules[name] terom@21: terom@21: return module, connection.transport.getPeer() terom@21: terom@21: def makeService (config) : terom@21: n = Nexus() terom@21: s = service.MultiService() terom@21: terom@21: # the IRC side terom@21: n.irc = irc.Factory(n, terom@21: config['irc-nickname'], terom@21: config['irc-username'], terom@21: config['irc-channel'] terom@21: ) terom@21: terom@37: log.msg("Connecting to IRC server on [%s:%d]", config['irc-server'], config['irc-port']) terom@37: irc_client = internet.TCPClient(config['irc-server'], config['irc-port'], n.irc) terom@21: terom@21: irc_client.setServiceParent(s) terom@21: terom@21: # the API side terom@35: n.api = api.ServerFactory(n, config['api-secret']) terom@21: terom@21: log.msg("Starting API server on [%s:%d]", config['api-port'], config['api-listen']) terom@21: api_server = internet.TCPServer(config['api-port'], n.api, interface=config['api-listen']) terom@21: terom@21: api_server.setServiceParent(s) terom@21: terom@21: # return the service collection terom@21: return s terom@21: