fixbot/api/amp.py
author Tero Marttila <terom@fixme.fi>
Sat, 20 Feb 2010 22:31:17 +0200
changeset 62 e4db89a5f6bc
child 64 8574aeff9b36
permissions -rw-r--r--
restructure api, using AMP as the client-server protocol
from twisted.protocols import amp

from fixbot.module import ModuleInfo, Event

class CmdModuleRegister (amp.Command) :
    """
        Register module
    """

    arguments = [
        ('name',    amp.String()),
    ]

class CmdModuleEvent (amp.Command) :
    """
        Broadcast event
    """

    arguments = [
        ('type',    amp.String()),
        ('msg',     amp.String()),
    ]

class ServerProtocol (amp.AMP) :
    """
        Nexus-side command handler
    """

    # the registered ModuleInfo
    module = None
    
    @CmdModuleRegister.responder
    def on_ModuleRegister (self, name) :
        # construct the ModuleInfo
        mi = ModuleInfo()
        mi.name = name
        
        # register
        self.factory.nexus.registerModule(mi, self)
        self.module = mi

        # ok
        return {}

    @CmdModuleEvent.responder
    def on_ModuleEvent (self, type, msg) :
        # as Event
        e = Event(self.module, type, msg)
        
        # publish
        self.factory.nexus.handleEvent(e)

        # ok
        return {}


class ClientProtocol (amp.AMP) :
    """
        Module-side command sender/handler
    """
    

    def connectionMade (self) :
        """
            Connected to nexus, send ModuleRegister
        """
        
        # register
        self.sendModuleRegister(self.factory.name).addCallback(self._ModuleRegisterOK)
    

    def sendModuleRegister (self, name) :
        """
            Register with given module name
        """

        return self.callRemote(CmdModuleRegister, name=name)


    def _ModuleRegisterOK (self, ret) :
        """
            Registered with nexus, commence operation
        """

        self.factory._onRegistered(self)


    def sendEvent (self, event) :
        """
            Broadcast event to nexus
        """
        
        self.callRemote(CmdModuleEvent, type=event.type, msg=event.msg)