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