Coverage for slidge/util/archive_msg.py: 98%
41 statements
« prev ^ index » next coverage.py v7.11.3, created at 2025-11-26 19:34 +0000
« prev ^ index » next coverage.py v7.11.3, created at 2025-11-26 19:34 +0000
1from copy import copy
2from datetime import datetime, timezone
3from typing import Optional, Union
4from uuid import uuid4
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 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