annotate libervia/backend/plugins/plugin_xep_0444.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 5d2de6c1156d
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3886
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
1 #!/usr/bin/env python3
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
2
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
3 # Libervia plugin for XEP-0444
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
4 # Copyright (C) 2009-2021 Jérôme Poisson (goffi@goffi.org)
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
5
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
6 # This program is free software: you can redistribute it and/or modify
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
7 # it under the terms of the GNU Affero General Public License as published by
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
8 # the Free Software Foundation, either version 3 of the License, or
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
9 # (at your option) any later version.
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
10
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
11 # This program is distributed in the hope that it will be useful,
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
14 # GNU Affero General Public License for more details.
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
15
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
16 # You should have received a copy of the GNU Affero General Public License
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
18
4157
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
19 from typing import Iterable, List
3886
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
20
4157
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
21 from twisted.internet import defer
3886
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
22 from twisted.words.protocols.jabber import jid, xmlstream
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
23 from twisted.words.xish import domish
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
24 from wokkel import disco, iwokkel
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
25 from zope.interface import implementer
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
26
4157
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
27 import emoji
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
28 from libervia.backend.core import exceptions
4071
4b842c1fb686 refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents: 4051
diff changeset
29 from libervia.backend.core.constants import Const as C
4157
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
30 from libervia.backend.core.core_types import SatXMPPEntity
4071
4b842c1fb686 refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents: 4051
diff changeset
31 from libervia.backend.core.i18n import _
4b842c1fb686 refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents: 4051
diff changeset
32 from libervia.backend.core.log import getLogger
4b842c1fb686 refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents: 4051
diff changeset
33 from libervia.backend.memory.sqla_mapping import History
4157
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
34 from libervia.backend.models.core import MessageReactionData
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
35 from libervia.backend.tools.utils import aio
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
36 from libervia.backend.memory.sqla import select
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
37 from sqlalchemy.orm.attributes import flag_modified
3886
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
38
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
39 log = getLogger(__name__)
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
40
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
41 PLUGIN_INFO = {
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
42 C.PI_NAME: "Message Reactions",
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
43 C.PI_IMPORT_NAME: "XEP-0444",
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
44 C.PI_TYPE: C.PLUG_TYPE_XEP,
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
45 C.PI_MODES: C.PLUG_MODE_BOTH,
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
46 C.PI_PROTOCOLS: ["XEP-0444"],
4157
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
47 C.PI_DEPENDENCIES: ["XEP-0045", "XEP-0334"],
3886
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
48 C.PI_MAIN: "XEP_0444",
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
49 C.PI_HANDLER: "yes",
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
50 C.PI_DESCRIPTION: _("""Message Reactions implementation"""),
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
51 }
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
52
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
53 NS_REACTIONS = "urn:xmpp:reactions:0"
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
54
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
55
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
56 class XEP_0444:
4157
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
57 # TODO: implement and use occupant-ID (XEP-0421), and check sender (see
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
58 # https://xmpp.org/extensions/xep-0444.html#acceptable-reactions).
3886
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
59 def __init__(self, host):
4163
3b3cd9453d9b plugin XEP-0308: implement Last Message Correction
Goffi <goffi@goffi.org>
parents: 4157
diff changeset
60 log.info(f"plugin {PLUGIN_INFO[C.PI_NAME]!r} initialization")
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3886
diff changeset
61 host.register_namespace("reactions", NS_REACTIONS)
3886
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
62 self.host = host
4157
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
63 self._m = host.plugins["XEP-0045"]
3886
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
64 self._h = host.plugins["XEP-0334"]
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3886
diff changeset
65 host.bridge.add_method(
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3886
diff changeset
66 "message_reactions_set",
3886
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
67 ".plugin",
4157
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
68 in_sign="sasss",
3886
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
69 out_sign="",
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3886
diff changeset
70 method=self._reactions_set,
3886
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
71 async_=True,
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
72 )
4051
c23cad65ae99 core: renamed `messageReceived` trigger to `message_received`
Goffi <goffi@goffi.org>
parents: 4037
diff changeset
73 host.trigger.add("message_received", self._message_received_trigger)
3886
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
74
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3886
diff changeset
75 def get_handler(self, client):
3886
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
76 return XEP_0444_Handler()
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
77
4157
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
78 @aio
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
79 async def get_history_from_reaction_id(
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
80 self, client: SatXMPPEntity, message_elt: domish.Element, reaction_id: str
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
81 ) -> History | None:
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
82 """Retrieves history rows that match a specific reaction_id.
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
83
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
84 The retrieval criteria vary based on the message type, according to XEP-0444.
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
85
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
86 @param message_elt: The message element, used to determine the type of message.
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
87 @param reaction_id: The reaction ID to match in the history.
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
88 """
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
89 profile_id = self.host.memory.storage.profiles[client.profile]
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
90 async with self.host.memory.storage.session() as session:
4200
5d2de6c1156d plugin XEP-0444: fix emoji check and ID used
Goffi <goffi@goffi.org>
parents: 4163
diff changeset
91 if message_elt.getAttribute("type") == C.MESS_TYPE_GROUPCHAT:
4157
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
92 query = select(History).where(
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
93 History.profile_id == profile_id, History.stanza_id == reaction_id
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
94 )
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
95 else:
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
96 query = select(History).where(
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
97 History.profile_id == profile_id, History.origin_id == reaction_id
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
98 )
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
99
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
100 result = await session.execute(query)
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
101 history = result.scalars().first()
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
102
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
103 return history
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
104
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3886
diff changeset
105 async def _message_received_trigger(
3886
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
106 self,
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
107 client: SatXMPPEntity,
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
108 message_elt: domish.Element,
4157
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
109 post_treat: defer.Deferred,
3886
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
110 ) -> bool:
4157
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
111 reactions_elt = next(message_elt.elements(NS_REACTIONS, "reactions"), None)
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
112 if reactions_elt is not None:
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
113 reaction_id = reactions_elt.getAttribute("id")
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
114 history = await self.get_history_from_reaction_id(
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
115 client, message_elt, reaction_id
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
116 )
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
117 if history is None:
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
118 log.warning(
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
119 f"Can't find matching message for reaction: {reactions_elt.toXml()}"
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
120 )
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
121 else:
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
122 if not reaction_id:
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
123 log.warning(f"Invalid reaction: {reactions_elt.toXml()}")
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
124 return False
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
125 from_jid = jid.JID(message_elt["from"])
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
126 reactions = set()
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
127 for reaction_elt in reactions_elt.elements("reaction"):
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
128 reaction = str(reaction_elt)
4200
5d2de6c1156d plugin XEP-0444: fix emoji check and ID used
Goffi <goffi@goffi.org>
parents: 4163
diff changeset
129 if (
5d2de6c1156d plugin XEP-0444: fix emoji check and ID used
Goffi <goffi@goffi.org>
parents: 4163
diff changeset
130 not emoji.purely_emoji(reaction)
5d2de6c1156d plugin XEP-0444: fix emoji check and ID used
Goffi <goffi@goffi.org>
parents: 4163
diff changeset
131 or emoji.emoji_count(reaction) != 1
5d2de6c1156d plugin XEP-0444: fix emoji check and ID used
Goffi <goffi@goffi.org>
parents: 4163
diff changeset
132 ):
5d2de6c1156d plugin XEP-0444: fix emoji check and ID used
Goffi <goffi@goffi.org>
parents: 4163
diff changeset
133 log.warning(f"Ignoring invalid reaction: {reaction_elt.toXml()}.")
4157
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
134 continue
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
135 reactions.add(reaction)
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
136 await self.update_history_reactions(client, history, from_jid, reactions)
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
137
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
138 return False
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
139
3886
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
140 return True
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
141
4157
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
142 def _reactions_set(
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
143 self,
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
144 message_id: str,
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
145 reactions: List[str],
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
146 update_type: str = "replace",
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
147 profile: str = C.PROF_KEY_NONE,
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
148 ) -> defer.Deferred[None]:
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3886
diff changeset
149 client = self.host.get_client(profile)
3886
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
150 return defer.ensureDeferred(
4157
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
151 self.set_reactions(client, message_id, reactions, update_type)
3886
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
152 )
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
153
4157
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
154 async def get_history_from_uid(
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
155 self, client: SatXMPPEntity, message_id: str
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
156 ) -> History:
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
157 """Retrieve the chat history associated with a given message ID.
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
158
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
159 @param message_id: The Libervia specific identifier of the message
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
160
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
161 @return: An instance of History containing the chat history, messages, and
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
162 subjects related to the specified message ID.
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
163
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
164 @raises exceptions.NotFound: The history corresponding to the given message ID is
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
165 not found in the database.
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
166 """
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
167 history = await self.host.memory.storage.get(
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
168 client,
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
169 History,
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
170 History.uid,
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
171 message_id,
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
172 )
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
173 if history is None:
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
174 raise exceptions.NotFound(
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
175 f"message to retract not found in database ({message_id})"
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
176 )
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
177 return history
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
178
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3886
diff changeset
179 def send_reactions(
3886
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
180 self,
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
181 client: SatXMPPEntity,
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
182 dest_jid: jid.JID,
4157
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
183 message_type: str,
3886
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
184 message_id: str,
4157
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
185 reactions: Iterable[str],
3886
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
186 ) -> None:
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
187 """Send the <message> stanza containing the reactions
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
188
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
189 @param dest_jid: recipient of the reaction
4200
5d2de6c1156d plugin XEP-0444: fix emoji check and ID used
Goffi <goffi@goffi.org>
parents: 4163
diff changeset
190 @param message_id: either origin ID or stanza ID
3886
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
191 see https://xmpp.org/extensions/xep-0444.html#business-id
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
192 """
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
193 message_elt = domish.Element((None, "message"))
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
194 message_elt["from"] = client.jid.full()
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
195 message_elt["to"] = dest_jid.full()
4157
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
196 message_elt["type"] = message_type
3886
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
197 reactions_elt = message_elt.addElement((NS_REACTIONS, "reactions"))
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
198 reactions_elt["id"] = message_id
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
199 for r in set(reactions):
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
200 reactions_elt.addElement("reaction", content=r)
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3886
diff changeset
201 self._h.add_hint_elements(message_elt, [self._h.HINT_STORE])
3886
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
202 client.send(message_elt)
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
203
4157
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
204 def convert_to_replace_update(
3886
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
205 self,
4157
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
206 current_reactions: set[str],
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
207 reactions_new: Iterable[str],
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
208 update_type: str,
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
209 ) -> set[str]:
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
210 """Convert the given update to a replace update.
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
211
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
212 @param current_reactions: reaction of reacting JID before update
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
213 @param reactions_new: New reactions to be updated.
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
214 @param update_type: Original type of update (add, remove, toggle, replace).
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
215 @return: reactions for a replace operation.
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
216
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
217 @raise ValueError: invalid ``update_type``.
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
218 """
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
219 new_reactions_set = set(reactions_new)
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
220
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
221 if update_type == "replace":
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
222 return new_reactions_set
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
223
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
224 if update_type == "add":
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
225 replace_reactions = current_reactions | new_reactions_set
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
226 elif update_type == "remove":
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
227 replace_reactions = current_reactions - new_reactions_set
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
228 elif update_type == "toggle":
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
229 replace_reactions = current_reactions ^ new_reactions_set
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
230 else:
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
231 raise ValueError(f"Invalid update type: {update_type!r}")
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
232
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
233 return replace_reactions
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
234
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
235 async def update_history_reactions(
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
236 self,
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
237 client: SatXMPPEntity,
3886
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
238 history: History,
4157
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
239 reacting_jid: jid.JID,
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
240 reactions_new: Iterable[str],
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
241 update_type: str = "replace",
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
242 store: bool = True,
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
243 ) -> set[str]:
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
244 """Update reactions in History instance and optionally store and signal it.
3886
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
245
4157
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
246 @param history: storage History instance to be updated
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
247 @param reacting_jid: author of the reactions
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
248 @param reactions_new: new reactions to update
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
249 @param update_type: Original type of update (add, remove, toggle, replace).
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
250 @param store: if True, update history in storage, and send a `message_update`
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
251 signal with the new reactions.
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
252 @return: set of reactions for this JID for a "replace" update
3886
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
253 """
4157
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
254 # FIXME: handle race conditions
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
255 if history.type == C.MESS_TYPE_GROUPCHAT:
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
256 entity_jid_s = reacting_jid.full()
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
257 else:
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
258 entity_jid_s = reacting_jid.userhost()
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
259 if history.extra is None:
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
260 history.extra = {}
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
261 extra = history.extra
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
262 reactions = extra.get("reactions", {})
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
263
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
264 current_reactions = {
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
265 reaction for reaction, jids in reactions.items() if entity_jid_s in jids
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
266 }
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
267 reactions_replace_set = self.convert_to_replace_update(
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
268 current_reactions, reactions_new, update_type
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
269 )
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
270
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
271 for reaction in current_reactions - reactions_replace_set:
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
272 reaction_jids = reactions[reaction]
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
273 reaction_jids.remove(entity_jid_s)
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
274 if not reaction_jids:
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
275 del reactions[reaction]
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
276
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
277 for reaction in reactions_replace_set - current_reactions:
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
278 reactions.setdefault(reaction, []).append(entity_jid_s)
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
279
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
280 # we want to have a constant order in reactions
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
281 extra["reactions"] = dict(sorted(reactions.items()))
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
282
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
283 if store:
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
284 # FIXME: this is not a clean way to flag "extra" as modified, but a deepcopy
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
285 # is for some reason not working here.
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
286 flag_modified(history, "extra")
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
287 await self.host.memory.storage.add(history)
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
288 # we send the signal for frontends update
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
289 data = MessageReactionData(reactions=extra["reactions"])
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
290 self.host.bridge.message_update(
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
291 history.uid,
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
292 C.MESS_UPDATE_REACTION,
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
293 data.model_dump_json(),
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
294 client.profile,
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
295 )
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
296
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
297 return reactions_replace_set
3886
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
298
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 3886
diff changeset
299 async def set_reactions(
3886
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
300 self,
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
301 client: SatXMPPEntity,
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
302 message_id: str,
4157
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
303 reactions: Iterable[str],
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
304 update_type: str = "replace",
3886
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
305 ) -> None:
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
306 """Set and replace reactions to a message
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
307
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
308 @param message_id: internal ID of the message
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
309 @param rections: lsit of emojis to used to react to the message
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
310 use empty list to remove all reactions
4157
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
311 @param update_type: how to use the reaction to make the update, can be "replace",
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
312 "add", "remove" or "toggle".
3886
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
313 """
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
314 if not message_id:
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
315 raise ValueError("message_id can't be empty")
4157
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
316
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
317 history = await self.get_history_from_uid(client, message_id)
4200
5d2de6c1156d plugin XEP-0444: fix emoji check and ID used
Goffi <goffi@goffi.org>
parents: 4163
diff changeset
318 if history.type == C.MESS_TYPE_GROUPCHAT:
5d2de6c1156d plugin XEP-0444: fix emoji check and ID used
Goffi <goffi@goffi.org>
parents: 4163
diff changeset
319 mess_id = history.stanza_id
5d2de6c1156d plugin XEP-0444: fix emoji check and ID used
Goffi <goffi@goffi.org>
parents: 4163
diff changeset
320 else:
4157
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
321 mess_id = history.origin_id
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
322
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
323 if mess_id is None:
3886
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
324 raise exceptions.DataError(
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
325 "target message has neither origin-id nor message-id, we can't send a "
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
326 "reaction"
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
327 )
4157
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
328
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
329 if history.source == client.jid.userhost():
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
330 dest_jid = history.dest_jid
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
331 else:
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
332 dest_jid = history.source_jid
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
333
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
334 if history.type == C.MESS_TYPE_GROUPCHAT:
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
335 # the reaction is for the chat room itself
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
336 dest_jid = dest_jid.userhostJID()
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
337 reacting_jid = self._m.get_room_user_jid(client, dest_jid)
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
338 # we don't store reactions for MUC, at this will be done when we receive back
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
339 # the reaction
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
340 store = False
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
341 else:
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
342 # we use bare JIDs for one2one message, except if the recipient is from a MUC
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
343 if self._m.is_room(client, dest_jid):
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
344 # this is a private message in a room, we need to use the MUC JID
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
345 reacting_jid = self._m.get_room_user_jid(client, dest_jid.userhostJID())
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
346 else:
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
347 # this is a classic one2one message, we need the bare JID
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
348 reacting_jid = client.jid.userhostJID()
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
349 dest_jid = dest_jid.userhostJID()
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
350 store = True
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
351
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
352 reaction_replace_set = await self.update_history_reactions(
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
353 client, history, reacting_jid, reactions, update_type, store
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
354 )
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
355
04cdcb3fd713 plugin XEP-0444: complete implementation:
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
356 self.send_reactions(client, dest_jid, history.type, mess_id, reaction_replace_set)
3886
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
357
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
358
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
359 @implementer(iwokkel.IDisco)
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
360 class XEP_0444_Handler(xmlstream.XMPPHandler):
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
361 def getDiscoInfo(self, requestor, service, nodeIdentifier=""):
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
362 return [disco.DiscoFeature(NS_REACTIONS)]
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
363
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
364 def getDiscoItems(self, requestor, service, nodeIdentifier=""):
1f88ca90c3de plugin XEP-0444: Message Reactions implementation:
Goffi <goffi@goffi.org>
parents:
diff changeset
365 return []