annotate libervia/backend/plugins/plugin_xep_0308.py @ 4335:430d5d99a740

plugin XEP-0358: "Publishing Available Jingle Sessions" implementation: rel 453
author Goffi <goffi@goffi.org>
date Tue, 03 Dec 2024 00:13:07 +0100
parents 0d7bb4df2343
children
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
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4198
diff changeset
38
4163
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
39 log = getLogger(__name__)
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
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
42 PLUGIN_INFO = {
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
43 C.PI_NAME: "Last Message Correction",
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
44 C.PI_IMPORT_NAME: "XEP-0308",
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
45 C.PI_TYPE: "XEP",
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
46 C.PI_PROTOCOLS: ["XEP-0308"],
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
47 C.PI_DEPENDENCIES: ["XEP-0334"],
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
48 C.PI_MAIN: "XEP_0308",
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
49 C.PI_HANDLER: "yes",
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
50 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
51 }
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
52
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
53 NS_MESSAGE_CORRECT = "urn:xmpp:message-correct:0"
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
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
56 class XEP_0308:
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
57 def __init__(self, host):
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
58 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
59 self.host = host
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
60 host.register_namespace("message_correct", NS_MESSAGE_CORRECT)
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
61 host.trigger.add("message_received", self._message_received_trigger)
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
62 host.bridge.add_method(
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
63 "message_edit",
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
64 ".plugin",
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
65 in_sign="sss",
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
66 out_sign="",
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
67 method=self._message_edit,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
68 async_=True,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
69 )
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
70 self._h = host.plugins["XEP-0334"]
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
71
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
72 def get_handler(self, client):
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
73 return XEP_0308_handler()
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
74
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
75 @aio
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
76 async def get_last_history(
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
77 self, client: SatXMPPEntity, message_elt: domish.Element
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
78 ) -> History | None:
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
79 profile_id = self.host.memory.storage.profiles[client.profile]
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
80 from_jid = jid.JID(message_elt["from"])
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
81 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
82 async with self.host.memory.storage.session() as session:
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
83 stmt = (
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
84 select(History)
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
85 .where(
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
86 History.profile_id == profile_id,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
87 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
88 History.dest == client.jid.userhost(),
4163
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
89 History.type == message_type,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
90 )
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
91 .options(joinedload(History.messages))
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
92 .options(joinedload(History.subjects))
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
93 .options(joinedload(History.thread))
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
94 )
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
95 if message_elt.type == C.MESS_TYPE_GROUPCHAT:
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
96 stmt = stmt.where(History.source_res == from_jid.resource)
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
97
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
98 # we want last message
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
99 stmt = stmt.order_by(History.timestamp.desc()).limit(1)
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
100 result = await session.execute(stmt)
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
101 history = result.unique().scalar_one_or_none()
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
102 return history
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
103
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
104 async def update_history(
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
105 self,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
106 client: SatXMPPEntity,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
107 edited_history: History,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
108 edit_timestamp: float,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
109 new_message: dict[str, str],
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
110 new_subject: dict[str, str],
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
111 new_extra: dict,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
112 previous_message: dict[str, str],
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
113 previous_subject: dict[str, str],
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
114 previous_extra: dict | None,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
115 store: bool = True,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
116 ) -> None:
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
117 # FIXME: new_extra is not handled by now
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
118 edited_history.messages = [
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
119 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
120 ]
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
121 edited_history.subjects = [
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
122 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
123 ]
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
124 previous_version = {
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
125 # this is the timestamp when this version was published
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
126 "timestamp": edited_history.extra.get("updated", edited_history.timestamp),
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
127 "message": previous_message,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
128 "subject": previous_subject,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
129 }
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
130 edited_history.extra["updated"] = edit_timestamp
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
131 if previous_extra:
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
132 previous_extra = previous_extra.copy()
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
133 # we must not have editions in each edition
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
134 try:
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
135 del previous_extra[C.MESS_EXTRA_EDITIONS]
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
136 except KeyError:
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
137 pass
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
138 # extra may be important for rich content
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
139 previous_version["extra"] = previous_extra
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
140
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
141 if store:
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
142 flag_modified(edited_history, "extra")
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4198
diff changeset
143 edited_history.extra.setdefault(C.MESS_EXTRA_EDITIONS, []).append(
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4198
diff changeset
144 previous_version
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4198
diff changeset
145 )
4163
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
146 await self.host.memory.storage.add(edited_history)
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
147
4166
a1f7040b5a15 plugin XEP-0424: message retraction update:
Goffi <goffi@goffi.org>
parents: 4163
diff changeset
148 edit_data = MessageData(edited_history.serialise())
4163
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
149 self.host.bridge.message_update(
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
150 edited_history.uid,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
151 C.MESS_UPDATE_EDIT,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
152 data_format.serialise(edit_data),
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
153 client.profile,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
154 )
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
155
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
156 async def _message_received_trigger(
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
157 self,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
158 client: SatXMPPEntity,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
159 message_elt: domish.Element,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
160 post_treat: defer.Deferred,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
161 ) -> bool:
4198
b1207332cea2 plugin XEP-0308: fix ID used, recipients and author check.
Goffi <goffi@goffi.org>
parents: 4166
diff changeset
162 from_jid = jid.JID(message_elt["from"])
4163
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
163 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
164 if not replace_elt:
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
165 return True
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
166 try:
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
167 replace_id = replace_elt["id"].strip()
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
168 if not replace_id:
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
169 raise KeyError
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
170 except KeyError:
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
171 log.warning(f"Invalid message correction: {message_elt.toXml()}")
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
172 else:
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
173 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
174 if edited_history is None:
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
175 log.warning(
4198
b1207332cea2 plugin XEP-0308: fix ID used, recipients and author check.
Goffi <goffi@goffi.org>
parents: 4166
diff changeset
176 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
177 f"anything: {message_elt.toXml()}"
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
178 )
4198
b1207332cea2 plugin XEP-0308: fix ID used, recipients and author check.
Goffi <goffi@goffi.org>
parents: 4166
diff changeset
179 return True
b1207332cea2 plugin XEP-0308: fix ID used, recipients and author check.
Goffi <goffi@goffi.org>
parents: 4166
diff changeset
180 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
181 if check_id != replace_id:
4163
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
182 log.warning(
4198
b1207332cea2 plugin XEP-0308: fix ID used, recipients and author check.
Goffi <goffi@goffi.org>
parents: 4166
diff changeset
183 "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
184 f"{message_elt.toXml()}"
4163
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
185 )
4198
b1207332cea2 plugin XEP-0308: fix ID used, recipients and author check.
Goffi <goffi@goffi.org>
parents: 4166
diff changeset
186 return True
b1207332cea2 plugin XEP-0308: fix ID used, recipients and author check.
Goffi <goffi@goffi.org>
parents: 4166
diff changeset
187 # 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
188 # 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
189 # 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
190 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
191 log.warning(
b1207332cea2 plugin XEP-0308: fix ID used, recipients and author check.
Goffi <goffi@goffi.org>
parents: 4166
diff changeset
192 "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
193 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
194 )
b1207332cea2 plugin XEP-0308: fix ID used, recipients and author check.
Goffi <goffi@goffi.org>
parents: 4166
diff changeset
195 return True
b1207332cea2 plugin XEP-0308: fix ID used, recipients and author check.
Goffi <goffi@goffi.org>
parents: 4166
diff changeset
196
4163
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
197 previous_message_data = edited_history.serialise()
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
198 message_data = client.messageProt.parse_message(message_elt)
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
199 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
200 log.warning(
4198
b1207332cea2 plugin XEP-0308: fix ID used, recipients and author check.
Goffi <goffi@goffi.org>
parents: 4166
diff changeset
201 "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
202 "anything"
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
203 )
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
204 return False
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
205
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
206 await self.update_history(
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
207 client,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
208 edited_history,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
209 message_data.get("received_timestamp") or message_data["timestamp"],
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
210 message_data["message"],
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
211 message_data["subject"],
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
212 message_data["extra"],
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
213 previous_message_data["message"],
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
214 previous_message_data["subject"],
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
215 previous_message_data.get("extra"),
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
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
218 return False
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
219
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
220 async def message_edit(
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
221 self,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
222 client: SatXMPPEntity,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
223 message_id: str,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
224 edit_data: MessageEdition,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
225 ) -> None:
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
226 """Edit a message
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
227
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
228 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
229 @param client: client instance
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
230 @param message_id: UID of the message to edit
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
231 @param edit_data: data to update in the message
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
232 """
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
233 timestamp = time.time()
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
234 edited_history = await self.host.memory.storage.get(
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
235 client,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
236 History,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
237 History.uid,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
238 message_id,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
239 joined_loads=[History.messages, History.subjects, History.thread],
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
240 )
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
241 if edited_history is None:
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
242 raise exceptions.NotFound(
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
243 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
244 )
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
245 if edited_history.type == C.MESS_TYPE_GROUPCHAT:
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
246 is_group_chat = True
4198
b1207332cea2 plugin XEP-0308: fix ID used, recipients and author check.
Goffi <goffi@goffi.org>
parents: 4166
diff changeset
247 # 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
248 peer_jid = edited_history.source_jid
4163
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
249 else:
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
250 is_group_chat = False
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
251 peer_jid = jid.JID(edited_history.dest)
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
252 history_data = await self.host.memory.history_get(
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
253 client.jid, peer_jid, limit=1, profile=client.profile
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
254 )
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
255 if not history_data:
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
256 raise exceptions.NotFound(
4198
b1207332cea2 plugin XEP-0308: fix ID used, recipients and author check.
Goffi <goffi@goffi.org>
parents: 4166
diff changeset
257 "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
258 )
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
259 last_mess = history_data[0]
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
260 if last_mess[0] != message_id:
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
261 raise ValueError(
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
262 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
263 "it"
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
264 )
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
265
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
266 await self.update_history(
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
267 client,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
268 edited_history,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
269 timestamp,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
270 edit_data.message,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
271 edit_data.subject,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
272 edit_data.extra,
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
273 last_mess[4],
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
274 last_mess[5],
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
275 last_mess[-1],
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
276 # message will be updated and signal sent on reception in group chat
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4198
diff changeset
277 store=not is_group_chat,
4163
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
278 )
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
279
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
280 serialised = edited_history.serialise()
4198
b1207332cea2 plugin XEP-0308: fix ID used, recipients and author check.
Goffi <goffi@goffi.org>
parents: 4166
diff changeset
281 serialised["uid"] = str(uuid.uuid4())
b1207332cea2 plugin XEP-0308: fix ID used, recipients and author check.
Goffi <goffi@goffi.org>
parents: 4166
diff changeset
282 serialised["from"] = client.jid
b1207332cea2 plugin XEP-0308: fix ID used, recipients and author check.
Goffi <goffi@goffi.org>
parents: 4166
diff changeset
283 # 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
284 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
285
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
286 message_elt = client.generate_message_xml(serialised)["xml"]
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
287 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
288 replace_elt["id"] = edited_history.origin_id
4163
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
289 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
290 client.send(message_elt)
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
291
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
292 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
293 client = self.host.get_client(profile)
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
294 edit_data = MessageEdition.model_validate_json(edit_data_s)
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
295 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
296
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
297
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
298 @implementer(disco.IDisco)
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
299 class XEP_0308_handler(xmlstream.XMPPHandler):
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
300 def getDiscoInfo(self, __, target, nodeIdentifier=""):
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
301 return [disco.DiscoFeature(NS_MESSAGE_CORRECT)]
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
302
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
303 def getDiscoItems(self, requestor, target, nodeIdentifier=""):
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents:
diff changeset
304 return []