diff --git a/sat/plugins/plugin_xep_0277.py b/sat/plugins/plugin_xep_0277.py index 1b3a5f07..a4b9cfc6 100644 --- a/sat/plugins/plugin_xep_0277.py +++ b/sat/plugins/plugin_xep_0277.py @@ -99,6 +99,14 @@ class XEP_0277(object): method=self._mbSend, async_=True, ) + host.bridge.addMethod( + "mbPreview", + ".plugin", + in_sign="ssss", + out_sign="s", + method=self._mbPreview, + async_=True, + ) host.bridge.addMethod( "mbRetract", ".plugin", @@ -651,7 +659,7 @@ class XEP_0277(object): defer.returnValue(item_elt) - ## publish ## + ## publish/preview ## def getCommentsNode(self, item_id): """Generate comment node @@ -803,27 +811,32 @@ class XEP_0277(object): client, comments_service, comments_node, comments_affiliations ) - def _mbSend(self, service, node, data, profile_key): - service = jid.JID(service) if service else None - node = node if node else NS_MICROBLOG - client = self.host.getClient(profile_key) - data = data_format.deserialise(data) - return self.send(client, data, service, node) - def friendlyId(self, data): """Generate a user friendly id from title or content""" id_base = regex.urlFriendlyText(data.get('title') or data.get('content', '')) return f"{id_base}-{token_urlsafe(3)}" - @defer.inlineCallbacks - def send(self, client, data, service=None, node=NS_MICROBLOG): + def _mbSend(self, service, node, data, profile_key): + service = jid.JID(service) if service else None + node = node if node else NS_MICROBLOG + client = self.host.getClient(profile_key) + data = data_format.deserialise(data) + return defer.ensureDeferred(self.send(client, data, service, node)) + + async def send( + self, + client: SatXMPPEntity, + data: dict, + service: Optional[jid.JID] = None, + node: Optional[str] = NS_MICROBLOG + ) -> None: """Send XEP-0277's microblog data - @param data(dict): microblog data (must include at least a "content" or a "title" key). + @param data: microblog data (must include at least a "content" or a "title" key). see http://wiki.goffi.org/wiki/Bridge_API_-_Microblogging/en for details - @param service(jid.JID, None): PubSub service where the microblog must be published + @param service: PubSub service where the microblog must be published None to publish on profile's PEP - @param node(unicode, None): PubSub node to use (defaut to microblog NS) + @param node: PubSub node to use (defaut to microblog NS) None is equivalend as using default value """ # TODO: check that all data keys are used, this would avoid sending publicly a private message @@ -839,12 +852,43 @@ class XEP_0277(object): item_id = str(shortuuid.uuid()) try: - yield self._manageComments(client, data, service, node, item_id, access=None) + await self._manageComments(client, data, service, node, item_id, access=None) except error.StanzaError: log.warning("Can't create comments node for item {}".format(item_id)) - item = yield self.data2entry(client, data, item_id, service, node) - ret = yield self._p.publish(client, service, node, [item]) - defer.returnValue(ret) + item = await self.data2entry(client, data, item_id, service, node) + return await self._p.publish(client, service, node, [item]) + + def _mbPreview(self, service, node, data, profile_key): + service = jid.JID(service) if service else None + node = node if node else NS_MICROBLOG + client = self.host.getClient(profile_key) + data = data_format.deserialise(data) + d = defer.ensureDeferred(self.preview(client, data, service, node)) + d.addCallback(data_format.serialise) + return d + + async def preview( + self, + client: SatXMPPEntity, + data: dict, + service: Optional[jid.JID] = None, + node: Optional[str] = NS_MICROBLOG + ) -> dict: + """Preview microblog data without publishing them + + params are the same as for [send] + @return: microblog data as would be retrieved from published item + """ + if node is None: + node = NS_MICROBLOG + + item_id = data.get("id", "") + + # we have to serialise then deserialise to be sure that all triggers are called + item_elt = await self.data2entry(client, data, item_id, service, node) + item_elt.uri = pubsub.NS_PUBSUB + return await self.item2mbdata(client, item_elt, service, node) + ## retract ##