component AP gateway: "repeat" to "Announce" conversion:
when an XMPP blog post is marked as repeated, it is converted to an AP Announce activity rel 370
This commit is contained in:
parent
5ceb75a137
commit
ee898b120d
1 changed files with 67 additions and 1 deletions
|
|
@ -1554,6 +1554,69 @@ class APGateway:
|
|||
TYPE_ITEM, parent_ap_account, parent_item
|
||||
)
|
||||
|
||||
async def repeatedMB2APItem(
|
||||
self,
|
||||
mb_data: dict
|
||||
) -> dict:
|
||||
"""Convert repeated blog item to suitable AP Announce activity
|
||||
|
||||
@param mb_data: microblog metadata of an item repeating an other blog post
|
||||
@return: Announce activity linking to the repeated item
|
||||
"""
|
||||
repeated = mb_data["extra"]["repeated"]
|
||||
repeater = jid.JID(repeated["by"])
|
||||
repeater_account = await self.getAPAccountFromJidAndNode(
|
||||
repeater,
|
||||
None
|
||||
)
|
||||
repeater_id = self.buildAPURL(TYPE_ACTOR, repeater_account)
|
||||
repeated_uri = repeated["uri"]
|
||||
|
||||
if not repeated_uri.startswith("xmpp:"):
|
||||
log.warning(
|
||||
"Only xmpp: URL are handled for repeated item at the moment, ignoring "
|
||||
f"item {mb_data}"
|
||||
)
|
||||
raise NotImplementedError
|
||||
parsed_url = uri.parseXMPPUri(repeated_uri)
|
||||
if parsed_url["type"] != "pubsub":
|
||||
log.warning(
|
||||
"Only pubsub URL are handled for repeated item at the moment, ignoring "
|
||||
f"item {mb_data}"
|
||||
)
|
||||
raise NotImplementedError
|
||||
rep_service = jid.JID(parsed_url["path"])
|
||||
rep_item = parsed_url["item"]
|
||||
activity_id = self.buildAPURL("item", repeater.userhost(), mb_data["id"])
|
||||
|
||||
if rep_service.host == self.client.jid.userhost():
|
||||
# it's an AP actor linked through this gateway
|
||||
# in this case we can simply use the item ID
|
||||
if not rep_item.startswith("https:"):
|
||||
log.warning(
|
||||
f"Was expecting an HTTPS url as item ID and got {rep_item!r}\n"
|
||||
f"{mb_data}"
|
||||
)
|
||||
announced_uri = rep_item
|
||||
repeated_account = self._e.unescape(rep_service.user)
|
||||
else:
|
||||
# the repeated item is an XMPP publication, we build the corresponding ID
|
||||
rep_node = parsed_url["node"]
|
||||
repeated_account = await self.getAPAccountFromJidAndNode(
|
||||
rep_service, rep_node
|
||||
)
|
||||
announced_uri = self.buildAPURL("item", repeated_account, rep_item)
|
||||
|
||||
announce = self.createActivity(
|
||||
"Announce", repeater_id, announced_uri, activity_id=activity_id
|
||||
)
|
||||
announce["to"] = [NS_AP_PUBLIC]
|
||||
announce["cc"] = [
|
||||
self.buildAPURL(TYPE_FOLLOWERS, repeater_account),
|
||||
await self.getAPActorIdFromAccount(repeated_account)
|
||||
]
|
||||
return announce
|
||||
|
||||
async def mbdata2APitem(
|
||||
self,
|
||||
client: SatXMPPEntity,
|
||||
|
|
@ -1571,8 +1634,11 @@ class APGateway:
|
|||
``inReplyTo`` will also be set if suitable
|
||||
if False, no destinee will be set (i.e., no ``to`` or ``cc`` or public flag).
|
||||
This is usually used for direct messages.
|
||||
@return: AP item
|
||||
@return: Activity item
|
||||
"""
|
||||
extra = mb_data.get("extra", {})
|
||||
if "repeated" in extra:
|
||||
return await self.repeatedMB2APItem(mb_data)
|
||||
if not mb_data.get("id"):
|
||||
mb_data["id"] = shortuuid.uuid()
|
||||
if not mb_data.get("author_jid"):
|
||||
|
|
|
|||
Loading…
Reference in a new issue