start adding node configuration, but unfortunately ejabberd doesn't support this...
[plcapi.git] / omf / omf-slicemgr.py
index 6719e42..a2756aa 100644 (file)
@@ -123,6 +123,7 @@ class PubSubClient(BaseClient):
         xs.addObserver("/iq/pubsub/delete", self.result_delete_node)
         xs.addObserver("/iq/query[@xmlns='http://jabber.org/protocol/disco#items']", self.result_discover)
         xs.addObserver("/iq/pubsub/subscription[@subscription='subscribed']", self.result_subscribe_to_node)
+        xs.addObserver("/iq/pubsub/configure", self.result_configure_node)
 
     def __iq(self, t="get"):
         iq = domish.Element((None, "iq"))
@@ -137,6 +138,7 @@ class PubSubClient(BaseClient):
         pubsub['xmlns'] = "http://jabber.org/protocol/pubsub"
         return pubsub
 
+
     def discover(self, node = None):
         iq = self.__iq("get")
         query = iq.addElement("query")
@@ -147,19 +149,14 @@ class PubSubClient(BaseClient):
         self.xmlstream.send(iq)
 
     def result_discover(self, iq):
-        if self.verbose: self.info("Items for node: %s" % self.requests[iq['id']])
-        
         hook = self.hooks.get('discover', None)
         if hook:
             hook(iq)
             self.delete_result_hook('discover')
 
-        if self.verbose:
-            for i in iq.query.elements():
-                self.msg(i.toXml())
-
         self.requests.pop(iq['id'])
 
+
     def subscribe_to_node(self, node):
         iq = self.__iq("set")
         pubsub = self.__add_pubsub(iq)
@@ -172,6 +169,40 @@ class PubSubClient(BaseClient):
     def result_subscribe_to_node(self, iq):
         self.requests.pop(iq['id'])
 
+
+    def publish_to_node(self, node, payload):
+        iq = self.__iq("set")
+        pubsub = self.__add_pubsub(iq)
+        publish = pubsub.addElement("publish")
+        publish['node'] = node
+        items = publish.addElement("item", content=payload)
+        self.requests[iq['id']] = node
+        self.xmlstream.send(iq)
+
+    def result_publish_to_node(self, iq):
+        self.requests.pop(iq['id'])
+
+
+    # TODO: ejabberd doesn't have the node configuration feature implmented yet!
+    def configure_node(self, node, fields=None):
+        iq = self.__iq("set")
+        pubsub = self.__add_pubsub(iq)
+        configure = pubsub.addElement("configure")
+        configure['node'] = node
+        
+        # TODO: add fields
+
+        self.requests[iq['id']] = node
+        self.xmlstream.send(iq)
+        
+    def result_configure_node(self, iq):
+        hook = self.hooks.get('configure', None)
+        if hook:
+            hook(iq)
+            self.delete_result_hook('configure')
+        self.requests.pop(iq['id'])
+
+
     def create_node(self, node = None):
         iq = self.__iq("set")
         pubsub = self.__add_pubsub(iq)
@@ -184,20 +215,16 @@ class PubSubClient(BaseClient):
 
     def result_create_node(self, iq):
         node = self.requests[iq['id']]
-        try:
-            if hasattr(iq.error, "conflict"):
+        if iq.error:
+            if iq.error.conflict:
                 # node is already there, nothing important.
                 self.warn("NodeID exists: %s" % node)
             else:
                 err_type = ""
-                err_name = ""
-                if iq.error:
-                    if iq.error.has_key('type'):
-                        err_type = iq.error['type']
-                    if iq.error.firstChildElement and hasattr(iq.error.firstChildElement, "name"):
-                        err_name = iq.error.firstChildElement.name
-                self.error("Can not create node: %s (error type: %s, %s)" %  (node, err_type, err_name))
-        except AttributeError:
+                if iq.error['type']:
+                    err_type = iq.error['type']
+                self.error("Can not create node: %s (error type: %s)" %  (node, err_type))
+        else:
             # no errors
             # try subscribing to the node for debugging purposes
             self.subscribe_to_node(node)
@@ -217,13 +244,24 @@ class PubSubClient(BaseClient):
         self.requests.pop(iq['id'])
 
     def message_chat(self, m):
-        command = ""
+        body = ""
         for e in m.elements():
             if e.name == "body":
-                command = "%s" % e
+                body = "%s" % e
                 break
 
-        if command == "list groups":
+#         try:
+#             node = m.event.items['node']
+#             n = domish.Element((None, "message"))
+#             n.addElement("body", content = "published to: %s\n%s" % (node, m.event.items.toXml()))
+#             # for each listener in promiscuous mode send the published event
+#             self.xmlstream.send(n)
+#             return
+#         except:
+#             # not a pubsub message continue on
+#             pass
+
+        if body == "list groups":
             def list_groups(iq):
                 reply = ""
                 for i in iq.query.elements():
@@ -237,6 +275,25 @@ class PubSubClient(BaseClient):
             self.add_result_hook("discover", list_groups)
             self.discover()
 
+        elif body.startswith("configuration"):
+            # "configuration NODE"
+            node = ""
+            try:
+                node = body.split()[1].strip()
+            except IndexError:
+                pass
+
+            def get_configuration(iq):
+                reply = iq.toXml()
+                n = domish.Element((None, "message"))
+                n['to'] = m['from']
+                n['from'] = self.id.full()
+                n.addElement("body", content = reply)
+                self.xmlstream.send(n)
+
+            self.add_result_hook("configure", get_configuration)
+            self.configure_node(node)
+
         else:
             BaseClient.message_chat(self, m)