comparison sat/plugins/plugin_xep_0060.py @ 2760:3480d4fdf83a

plugins XEP-0060, XEP-0313: implemented Order-By protoXEP: new "order_by" key can be used in extra data, value can be, for now, "creation" or "modification".
author Goffi <goffi@goffi.org>
date Sun, 06 Jan 2019 17:36:51 +0100
parents f4070693814a
children 9282b289b964
comparison
equal deleted inserted replaced
2759:607cfc79e40f 2760:3480d4fdf83a
80 ID_SINGLETON = "current" 80 ID_SINGLETON = "current"
81 81
82 def __init__(self, host): 82 def __init__(self, host):
83 log.info(_(u"PubSub plugin initialization")) 83 log.info(_(u"PubSub plugin initialization"))
84 self.host = host 84 self.host = host
85 self._rsm = host.plugins.get("XEP-0059") 85 self._rsm = host.plugins.get(u"XEP-0059")
86 self._mam = host.plugins.get("XEP-0313") 86 self._mam = host.plugins.get(u"XEP-0313")
87 self._node_cb = {} # dictionnary of callbacks for node (key: node, value: list of callbacks) 87 self._node_cb = {} # dictionnary of callbacks for node (key: node, value: list of callbacks)
88 self.rt_sessions = sat_defer.RTDeferredSessions() 88 self.rt_sessions = sat_defer.RTDeferredSessions()
89 host.bridge.addMethod( 89 host.bridge.addMethod(
90 "psNodeCreate", 90 "psNodeCreate",
91 ".plugin", 91 ".plugin",
319 """ 319 """
320 if extra is None: 320 if extra is None:
321 rsm_request = None 321 rsm_request = None
322 extra = {} 322 extra = {}
323 else: 323 else:
324 # order-by
325 if C.KEY_ORDER_BY in extra:
326 # FIXME: we temporarily manage only one level of ordering
327 # we need to switch to a fully serialised extra data
328 # to be able to encode a whole ordered list
329 extra[C.KEY_ORDER_BY] = [extra.pop(C.KEY_ORDER_BY)]
330
324 # rsm 331 # rsm
325 if self._rsm is None: 332 if self._rsm is None:
326 rsm_request = None 333 rsm_request = None
327 else: 334 else:
328 rsm_request = self._rsm.parseExtra(extra) 335 rsm_request = self._rsm.parseExtra(extra)
334 mam_request = self._mam.parseExtra(extra, with_rsm=False) 341 mam_request = self._mam.parseExtra(extra, with_rsm=False)
335 342
336 if mam_request is not None: 343 if mam_request is not None:
337 assert u"mam" not in extra 344 assert u"mam" not in extra
338 extra[u"mam"] = mam_request 345 extra[u"mam"] = mam_request
346
339 return Extra(rsm_request, extra) 347 return Extra(rsm_request, extra)
340 348
341 def addManagedNode(self, node, **kwargs): 349 def addManagedNode(self, node, **kwargs):
342 """Add a handler for a node 350 """Add a handler for a node
343 351
535 extra = {} 543 extra = {}
536 try: 544 try:
537 mam_query = extra["mam"] 545 mam_query = extra["mam"]
538 except KeyError: 546 except KeyError:
539 d = client.pubsub_client.items( 547 d = client.pubsub_client.items(
540 service, node, max_items, item_ids, sub_id, None, rsm_request 548 service = service,
549 nodeIdentifier = node,
550 maxItems = max_items,
551 subscriptionIdentifier = sub_id,
552 sender = None,
553 itemIdentifiers = item_ids,
554 orderBy = extra.get(C.KEY_ORDER_BY),
555 rsm_request = rsm_request
541 ) 556 )
542 # we have no MAM data here, so we add None 557 # we have no MAM data here, so we add None
543 d.addCallback(lambda data: data + (None,)) 558 d.addCallback(lambda data: data + (None,))
544 else: 559 else:
545 # if mam is requested, we have to do a totally different query 560 # if mam is requested, we have to do a totally different query
575 u"Could not subscribe to node {} on service {}: {}".format( 590 u"Could not subscribe to node {} on service {}: {}".format(
576 node, unicode(service), unicode(failure.value) 591 node, unicode(service), unicode(failure.value)
577 ) 592 )
578 ) 593 )
579 594
580 def doSubscribe(items): 595 def doSubscribe(data):
581 self.subscribe(service, node, profile_key=client.profile).addErrback( 596 self.subscribe(service, node, profile_key=client.profile).addErrback(
582 subscribeEb, service, node 597 subscribeEb, service, node
583 ) 598 )
584 return items 599 return data
585 600
586 if subscribe: 601 if subscribe:
587 d.addCallback(doSubscribe) 602 d.addCallback(doSubscribe)
588 603
589 def addMetadata(result): 604 def addMetadata(result):
1322 for callback in callbacks_dict[event]: 1337 for callback in callbacks_dict[event]:
1323 yield callback 1338 yield callback
1324 except KeyError: 1339 except KeyError:
1325 continue 1340 continue
1326 1341
1342
1327 def itemsReceived(self, event): 1343 def itemsReceived(self, event):
1328 log.debug(u"Pubsub items received") 1344 log.debug(u"Pubsub items received")
1329 for callback in self._getNodeCallbacks(event.nodeIdentifier, C.PS_ITEMS): 1345 for callback in self._getNodeCallbacks(event.nodeIdentifier, C.PS_ITEMS):
1330 callback(self.parent, event) 1346 callback(self.parent, event)
1331 client = self.parent 1347 client = self.parent