Skip to content

Commit 047fe37

Browse files
committed
Add support for scheduled messages
1 parent c3dde77 commit 047fe37

16 files changed

Lines changed: 172 additions & 42 deletions

pyrogram/client/ext/dispatcher.py

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,13 @@
2323
from threading import Thread, Lock
2424

2525
import pyrogram
26-
from pyrogram.api import types
26+
from pyrogram.api.types import (
27+
UpdateNewMessage, UpdateNewChannelMessage, UpdateNewScheduledMessage,
28+
UpdateEditMessage, UpdateEditChannelMessage,
29+
UpdateDeleteMessages, UpdateDeleteChannelMessages,
30+
UpdateBotCallbackQuery, UpdateInlineBotCallbackQuery,
31+
UpdateUserStatus, UpdateBotInlineQuery, UpdateMessagePoll
32+
)
2733
from . import utils
2834
from ..handlers import (
2935
CallbackQueryHandler, MessageHandler, DeletedMessagesHandler,
@@ -35,23 +41,24 @@
3541

3642
class Dispatcher:
3743
NEW_MESSAGE_UPDATES = (
38-
types.UpdateNewMessage,
39-
types.UpdateNewChannelMessage
44+
UpdateNewMessage,
45+
UpdateNewChannelMessage,
46+
UpdateNewScheduledMessage
4047
)
4148

4249
EDIT_MESSAGE_UPDATES = (
43-
types.UpdateEditMessage,
44-
types.UpdateEditChannelMessage
50+
UpdateEditMessage,
51+
UpdateEditChannelMessage,
4552
)
4653

4754
DELETE_MESSAGES_UPDATES = (
48-
types.UpdateDeleteMessages,
49-
types.UpdateDeleteChannelMessages
55+
UpdateDeleteMessages,
56+
UpdateDeleteChannelMessages
5057
)
5158

5259
CALLBACK_QUERY_UPDATES = (
53-
types.UpdateBotCallbackQuery,
54-
types.UpdateInlineBotCallbackQuery
60+
UpdateBotCallbackQuery,
61+
UpdateInlineBotCallbackQuery
5562
)
5663

5764
MESSAGE_UPDATES = NEW_MESSAGE_UPDATES + EDIT_MESSAGE_UPDATES
@@ -68,21 +75,30 @@ def __init__(self, client, workers: int):
6875

6976
self.update_parsers = {
7077
Dispatcher.MESSAGE_UPDATES:
71-
lambda upd, usr, cht: (pyrogram.Message._parse(self.client, upd.message, usr, cht), MessageHandler),
78+
lambda upd, usr, cht: (
79+
pyrogram.Message._parse(
80+
self.client,
81+
upd.message,
82+
usr,
83+
cht,
84+
isinstance(upd, UpdateNewScheduledMessage)
85+
),
86+
MessageHandler
87+
),
7288

7389
Dispatcher.DELETE_MESSAGES_UPDATES:
7490
lambda upd, usr, cht: (utils.parse_deleted_messages(self.client, upd), DeletedMessagesHandler),
7591

7692
Dispatcher.CALLBACK_QUERY_UPDATES:
7793
lambda upd, usr, cht: (pyrogram.CallbackQuery._parse(self.client, upd, usr), CallbackQueryHandler),
7894

79-
(types.UpdateUserStatus,):
95+
(UpdateUserStatus,):
8096
lambda upd, usr, cht: (pyrogram.User._parse_user_status(self.client, upd), UserStatusHandler),
8197

82-
(types.UpdateBotInlineQuery,):
98+
(UpdateBotInlineQuery,):
8399
lambda upd, usr, cht: (pyrogram.InlineQuery._parse(self.client, upd, usr), InlineQueryHandler),
84100

85-
(types.UpdateMessagePoll,):
101+
(UpdateMessagePoll,):
86102
lambda upd, usr, cht: (pyrogram.Poll._parse_update(self.client, upd), PollHandler)
87103
}
88104

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 @@ 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 @@ 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
**self.parser.parse(caption, parse_mode)
188193
)
@@ -191,11 +196,15 @@ def progress(current, total):
191196
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 = 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
@@ -38,6 +38,7 @@ def send_audio(
3838
thumb: str = None,
3939
disable_notification: bool = None,
4040
reply_to_message_id: int = None,
41+
schedule_date: int = None,
4142
reply_markup: Union[
4243
"pyrogram.InlineKeyboardMarkup",
4344
"pyrogram.ReplyKeyboardMarkup",
@@ -95,6 +96,9 @@ def send_audio(
9596
reply_to_message_id (``int``, *optional*):
9697
If the message is a reply, ID of the original message.
9798
99+
schedule_date (``int``, *optional*):
100+
Date when the message will be automatically sent. Unix time.
101+
98102
reply_markup (:obj:`InlineKeyboardMarkup` | :obj:`ReplyKeyboardMarkup` | :obj:`ReplyKeyboardRemove` | :obj:`ForceReply`, *optional*):
99103
Additional interface options. An object for an inline keyboard, custom reply keyboard,
100104
instructions to remove reply keyboard or to force a reply from the user.
@@ -181,6 +185,7 @@ def progress(current, total):
181185
silent=disable_notification or None,
182186
reply_to_msg_id=reply_to_message_id,
183187
random_id=self.rnd_id(),
188+
schedule_date=schedule_date,
184189
reply_markup=reply_markup.write() if reply_markup else None,
185190
**self.parser.parse(caption, parse_mode)
186191
)
@@ -189,11 +194,15 @@ def progress(current, total):
189194
self.save_file(audio, file_id=file.id, file_part=e.x)
190195
else:
191196
for i in r.updates:
192-
if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage)):
197+
if isinstance(
198+
i,
199+
(types.UpdateNewMessage, types.UpdateNewChannelMessage, types.UpdateNewScheduledMessage)
200+
):
193201
return pyrogram.Message._parse(
194202
self, i.message,
195203
{i.id: i for i in r.users},
196-
{i.id: i for i in r.chats}
204+
{i.id: i for i in r.chats},
205+
is_scheduled=isinstance(i, types.UpdateNewScheduledMessage)
197206
)
198207
except BaseClient.StopTransmission:
199208
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 @@ 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 @@ 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 @@ 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
**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 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: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ def send_contact(
3333
vcard: str = None,
3434
disable_notification: bool = None,
3535
reply_to_message_id: int = None,
36+
schedule_date: int = None,
3637
reply_markup: Union[
3738
"pyrogram.InlineKeyboardMarkup",
3839
"pyrogram.ReplyKeyboardMarkup",
@@ -67,6 +68,9 @@ def send_contact(
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.
@@ -92,14 +96,16 @@ def send_contact(
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
)
97102
)
98103

99104
for i in r.updates:
100-
if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage)):
105+
if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage, types.UpdateNewScheduledMessage)):
101106
return pyrogram.Message._parse(
102107
self, i.message,
103108
{i.id: i for i in r.users},
104-
{i.id: i for i in r.chats}
109+
{i.id: i for i in r.chats},
110+
is_scheduled=isinstance(i, types.UpdateNewScheduledMessage)
105111
)

pyrogram/client/methods/messages/send_document.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ def send_document(
3535
parse_mode: Union[str, None] = object,
3636
disable_notification: bool = None,
3737
reply_to_message_id: int = None,
38+
schedule_date: int = None,
3839
reply_markup: Union[
3940
"pyrogram.InlineKeyboardMarkup",
4041
"pyrogram.ReplyKeyboardMarkup",
@@ -81,6 +82,9 @@ def send_document(
8182
reply_to_message_id (``int``, *optional*):
8283
If the message is a reply, ID of the original message.
8384
85+
schedule_date (``int``, *optional*):
86+
Date when the message will be automatically sent. Unix time.
87+
8488
reply_markup (:obj:`InlineKeyboardMarkup` | :obj:`ReplyKeyboardMarkup` | :obj:`ReplyKeyboardRemove` | :obj:`ForceReply`, *optional*):
8589
Additional interface options. An object for an inline keyboard, custom reply keyboard,
8690
instructions to remove reply keyboard or to force a reply from the user.
@@ -156,6 +160,7 @@ def progress(current, total):
156160
silent=disable_notification or None,
157161
reply_to_msg_id=reply_to_message_id,
158162
random_id=self.rnd_id(),
163+
schedule_date=schedule_date,
159164
reply_markup=reply_markup.write() if reply_markup else None,
160165
**self.parser.parse(caption, parse_mode)
161166
)
@@ -164,11 +169,15 @@ def progress(current, total):
164169
self.save_file(document, file_id=file.id, file_part=e.x)
165170
else:
166171
for i in r.updates:
167-
if isinstance(i, (types.UpdateNewMessage, types.UpdateNewChannelMessage)):
172+
if isinstance(
173+
i,
174+
(types.UpdateNewMessage, types.UpdateNewChannelMessage, types.UpdateNewScheduledMessage)
175+
):
168176
return pyrogram.Message._parse(
169177
self, i.message,
170178
{i.id: i for i in r.users},
171-
{i.id: i for i in r.chats}
179+
{i.id: i for i in r.chats},
180+
is_scheduled=isinstance(i, types.UpdateNewScheduledMessage)
172181
)
173182
except BaseClient.StopTransmission:
174183
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 @@ 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 @@ 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 @@ 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 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 @@ 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 @@ 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 @@ 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 @@ 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 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)