From 92837b3bee7f38fa4a840916270319c82e02173c Mon Sep 17 00:00:00 2001 From: levlam Date: Thu, 9 Mar 2023 15:54:31 +0300 Subject: [PATCH] Reget message to delete it after receiving "MESSAGE_ID_INVALID" from getPollResults. --- td/telegram/PollManager.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/td/telegram/PollManager.cpp b/td/telegram/PollManager.cpp index bfd6acdab..acb7ee0e2 100644 --- a/td/telegram/PollManager.cpp +++ b/td/telegram/PollManager.cpp @@ -50,6 +50,7 @@ class GetPollResultsQuery final : public Td::ResultHandler { Promise> promise_; PollId poll_id_; DialogId dialog_id_; + MessageId message_id_; public: explicit GetPollResultsQuery(Promise> &&promise) : promise_(std::move(promise)) { @@ -58,13 +59,14 @@ class GetPollResultsQuery final : public Td::ResultHandler { void send(PollId poll_id, FullMessageId full_message_id) { poll_id_ = poll_id; dialog_id_ = full_message_id.get_dialog_id(); + message_id_ = full_message_id.get_message_id(); auto input_peer = td_->messages_manager_->get_input_peer(dialog_id_, AccessRights::Read); if (input_peer == nullptr) { LOG(INFO) << "Can't reget poll, because have no read access to " << dialog_id_; return promise_.set_value(nullptr); } - auto message_id = full_message_id.get_message_id().get_server_message_id().get(); + auto message_id = message_id_.get_server_message_id().get(); send_query( G()->net_query_creator().create(telegram_api::messages_getPollResults(std::move(input_peer), message_id))); } @@ -79,8 +81,13 @@ class GetPollResultsQuery final : public Td::ResultHandler { } void on_error(Status status) final { - if (!td_->messages_manager_->on_get_dialog_error(dialog_id_, status, "GetPollResultsQuery") && - status.message() != "MESSAGE_ID_INVALID") { + if (status.message() == "MESSAGE_ID_INVALID") { + // likely, the message has already been deleted + if (dialog_id_.get_type() == DialogType::Channel) { + td_->messages_manager_->get_message_from_server({dialog_id_, message_id_}, Promise(), + "GetPollResultsQuery"); + } + } else if (!td_->messages_manager_->on_get_dialog_error(dialog_id_, status, "GetPollResultsQuery")) { LOG(ERROR) << "Receive " << status << ", while trying to get results of " << poll_id_; } promise_.set_error(std::move(status));