from twisted.application import internet, service
from twisted.internet import reactor, protocol
from twisted.python import log
import sys
import irc, api
class Nexus (object) :
"""
The core component, which has the set of registered ModuleInfo's from api, and the IRC connection
"""
# runtime config options as a dict
config = None
# the irc.Factory instance
irc = None
# the api.ServerFactory instance
api = None
def __init__ (self, config) :
self.config = config
self.modules = dict()
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()
def makeService (config) :
n = Nexus(config)
s = service.MultiService()
# the IRC side
n.irc = irc.Factory(n,
config['irc-nickname'],
config['irc-username'],
config['irc-channel']
)
log.msg("Connecting to IRC server on [%s:%d]", config['irc-server'], config['irc-port'])
irc_client = internet.TCPClient(config['irc-server'], config['irc-port'], n.irc)
irc_client.setServiceParent(s)
# the API side
n.api = api.ServerFactory(n, config)
log.msg("Starting API server on [%s:%d]", config['api-port'], config['api-listen'])
api_server = internet.TCPServer(config['api-port'], n.api, interface=config['api-listen'])
api_server.setServiceParent(s)
# return the service collection
return s