Skip to content

Commit 96334e0

Browse files
committed
Merge develop -> asyncio
2 parents 5f94405 + 44a74b9 commit 96334e0

19 files changed

Lines changed: 183 additions & 46 deletions

compiler/error/source/400_BAD_REQUEST.tsv

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,4 +124,5 @@ WEBDOCUMENT_URL_EMPTY The web document URL is empty
124124
WEBDOCUMENT_URL_INVALID The web document URL is invalid
125125
WEBDOCUMENT_MIME_INVALID The web document mime type is invalid
126126
BUTTON_URL_INVALID The button url is invalid
127-
AUTH_BYTES_INVALID The authorization bytes are invalid
127+
AUTH_BYTES_INVALID The authorization bytes are invalid
128+
CHANNELS_TOO_MUCH You have joined too many channels or supergroups

pyrogram/client/ext/dispatcher.py

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,13 @@
2121
from collections import OrderedDict
2222

2323
import pyrogram
24-
from pyrogram.api import types
24+
from pyrogram.api.types import (
25+
UpdateNewMessage, UpdateNewChannelMessage, UpdateNewScheduledMessage,
26+
UpdateEditMessage, UpdateEditChannelMessage,
27+
UpdateDeleteMessages, UpdateDeleteChannelMessages,
28+
UpdateBotCallbackQuery, UpdateInlineBotCallbackQuery,
29+
UpdateUserStatus, UpdateBotInlineQuery, UpdateMessagePoll
30+
)
2531
from . import utils
2632
from ..handlers import (
2733
CallbackQueryHandler, MessageHandler, DeletedMessagesHandler,
@@ -33,23 +39,24 @@
3339

3440
class Dispatcher:
3541
NEW_MESSAGE_UPDATES = (
36-
types.UpdateNewMessage,
37-
types.UpdateNewChannelMessage
42+
UpdateNewMessage,
43+
UpdateNewChannelMessage,
44+
UpdateNewScheduledMessage
3845
)
3946

4047
EDIT_MESSAGE_UPDATES = (
41-
types.UpdateEditMessage,
42-
types.UpdateEditChannelMessage
48+
UpdateEditMessage,
49+
UpdateEditChannelMessage,
4350
)
4451

4552
DELETE_MESSAGES_UPDATES = (
46-
types.UpdateDeleteMessages,
47-
types.UpdateDeleteChannelMessages
53+
UpdateDeleteMessages,
54+
UpdateDeleteChannelMessages
4855
)
4956

5057
CALLBACK_QUERY_UPDATES = (
51-
types.UpdateBotCallbackQuery,
52-
types.UpdateInlineBotCallbackQuery
58+
UpdateBotCallbackQuery,
59+
UpdateInlineBotCallbackQuery
5360
)
5461

5562
MESSAGE_UPDATES = NEW_MESSAGE_UPDATES + EDIT_MESSAGE_UPDATES
@@ -65,7 +72,10 @@ def __init__(self, client, workers: int):
6572
self.groups = OrderedDict()
6673

6774
async def message_parser(update, users, chats):
68-
return await pyrogram.Message._parse(self.client, update.message, users, chats), MessageHandler
75+
return await pyrogram.Message._parse(
76+
self.client, update.message, users, chats,
77+
isinstance(update, UpdateNewScheduledMessage)
78+
), MessageHandler
6979

7080
async def deleted_messages_parser(update, users, chats):
7181
return utils.parse_deleted_messages(self.client, update), DeletedMessagesHandler
@@ -86,9 +96,9 @@ async def poll_parser(update, users, chats):
8696
Dispatcher.MESSAGE_UPDATES: message_parser,
8797
Dispatcher.DELETE_MESSAGES_UPDATES: deleted_messages_parser,
8898
Dispatcher.CALLBACK_QUERY_UPDATES: callback_query_parser,
89-
(types.UpdateUserStatus,): user_status_parser,
90-
(types.UpdateBotInlineQuery,): inline_query_parser,
91-
(types.UpdateMessagePoll,): poll_parser
99+
(UpdateUserStatus,): user_status_parser,
100+
(UpdateBotInlineQuery,): inline_query_parser,
101+
(UpdateMessagePoll,): poll_parser
92102
}
93103

94104
self.update_parsers = {key: value for key_tuple, value in self.update_parsers.items() for key in key_tuple}

pyrogram/client/filters/filters.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,12 @@ class Filters:
208208
*animation*, *voice*, *video_note*, *contact*, *location*, *venue*, *poll*.
209209
"""
210210

211+
scheduled = create(lambda _, m: bool(m.scheduled), "ScheduledFilter")
212+
"""Filter messages that have been scheduled (not yet sent)."""
213+
214+
from_scheduled = create(lambda _, m: bool(m.from_scheduled), "FromScheduledFilter")
215+
"""Filter new automatically sent messages that were previously scheduled."""
216+
211217
@staticmethod
212218
def command(
213219
commands: str or list,

pyrogram/client/methods/messages/send_animation.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ async def send_animation(
3939
thumb: str = None,
4040
disable_notification: bool = None,
4141
reply_to_message_id: int = None,
42+
schedule_date: int = None,
4243
reply_markup: Union[
4344
"pyrogram.InlineKeyboardMarkup",
4445
"pyrogram.ReplyKeyboardMarkup",
@@ -98,6 +99,9 @@ async def send_animation(
9899
reply_to_message_id (``int``, *optional*):
99100
If the message is a reply, ID of the original message.
100101
102+
schedule_date (``int``, *optional*):
103+
Date when the message will be automatically sent. Unix time.
104+
101105
reply_markup (:obj:`InlineKeyboardMarkup` | :obj:`ReplyKeyboardMarkup` | :obj:`ReplyKeyboardRemove` | :obj:`ForceReply`, *optional*):
102106
Additional interface options. An object for an inline keyboard, custom reply keyboard,
103107
instructions to remove reply keyboard or to force a reply from the user.
@@ -183,6 +187,7 @@ def progress(current, total):
183187
silent=disable_notification or None,
184188
reply_to_msg_id=reply_to_message_id,
185189
random_id=self.rnd_id(),
190+
schedule_date=schedule_date,
186191
reply_markup=reply_markup.write() if reply_markup else None,
187192
**await self.parser.parse(caption, parse_mode)
188193
)
@@ -191,11 +196,15 @@ def progress(current, total):
191196
await self.save_file(animation, file_id=file.id, file_part=e.x)
192197
else:
193198
for i in r.updates:
194-
if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage)):
199+
if isinstance(
200+
i,
201+
(types.UpdateNewMessage, types.UpdateNewChannelMessage, types.UpdateNewScheduledMessage)
202+
):
195203
message = await pyrogram.Message._parse(
196204
self, i.message,
197205
{i.id: i for i in r.users},
198-
{i.id: i for i in r.chats}
206+
{i.id: i for i in r.chats},
207+
is_scheduled=isinstance(i, types.UpdateNewScheduledMessage)
199208
)
200209

201210
if unsave:

pyrogram/client/methods/messages/send_audio.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ async def send_audio(
3737
title: str = None,
3838
thumb: str = None, disable_notification: bool = None,
3939
reply_to_message_id: int = None,
40+
schedule_date: int = None,
4041
reply_markup: Union[
4142
"pyrogram.InlineKeyboardMarkup",
4243
"pyrogram.ReplyKeyboardMarkup",
@@ -94,6 +95,9 @@ async def send_audio(
9495
reply_to_message_id (``int``, *optional*):
9596
If the message is a reply, ID of the original message.
9697
98+
schedule_date (``int``, *optional*):
99+
Date when the message will be automatically sent. Unix time.
100+
97101
reply_markup (:obj:`InlineKeyboardMarkup` | :obj:`ReplyKeyboardMarkup` | :obj:`ReplyKeyboardRemove` | :obj:`ForceReply`, *optional*):
98102
Additional interface options. An object for an inline keyboard, custom reply keyboard,
99103
instructions to remove reply keyboard or to force a reply from the user.
@@ -180,6 +184,7 @@ def progress(current, total):
180184
silent=disable_notification or None,
181185
reply_to_msg_id=reply_to_message_id,
182186
random_id=self.rnd_id(),
187+
schedule_date=schedule_date,
183188
reply_markup=reply_markup.write() if reply_markup else None,
184189
**await self.parser.parse(caption, parse_mode)
185190
)
@@ -188,11 +193,15 @@ def progress(current, total):
188193
await self.save_file(audio, file_id=file.id, file_part=e.x)
189194
else:
190195
for i in r.updates:
191-
if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage)):
196+
if isinstance(
197+
i,
198+
(types.UpdateNewMessage, types.UpdateNewChannelMessage, types.UpdateNewScheduledMessage)
199+
):
192200
return await pyrogram.Message._parse(
193201
self, i.message,
194202
{i.id: i for i in r.users},
195-
{i.id: i for i in r.chats}
203+
{i.id: i for i in r.chats},
204+
is_scheduled=isinstance(i, types.UpdateNewScheduledMessage)
196205
)
197206
except BaseClient.StopTransmission:
198207
return None

pyrogram/client/methods/messages/send_cached_media.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ async def send_cached_media(
3232
parse_mode: Union[str, None] = object,
3333
disable_notification: bool = None,
3434
reply_to_message_id: int = None,
35+
schedule_date: int = None,
3536
reply_markup: Union[
3637
"pyrogram.InlineKeyboardMarkup",
3738
"pyrogram.ReplyKeyboardMarkup",
@@ -72,6 +73,9 @@ async def send_cached_media(
7273
reply_to_message_id (``int``, *optional*):
7374
If the message is a reply, ID of the original message.
7475
76+
schedule_date (``int``, *optional*):
77+
Date when the message will be automatically sent. Unix time.
78+
7579
reply_markup (:obj:`InlineKeyboardMarkup` | :obj:`ReplyKeyboardMarkup` | :obj:`ReplyKeyboardRemove` | :obj:`ForceReply`, *optional*):
7680
Additional interface options. An object for an inline keyboard, custom reply keyboard,
7781
instructions to remove reply keyboard or to force a reply from the user.
@@ -92,15 +96,17 @@ async def send_cached_media(
9296
silent=disable_notification or None,
9397
reply_to_msg_id=reply_to_message_id,
9498
random_id=self.rnd_id(),
99+
schedule_date=schedule_date,
95100
reply_markup=reply_markup.write() if reply_markup else None,
96101
**await self.parser.parse(caption, parse_mode)
97102
)
98103
)
99104

100105
for i in r.updates:
101-
if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage)):
106+
if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage, types.UpdateNewScheduledMessage)):
102107
return await pyrogram.Message._parse(
103108
self, i.message,
104109
{i.id: i for i in r.users},
105-
{i.id: i for i in r.chats}
110+
{i.id: i for i in r.chats},
111+
is_scheduled=isinstance(i, types.UpdateNewScheduledMessage)
106112
)

pyrogram/client/methods/messages/send_contact.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,10 @@ async def send_contact(
3030
phone_number: str,
3131
first_name: str,
3232
last_name: str = None,
33-
vcard: str = None, disable_notification: bool = None,
33+
vcard: str = None,
34+
disable_notification: bool = None,
3435
reply_to_message_id: int = None,
36+
schedule_date: int = None,
3537
reply_markup: Union[
3638
"pyrogram.InlineKeyboardMarkup",
3739
"pyrogram.ReplyKeyboardMarkup",
@@ -66,6 +68,9 @@ async def send_contact(
6668
reply_to_message_id (``int``, *optional*):
6769
If the message is a reply, ID of the original message.
6870
71+
schedule_date (``int``, *optional*):
72+
Date when the message will be automatically sent. Unix time.
73+
6974
reply_markup (:obj:`InlineKeyboardMarkup` | :obj:`ReplyKeyboardMarkup` | :obj:`ReplyKeyboardRemove` | :obj:`ForceReply`, *optional*):
7075
Additional interface options. An object for an inline keyboard, custom reply keyboard,
7176
instructions to remove reply keyboard or to force a reply from the user.
@@ -91,14 +96,16 @@ async def send_contact(
9196
silent=disable_notification or None,
9297
reply_to_msg_id=reply_to_message_id,
9398
random_id=self.rnd_id(),
99+
schedule_date=schedule_date,
94100
reply_markup=reply_markup.write() if reply_markup else None
95101
)
96102
)
97103

98104
for i in r.updates:
99-
if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage)):
105+
if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage, types.UpdateNewScheduledMessage)):
100106
return await pyrogram.Message._parse(
101107
self, i.message,
102108
{i.id: i for i in r.users},
103-
{i.id: i for i in r.chats}
109+
{i.id: i for i in r.chats},
110+
is_scheduled=isinstance(i, types.UpdateNewScheduledMessage)
104111
)

pyrogram/client/methods/messages/send_document.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,12 @@ async def send_document(
3030
self,
3131
chat_id: Union[int, str],
3232
document: str,
33-
thumb: str = None, caption: str = "",
33+
thumb: str = None,
34+
caption: str = "",
3435
parse_mode: Union[str, None] = object,
3536
disable_notification: bool = None,
3637
reply_to_message_id: int = None,
38+
schedule_date: int = None,
3739
reply_markup: Union[
3840
"pyrogram.InlineKeyboardMarkup",
3941
"pyrogram.ReplyKeyboardMarkup",
@@ -80,6 +82,9 @@ async def send_document(
8082
reply_to_message_id (``int``, *optional*):
8183
If the message is a reply, ID of the original message.
8284
85+
schedule_date (``int``, *optional*):
86+
Date when the message will be automatically sent. Unix time.
87+
8388
reply_markup (:obj:`InlineKeyboardMarkup` | :obj:`ReplyKeyboardMarkup` | :obj:`ReplyKeyboardRemove` | :obj:`ForceReply`, *optional*):
8489
Additional interface options. An object for an inline keyboard, custom reply keyboard,
8590
instructions to remove reply keyboard or to force a reply from the user.
@@ -155,6 +160,7 @@ def progress(current, total):
155160
silent=disable_notification or None,
156161
reply_to_msg_id=reply_to_message_id,
157162
random_id=self.rnd_id(),
163+
schedule_date=schedule_date,
158164
reply_markup=reply_markup.write() if reply_markup else None,
159165
**await self.parser.parse(caption, parse_mode)
160166
)
@@ -163,11 +169,15 @@ def progress(current, total):
163169
await self.save_file(document, file_id=file.id, file_part=e.x)
164170
else:
165171
for i in r.updates:
166-
if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage)):
172+
if isinstance(
173+
i,
174+
(types.UpdateNewMessage, types.UpdateNewChannelMessage, types.UpdateNewScheduledMessage)
175+
):
167176
return await pyrogram.Message._parse(
168177
self, i.message,
169178
{i.id: i for i in r.users},
170-
{i.id: i for i in r.chats}
179+
{i.id: i for i in r.chats},
180+
is_scheduled=isinstance(i, types.UpdateNewScheduledMessage)
171181
)
172182
except BaseClient.StopTransmission:
173183
return None

pyrogram/client/methods/messages/send_location.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ async def send_location(
3131
longitude: float,
3232
disable_notification: bool = None,
3333
reply_to_message_id: int = None,
34+
schedule_date: int = None,
3435
reply_markup: Union[
3536
"pyrogram.InlineKeyboardMarkup",
3637
"pyrogram.ReplyKeyboardMarkup",
@@ -59,6 +60,9 @@ async def send_location(
5960
reply_to_message_id (``int``, *optional*):
6061
If the message is a reply, ID of the original message
6162
63+
schedule_date (``int``, *optional*):
64+
Date when the message will be automatically sent. Unix time.
65+
6266
reply_markup (:obj:`InlineKeyboardMarkup` | :obj:`ReplyKeyboardMarkup` | :obj:`ReplyKeyboardRemove` | :obj:`ForceReply`, *optional*):
6367
Additional interface options. An object for an inline keyboard, custom reply keyboard,
6468
instructions to remove reply keyboard or to force a reply from the user.
@@ -84,14 +88,16 @@ async def send_location(
8488
silent=disable_notification or None,
8589
reply_to_msg_id=reply_to_message_id,
8690
random_id=self.rnd_id(),
91+
schedule_date=schedule_date,
8792
reply_markup=reply_markup.write() if reply_markup else None
8893
)
8994
)
9095

9196
for i in r.updates:
92-
if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage)):
97+
if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage, types.UpdateNewScheduledMessage)):
9398
return await pyrogram.Message._parse(
9499
self, i.message,
95100
{i.id: i for i in r.users},
96-
{i.id: i for i in r.chats}
101+
{i.id: i for i in r.chats},
102+
is_scheduled=isinstance(i, types.UpdateNewScheduledMessage)
97103
)

pyrogram/client/methods/messages/send_message.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ async def send_message(
3232
disable_web_page_preview: bool = None,
3333
disable_notification: bool = None,
3434
reply_to_message_id: int = None,
35+
schedule_date: int = None,
3536
reply_markup: Union[
3637
"pyrogram.InlineKeyboardMarkup",
3738
"pyrogram.ReplyKeyboardMarkup",
@@ -67,6 +68,9 @@ async def send_message(
6768
reply_to_message_id (``int``, *optional*):
6869
If the message is a reply, ID of the original message.
6970
71+
schedule_date (``int``, *optional*):
72+
Date when the message will be automatically sent. Unix time.
73+
7074
reply_markup (:obj:`InlineKeyboardMarkup` | :obj:`ReplyKeyboardMarkup` | :obj:`ReplyKeyboardRemove` | :obj:`ForceReply`, *optional*):
7175
Additional interface options. An object for an inline keyboard, custom reply keyboard,
7276
instructions to remove reply keyboard or to force a reply from the user.
@@ -121,6 +125,7 @@ async def send_message(
121125
silent=disable_notification or None,
122126
reply_to_msg_id=reply_to_message_id,
123127
random_id=self.rnd_id(),
128+
schedule_date=schedule_date,
124129
reply_markup=reply_markup.write() if reply_markup else None,
125130
message=message,
126131
entities=entities
@@ -151,9 +156,10 @@ async def send_message(
151156
)
152157

153158
for i in r.updates:
154-
if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage)):
159+
if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage, types.UpdateNewScheduledMessage)):
155160
return await pyrogram.Message._parse(
156161
self, i.message,
157162
{i.id: i for i in r.users},
158-
{i.id: i for i in r.chats}
163+
{i.id: i for i in r.chats},
164+
is_scheduled=isinstance(i, types.UpdateNewScheduledMessage)
159165
)

0 commit comments

Comments
 (0)