nexus.py
author Tero Marttila <terom@paivola.fi>
Fri, 21 Mar 2008 02:06:34 +0200
changeset 9 75cc996c6ba1
parent 6 614161f85d9b
child 14 ae8e18030f68
permissions -rw-r--r--
testing IPv6

committer: Tero Marttila <terom@paivola.fi>
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()