Mercurial > libervia-backend
diff libervia/backend/core/xmpp.py @ 4375:42becd4b819f
core (xmpp): add `origin` and `origin_label` to message data:
If a message comes from a gateway, its type is used as `origin` in `extra`, and it has a
name, it's used as `origin_label`.
`is-bot` is also set when the sending entity is advertised as a bot.
rel 459
author | Goffi <goffi@goffi.org> |
---|---|
date | Sun, 08 Jun 2025 17:16:56 +0200 |
parents | 90d476a80ce9 |
children |
line wrap: on
line diff
--- a/libervia/backend/core/xmpp.py Fri Jun 06 10:45:54 2025 +0200 +++ b/libervia/backend/core/xmpp.py Sun Jun 08 17:16:56 2025 +0200 @@ -24,7 +24,7 @@ from pathlib import Path import sys import time -from typing import Callable, Dict, Tuple, Optional +from typing import Callable, Dict, Tuple, Optional, cast from urllib.parse import unquote, urlparse import uuid @@ -1316,7 +1316,7 @@ for child in elt.elements(): self.normalize_ns(child, namespace) - def parse_message(self, message_elt: domish.Element) -> MessageData: + async def parse_message(self, message_elt: domish.Element) -> MessageData: """Parse a message XML and return message_data @param message_elt(domish.Element): raw <message> xml @@ -1346,16 +1346,19 @@ ) ) - client = self.parent + client = cast(SatXMPPEntity, self.parent) + assert client is not None if not message_elt.hasAttribute("to"): message_elt["to"] = client.jid.full() + from_jid = jid.JID(message_elt["from"]) + from_jid_bare = from_jid.userhostJID() message = {} subject = {} extra = {} data = MessageData({ - "from": jid.JID(message_elt["from"]), + "from": from_jid, "to": jid.JID(message_elt["to"]), "uid": message_elt.getAttribute( "uid", str(uuid.uuid4()) @@ -1373,6 +1376,23 @@ else: client.mess_id2uid[(data["from"], message_id)] = data["uid"] + # origin + if not from_jid_bare in (client.jid.userhostJID(), client.server_jid): + disco_infos = await self.host.memory.disco.get_infos(client, from_jid_bare) + if from_jid_bare.user: + domain_disco_infos = await self.host.memory.disco.get_infos( + client, jid.JID(from_jid_bare.host) + ) + else: + domain_disco_infos = disco_infos + if ("client", "bot") in disco_infos.identities: + extra["is-bot"] = True + for (category, type_), label in domain_disco_infos.identities.items(): + if category == "gateway": + extra["origin"] = type_ + if label: + extra["origin_name"] = label + # message for e in message_elt.elements(C.NS_CLIENT, "body"): message[e.getAttribute((C.NS_XML, "lang"), "")] = str(e) @@ -1480,7 +1500,7 @@ return try: - data = self.parse_message(message_elt) + data = await self.parse_message(message_elt) # we now do all post treatments added by plugins post_treat.callback(data) await post_treat