From 699bef07816ead1f2c220c922735ace9fbcb7276 Mon Sep 17 00:00:00 2001 From: levlam Date: Sat, 9 Mar 2019 21:07:07 +0300 Subject: [PATCH] Return result of GetPollResultsQuery through Promise. GitOrigin-RevId: fafc25acc4944066efb21f9dcc3000631fee0912 --- td/telegram/PollManager.cpp | 33 +++++++++++++++++++++------------ td/telegram/PollManager.h | 4 ++-- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/td/telegram/PollManager.cpp b/td/telegram/PollManager.cpp index c8addb7a..5b9dbcd0 100644 --- a/td/telegram/PollManager.cpp +++ b/td/telegram/PollManager.cpp @@ -44,10 +44,14 @@ namespace td { class GetPollResultsQuery : public Td::ResultHandler { + Promise> promise_; PollId poll_id_; DialogId dialog_id_; public: + explicit GetPollResultsQuery(Promise> &&promise) : promise_(std::move(promise)) { + } + void send(PollId poll_id, FullMessageId full_message_id) { poll_id_ = poll_id; dialog_id_ = full_message_id.get_dialog_id(); @@ -69,17 +73,14 @@ class GetPollResultsQuery : public Td::ResultHandler { return on_error(id, result_ptr.move_as_error()); } - auto result = result_ptr.move_as_ok(); - LOG(INFO) << "Receive poll results: " << to_string(result); - - td->updates_manager_->on_get_updates(std::move(result)); + promise_.set_value(result_ptr.move_as_ok()); } void on_error(uint64 id, Status status) override { if (!td->messages_manager_->on_get_dialog_error(dialog_id_, status, "GetPollResultsQuery")) { LOG(ERROR) << "Receive " << status << ", while trying to get results of " << poll_id_; - td->poll_manager_->on_get_poll_results_failed(poll_id_); } + promise_.set_error(std::move(status)); } }; @@ -630,7 +631,6 @@ void PollManager::do_set_poll_answer(PollId poll_id, FullMessageId full_message_ auto query_promise = PromiseCreator::lambda([poll_id, generation, actor_id = actor_id(this)](Result &&result) { send_closure(actor_id, &PollManager::on_set_poll_answer, poll_id, generation, std::move(result)); }); - send_closure(td_->create_net_actor(std::move(query_promise)), &SetPollAnswerActor::send, full_message_id, std::move(sent_options), generation, &pending_answer.query_ref_); } @@ -753,15 +753,24 @@ void PollManager::on_update_poll_timeout(PollId poll_id) { auto full_message_id = *it->second.begin(); LOG(INFO) << "Fetching results of " << poll_id << " from " << full_message_id; - td_->create_handler()->send(poll_id, full_message_id); + auto query_promise = PromiseCreator::lambda( + [poll_id, actor_id = actor_id(this)](Result> &&result) { + send_closure(actor_id, &PollManager::on_get_poll_results, poll_id, std::move(result)); + }); + td_->create_handler(std::move(query_promise))->send(poll_id, full_message_id); } -void PollManager::on_get_poll_results_failed(PollId poll_id) { - if (!get_poll_is_closed(poll_id) && !td_->auth_manager_->is_bot()) { - auto timeout = get_polling_timeout(); - LOG(INFO) << "Schedule updating of " << poll_id << " in " << timeout; - update_poll_timeout_.add_timeout_in(poll_id.get(), timeout); +void PollManager::on_get_poll_results(PollId poll_id, Result> result) { + if (result.is_error()) { + if (!get_poll_is_closed(poll_id) && !td_->auth_manager_->is_bot()) { + auto timeout = get_polling_timeout(); + LOG(INFO) << "Schedule updating of " << poll_id << " in " << timeout; + update_poll_timeout_.add_timeout_in(poll_id.get(), timeout); + } + return; } + + td_->updates_manager_->on_get_updates(result.move_as_ok()); } void PollManager::on_online() { diff --git a/td/telegram/PollManager.h b/td/telegram/PollManager.h index e3546790..d61e081c 100644 --- a/td/telegram/PollManager.h +++ b/td/telegram/PollManager.h @@ -66,8 +66,6 @@ class PollManager : public Actor { void on_binlog_events(vector &&events); - void on_get_poll_results_failed(PollId poll_id); - static vector get_vote_percentage(const vector &voter_counts, int32 total_voter_count); template @@ -139,6 +137,8 @@ class PollManager : public Actor { Poll *get_poll_force(PollId poll_id); + void on_get_poll_results(PollId poll_id, Result> result); + void do_set_poll_answer(PollId poll_id, FullMessageId full_message_id, vector &&options, uint64 logevent_id, Promise &&promise);