mirror of
				https://github.com/LonamiWebs/Telethon.git
				synced 2025-11-04 09:57:29 +03:00 
			
		
		
		
	Add ButtonCallback.get_message (#4250)
This commit is contained in:
		
							parent
							
								
									ea65bf001e
								
							
						
					
					
						commit
						70fb266eea
					
				| 
						 | 
					@ -1,6 +1,6 @@
 | 
				
			||||||
from __future__ import annotations
 | 
					from __future__ import annotations
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from typing import TYPE_CHECKING, List, Optional, Sequence
 | 
					from typing import TYPE_CHECKING, List, Optional, Sequence, Union
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ...mtproto import RpcError
 | 
					from ...mtproto import RpcError
 | 
				
			||||||
from ...session import PackedChat, PackedType
 | 
					from ...session import PackedChat, PackedType
 | 
				
			||||||
| 
						 | 
					@ -117,7 +117,7 @@ async def get_chats(self: Client, chats: Sequence[ChatLike]) -> List[Chat]:
 | 
				
			||||||
    ]
 | 
					    ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
async def resolve_to_packed(client: Client, chat: ChatLike) -> PackedChat:
 | 
					async def resolve_to_packed(client: Client, chat: Union[ChatLike, abcs.InputPeer, abcs.Peer]) -> PackedChat:
 | 
				
			||||||
    if isinstance(chat, PackedChat):
 | 
					    if isinstance(chat, PackedChat):
 | 
				
			||||||
        return chat
 | 
					        return chat
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -172,6 +172,31 @@ async def resolve_to_packed(client: Client, chat: ChatLike) -> PackedChat:
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            raise RuntimeError("unexpected case")
 | 
					            raise RuntimeError("unexpected case")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if isinstance(chat, abcs.Peer):
 | 
				
			||||||
 | 
					        packed = client._chat_hashes.get(peer_id(chat))
 | 
				
			||||||
 | 
					        if packed is not None:
 | 
				
			||||||
 | 
					            return packed
 | 
				
			||||||
 | 
					        if isinstance(chat, types.PeerUser):
 | 
				
			||||||
 | 
					            return PackedChat(
 | 
				
			||||||
 | 
					                ty=PackedType.USER,
 | 
				
			||||||
 | 
					                id=chat.user_id,
 | 
				
			||||||
 | 
					                access_hash=0,
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					        elif isinstance(chat, types.PeerChat):
 | 
				
			||||||
 | 
					            return PackedChat(
 | 
				
			||||||
 | 
					                ty=PackedType.CHAT,
 | 
				
			||||||
 | 
					                id=chat.chat_id,
 | 
				
			||||||
 | 
					                access_hash=0,
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					        elif isinstance(chat, types.PeerChannel):
 | 
				
			||||||
 | 
					            return PackedChat(
 | 
				
			||||||
 | 
					                ty=PackedType.BROADCAST,
 | 
				
			||||||
 | 
					                id=chat.channel_id,
 | 
				
			||||||
 | 
					                access_hash=0,
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            raise RuntimeError("unexpected case")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if isinstance(chat, str):
 | 
					    if isinstance(chat, str):
 | 
				
			||||||
        if chat.startswith("+"):
 | 
					        if chat.startswith("+"):
 | 
				
			||||||
            resolved = await resolve_phone(client, chat)
 | 
					            resolved = await resolve_phone(client, chat)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3,8 +3,10 @@ from __future__ import annotations
 | 
				
			||||||
from typing import TYPE_CHECKING, Dict, Optional, Self
 | 
					from typing import TYPE_CHECKING, Dict, Optional, Self
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from ...tl import abcs, functions, types
 | 
					from ...tl import abcs, functions, types
 | 
				
			||||||
from ..types import Chat
 | 
					from ..types import Chat, Message
 | 
				
			||||||
from .event import Event
 | 
					from .event import Event
 | 
				
			||||||
 | 
					from ..types.chat import peer_id
 | 
				
			||||||
 | 
					from ..client.messages import CherryPickedList
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if TYPE_CHECKING:
 | 
					if TYPE_CHECKING:
 | 
				
			||||||
    from ..client.client import Client
 | 
					    from ..client.client import Client
 | 
				
			||||||
| 
						 | 
					@ -69,6 +71,25 @@ class ButtonCallback(Event):
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    async def get_message(self) -> Optional[Message]:
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        Get the :class:`~telethon.types.Message` containing the button that was clicked.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        If the message is too old and is no longer accessible, :data:`None` is returned instead.
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        pid = peer_id(self._raw.peer)
 | 
				
			||||||
 | 
					        chat = self._chat_map.get(pid)
 | 
				
			||||||
 | 
					        if not chat:
 | 
				
			||||||
 | 
					            chat = await self._client._resolve_to_packed(pid)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        lst = CherryPickedList(self._client, chat, [])
 | 
				
			||||||
 | 
					        lst._ids.append(types.InputMessageCallbackQuery(id=self._raw.msg_id, query_id=self._raw.query_id))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        message = (await lst)[0]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return message or None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class InlineQuery(Event):
 | 
					class InlineQuery(Event):
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -45,6 +45,16 @@ class Message(metaclass=NoPublicConstructor):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    You can get a message from :class:`telethon.events.NewMessage`,
 | 
					    You can get a message from :class:`telethon.events.NewMessage`,
 | 
				
			||||||
    or from methods such as :meth:`telethon.Client.get_messages`.
 | 
					    or from methods such as :meth:`telethon.Client.get_messages`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Empty messages can occur very rarely when fetching the message history.
 | 
				
			||||||
 | 
					    In these cases, only the :attr:`id` and :attr`peer` properties are guaranteed to be present.
 | 
				
			||||||
 | 
					    To determine whether a message is empty, its truthy value can be checked via :meth:`object.__bool__`:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .. code-block:: python
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        async for message in client.iter_messages(chat):
 | 
				
			||||||
 | 
					            if not message:
 | 
				
			||||||
 | 
					                print('Found empty message with ID', message.id)
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def __init__(
 | 
					    def __init__(
 | 
				
			||||||
| 
						 | 
					@ -487,6 +497,9 @@ class Message(metaclass=NoPublicConstructor):
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            return False
 | 
					            return False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def __bool__(self):
 | 
				
			||||||
 | 
					        return not isinstance(self._raw, types.MessageEmpty)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def build_msg_map(
 | 
					def build_msg_map(
 | 
				
			||||||
    client: Client, messages: List[abcs.Message], chat_map: Dict[int, Chat]
 | 
					    client: Client, messages: List[abcs.Message], chat_map: Dict[int, Chat]
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user