diff --git a/mautrix_telegram/commands/telegram/misc.py b/mautrix_telegram/commands/telegram/misc.py index 99b2e22e..4bc9d93f 100644 --- a/mautrix_telegram/commands/telegram/misc.py +++ b/mautrix_telegram/commands/telegram/misc.py @@ -24,7 +24,7 @@ from telethon.errors import (InviteHashInvalidError, InviteHashExpiredError, Opt TakeoutInitDelayError) from telethon.tl.patched import Message from telethon.tl.types import (User as TLUser, TypeUpdates, MessageMediaGame, MessageMediaPoll, - TypeInputPeer) + TypeInputPeer, InputMediaDice) from telethon.tl.types.messages import BotCallbackAnswer from telethon.tl.functions.messages import (ImportChatInviteRequest, CheckChatInviteRequest, GetBotCallbackAnswerRequest, SendVoteRequest) @@ -104,7 +104,7 @@ async def pm(evt: CommandEvent) -> EventID: return await evt.reply("**Usage:** `$cmdprefix+sp pm `") try: - id = "".join(evt.args).translate({ord(c):None for c in "+()- "}) + id = "".join(evt.args).translate({ord(c): None for c in "+()- "}) user = await evt.sender.client.get_entity(id) except ValueError: return await evt.reply("Invalid user identifier or user not found.") @@ -308,6 +308,15 @@ async def vote(evt: CommandEvent) -> EventID: return await evt.mark_read() +@command_handler(help_section=SECTION_MISC, + help_text="Roll a dice on the Telegram servers.") +async def roll(evt: CommandEvent) -> EventID: + if not evt.is_portal: + return await evt.reply("You can only roll dice in portal rooms") + portal = po.Portal.get_by_mxid(evt.room_id) + await evt.sender.client.send_media(await portal.get_input_entity(evt.sender), InputMediaDice()) + + @command_handler(help_section=SECTION_PORTAL_MANAGEMENT, help_args="<_number of messages_> [--takeout]", help_text="Backfill messages from Telegram history.") diff --git a/mautrix_telegram/portal/telegram.py b/mautrix_telegram/portal/telegram.py index bd782797..5fcff089 100644 --- a/mautrix_telegram/portal/telegram.py +++ b/mautrix_telegram/portal/telegram.py @@ -29,11 +29,11 @@ from telethon.tl.types import ( MessageMediaPoll, MessageActionChannelCreate, MessageActionChatAddUser, MessageActionChatCreate, MessageActionChatDeletePhoto, MessageActionChatDeleteUser, MessageActionChatEditPhoto, MessageActionChatEditTitle, MessageActionChatJoinedByLink, - MessageActionChatMigrateTo, MessageActionChannelMigrateFrom, MessageActionGameScore, - MessageMediaDocument, MessageMediaGeo, MessageMediaPhoto, MessageMediaUnsupported, - MessageMediaGame, PeerUser, PhotoCachedSize, TypeChannelParticipant, TypeChatParticipant, - TypeDocumentAttribute, TypeMessageAction, TypePhotoSize, PhotoSize, UpdateChatUserTyping, - UpdateUserTyping, MessageEntityPre, ChatPhotoEmpty) + MessageActionChatMigrateTo, MessageActionGameScore, MessageMediaDocument, MessageMediaGeo, + MessageMediaPhoto, MessageMediaDice, MessageMediaGame, MessageMediaUnsupported, PeerUser, + PhotoCachedSize, TypeChannelParticipant, TypeChatParticipant, TypeDocumentAttribute, + TypeMessageAction, TypePhotoSize, PhotoSize, UpdateChatUserTyping, UpdateUserTyping, + MessageEntityPre, ChatPhotoEmpty) from mautrix.appservice import IntentAPI from mautrix.types import (EventID, UserID, ImageInfo, ThumbnailInfo, RelatesTo, MessageType, @@ -74,6 +74,8 @@ class PortalTelegram(BasePortal, ABC): async def _send_message(self, intent: IntentAPI, content: MessageEventContent, event_type: EventType = EventType.ROOM_MESSAGE, **kwargs) -> EventID: if self.encrypted and self.matrix.e2ee: + if intent.api.is_real_user: + content[intent.api.real_user_content_key] = True event_type, content = await self.matrix.e2ee.encrypt(self.mxid, event_type, content) return await intent.send_message_event(self.mxid, event_type, content, **kwargs) @@ -293,6 +295,17 @@ class PortalTelegram(BasePortal, ABC): await intent.set_typing(self.mxid, is_typing=False) return await self._send_message(intent, content, timestamp=evt.date) + async def handle_telegram_dice(self, source: 'AbstractUser', intent: IntentAPI, evt: Message, + relates_to: RelatesTo) -> EventID: + content = TextMessageEventContent( + msgtype=MessageType.TEXT, format=Format.HTML, + body=f"Dice roll result: {evt.media.value}", + formatted_body=f'

Dice roll result: {evt.media.value}

', + relates_to=relates_to, external_url=self._get_external_url(evt)) + content["net.maunium.telegram.dice"] = evt.media.value + await intent.set_typing(self.mxid, is_typing=False) + return await self._send_message(intent, content, timestamp=evt.date) + @staticmethod def _int_to_bytes(i: int) -> bytes: hex_value = "{0:010x}".format(i) @@ -457,7 +470,8 @@ class PortalTelegram(BasePortal, ABC): await sender.update_info(source, entity) allowed_media = (MessageMediaPhoto, MessageMediaDocument, MessageMediaGeo, - MessageMediaGame, MessageMediaPoll, MessageMediaUnsupported) + MessageMediaGame, MessageMediaDice, MessageMediaPoll, + MessageMediaUnsupported) media = evt.media if hasattr(evt, "media") and isinstance(evt.media, allowed_media) else None if sender: @@ -476,6 +490,7 @@ class PortalTelegram(BasePortal, ABC): MessageMediaDocument: self.handle_telegram_document, MessageMediaGeo: self.handle_telegram_location, MessageMediaPoll: self.handle_telegram_poll, + MessageMediaDice: self.handle_telegram_dice, MessageMediaUnsupported: self.handle_telegram_unsupported, MessageMediaGame: self.handle_telegram_game, }[type(media)](source, intent, evt, diff --git a/requirements.txt b/requirements.txt index feaf4bb8..2cb95d2a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,5 +5,5 @@ python-magic>=0.4,<0.5 commonmark>=0.8,<0.10 aiohttp>=3,<4 mautrix==0.5.0.beta10 -telethon>=1.10,<1.12 +telethon>=1.12,<1.13 telethon-session-sqlalchemy>=0.2.14,<0.3