annotate libervia/backend/plugins/plugin_xep_0308.py @ 4242:8acf46ed7f36

frontends: remote control implementation: This is the frontends common part of remote control implementation. It handle the creation of WebRTC session, and management of inputs. For now the reception use freedesktop.org Desktop portal, and works mostly with Wayland based Desktop Environments. rel 436
author Goffi <goffi@goffi.org>
date Sat, 11 May 2024 13:52:43 +0200
parents b1207332cea2
children 0d7bb4df2343
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4163
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
1 #!/usr/bin/env python3
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
2
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
3 # Copyright (C) 2009-2023 Jérôme Poisson (goffi@goffi.org)
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
4
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
5 # This program is free software: you can redistribute it and/or modify
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
6 # it under the terms of the GNU Affero General Public License as published by
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
7 # the Free Software Foundation, either version 3 of the License, or
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
8 # (at your option) any later version.
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
9
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
10 # This program is distributed in the hope that it will be useful,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
13 # GNU Affero General Public License for more details.
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
14
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
15 # You should have received a copy of the GNU Affero General Public License
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
16 # along with this program. If not, see <http://www.gnu.org/licenses/>.
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
17
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
18 import time
4198
b1207332cea2 plugin XEP-0308: fix ID used, recipients and author check.
Goffi <goffi@goffi.org>
parents: 4166
diff changeset
19 import uuid
4163
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
20
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
21 from sqlalchemy.orm.attributes import flag_modified
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
22 from twisted.internet import defer
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
23 from twisted.words.protocols.jabber import xmlstream
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
24 from twisted.words.protocols.jabber import jid
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
25 from twisted.words.xish import domish
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
26 from wokkel import disco
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
27 from zope.interface import implementer
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
28
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
29 from libervia.backend.core import exceptions
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
30 from libervia.backend.core.constants import Const as C
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
31 from libervia.backend.core.core_types import SatXMPPEntity
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
32 from libervia.backend.core.i18n import _
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
33 from libervia.backend.core.log import getLogger
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
34 from libervia.backend.memory.sqla import History, Message, Subject, joinedload, select
4166
a1f7040b5a15 plugin XEP-0424: message retraction update:
Goffi <goffi@goffi.org>
parents: 4163
diff changeset
35 from libervia.backend.models.core import MessageData, MessageEdition
4163
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
36 from libervia.backend.tools.common import data_format
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
37 from libervia.backend.tools.utils import aio
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
38 log = getLogger(__name__)
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
39
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
40
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
41 PLUGIN_INFO = {
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
42 C.PI_NAME: "Last Message Correction",
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
43 C.PI_IMPORT_NAME: "XEP-0308",
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
44 C.PI_TYPE: "XEP",
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
45 C.PI_PROTOCOLS: ["XEP-0308"],
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
46 C.PI_DEPENDENCIES: ["XEP-0334"],
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
47 C.PI_MAIN: "XEP_0308",
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
48 C.PI_HANDLER: "yes",
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
49 C.PI_DESCRIPTION: _("""Implementation of XEP-0308 (Last Message Correction)"""),
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
50 }
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
51
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
52 NS_MESSAGE_CORRECT = "urn:xmpp:message-correct:0"
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
53
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
54
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
55 class XEP_0308:
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
56 def __init__(self, host):
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
57 log.info(f"plugin {PLUGIN_INFO[C.PI_NAME]!r} initialization")
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
58 self.host = host
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
59 host.register_namespace("message_correct", NS_MESSAGE_CORRECT)
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
60 host.trigger.add("message_received", self._message_received_trigger)
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
61 host.bridge.add_method(
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
62 "message_edit",
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
63 ".plugin",
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
64 in_sign="sss",
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
65 out_sign="",
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
66 method=self._message_edit,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
67 async_=True,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
68 )
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
69 self._h = host.plugins["XEP-0334"]
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
70
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
71 def get_handler(self, client):
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
72 return XEP_0308_handler()
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
73
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
74 @aio
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
75 async def get_last_history(
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
76 self, client: SatXMPPEntity, message_elt: domish.Element
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
77 ) -> History | None:
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
78 profile_id = self.host.memory.storage.profiles[client.profile]
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
79 from_jid = jid.JID(message_elt["from"])
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
80 message_type = message_elt.getAttribute("type", C.MESS_TYPE_NORMAL)
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
81 async with self.host.memory.storage.session() as session:
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
82 stmt = (
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
83 select(History)
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
84 .where(
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
85 History.profile_id == profile_id,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
86 History.source == from_jid.userhost(),
4198
b1207332cea2 plugin XEP-0308: fix ID used, recipients and author check.
Goffi <goffi@goffi.org>
parents: 4166
diff changeset
87 History.dest == client.jid.userhost(),
4163
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
88 History.type == message_type,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
89 )
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
90 .options(joinedload(History.messages))
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
91 .options(joinedload(History.subjects))
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
92 .options(joinedload(History.thread))
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
93 )
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
94 if message_elt.type == C.MESS_TYPE_GROUPCHAT:
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
95 stmt = stmt.where(History.source_res == from_jid.resource)
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
96
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
97 # we want last message
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
98 stmt = stmt.order_by(History.timestamp.desc()).limit(1)
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
99 result = await session.execute(stmt)
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
100 history = result.unique().scalar_one_or_none()
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
101 return history
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
102
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
103 async def update_history(
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
104 self,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
105 client: SatXMPPEntity,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
106 edited_history: History,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
107 edit_timestamp: float,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
108 new_message: dict[str, str],
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
109 new_subject: dict[str, str],
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
110 new_extra: dict,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
111 previous_message: dict[str, str],
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
112 previous_subject: dict[str, str],
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
113 previous_extra: dict | None,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
114 store: bool = True,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
115 ) -> None:
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
116 # FIXME: new_extra is not handled by now
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
117 edited_history.messages = [
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
118 Message(message=mess, language=lang) for lang, mess in new_message.items()
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
119 ]
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
120 edited_history.subjects = [
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
121 Subject(subject=mess, language=lang) for lang, mess in new_subject.items()
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
122 ]
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
123 previous_version = {
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
124 # this is the timestamp when this version was published
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
125 "timestamp": edited_history.extra.get("updated", edited_history.timestamp),
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
126 "message": previous_message,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
127 "subject": previous_subject,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
128 }
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
129 edited_history.extra["updated"] = edit_timestamp
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
130 if previous_extra:
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
131 previous_extra = previous_extra.copy()
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
132 # we must not have editions in each edition
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
133 try:
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
134 del previous_extra[C.MESS_EXTRA_EDITIONS]
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
135 except KeyError:
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
136 pass
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
137 # extra may be important for rich content
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
138 previous_version["extra"] = previous_extra
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
139
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
140 if store:
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
141 flag_modified(edited_history, "extra")
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
142 edited_history.extra.setdefault(C.MESS_EXTRA_EDITIONS, []).append(previous_version)
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
143 await self.host.memory.storage.add(edited_history)
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
144
4166
a1f7040b5a15 plugin XEP-0424: message retraction update:
Goffi <goffi@goffi.org>
parents: 4163
diff changeset
145 edit_data = MessageData(edited_history.serialise())
4163
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
146 self.host.bridge.message_update(
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
147 edited_history.uid,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
148 C.MESS_UPDATE_EDIT,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
149 data_format.serialise(edit_data),
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
150 client.profile,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
151 )
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
152
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
153 async def _message_received_trigger(
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
154 self,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
155 client: SatXMPPEntity,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
156 message_elt: domish.Element,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
157 post_treat: defer.Deferred,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
158 ) -> bool:
4198
b1207332cea2 plugin XEP-0308: fix ID used, recipients and author check.
Goffi <goffi@goffi.org>
parents: 4166
diff changeset
159 from_jid = jid.JID(message_elt["from"])
4163
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
160 replace_elt = next(message_elt.elements(NS_MESSAGE_CORRECT, "replace"), None)
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
161 if not replace_elt:
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
162 return True
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
163 try:
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
164 replace_id = replace_elt["id"].strip()
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
165 if not replace_id:
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
166 raise KeyError
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
167 except KeyError:
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
168 log.warning(f"Invalid message correction: {message_elt.toXml()}")
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
169 else:
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
170 edited_history = await self.get_last_history(client, message_elt)
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
171 if edited_history is None:
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
172 log.warning(
4198
b1207332cea2 plugin XEP-0308: fix ID used, recipients and author check.
Goffi <goffi@goffi.org>
parents: 4166
diff changeset
173 f"No message found from {from_jid.full()}, can't correct "
4163
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
174 f"anything: {message_elt.toXml()}"
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
175 )
4198
b1207332cea2 plugin XEP-0308: fix ID used, recipients and author check.
Goffi <goffi@goffi.org>
parents: 4166
diff changeset
176 return True
b1207332cea2 plugin XEP-0308: fix ID used, recipients and author check.
Goffi <goffi@goffi.org>
parents: 4166
diff changeset
177 check_id = edited_history.origin_id or edited_history.extra.get("message_id")
b1207332cea2 plugin XEP-0308: fix ID used, recipients and author check.
Goffi <goffi@goffi.org>
parents: 4166
diff changeset
178 if check_id != replace_id:
4163
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
179 log.warning(
4198
b1207332cea2 plugin XEP-0308: fix ID used, recipients and author check.
Goffi <goffi@goffi.org>
parents: 4166
diff changeset
180 "Can't apply correction: it doesn't reference the last one:\n"
b1207332cea2 plugin XEP-0308: fix ID used, recipients and author check.
Goffi <goffi@goffi.org>
parents: 4166
diff changeset
181 f"{message_elt.toXml()}"
4163
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
182 )
4198
b1207332cea2 plugin XEP-0308: fix ID used, recipients and author check.
Goffi <goffi@goffi.org>
parents: 4166
diff changeset
183 return True
b1207332cea2 plugin XEP-0308: fix ID used, recipients and author check.
Goffi <goffi@goffi.org>
parents: 4166
diff changeset
184 # TODO: this only accept same full JID, if we do more than last message
b1207332cea2 plugin XEP-0308: fix ID used, recipients and author check.
Goffi <goffi@goffi.org>
parents: 4166
diff changeset
185 # correction, we may want to accept different resource for non groupchat
b1207332cea2 plugin XEP-0308: fix ID used, recipients and author check.
Goffi <goffi@goffi.org>
parents: 4166
diff changeset
186 # messages (in case of reconnection with resource change for instance).
b1207332cea2 plugin XEP-0308: fix ID used, recipients and author check.
Goffi <goffi@goffi.org>
parents: 4166
diff changeset
187 if edited_history.source_jid != from_jid:
b1207332cea2 plugin XEP-0308: fix ID used, recipients and author check.
Goffi <goffi@goffi.org>
parents: 4166
diff changeset
188 log.warning(
b1207332cea2 plugin XEP-0308: fix ID used, recipients and author check.
Goffi <goffi@goffi.org>
parents: 4166
diff changeset
189 "Can't apply correction: correction doesn't come from same author "
b1207332cea2 plugin XEP-0308: fix ID used, recipients and author check.
Goffi <goffi@goffi.org>
parents: 4166
diff changeset
190 f"{edited_history.source_jid.full()}:\n{message_elt.toXml()}"
b1207332cea2 plugin XEP-0308: fix ID used, recipients and author check.
Goffi <goffi@goffi.org>
parents: 4166
diff changeset
191 )
b1207332cea2 plugin XEP-0308: fix ID used, recipients and author check.
Goffi <goffi@goffi.org>
parents: 4166
diff changeset
192 return True
b1207332cea2 plugin XEP-0308: fix ID used, recipients and author check.
Goffi <goffi@goffi.org>
parents: 4166
diff changeset
193
4163
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
194 previous_message_data = edited_history.serialise()
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
195 message_data = client.messageProt.parse_message(message_elt)
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
196 if not message_data["message"] and not message_data["subject"]:
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
197 log.warning(
4198
b1207332cea2 plugin XEP-0308: fix ID used, recipients and author check.
Goffi <goffi@goffi.org>
parents: 4166
diff changeset
198 "Message correction doesn't have body nor subject, we can't edit "
4163
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
199 "anything"
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
200 )
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
201 return False
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
202
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
203 await self.update_history(
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
204 client,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
205 edited_history,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
206 message_data.get("received_timestamp") or message_data["timestamp"],
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
207 message_data["message"],
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
208 message_data["subject"],
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
209 message_data["extra"],
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
210 previous_message_data["message"],
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
211 previous_message_data["subject"],
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
212 previous_message_data.get("extra"),
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
213 )
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
214
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
215 return False
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
216
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
217 async def message_edit(
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
218 self,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
219 client: SatXMPPEntity,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
220 message_id: str,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
221 edit_data: MessageEdition,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
222 ) -> None:
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
223 """Edit a message
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
224
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
225 The message can only be edited if it's the last one of the discussion.
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
226 @param client: client instance
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
227 @param message_id: UID of the message to edit
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
228 @param edit_data: data to update in the message
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
229 """
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
230 timestamp = time.time()
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
231 edited_history = await self.host.memory.storage.get(
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
232 client,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
233 History,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
234 History.uid,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
235 message_id,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
236 joined_loads=[History.messages, History.subjects, History.thread],
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
237 )
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
238 if edited_history is None:
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
239 raise exceptions.NotFound(
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
240 f"message to edit not found in database ({message_id})"
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
241 )
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
242 if edited_history.type == C.MESS_TYPE_GROUPCHAT:
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
243 is_group_chat = True
4198
b1207332cea2 plugin XEP-0308: fix ID used, recipients and author check.
Goffi <goffi@goffi.org>
parents: 4166
diff changeset
244 # In the case of group chat, our message is sent by ourself with our room JID.
b1207332cea2 plugin XEP-0308: fix ID used, recipients and author check.
Goffi <goffi@goffi.org>
parents: 4166
diff changeset
245 peer_jid = edited_history.source_jid
4163
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
246 else:
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
247 is_group_chat = False
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
248 peer_jid = jid.JID(edited_history.dest)
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
249 history_data = await self.host.memory.history_get(
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
250 client.jid, peer_jid, limit=1, profile=client.profile
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
251 )
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
252 if not history_data:
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
253 raise exceptions.NotFound(
4198
b1207332cea2 plugin XEP-0308: fix ID used, recipients and author check.
Goffi <goffi@goffi.org>
parents: 4166
diff changeset
254 "No message found in conversation with {peer_jid.userhost()}"
4163
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
255 )
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
256 last_mess = history_data[0]
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
257 if last_mess[0] != message_id:
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
258 raise ValueError(
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
259 f"{message_id} is not the last message of the discussion, we can't edit "
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
260 "it"
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
261 )
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
262
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
263 await self.update_history(
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
264 client,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
265 edited_history,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
266 timestamp,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
267 edit_data.message,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
268 edit_data.subject,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
269 edit_data.extra,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
270 last_mess[4],
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
271 last_mess[5],
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
272 last_mess[-1],
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
273 # message will be updated and signal sent on reception in group chat
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
274 store = not is_group_chat
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
275 )
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
276
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
277 serialised = edited_history.serialise()
4198
b1207332cea2 plugin XEP-0308: fix ID used, recipients and author check.
Goffi <goffi@goffi.org>
parents: 4166
diff changeset
278 serialised["uid"] = str(uuid.uuid4())
b1207332cea2 plugin XEP-0308: fix ID used, recipients and author check.
Goffi <goffi@goffi.org>
parents: 4166
diff changeset
279 serialised["from"] = client.jid
b1207332cea2 plugin XEP-0308: fix ID used, recipients and author check.
Goffi <goffi@goffi.org>
parents: 4166
diff changeset
280 # for group chat, we want to send the correction to the room
b1207332cea2 plugin XEP-0308: fix ID used, recipients and author check.
Goffi <goffi@goffi.org>
parents: 4166
diff changeset
281 serialised["to"] = peer_jid.userhostJID() if is_group_chat else peer_jid
4163
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
282
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
283 message_elt = client.generate_message_xml(serialised)["xml"]
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
284 replace_elt = message_elt.addElement((NS_MESSAGE_CORRECT, "replace"))
4198
b1207332cea2 plugin XEP-0308: fix ID used, recipients and author check.
Goffi <goffi@goffi.org>
parents: 4166
diff changeset
285 replace_elt["id"] = edited_history.origin_id
4163
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
286 self._h.add_hint_elements(message_elt, [self._h.HINT_STORE])
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
287 client.send(message_elt)
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
288
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
289 def _message_edit(self, message_id: str, edit_data_s: str, profile: str) -> None:
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
290 client = self.host.get_client(profile)
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
291 edit_data = MessageEdition.model_validate_json(edit_data_s)
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
292 defer.ensureDeferred(self.message_edit(client, message_id, edit_data))
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
293
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
294
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
295 @implementer(disco.IDisco)
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
296 class XEP_0308_handler(xmlstream.XMPPHandler):
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
297 def getDiscoInfo(self, __, target, nodeIdentifier=""):
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
298 return [disco.DiscoFeature(NS_MESSAGE_CORRECT)]
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
299
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
300 def getDiscoItems(self, requestor, target, nodeIdentifier=""):
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
301 return []