-
-
Notifications
You must be signed in to change notification settings - Fork 49
Expand file tree
/
Copy pathget_messages.py
More file actions
127 lines (96 loc) · 4.78 KB
/
get_messages.py
File metadata and controls
127 lines (96 loc) · 4.78 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# Hydrogram - Telegram MTProto API Client Library for Python
# Copyright (C) 2017-2023 Dan <https://github.com/delivrance>
# Copyright (C) 2023-present Hydrogram <https://hydrogram.org>
#
# This file is part of Hydrogram.
#
# Hydrogram is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Hydrogram is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with Hydrogram. If not, see <http://www.gnu.org/licenses/>.
from __future__ import annotations
import logging
from typing import TYPE_CHECKING
import hydrogram
from hydrogram import raw, types, utils
if TYPE_CHECKING:
from collections.abc import Iterable
log = logging.getLogger(__name__)
# TODO: Rewrite using a flag for replied messages and have message_ids non-optional
class GetMessages:
async def get_messages(
self: hydrogram.Client,
chat_id: int | str,
message_ids: int | Iterable[int] | None = None,
reply_to_message_ids: int | Iterable[int] | None = None,
replies: int = 1,
) -> types.Message | list[types.Message]:
"""Get one or more messages from a chat by using message identifiers.
You can retrieve up to 200 messages at once.
.. include:: /_includes/usable-by/users-bots.rst
Parameters:
chat_id (``int`` | ``str``):
Unique identifier (int) or username (str) of the target chat.
For your personal cloud (Saved Messages) you can simply use "me" or "self".
For a contact that exists in your Telegram address book you can use his phone number (str).
message_ids (``int`` | Iterable of ``int``, *optional*):
Pass a single message identifier or an iterable of message ids (as integers) to get the content of the
message themselves.
reply_to_message_ids (``int`` | Iterable of ``int``, *optional*):
Pass a single message identifier or an iterable of message ids (as integers) to get the content of
the previous message you replied to using this message.
If *message_ids* is set, this argument will be ignored.
replies (``int``, *optional*):
The number of subsequent replies to get for each message.
Pass 0 for no reply at all or -1 for unlimited replies.
Defaults to 1.
Returns:
:obj:`~hydrogram.types.Message` | List of :obj:`~hydrogram.types.Message`: In case *message_ids* was not
a list, a single message is returned, otherwise a list of messages is returned.
Example:
.. code-block:: python
# Get one message
await app.get_messages(chat_id, 12345)
# Get more than one message (list of messages)
await app.get_messages(chat_id, [12345, 12346])
# Get message by ignoring any replied-to message
await app.get_messages(chat_id, message_id, replies=0)
# Get message with all chained replied-to messages
await app.get_messages(chat_id, message_id, replies=-1)
# Get the replied-to message of a message
await app.get_messages(chat_id, reply_to_message_ids=message_id)
Raises:
ValueError: In case of invalid arguments.
"""
ids, ids_type = (
(message_ids, raw.types.InputMessageID)
if message_ids
else (reply_to_message_ids, raw.types.InputMessageReplyTo)
if reply_to_message_ids
else (None, None)
)
if ids is None:
raise ValueError(
"No argument supplied. Either pass message_ids or reply_to_message_ids"
)
peer = await self.resolve_peer(chat_id)
is_iterable = not isinstance(ids, int)
ids = list(ids) if is_iterable else [ids]
ids = [ids_type(id=i) for i in ids]
if replies < 0:
replies = (1 << 31) - 1
if isinstance(peer, raw.types.InputPeerChannel):
rpc = raw.functions.channels.GetMessages(channel=peer, id=ids)
else:
rpc = raw.functions.messages.GetMessages(id=ids)
r = await self.invoke(rpc, sleep_threshold=-1)
messages = await utils.parse_messages(self, r, replies=replies)
return messages if is_iterable else messages[0] if messages else None