From f13a9d0e969a39fa77137fa38e9dba4bd3dd1a2e Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sun, 14 Aug 2022 01:49:39 +0300 Subject: [PATCH] Add support for disappearing messages --- CHANGELOG.md | 1 + mautrix_telegram/portal.py | 27 ++++++++++++++++++- .../portal_util/message_convert.py | 10 ++++--- 3 files changed, 34 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9948c090..1f4048b0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ Minimum Conduit version remains at 0.4.0. * Added option to include captions in the same message as the media to implement [MSC2530]. Sending captions the same way is also supported and enabled by default. +* Added support for Telegram's disappearing messages. * Added support for bridging forwarded messages as forwards on Telegram. * Forwarding is not allowed in relay mode as the bot wouldn't be able to specify who sent the message. diff --git a/mautrix_telegram/portal.py b/mautrix_telegram/portal.py index e922ff42..5216a1e3 100644 --- a/mautrix_telegram/portal.py +++ b/mautrix_telegram/portal.py @@ -1843,6 +1843,12 @@ class Portal(DBPortal, BasePortal): ) await self._send_delivery_receipt(event_id) asyncio.create_task(self._send_message_status(event_id, err=None)) + if response.ttl_period: + await self._mark_disappearing( + event_id=event_id, + seconds=response.ttl_period, + expires_at=int(response.date.timestamp()) + response.ttl_period, + ) async def _send_message_status(self, event_id: EventID, err: Exception | None) -> None: if not self.config["bridge.message_status_events"]: @@ -2867,8 +2873,9 @@ class Portal(DBPortal, BasePortal): event_id = await self._send_message( intent, converted.content, timestamp=evt.date, event_type=converted.type ) + caption_id = None if converted.caption: - await self._send_message(intent, converted.caption, timestamp=evt.date) + caption_id = await self._send_message(intent, converted.caption, timestamp=evt.date) self._new_messages_after_sponsored = True @@ -2914,6 +2921,24 @@ class Portal(DBPortal, BasePortal): ) ) await self._send_delivery_receipt(event_id) + if converted.disappear_seconds: + if converted.disappear_start_immediately: + expires_at = int(evt.date.timestamp()) + converted.disappear_seconds + else: + expires_at = None + await self._mark_disappearing(event_id, converted.disappear_seconds, expires_at) + if caption_id: + await self._mark_disappearing(caption_id, converted.disappear_seconds, expires_at) + + async def _mark_disappearing( + self, event_id: EventID, seconds: int, expires_at: int | None + ) -> None: + dm = DisappearingMessage( + self.mxid, event_id, seconds * 1000, expiration_ts=expires_at * 1000 + ) + await dm.insert() + if expires_at: + asyncio.create_task(self._disappear_event(dm)) async def _create_room_on_action( self, source: au.AbstractUser, action: TypeMessageAction diff --git a/mautrix_telegram/portal_util/message_convert.py b/mautrix_telegram/portal_util/message_convert.py index 072c0c1b..84f3f707 100644 --- a/mautrix_telegram/portal_util/message_convert.py +++ b/mautrix_telegram/portal_util/message_convert.py @@ -92,7 +92,8 @@ class ConvertedMessage: content: MessageEventContent caption: MessageEventContent | None = None type: EventType = EventType.ROOM_MESSAGE - disappear_in: int | None = None + disappear_seconds: int | None = None + disappear_start_immediately: bool = False class DocAttrs(NamedTuple): @@ -158,6 +159,9 @@ class TelegramMessageConverter: self.log.debug("Unhandled Telegram message %d", evt.id) return if converted: + if evt.ttl_period and not converted.disappear_seconds: + converted.disappear_seconds = evt.ttl_period + converted.disappear_start_immediately = True converted.content.external_url = self._get_external_url(evt) converted.content["fi.mau.telegram.source"] = { "space": self.portal.tgid if self.portal.peer_type == "channel" else source.tgid, @@ -388,7 +392,7 @@ class TelegramMessageConverter: return ConvertedMessage( content=content, caption=caption_content, - disappear_in=media.ttl_seconds, + disappear_seconds=media.ttl_seconds, ) async def _convert_document( @@ -488,7 +492,7 @@ class TelegramMessageConverter: type=event_type, content=content, caption=caption_content, - disappear_in=evt.media.ttl_seconds, + disappear_seconds=evt.media.ttl_seconds, ) @staticmethod