From 99ac768778151948a5b7a410d255d4bdeb8df9d4 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Fri, 31 May 2019 00:30:55 +0300 Subject: [PATCH] Fix relaybot edit deduplication in channels. Fixes #325 --- mautrix_telegram/portal.py | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/mautrix_telegram/portal.py b/mautrix_telegram/portal.py index bb7143cf..f95de355 100644 --- a/mautrix_telegram/portal.py +++ b/mautrix_telegram/portal.py @@ -917,12 +917,13 @@ class Portal: if msgtype == "m.emote": await self._apply_msg_format(sender, msgtype, message) if "m.new_content" in message: - await self._apply_msg_format(sender, msgtype, message.get("m.new_content")) + await self._apply_msg_format(sender, msgtype, message["m.new_content"]) + message["m.new_content"]["msgtype"] = "m.text" message["msgtype"] = "m.text" elif use_relaybot: await self._apply_msg_format(sender, msgtype, message) if "m.new_content" in message: - await self._apply_msg_format(sender, msgtype, message.get("m.new_content")) + await self._apply_msg_format(sender, msgtype, message["m.new_content"]) @staticmethod def _matrix_event_to_entities(event: Dict[str, Any] @@ -1048,7 +1049,7 @@ class Portal: def _add_telegram_message_to_db(self, event_id: MatrixEventID, space: TelegramID, edit_index: int, response: TypeMessage) -> None: self.log.debug("Handled Matrix message: %s", response) - self.is_duplicate(response, (event_id, space)) + self.is_duplicate(response, (event_id, space), force_hash=edit_index != 0) if edit_index < 0: prev_edit = DBMessage.get_one_by_tgid(TelegramID(response.id), space, -1) edit_index = prev_edit.edit_index + 1 @@ -1654,10 +1655,17 @@ class Portal: text, html, _ = await formatter.telegram_to_matrix(evt, source, self.main_intent, no_reply_fallback=True) editing_msg = DBMessage.get_one_by_tgid(TelegramID(evt.id), tg_space) + if not editing_msg: + self.log.info(f"Didn't find edited message {evt.id}@{tg_space} (src {source.tgid}) " + "in database.") + return + msgtype = ("m.notice" + if sender and sender.is_bot and self.get_config("bot_messages_as_notices") + else "m.text") content = { "body": f"Edit: {text}", - "msgtype": "m.text", + "msgtype": msgtype, "format": "org.matrix.custom.html", "formatted_body": (f"Edit: " @@ -1680,12 +1688,7 @@ class Portal: response = await intent.send_message(self.mxid, content) mxid = response["event_id"] - prev_edit_msg = DBMessage.get_one_by_tgid(TelegramID(evt.id), tg_space, -1) - if not prev_edit_msg: - self.log.info(f"Didn't find edited message {evt.id}@{tg_space} (src {source.tgid}) " - "in database.") - # Oh crap - return + prev_edit_msg = DBMessage.get_one_by_tgid(TelegramID(evt.id), tg_space, -1) or editing_msg DBMessage(mxid=mxid, mx_room=self.mxid, tg_space=tg_space, tgid=evt.id, edit_index=prev_edit_msg.edit_index + 1).insert() DBMessage.update_by_mxid(temporary_identifier, self.mxid, mxid=mxid)