diff --git a/td/telegram/MessagesManager.h b/td/telegram/MessagesManager.h index 25f9d6d29..0cbedbf04 100644 --- a/td/telegram/MessagesManager.h +++ b/td/telegram/MessagesManager.h @@ -165,6 +165,8 @@ class MessagesManager final : public Actor { MessagesManager &operator=(MessagesManager &&) = delete; ~MessagesManager() final; + static bool is_invalid_poll_message(const telegram_api::Message *message); + tl_object_ptr get_input_peer(DialogId dialog_id, AccessRights access_rights) const; static tl_object_ptr get_input_peer_force(DialogId dialog_id); @@ -3012,8 +3014,6 @@ class MessagesManager final : public Actor { void update_list_last_dialog_date(DialogList &list); - static bool is_invalid_poll_message(const telegram_api::Message *message); - static string get_channel_pts_key(DialogId dialog_id); int32 load_channel_pts(DialogId dialog_id) const; diff --git a/td/telegram/UpdatesManager.cpp b/td/telegram/UpdatesManager.cpp index a4d68f030..66fe5d22e 100644 --- a/td/telegram/UpdatesManager.cpp +++ b/td/telegram/UpdatesManager.cpp @@ -1888,6 +1888,17 @@ void UpdatesManager::on_get_difference(tl_object_ptrcontacts_manager_->on_get_users(std::move(difference->users_), "updates.difference"); td_->contacts_manager_->on_get_chats(std::move(difference->chats_), "updates.difference"); + if (get_difference_retry_count_ <= 5) { + for (const auto &message : difference->new_messages_) { + if (MessagesManager::is_invalid_poll_message(message.get())) { + get_difference_retry_count_++; + LOG(ERROR) << "Receive invalid poll message in updates.difference after " << get_difference_retry_count_ + << " tries"; + return run_get_difference(true, "reget difference"); + } + } + } + process_get_difference_updates(std::move(difference->new_messages_), std::move(difference->new_encrypted_messages_), std::move(difference->other_updates_)); @@ -1913,6 +1924,17 @@ void UpdatesManager::on_get_difference(tl_object_ptrcontacts_manager_->on_get_users(std::move(difference->users_), "updates.differenceSlice"); td_->contacts_manager_->on_get_chats(std::move(difference->chats_), "updates.differenceSlice"); + if (get_difference_retry_count_ <= 5) { + for (const auto &message : difference->new_messages_) { + if (MessagesManager::is_invalid_poll_message(message.get())) { + get_difference_retry_count_++; + LOG(ERROR) << "Receive invalid poll message in updates.differenceSlice after " + << get_difference_retry_count_ << " tries"; + return run_get_difference(true, "reget difference"); + } + } + } + process_get_difference_updates(std::move(difference->new_messages_), std::move(difference->new_encrypted_messages_), std::move(difference->other_updates_)); @@ -1961,6 +1983,8 @@ void UpdatesManager::on_get_difference(tl_object_ptr pending_audio_transcriptions_; MultiTimeout pending_audio_transcription_timeout_{"PendingAudioTranscriptionTimeout"};