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:
parent
ea0da04fdf
commit
f8a8aa4b08
2 changed files with 26 additions and 21 deletions
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -72,7 +72,7 @@ class XEP_0277(object):
|
|||
self.host = host
|
||||
self._p = self.host.plugins["XEP-0060"] # this facilitate the access to pubsub plugin
|
||||
self.rt_sessions = sat_defer.RTDeferredSessions()
|
||||
self.host.plugins["XEP-0060"].addManagedNode(None, items_cb=self._itemsReceived)
|
||||
self.host.plugins["XEP-0060"].addManagedNode(NS_MICROBLOG, items_cb=self._itemsReceived)
|
||||
|
||||
host.bridge.addMethod("mbSend", ".plugin",
|
||||
in_sign='ssa{ss}s', out_sign='',
|
||||
|
|
@ -120,8 +120,6 @@ class XEP_0277(object):
|
|||
|
||||
def _itemsReceived(self, itemsEvent, profile):
|
||||
"""Callback which manage items notifications (publish + retract)"""
|
||||
if not itemsEvent.nodeIdentifier.startswith(NS_MICROBLOG):
|
||||
return
|
||||
def manageItem(data, event):
|
||||
self.host.bridge.psEvent(C.PS_MICROBLOG, itemsEvent.sender.full(), itemsEvent.nodeIdentifier, event, data, profile)
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue