fixbot/nexus.py
author Tero Marttila <terom@fixme.fi>
Sat, 06 Nov 2010 16:02:28 +0200
changeset 67 00907acd732a
parent 62 e4db89a5f6bc
permissions -rw-r--r--
Merge with api restructuring
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