1 //
2 // Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2021
3 //
4 // Distributed under the Boost Software License, Version 1.0. (See accompanying
5 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 //
7 #pragma once
8 
9 #include "td/telegram/ChannelId.h"
10 #include "td/telegram/ChatId.h"
11 #include "td/telegram/DialogId.h"
12 #include "td/telegram/InputGroupCallId.h"
13 #include "td/telegram/MessageId.h"
14 #include "td/telegram/PtsManager.h"
15 #include "td/telegram/telegram_api.h"
16 #include "td/telegram/UserId.h"
17 
18 #include "td/actor/actor.h"
19 #include "td/actor/PromiseFuture.h"
20 #include "td/actor/Timeout.h"
21 
22 #include "td/utils/common.h"
23 #include "td/utils/logging.h"
24 #include "td/utils/Status.h"
25 #include "td/utils/tl_storers.h"
26 #include "td/utils/TlStorerToString.h"
27 
28 #include <map>
29 #include <unordered_set>
30 
31 namespace td {
32 
33 extern int VERBOSITY_NAME(get_difference);
34 
35 class Td;
36 
37 class dummyUpdate final : public telegram_api::Update {
38  public:
39   static constexpr int32 ID = 1234567891;
get_id()40   int32 get_id() const final {
41     return ID;
42   }
43 
store(TlStorerUnsafe & s)44   void store(TlStorerUnsafe &s) const final {
45     UNREACHABLE();
46   }
47 
store(TlStorerCalcLength & s)48   void store(TlStorerCalcLength &s) const final {
49     UNREACHABLE();
50   }
51 
store(TlStorerToString & s,const char * field_name)52   void store(TlStorerToString &s, const char *field_name) const final {
53     s.store_class_begin(field_name, "dummyUpdate");
54     s.store_class_end();
55   }
56 };
57 
58 class updateSentMessage final : public telegram_api::Update {
59  public:
60   int64 random_id_;
61   MessageId message_id_;
62   int32 date_;
63   int32 ttl_period_;
64 
updateSentMessage(int64 random_id,MessageId message_id,int32 date,int32 ttl_period)65   updateSentMessage(int64 random_id, MessageId message_id, int32 date, int32 ttl_period)
66       : random_id_(random_id), message_id_(message_id), date_(date), ttl_period_(ttl_period) {
67   }
68 
69   static constexpr int32 ID = 1234567890;
get_id()70   int32 get_id() const final {
71     return ID;
72   }
73 
store(TlStorerUnsafe & s)74   void store(TlStorerUnsafe &s) const final {
75     UNREACHABLE();
76   }
77 
store(TlStorerCalcLength & s)78   void store(TlStorerCalcLength &s) const final {
79     UNREACHABLE();
80   }
81 
store(TlStorerToString & s,const char * field_name)82   void store(TlStorerToString &s, const char *field_name) const final {
83     s.store_class_begin(field_name, "updateSentMessage");
84     s.store_field("random_id", random_id_);
85     s.store_field("message_id", message_id_.get());
86     s.store_field("date", date_);
87     s.store_field("ttl_period", ttl_period_);
88     s.store_class_end();
89   }
90 };
91 
92 class UpdatesManager final : public Actor {
93  public:
94   UpdatesManager(Td *td, ActorShared<> parent);
95 
96   void on_get_updates(tl_object_ptr<telegram_api::Updates> &&updates_ptr, Promise<Unit> &&promise);
97 
98   void add_pending_pts_update(tl_object_ptr<telegram_api::Update> &&update, int32 new_pts, int32 pts_count,
99                               double receive_time, Promise<Unit> &&promise, const char *source);
100 
101   static std::unordered_set<int64> get_sent_messages_random_ids(const telegram_api::Updates *updates_ptr);
102 
103   static vector<const tl_object_ptr<telegram_api::Message> *> get_new_messages(
104       const telegram_api::Updates *updates_ptr);
105 
106   static vector<InputGroupCallId> get_update_new_group_call_ids(const telegram_api::Updates *updates_ptr);
107 
108   static string extract_join_group_call_presentation_params(telegram_api::Updates *updates_ptr);
109 
110   static vector<DialogId> get_update_notify_settings_dialog_ids(const telegram_api::Updates *updates_ptr);
111 
112   static vector<DialogId> get_chat_dialog_ids(const telegram_api::Updates *updates_ptr);
113 
114   static int32 get_update_edit_message_pts(const telegram_api::Updates *updates_ptr);
115 
116   void get_difference(const char *source);
117 
118   void schedule_get_difference(const char *source);
119 
120   void ping_server();
121 
running_get_difference()122   bool running_get_difference() const {
123     return running_get_difference_;
124   }
125 
126   void timeout_expired() final;
127 
128  private:
129   static constexpr int32 FORCED_GET_DIFFERENCE_PTS_DIFF = 100000;
130   static constexpr int32 GAP_TIMEOUT_UPDATE_COUNT = 20;
131   static const double MAX_UNFILLED_GAP_TIME;
132   static const double MAX_PTS_SAVE_DELAY;
133   static constexpr bool DROP_PTS_UPDATES = false;
134 
135   friend class OnUpdate;
136 
137   class PendingPtsUpdate {
138    public:
139     tl_object_ptr<telegram_api::Update> update;
140     int32 pts;
141     int32 pts_count;
142     double receive_time;
143     Promise<Unit> promise;
144 
PendingPtsUpdate(tl_object_ptr<telegram_api::Update> && update,int32 pts,int32 pts_count,double receive_time,Promise<Unit> && promise)145     PendingPtsUpdate(tl_object_ptr<telegram_api::Update> &&update, int32 pts, int32 pts_count, double receive_time,
146                      Promise<Unit> &&promise)
147         : update(std::move(update))
148         , pts(pts)
149         , pts_count(pts_count)
150         , receive_time(receive_time)
151         , promise(std::move(promise)) {
152     }
153   };
154 
155   class PendingSeqUpdates {
156    public:
157     int32 seq_begin;
158     int32 seq_end;
159     int32 date;
160     double receive_time;
161     vector<tl_object_ptr<telegram_api::Update>> updates;
162     Promise<Unit> promise;
163 
PendingSeqUpdates(int32 seq_begin,int32 seq_end,int32 date,double receive_time,vector<tl_object_ptr<telegram_api::Update>> && updates,Promise<Unit> && promise)164     PendingSeqUpdates(int32 seq_begin, int32 seq_end, int32 date, double receive_time,
165                       vector<tl_object_ptr<telegram_api::Update>> &&updates, Promise<Unit> &&promise)
166         : seq_begin(seq_begin)
167         , seq_end(seq_end)
168         , date(date)
169         , receive_time(receive_time)
170         , updates(std::move(updates))
171         , promise(std::move(promise)) {
172     }
173   };
174 
175   class PendingQtsUpdate {
176    public:
177     double receive_time = 0.0;
178     tl_object_ptr<telegram_api::Update> update;
179     vector<Promise<Unit>> promises;
180   };
181 
182   Td *td_;
183   ActorShared<> parent_;
184   int32 ref_cnt_ = 1;
185 
186   PtsManager pts_manager_;
187   PtsManager qts_manager_;
188   int32 date_ = 0;
189   int32 seq_ = 0;
190   string date_source_ = "nowhere";
191 
192   double last_pts_save_time_ = 0;
193   double last_qts_save_time_ = 0;
194   int32 pending_pts_ = 0;
195   int32 pending_qts_ = 0;
196 
197   int32 short_update_date_ = 0;
198 
199   int32 accumulated_pts_count_ = 0;
200   int32 accumulated_pts_ = -1;
201   double last_pts_jump_warning_time_ = 0;
202   double last_pts_gap_time_ = 0;
203 
204   std::multimap<int32, PendingPtsUpdate> pending_pts_updates_;
205   std::multimap<int32, PendingPtsUpdate> postponed_pts_updates_;
206 
207   std::multimap<int32, PendingSeqUpdates> postponed_updates_;    // updates received during getDifference
208   std::multimap<int32, PendingSeqUpdates> pending_seq_updates_;  // updates with too big seq
209 
210   std::map<int32, PendingQtsUpdate> pending_qts_updates_;  // updates with too big qts
211 
212   Timeout pts_gap_timeout_;
213 
214   Timeout seq_gap_timeout_;
215 
216   Timeout qts_gap_timeout_;
217 
218   int32 retry_time_ = 1;
219   Timeout retry_timeout_;
220 
221   bool running_get_difference_ = false;
222   int32 last_get_difference_pts_ = 0;
223   int32 last_get_difference_qts_ = 0;
224   int32 min_postponed_update_pts_ = 0;
225   int32 min_postponed_update_qts_ = 0;
226 
227   void tear_down() final;
228 
229   void hangup_shared() final;
230 
231   void hangup() final;
232 
233   ActorShared<UpdatesManager> create_reference();
234 
get_pts()235   int32 get_pts() const {
236     return pts_manager_.mem_pts();
237   }
get_qts()238   int32 get_qts() const {
239     return qts_manager_.mem_pts();
240   }
get_date()241   int32 get_date() const {
242     return date_;
243   }
244 
245   Promise<> set_pts(int32 pts, const char *source) TD_WARN_UNUSED_RESULT;
246   Promise<> add_pts(int32 pts);
247   void on_pts_ack(PtsManager::PtsId ack_token);
248   void save_pts(int32 pts);
249 
250   Promise<> add_qts(int32 qts);
251   void on_qts_ack(PtsManager::PtsId ack_token);
252   void save_qts(int32 qts);
253 
254   void set_date(int32 date, bool from_update, string date_source);
255 
256   int32 get_short_update_date() const;
257 
258   void init_state();
259 
260   void on_get_updates_state(tl_object_ptr<telegram_api::updates_state> &&state, const char *source);
261 
262   void on_server_pong(tl_object_ptr<telegram_api::updates_state> &&state);
263 
264   void on_get_difference(tl_object_ptr<telegram_api::updates_Difference> &&difference_ptr);
265 
266   void process_get_difference_updates(vector<tl_object_ptr<telegram_api::Message>> &&new_messages,
267                                       vector<tl_object_ptr<telegram_api::EncryptedMessage>> &&new_encrypted_messages,
268                                       vector<tl_object_ptr<telegram_api::Update>> &&other_updates);
269 
270   void on_pending_update(tl_object_ptr<telegram_api::Update> update, int32 seq, Promise<Unit> &&promise,
271                          const char *source);
272 
273   void add_pending_qts_update(tl_object_ptr<telegram_api::Update> &&update, int32 qts, Promise<Unit> &&promise);
274 
275   void on_pending_updates(vector<tl_object_ptr<telegram_api::Update>> &&updates, int32 seq_begin, int32 seq_end,
276                           int32 date, double receive_time, Promise<Unit> &&promise, const char *source);
277 
278   void on_pending_updates_processed(Result<Unit> result, Promise<Unit> promise);
279 
280   void process_updates(vector<tl_object_ptr<telegram_api::Update>> &&updates, bool force_apply,
281                        Promise<Unit> &&promise);
282 
283   void postpone_pts_update(tl_object_ptr<telegram_api::Update> &&update, int32 pts, int32 pts_count,
284                            double receive_time, Promise<Unit> &&promise);
285 
286   void process_pts_update(tl_object_ptr<telegram_api::Update> &&update);
287 
288   void process_seq_updates(int32 seq_end, int32 date, vector<tl_object_ptr<telegram_api::Update>> &&updates,
289                            Promise<Unit> &&promise);
290 
291   void process_qts_update(tl_object_ptr<telegram_api::Update> &&update_ptr, int32 qts, Promise<Unit> &&promise);
292 
293   void process_all_pending_pts_updates();
294 
295   void drop_all_pending_pts_updates();
296 
297   void process_postponed_pts_updates();
298 
299   void process_pending_pts_updates();
300 
301   void process_pending_seq_updates();
302 
303   void process_pending_qts_updates();
304 
305   static void fill_pts_gap(void *td);
306 
307   static void fill_seq_gap(void *td);
308 
309   static void fill_qts_gap(void *td);
310 
311   static void fill_get_difference_gap(void *td);
312 
313   static void fill_gap(void *td, const char *source);
314 
315   void set_pts_gap_timeout(double timeout);
316 
317   void set_seq_gap_timeout(double timeout);
318 
319   void set_qts_gap_timeout(double timeout);
320 
321   void run_get_difference(bool is_recursive, const char *source);
322 
323   void on_failed_get_updates_state(Status &&error);
324 
325   void on_failed_get_difference(Status &&error);
326 
327   void before_get_difference(bool is_initial);
328 
329   void after_get_difference();
330 
331   static bool have_update_pts_changed(const vector<tl_object_ptr<telegram_api::Update>> &updates);
332 
333   static bool check_pts_update_dialog_id(DialogId dialog_id);
334 
335   static bool check_pts_update(const tl_object_ptr<telegram_api::Update> &update);
336 
337   static bool is_pts_update(const telegram_api::Update *update);
338 
339   static int32 get_update_pts(const telegram_api::Update *update);
340 
341   static bool is_qts_update(const telegram_api::Update *update);
342 
343   static int32 get_update_qts(const telegram_api::Update *update);
344 
345   static const vector<tl_object_ptr<telegram_api::Update>> *get_updates(const telegram_api::Updates *updates_ptr);
346 
347   static vector<tl_object_ptr<telegram_api::Update>> *get_updates(telegram_api::Updates *updates_ptr);
348 
349   bool is_acceptable_user(UserId user_id) const;
350 
351   bool is_acceptable_chat(ChatId chat_id) const;
352 
353   bool is_acceptable_channel(ChannelId channel_id) const;
354 
355   bool is_acceptable_peer(const tl_object_ptr<telegram_api::Peer> &peer) const;
356 
357   bool is_acceptable_message_entities(const vector<tl_object_ptr<telegram_api::MessageEntity>> &message_entities) const;
358 
359   bool is_acceptable_reply_markup(const tl_object_ptr<telegram_api::ReplyMarkup> &reply_markup) const;
360 
361   bool is_acceptable_message_reply_header(
362       const telegram_api::object_ptr<telegram_api::messageReplyHeader> &header) const;
363 
364   bool is_acceptable_message_forward_header(
365       const telegram_api::object_ptr<telegram_api::messageFwdHeader> &header) const;
366 
367   bool is_acceptable_message(const telegram_api::Message *message_ptr) const;
368 
369   bool is_acceptable_update(const telegram_api::Update *update) const;
370 
371   void on_update(tl_object_ptr<telegram_api::updateNewMessage> update, Promise<Unit> &&promise);
372   void on_update(tl_object_ptr<telegram_api::updateMessageID> update, Promise<Unit> &&promise);
373   void on_update(tl_object_ptr<telegram_api::updateReadMessagesContents> update, Promise<Unit> &&promise);
374   void on_update(tl_object_ptr<telegram_api::updateEditMessage> update, Promise<Unit> &&promise);
375   void on_update(tl_object_ptr<telegram_api::updateDeleteMessages> update, Promise<Unit> &&promise);
376   void on_update(tl_object_ptr<telegram_api::updateReadHistoryInbox> update, Promise<Unit> &&promise);
377   void on_update(tl_object_ptr<telegram_api::updateReadHistoryOutbox> update, Promise<Unit> &&promise);
378   void on_update(tl_object_ptr<telegram_api::updateNotifySettings> update, Promise<Unit> &&promise);
379   void on_update(tl_object_ptr<telegram_api::updatePeerSettings> update, Promise<Unit> &&promise);
380   void on_update(tl_object_ptr<telegram_api::updatePeerHistoryTTL> update, Promise<Unit> &&promise);
381 
382   void on_update(tl_object_ptr<telegram_api::updatePeerLocated> update, Promise<Unit> &&promise);
383 
384   void on_update(tl_object_ptr<telegram_api::updateWebPage> update, Promise<Unit> &&promise);
385   void on_update(tl_object_ptr<telegram_api::updateChannelWebPage> update, Promise<Unit> &&promise);
386 
387   void on_update(tl_object_ptr<telegram_api::updateFolderPeers> update, Promise<Unit> &&promise);
388 
389   void on_update(tl_object_ptr<telegram_api::updateUserTyping> update, Promise<Unit> &&promise);
390   void on_update(tl_object_ptr<telegram_api::updateChatUserTyping> update, Promise<Unit> &&promise);
391   void on_update(tl_object_ptr<telegram_api::updateChannelUserTyping> update, Promise<Unit> &&promise);
392   void on_update(tl_object_ptr<telegram_api::updateEncryptedChatTyping> update, Promise<Unit> &&promise);
393 
394   void on_update(tl_object_ptr<telegram_api::updateUserStatus> update, Promise<Unit> &&promise);
395   void on_update(tl_object_ptr<telegram_api::updateUserName> update, Promise<Unit> &&promise);
396   void on_update(tl_object_ptr<telegram_api::updateUserPhone> update, Promise<Unit> &&promise);
397   void on_update(tl_object_ptr<telegram_api::updateUserPhoto> update, Promise<Unit> &&promise);
398 
399   void on_update(tl_object_ptr<telegram_api::updatePeerBlocked> update, Promise<Unit> &&promise);
400   void on_update(tl_object_ptr<telegram_api::updateBotCommands> update, Promise<Unit> &&promise);
401 
402   void on_update(tl_object_ptr<telegram_api::updateChatParticipants> update, Promise<Unit> &&promise);
403   void on_update(tl_object_ptr<telegram_api::updateChatParticipantAdd> update, Promise<Unit> &&promise);
404   void on_update(tl_object_ptr<telegram_api::updateChatParticipantAdmin> update, Promise<Unit> &&promise);
405   void on_update(tl_object_ptr<telegram_api::updateChatParticipantDelete> update, Promise<Unit> &&promise);
406 
407   void on_update(tl_object_ptr<telegram_api::updateChatDefaultBannedRights> update, Promise<Unit> &&promise);
408 
409   void on_update(tl_object_ptr<telegram_api::updateServiceNotification> update, Promise<Unit> &&promise);
410 
411   void on_update(tl_object_ptr<telegram_api::updateDcOptions> update, Promise<Unit> &&promise);
412 
413   void on_update(tl_object_ptr<telegram_api::updateChat> update, Promise<Unit> &&promise);
414 
415   void on_update(tl_object_ptr<telegram_api::updateNewChannelMessage> update, Promise<Unit> &&promise);
416   void on_update(tl_object_ptr<telegram_api::updateReadChannelInbox> update, Promise<Unit> &&promise);
417   void on_update(tl_object_ptr<telegram_api::updateReadChannelOutbox> update, Promise<Unit> &&promise);
418   void on_update(tl_object_ptr<telegram_api::updateChannelReadMessagesContents> update, Promise<Unit> &&promise);
419   void on_update(tl_object_ptr<telegram_api::updateChannelTooLong> update, Promise<Unit> &&promise);
420   void on_update(tl_object_ptr<telegram_api::updateChannel> update, Promise<Unit> &&promise);
421   void on_update(tl_object_ptr<telegram_api::updateEditChannelMessage> update, Promise<Unit> &&promise);
422   void on_update(tl_object_ptr<telegram_api::updateDeleteChannelMessages> update, Promise<Unit> &&promise);
423   void on_update(tl_object_ptr<telegram_api::updateChannelMessageViews> update, Promise<Unit> &&promise);
424   void on_update(tl_object_ptr<telegram_api::updateChannelMessageForwards> update, Promise<Unit> &&promise);
425   void on_update(tl_object_ptr<telegram_api::updateChannelAvailableMessages> update, Promise<Unit> &&promise);
426 
427   void on_update(tl_object_ptr<telegram_api::updateReadChannelDiscussionInbox> update, Promise<Unit> &&promise);
428   void on_update(tl_object_ptr<telegram_api::updateReadChannelDiscussionOutbox> update, Promise<Unit> &&promise);
429 
430   void on_update(tl_object_ptr<telegram_api::updatePinnedMessages> update, Promise<Unit> &&promise);
431   void on_update(tl_object_ptr<telegram_api::updatePinnedChannelMessages> update, Promise<Unit> &&promise);
432 
433   void on_update(tl_object_ptr<telegram_api::updateDraftMessage> update, Promise<Unit> &&promise);
434 
435   void on_update(tl_object_ptr<telegram_api::updateDialogPinned> update, Promise<Unit> &&promise);
436   void on_update(tl_object_ptr<telegram_api::updatePinnedDialogs> update, Promise<Unit> &&promise);
437   void on_update(tl_object_ptr<telegram_api::updateDialogUnreadMark> update, Promise<Unit> &&promise);
438 
439   void on_update(tl_object_ptr<telegram_api::updateDialogFilter> update, Promise<Unit> &&promise);
440   void on_update(tl_object_ptr<telegram_api::updateDialogFilters> update, Promise<Unit> &&promise);
441   void on_update(tl_object_ptr<telegram_api::updateDialogFilterOrder> update, Promise<Unit> &&promise);
442 
443   void on_update(tl_object_ptr<telegram_api::updateBotInlineQuery> update, Promise<Unit> &&promise);
444   void on_update(tl_object_ptr<telegram_api::updateBotInlineSend> update, Promise<Unit> &&promise);
445 
446   void on_update(tl_object_ptr<telegram_api::updateBotCallbackQuery> update, Promise<Unit> &&promise);
447   void on_update(tl_object_ptr<telegram_api::updateInlineBotCallbackQuery> update, Promise<Unit> &&promise);
448 
449   void on_update(tl_object_ptr<telegram_api::updateFavedStickers> update, Promise<Unit> &&promise);
450 
451   void on_update(tl_object_ptr<telegram_api::updateSavedGifs> update, Promise<Unit> &&promise);
452 
453   void on_update(tl_object_ptr<telegram_api::updateConfig> update, Promise<Unit> &&promise);
454 
455   void on_update(tl_object_ptr<telegram_api::updatePtsChanged> update, Promise<Unit> &&promise);
456 
457   void on_update(tl_object_ptr<telegram_api::updatePrivacy> update, Promise<Unit> &&promise);
458 
459   void on_update(tl_object_ptr<telegram_api::updateEncryption> update, Promise<Unit> &&promise);
460   void on_update(tl_object_ptr<telegram_api::updateNewEncryptedMessage> update, Promise<Unit> &&promise);
461   void on_update(tl_object_ptr<telegram_api::updateEncryptedMessagesRead> update, Promise<Unit> &&promise);
462 
463   void on_update(tl_object_ptr<telegram_api::updateNewStickerSet> update, Promise<Unit> &&promise);
464   void on_update(tl_object_ptr<telegram_api::updateStickerSets> update, Promise<Unit> &&promise);
465   void on_update(tl_object_ptr<telegram_api::updateStickerSetsOrder> update, Promise<Unit> &&promise);
466   void on_update(tl_object_ptr<telegram_api::updateReadFeaturedStickers> update, Promise<Unit> &&promise);
467   void on_update(tl_object_ptr<telegram_api::updateRecentStickers> update, Promise<Unit> &&promise);
468 
469   void on_update(tl_object_ptr<telegram_api::updateBotShippingQuery> update, Promise<Unit> &&promise);
470   void on_update(tl_object_ptr<telegram_api::updateBotPrecheckoutQuery> update, Promise<Unit> &&promise);
471 
472   void on_update(tl_object_ptr<telegram_api::updateBotWebhookJSON> update, Promise<Unit> &&promise);
473   void on_update(tl_object_ptr<telegram_api::updateBotWebhookJSONQuery> update, Promise<Unit> &&promise);
474 
475   void on_update(tl_object_ptr<telegram_api::updatePhoneCall> update, Promise<Unit> &&promise);
476   void on_update(tl_object_ptr<telegram_api::updatePhoneCallSignalingData> update, Promise<Unit> &&promise);
477 
478   void on_update(tl_object_ptr<telegram_api::updateGroupCallConnection> update, Promise<Unit> &&promise);
479   void on_update(tl_object_ptr<telegram_api::updateGroupCall> update, Promise<Unit> &&promise);
480   void on_update(tl_object_ptr<telegram_api::updateGroupCallParticipants> update, Promise<Unit> &&promise);
481 
482   void on_update(tl_object_ptr<telegram_api::updateContactsReset> update, Promise<Unit> &&promise);
483 
484   void on_update(tl_object_ptr<telegram_api::updateLangPackTooLong> update, Promise<Unit> &&promise);
485   void on_update(tl_object_ptr<telegram_api::updateLangPack> update, Promise<Unit> &&promise);
486 
487   void on_update(tl_object_ptr<telegram_api::updateGeoLiveViewed> update, Promise<Unit> &&promise);
488 
489   void on_update(tl_object_ptr<telegram_api::updateMessagePoll> update, Promise<Unit> &&promise);
490   void on_update(tl_object_ptr<telegram_api::updateMessagePollVote> update, Promise<Unit> &&promise);
491 
492   void on_update(tl_object_ptr<telegram_api::updateNewScheduledMessage> update, Promise<Unit> &&promise);
493   void on_update(tl_object_ptr<telegram_api::updateDeleteScheduledMessages> update, Promise<Unit> &&promise);
494 
495   void on_update(tl_object_ptr<telegram_api::updateLoginToken> update, Promise<Unit> &&promise);
496 
497   void on_update(tl_object_ptr<telegram_api::updateBotStopped> update, Promise<Unit> &&promise);
498   void on_update(tl_object_ptr<telegram_api::updateChatParticipant> update, Promise<Unit> &&promise);
499   void on_update(tl_object_ptr<telegram_api::updateChannelParticipant> update, Promise<Unit> &&promise);
500   void on_update(tl_object_ptr<telegram_api::updateBotChatInviteRequester> update, Promise<Unit> &&promise);
501 
502   void on_update(tl_object_ptr<telegram_api::updateTheme> update, Promise<Unit> &&promise);
503 
504   void on_update(tl_object_ptr<telegram_api::updatePendingJoinRequests> update, Promise<Unit> &&promise);
505 
506   // unsupported updates
507 };
508 
509 }  // namespace td
510