Coverage for slidge/util/archive_msg.py: 98%
40 statements
« prev ^ index » next coverage.py v7.15.0, created at 2026-07-09 03:59 +0000
« prev ^ index » next coverage.py v7.15.0, created at 2026-07-09 03:59 +0000
1import uuid
2from copy import copy
3from datetime import UTC, datetime
4from xml.etree import ElementTree as ET
6from slixmpp import Message
7from slixmpp.plugins.xep_0297.stanza import Forwarded
8from slixmpp.xmlstream import StanzaBase
10from ..util.util import fix_namespaces
13def set_client_namespace(stanza: StanzaBase) -> None:
14 fix_namespaces(stanza.xml, "jabber:component:accept", "jabber:client")
17class HistoryMessage:
18 def __init__(self, stanza: Message | str, when: datetime | None = None) -> None:
19 if isinstance(stanza, str):
20 from_db = True
21 stanza = Message(xml=ET.fromstring(stanza))
22 else:
23 from_db = False
25 self.id = stanza["stanza_id"]["id"] or uuid.uuid4().hex
26 self.when: datetime = when or stanza["delay"]["stamp"] or datetime.now(tz=UTC)
28 if not from_db:
29 del stanza["delay"]
30 del stanza["markable"]
31 del stanza["hint"]
32 del stanza["chat_state"]
33 if not stanza["body"]:
34 del stanza["body"]
35 set_client_namespace(stanza)
37 self.stanza: Message = stanza
39 @property
40 def stanza_component_ns(self) -> Message:
41 stanza = copy(self.stanza)
42 fix_namespaces(stanza.xml, old="jabber:client", new="jabber:component:accept")
43 return stanza
45 def forwarded(self) -> Forwarded:
46 forwarded = Forwarded()
47 forwarded["delay"]["stamp"] = self.when
48 forwarded.append(self.stanza)
49 return forwarded
51 @property
52 def occupant_id(self) -> str:
53 return self.stanza["occupant-id"]["id"] # type:ignore[no-any-return]