plugin XEP-0060: None is no more used in addManagedNode, but all nodes prefixed with a registered one are now triggered

This commit is contained in:
Goffi 2015-12-18 15:06:58 +01:00
commit f8a8aa4b08

View file

@ -142,12 +142,14 @@ class XEP_0060(object):
def addManagedNode(self, node, **kwargs):
"""Add a handler for a node
@param node(unicode): node to monitor, or None to monitor all
@param node(unicode): node to monitor
all node *prefixed* with this one will be triggered
@param **kwargs: method(s) to call when the node is found
the methode must be named after PubSub constants in lower case
and suffixed with "_cb"
e.g.: "publish_cb" for C.PS_PUBLISH, "delete_cb" for C.PS_DELETE
"""
assert node is not None
assert kwargs
callbacks = self._node_cb.setdefault(node, {})
for event, cb in kwargs.iteritems():
@ -247,7 +249,7 @@ class XEP_0060(object):
def subscribeEb(failure, service, node):
failure.trap(error.StanzaError)
log.warning("Could not subscribe to node {} on service {}: {}".format(node, unicode(service), unicode(failure.value)))
def doSubscribe(items):
self.subscribe(service, node, profile_key=profile_key).addErrback(subscribeEb, service, node)
return items
@ -495,27 +497,32 @@ class SatPubSubClient(rsm.PubSubClient):
def connectionInitialized(self):
rsm.PubSubClient.connectionInitialized(self)
def _getNodeCallbacks(self, node, event):
"""Generate callbacks from given node and event
@param node(unicode): node used for the item
any registered node which prefix the node will match
@param event(unicode): one of C.PS_ITEMS, C.PS_RETRACT, C.PS_DELETE
@return (iterator[callable]): callbacks for this node/event
"""
for registered_node, callbacks_dict in self.parent_plugin._node_cb.iteritems():
if not node.startswith(registered_node):
continue
try:
for callback in callbacks_dict[event]:
yield callback
except KeyError:
continue
def itemsReceived(self, event):
log.debug(u"Pubsub items received")
for node in (event.nodeIdentifier, None):
try:
callbacks = self.parent_plugin._node_cb[node][C.PS_ITEMS]
except KeyError:
pass
else:
for callback in callbacks:
callback(event, self.parent.profile)
for callback in self._getNodeCallbacks(event.nodeIdentifier, C.PS_ITEMS):
callback(event, self.parent.profile)
def deleteReceived(self, event):
log.debug((u"Publish node deleted"))
for node in (event.nodeIdentifier, None):
try:
callbacks = self.parent_plugin._node_cb[node][C.PS_DELETE]
except KeyError:
pass
else:
for callback in callbacks:
callback(event, self.parent.profile)
for callback in self._getNodeCallbacks(event.nodeIdentifier, C.PS_DELETE):
callback(event, self.parent.profile)
def subscriptions(self, service, nodeIdentifier, sender=None):
"""Return the list of subscriptions to the given service and node.