From c3d898f1e65b82ce81d2a9ef0a5889e242aa14d1 Mon Sep 17 00:00:00 2001 From: levlam Date: Wed, 6 Oct 2021 01:17:10 +0300 Subject: [PATCH] Add ConfigManager::reget_app_config. --- td/telegram/ConfigManager.cpp | 56 ++++++++++++++++++++++----------- td/telegram/ConfigManager.h | 5 +++ td/telegram/LinkManager.cpp | 16 +++++----- td/telegram/StickersManager.cpp | 3 +- 4 files changed, 52 insertions(+), 28 deletions(-) diff --git a/td/telegram/ConfigManager.cpp b/td/telegram/ConfigManager.cpp index 738dbc38a..1b309c81e 100644 --- a/td/telegram/ConfigManager.cpp +++ b/td/telegram/ConfigManager.cpp @@ -960,6 +960,16 @@ void ConfigManager::lazy_request_config() { set_timeout_at(expire_time_.at()); } +void ConfigManager::try_request_app_config() { + if (get_app_config_queries_.size() + reget_app_config_queries_.size() != 1) { + return; + } + + auto query = G()->net_query_creator().create_unauth(telegram_api::help_getAppConfig()); + query->total_timeout_limit_ = 60 * 60 * 24; + G()->net_query_dispatcher().dispatch_with_callback(std::move(query), actor_shared(this, 1)); +} + void ConfigManager::get_app_config(Promise> &&promise) { TRY_STATUS_PROMISE(promise, G()->close_status()); @@ -969,11 +979,21 @@ void ConfigManager::get_app_config(Promise } get_app_config_queries_.push_back(std::move(promise)); - if (get_app_config_queries_.size() == 1) { - auto query = G()->net_query_creator().create_unauth(telegram_api::help_getAppConfig()); - query->total_timeout_limit_ = 60 * 60 * 24; - G()->net_query_dispatcher().dispatch_with_callback(std::move(query), actor_shared(this, 1)); + try_request_app_config(); +} + +void ConfigManager::reget_app_config(Promise &&promise) { + if (G()->close_flag()) { + return promise.set_error(Status::Error(500, "Request aborted")); } + + auto auth_manager = G()->td().get_actor_unsafe()->auth_manager_.get(); + if (auth_manager != nullptr && auth_manager->is_bot()) { + return promise.set_value(Unit()); + } + + reget_app_config_queries_.push_back(std::move(promise)); + try_request_app_config(); } void ConfigManager::get_content_settings(Promise &&promise) { @@ -1066,7 +1086,7 @@ void ConfigManager::do_set_ignore_sensitive_content_restrictions(bool ignore_sen ignore_sensitive_content_restrictions); bool have_ignored_restriction_reasons = G()->shared_config().have_option("ignored_restriction_reasons"); if (have_ignored_restriction_reasons != ignore_sensitive_content_restrictions) { - get_app_config(Auto()); + reget_app_config(Auto()); } } @@ -1122,7 +1142,7 @@ void ConfigManager::on_result(NetQueryPtr res) { return; } remove_suggested_action(suggested_actions_, suggested_action); - get_app_config(Auto()); + reget_app_config(Auto()); for (auto &promise : promises) { promise.set_value(Unit()); @@ -1246,15 +1266,16 @@ void ConfigManager::on_result(NetQueryPtr res) { if (token == 1) { auto promises = std::move(get_app_config_queries_); get_app_config_queries_.clear(); - CHECK(!promises.empty()); + auto unit_promises = std::move(reget_app_config_queries_); + reget_app_config_queries_.clear(); + CHECK(!promises.empty() || !unit_promises.empty()); auto result_ptr = fetch_result(std::move(res)); if (result_ptr.is_error()) { for (auto &promise : promises) { - if (!promise) { - promise.set_value(nullptr); - } else { - promise.set_error(result_ptr.error().clone()); - } + promise.set_error(result_ptr.error().clone()); + } + for (auto &promise : unit_promises) { + promise.set_error(result_ptr.error().clone()); } return; } @@ -1262,11 +1283,10 @@ void ConfigManager::on_result(NetQueryPtr res) { auto result = result_ptr.move_as_ok(); process_app_config(result); for (auto &promise : promises) { - if (!promise) { - promise.set_value(nullptr); - } else { - promise.set_value(convert_json_value_object(result)); - } + promise.set_value(convert_json_value_object(result)); + } + for (auto &promise : unit_promises) { + promise.set_value(Unit()); } return; } @@ -1452,7 +1472,7 @@ void ConfigManager::process_config(tl_object_ptr config) { // shared_config.set_option_integer("push_chat_limit", config->push_chat_limit_); if (is_from_main_dc) { - get_app_config(Auto()); + reget_app_config(Auto()); if (!shared_config.have_option("can_ignore_sensitive_content_restrictions") || !shared_config.have_option("ignore_sensitive_content_restrictions")) { get_content_settings(Auto()); diff --git a/td/telegram/ConfigManager.h b/td/telegram/ConfigManager.h index 532719630..6e868d415 100644 --- a/td/telegram/ConfigManager.h +++ b/td/telegram/ConfigManager.h @@ -88,6 +88,8 @@ class ConfigManager final : public NetQueryCallback { void get_app_config(Promise> &&promise); + void reget_app_config(Promise &&promise); + void get_content_settings(Promise &&promise); void set_content_settings(bool ignore_sensitive_content_restrictions, Promise &&promise); @@ -114,6 +116,7 @@ class ConfigManager final : public NetQueryCallback { FloodControlStrict lazy_request_flood_control_; vector>> get_app_config_queries_; + vector> reget_app_config_queries_; vector> get_content_settings_queries_; vector> set_content_settings_queries_[2]; @@ -142,6 +145,8 @@ class ConfigManager final : public NetQueryCallback { void request_config_from_dc_impl(DcId dc_id); void process_config(tl_object_ptr config); + void try_request_app_config(); + void process_app_config(tl_object_ptr &config); void do_set_ignore_sensitive_content_restrictions(bool ignore_sensitive_content_restrictions); diff --git a/td/telegram/LinkManager.cpp b/td/telegram/LinkManager.cpp index 8aea83355..b314f6ce6 100644 --- a/td/telegram/LinkManager.cpp +++ b/td/telegram/LinkManager.cpp @@ -1156,14 +1156,14 @@ void LinkManager::get_external_link_info(string &&link, Promise> &&result) mutable { - if (result.is_error()) { - return promise.set_value(td_api::make_object(link, false)); - } - send_closure(G()->link_manager(), &LinkManager::get_external_link_info, std::move(link), std::move(promise)); - }); - return send_closure(G()->config_manager(), &ConfigManager::get_app_config, std::move(query_promise)); + auto query_promise = + PromiseCreator::lambda([link = std::move(link), promise = std::move(promise)](Result &&result) mutable { + if (result.is_error()) { + return promise.set_value(td_api::make_object(link, false)); + } + send_closure(G()->link_manager(), &LinkManager::get_external_link_info, std::move(link), std::move(promise)); + }); + return send_closure(G()->config_manager(), &ConfigManager::reget_app_config, std::move(query_promise)); } if (autologin_token_.empty()) { diff --git a/td/telegram/StickersManager.cpp b/td/telegram/StickersManager.cpp index fbafafdc3..8c8ca210e 100644 --- a/td/telegram/StickersManager.cpp +++ b/td/telegram/StickersManager.cpp @@ -4180,8 +4180,7 @@ void StickersManager::register_dice(const string &emoji, int32 value, FullMessag if (!td::contains(dice_emojis_, emoji)) { if (full_message_id.get_message_id().is_any_server() && full_message_id.get_dialog_id().get_type() != DialogType::SecretChat) { - send_closure(G()->config_manager(), &ConfigManager::get_app_config, - Promise>()); + send_closure(G()->config_manager(), &ConfigManager::reget_app_config, Promise()); } return; }