plugin XEP-0060: serialise psItemsGet result with data_format

This commit is contained in:
Goffi 2020-07-17 12:57:23 +02:00
commit f8b346e115
2 changed files with 65 additions and 50 deletions

View file

@ -190,7 +190,7 @@ class XEP_0060(object):
"psItemsGet",
".plugin",
in_sign="ssiassa{ss}s",
out_sign="(asa{ss})",
out_sign="s",
method=self._getItems,
async_=True,
)
@ -599,6 +599,11 @@ class XEP_0060(object):
raise exceptions.DataError("Can't find Item in MAM message element")
return item_elt
def serialiseItems(self, items_data):
items, metadata = items_data
metadata['items'] = items
return data_format.serialise(metadata)
def _getItems(self, service="", node="", max_items=10, item_ids=None, sub_id=None,
extra_dict=None, profile_key=C.PROF_KEY_NONE):
"""Get items from pubsub node
@ -620,6 +625,7 @@ class XEP_0060(object):
extra.extra,
)
d.addCallback(self.transItemsData)
d.addCallback(self.serialiseItems)
return d
def getItems(self, client, service, node, max_items=None, item_ids=None, sub_id=None,

View file

@ -800,20 +800,22 @@ class Get(base.CommandBase):
async def start(self):
try:
ps_result = await self.host.bridge.psItemsGet(
self.args.service,
self.args.node,
self.args.max,
self.args.items,
self.args.sub_id,
self.getPubsubExtra(),
self.profile,
ps_result = data_format.deserialise(
await self.host.bridge.psItemsGet(
self.args.service,
self.args.node,
self.args.max,
self.args.items,
self.args.sub_id,
self.getPubsubExtra(),
self.profile,
)
)
except Exception as e:
self.disp(f"can't get pubsub items: {e}", error=True)
self.host.quit(C.EXIT_BRIDGE_ERRBACK)
else:
await self.output(ps_result[0])
await self.output(ps_result['items'])
self.host.quit(C.EXIT_OK)
@ -901,9 +903,12 @@ class Edit(base.CommandBase, common.BaseEdit):
)
self.host.quit(1)
items = [item] if item else []
item_raw = (await self.host.bridge.psItemsGet(
service, node, 1, items, "", {}, self.profile
))[0][0]
ps_result = data_format.deserialise(
await self.host.bridge.psItemsGet(
service, node, 1, items, "", {}, self.profile
)
)
item_raw = ps_result['items'][0]
parser = etree.XMLParser(remove_blank_text=True, recover=True)
item_elt = etree.fromstring(item_raw, parser)
item_id = item_elt.get("id")
@ -1233,14 +1238,16 @@ class Search(base.CommandBase):
async def getItems(self, depth, service, node, items):
self.to_get += 1
try:
items_data = await self.host.bridge.psItemsGet(
service,
node,
self.args.node_max,
items,
"",
self.getPubsubExtra(),
self.profile,
ps_result = data_format.deserialise(
await self.host.bridge.psItemsGet(
service,
node,
self.args.node_max,
items,
"",
self.getPubsubExtra(),
self.profile,
)
)
except Exception as e:
self.disp(
@ -1249,7 +1256,7 @@ class Search(base.CommandBase):
)
self.to_get -= 1
else:
await self.search(items_data, depth)
await self.search(ps_result, depth)
def _checkPubsubURL(self, match, found_nodes):
"""check that the matched URL is an xmpp: one
@ -1449,7 +1456,7 @@ class Search(base.CommandBase):
)
)
async def search(self, items_data, depth):
async def search(self, ps_result, depth):
"""callback of getItems
this method filters items, get sub nodes if needed,
@ -1458,14 +1465,13 @@ class Search(base.CommandBase):
@param depth(int): current depth level
0 for first node, 1 for first children, and so on
"""
items, metadata = items_data
for item in items:
for item in ps_result['items']:
if depth < self.args.max_depth:
await self.getSubNodes(item, depth)
keep, item = self.filter(item)
if not keep:
continue
await self.doItemAction(item, metadata)
await self.doItemAction(item, ps_result)
#  we check if we got all getItems results
self.to_get -= 1
@ -1560,9 +1566,9 @@ class Transform(base.CommandBase):
@param metadata(dict): metadata as returned by psItemsGet
"""
try:
last = metadata['rsm_last']
index = int(metadata['rsm_index'])
count = int(metadata['rsm_count'])
last = metadata['rsm']['last']
index = int(metadata['rsm']['index'])
count = int(metadata['rsm']['count'])
except KeyError:
self.disp(_("Can't retrieve all items, RSM metadata not available"),
error=True)
@ -1585,14 +1591,16 @@ class Transform(base.CommandBase):
extra = self.getPubsubExtra()
extra['rsm_after'] = last
try:
ps_result = await self.host.bridge.psItemsGet(
self.args.service,
self.args.node,
self.args.rsm_max,
self.args.items,
"",
extra,
self.profile,
ps_result = await data_format.deserialise(
self.host.bridge.psItemsGet(
self.args.service,
self.args.node,
self.args.rsm_max,
self.args.items,
"",
extra,
self.profile,
)
)
except Exception as e:
self.disp(
@ -1603,11 +1611,10 @@ class Transform(base.CommandBase):
await self.psItemsGetCb(ps_result)
async def psItemsGetCb(self, ps_result):
items, metadata = ps_result
encoding = 'utf-8'
new_items = []
for item in items:
for item in ps_result['items']:
if self.check_duplicates:
# this is used when we are not ordering by creation
# to avoid infinite loop
@ -1687,7 +1694,7 @@ class Transform(base.CommandBase):
if not self.args.apply:
# on dry run we have nothing to wait for, we can quit
if self.args.all:
return await self.handleNextPage(metadata)
return await self.handleNextPage(ps_result)
self.host.quit()
else:
if self.args.admin:
@ -1696,7 +1703,7 @@ class Transform(base.CommandBase):
bridge_method = self.host.bridge.psItemsSend
try:
ps_result = await bridge_method(
ps_items_send_result = await bridge_method(
self.args.service,
self.args.node,
new_items,
@ -1707,7 +1714,7 @@ class Transform(base.CommandBase):
self.disp(f"can't send item: {e}", error=True)
self.host.quit(C.EXIT_BRIDGE_ERRBACK)
else:
await self.psItemsSendCb(ps_result, metadata=metadata)
await self.psItemsSendCb(ps_items_send_result, metadata=ps_result)
async def start(self):
if self.args.all and self.args.order_by != C.ORDER_BY_CREATION:
@ -1724,14 +1731,16 @@ class Transform(base.CommandBase):
self.check_duplicates = False
try:
ps_result = await self.host.bridge.psItemsGet(
self.args.service,
self.args.node,
self.args.max,
self.args.items,
"",
self.getPubsubExtra(),
self.profile,
ps_result = data_format.deserialise(
await self.host.bridge.psItemsGet(
self.args.service,
self.args.node,
self.args.max,
self.args.items,
"",
self.getPubsubExtra(),
self.profile,
)
)
except Exception as e:
self.disp(f"can't retrieve items: {e}", error=True)