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) :
def __init__ (self) :
"""
Must set .irc/.api attrs to irc.Factory/api.ServerFactory instances
"""
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()
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['api-secret'])
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
if __name__ == '__main__' :
log.startLogging(sys.stderr)
nexus = Nexus()
reactor.run()