Coverage for slidge / util / archive_msg.py: 95%
44 statements
« prev ^ index » next coverage.py v7.13.0, created at 2026-01-06 15:18 +0000
« prev ^ index » next coverage.py v7.13.0, created at 2026-01-06 15:18 +0000
1import uuid
2from copy import copy
3from datetime import datetime, timezone
4from typing import Optional, Union
5from xml.etree import ElementTree as ET
7from slixmpp import Message
8from slixmpp.plugins.xep_0297.stanza import Forwarded
9from slixmpp.xmlstream import StanzaBase
12def fix_namespaces(
13 xml: ET.Element,
14 old: str = "{jabber:component:accept}",
15 new: str = "{jabber:client}",
16) -> None:
17 """
18 Hack to fix namespaces between jabber:component and jabber:client
20 Acts in-place.
22 :param xml:
23 :param old:
24 :param new:
25 """
26 xml.tag = xml.tag.replace(old, new)
27 for child in xml:
28 fix_namespaces(child, old, new)
31def set_client_namespace(stanza: StanzaBase) -> None:
32 fix_namespaces(stanza.xml)
35class HistoryMessage:
36 def __init__(
37 self, stanza: Union[Message, str], when: Optional[datetime] = None
38 ) -> None:
39 if isinstance(stanza, str):
40 from_db = True
41 stanza = Message(xml=ET.fromstring(stanza))
42 else:
43 from_db = False
45 self.id = stanza["stanza_id"]["id"] or uuid.uuid4().hex
46 self.when: datetime = (
47 when or stanza["delay"]["stamp"] or datetime.now(tz=timezone.utc)
48 )
50 if not from_db:
51 del stanza["delay"]
52 del stanza["markable"]
53 del stanza["hint"]
54 del stanza["chat_state"]
55 if not stanza["body"]:
56 del stanza["body"]
57 fix_namespaces(stanza.xml)
59 self.stanza: Message = stanza
61 @property
62 def stanza_component_ns(self) -> Message:
63 stanza = copy(self.stanza)
64 fix_namespaces(
65 stanza.xml, old="{jabber:client}", new="{jabber:component:accept}"
66 )
67 return stanza
69 def forwarded(self) -> Forwarded:
70 forwarded = Forwarded()
71 forwarded["delay"]["stamp"] = self.when
72 forwarded.append(self.stanza)
73 return forwarded
75 @property
76 def occupant_id(self) -> str:
77 return self.stanza["occupant-id"]["id"]