From 14ed4ea7644a41c25946fd6b90a1cb225f67b38b Mon Sep 17 00:00:00 2001 From: Lonami Exo Date: Fri, 1 Sep 2023 19:50:40 +0200 Subject: [PATCH] Add some ways to convert message --- .../telethon/_impl/client/client/client.py | 10 ++++ .../telethon/_impl/client/client/messages.py | 51 ++++++++++++++++++- .../telethon/_impl/client/types/message.py | 16 ++++++ 3 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 client/src/telethon/_impl/client/types/message.py diff --git a/client/src/telethon/_impl/client/client/client.py b/client/src/telethon/_impl/client/client/client.py index 3670081f..c17ca154 100644 --- a/client/src/telethon/_impl/client/client/client.py +++ b/client/src/telethon/_impl/client/client/client.py @@ -12,6 +12,7 @@ from ...tl.core.request import Request from ..types.chat import ChatLike from ..types.chat.user import User from ..types.login_token import LoginToken +from ..types.message import Message from ..types.password_token import PasswordToken from .account import edit_2fa, end_takeout, takeout from .auth import ( @@ -40,6 +41,7 @@ from .downloads import download_media, download_profile_photo, iter_download from .messages import ( delete_messages, edit_message, + find_updates_message, forward_messages, iter_messages, pin_message, @@ -205,6 +207,14 @@ class Client: async def unpin_message(self) -> None: await unpin_message(self) + def _find_updates_message( + self, + result: abcs.Updates, + random_id: int, + chat: Optional[abcs.InputPeer], + ) -> Message: + return find_updates_message(self, result, random_id, chat) + async def set_receive_updates(self) -> None: await set_receive_updates(self) diff --git a/client/src/telethon/_impl/client/client/messages.py b/client/src/telethon/_impl/client/client/messages.py index 116ba1e4..943edaae 100644 --- a/client/src/telethon/_impl/client/client/messages.py +++ b/client/src/telethon/_impl/client/client/messages.py @@ -1,6 +1,9 @@ from __future__ import annotations -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, Dict, List, Optional, Union + +from ...tl import abcs, types +from ..types.message import Message if TYPE_CHECKING: from .client import Client @@ -44,3 +47,49 @@ async def pin_message(self: Client) -> None: async def unpin_message(self: Client) -> None: self raise NotImplementedError + + +def find_updates_message( + self: Client, + result: abcs.Updates, + random_id: int, + chat: Optional[abcs.InputPeer], +) -> Message: + if isinstance(result, types.UpdateShort): + updates = [result.update] + entities: Dict[int, object] = {} + elif isinstance(result, (types.Updates, types.UpdatesCombined)): + updates = result.updates + entities = {} + raise NotImplementedError() + else: + return Message._from_raw( + types.MessageEmpty(id=0, peer_id=self._input_as_peer(chat)) + ) + + random_to_id = {} + id_to_message = {} + for update in updates: + if isinstance(update, types.UpdateMessageId): + random_to_id[update.random_id] = update.id + + elif isinstance( + update, + ( + types.UpdateNewChannelMessage, + types.UpdateNewMessage, + types.UpdateEditMessage, + types.UpdateEditChannelMessage, + types.UpdateNewScheduledMessage, + ), + ): + assert isinstance( + update.message, + (types.Message, types.MessageService, types.MessageEmpty), + ) + id_to_message[update.message.id] = update.message + + elif isinstance(update, types.UpdateMessagePoll): + raise NotImplementedError() + + return Message._from_raw(id_to_message[random_to_id[random_id]]) diff --git a/client/src/telethon/_impl/client/types/message.py b/client/src/telethon/_impl/client/types/message.py new file mode 100644 index 00000000..700d5eb9 --- /dev/null +++ b/client/src/telethon/_impl/client/types/message.py @@ -0,0 +1,16 @@ +from typing import Self + +from telethon._impl.tl import abcs + +from .meta import NoPublicConstructor + + +class Message(metaclass=NoPublicConstructor): + __slots__ = ("_message",) + + def __init__(self, message: abcs.Message) -> None: + self._message = message + + @classmethod + def _from_raw(cls, message: abcs.Message) -> Self: + return cls._create(message)