fixbot/api/amp.py
changeset 62 e4db89a5f6bc
child 64 8574aeff9b36
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fixbot/api/amp.py	Sat Feb 20 22:31:17 2010 +0200
@@ -0,0 +1,95 @@
+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)
+
+