From 5091aa68e3f2df92e4c1e3255ae0751d57fa2b76 Mon Sep 17 00:00:00 2001 From: levlam Date: Fri, 24 Sep 2021 23:17:38 +0300 Subject: [PATCH] Allow direct access to TopDialogManager. --- td/telegram/AuthManager.cpp | 2 +- td/telegram/Td.cpp | 23 +++++++++++++---------- td/telegram/Td.h | 3 ++- td/telegram/TopDialogManager.cpp | 26 ++++++++++++++------------ td/telegram/TopDialogManager.h | 13 ++++++++++--- td/telegram/cli.cpp | 2 +- 6 files changed, 41 insertions(+), 28 deletions(-) diff --git a/td/telegram/AuthManager.cpp b/td/telegram/AuthManager.cpp index 986d68e24..ed1b9634e 100644 --- a/td/telegram/AuthManager.cpp +++ b/td/telegram/AuthManager.cpp @@ -784,7 +784,7 @@ void AuthManager::on_get_authorization(tl_object_ptrnotification_manager_->init(); td->stickers_manager_->init(); td->theme_manager_->init(); - send_closure(td->top_dialog_manager_, &TopDialogManager::do_start_up); + td->top_dialog_manager_->init(); td->updates_manager_->get_difference("on_get_authorization"); td->on_online_updated(false, true); if (!is_bot()) { diff --git a/td/telegram/Td.cpp b/td/telegram/Td.cpp index dfdebd52c..a8292ad2e 100644 --- a/td/telegram/Td.cpp +++ b/td/telegram/Td.cpp @@ -3435,12 +3435,12 @@ void Td::on_config_option_updated(const string &name) { } else if (name == "use_storage_optimizer") { send_closure(storage_manager_, &StorageManager::update_use_storage_optimizer); } else if (name == "rating_e_decay") { - return send_closure(top_dialog_manager_, &TopDialogManager::update_rating_e_decay); + return send_closure(top_dialog_manager_actor_, &TopDialogManager::update_rating_e_decay); } else if (name == "disable_contact_registered_notifications") { send_closure(notification_manager_actor_, &NotificationManager::on_disable_contact_registered_notifications_changed); } else if (name == "disable_top_chats") { - send_closure(top_dialog_manager_, &TopDialogManager::update_is_enabled, + send_closure(top_dialog_manager_actor_, &TopDialogManager::update_is_enabled, !G()->shared_config().get_option_boolean(name)); } else if (name == "connection_parameters") { if (G()->mtproto_header().set_parameters(G()->shared_config().get_option_string(name))) { @@ -3612,6 +3612,8 @@ void Td::dec_actor_refcnt() { LOG(DEBUG) << "StickersManager was cleared" << timer; theme_manager_.reset(); LOG(DEBUG) << "ThemeManager was cleared" << timer; + top_dialog_manager_.reset(); + LOG(DEBUG) << "TopDialogManager was cleared" << timer; updates_manager_.reset(); LOG(DEBUG) << "UpdatesManager was cleared" << timer; video_notes_manager_.reset(); @@ -3761,8 +3763,6 @@ void Td::clear() { LOG(DEBUG) << "SecretChatsManager was cleared" << timer; storage_manager_.reset(); LOG(DEBUG) << "StorageManager was cleared" << timer; - top_dialog_manager_.reset(); - LOG(DEBUG) << "TopDialogManager was cleared" << timer; verify_phone_number_manager_.reset(); LOG(DEBUG) << "VerifyPhoneNumberManager was cleared" << timer; @@ -3806,6 +3806,8 @@ void Td::clear() { LOG(DEBUG) << "StickersManager actor was cleared" << timer; theme_manager_actor_.reset(); LOG(DEBUG) << "ThemeManager actor was cleared" << timer; + top_dialog_manager_actor_.reset(); + LOG(DEBUG) << "TopDialogManager actor was cleared" << timer; updates_manager_actor_.reset(); LOG(DEBUG) << "UpdatesManager actor was cleared" << timer; web_pages_manager_actor_.reset(); @@ -4266,6 +4268,9 @@ void Td::init_managers() { theme_manager_ = make_unique(this, create_reference()); theme_manager_actor_ = register_actor("ThemeManager", theme_manager_.get()); G()->set_theme_manager(theme_manager_actor_.get()); + top_dialog_manager_ = make_unique(this, create_reference()); + top_dialog_manager_actor_ = register_actor("TopDialogManager", top_dialog_manager_.get()); + G()->set_top_dialog_manager(top_dialog_manager_actor_.get()); updates_manager_ = make_unique(this, create_reference()); updates_manager_actor_ = register_actor("UpdatesManager", updates_manager_.get()); G()->set_updates_manager(updates_manager_actor_.get()); @@ -4289,8 +4294,6 @@ void Td::init_managers() { secret_chats_manager_ = create_actor("SecretChatsManager", create_reference()); G()->set_secret_chats_manager(secret_chats_manager_.get()); secure_manager_ = create_actor("SecureManager", create_reference()); - top_dialog_manager_ = create_actor("TopDialogManager", create_reference()); - G()->set_top_dialog_manager(top_dialog_manager_.get()); verify_phone_number_manager_ = create_actor( "VerifyPhoneNumberManager", PhoneNumberManager::Type::VerifyPhone, create_reference()); } @@ -5214,8 +5217,8 @@ void Td::on_request(uint64 id, td_api::getTopChats &request) { promise.set_value(MessagesManager::get_chats_object(-1, result.ok())); } }); - send_closure(top_dialog_manager_, &TopDialogManager::get_top_dialogs, get_top_dialog_category(*request.category_), - narrow_cast(request.limit_), std::move(query_promise)); + top_dialog_manager_->get_top_dialogs(get_top_dialog_category(*request.category_), narrow_cast(request.limit_), + std::move(query_promise)); } void Td::on_request(uint64 id, const td_api::removeTopChat &request) { @@ -5228,8 +5231,8 @@ void Td::on_request(uint64 id, const td_api::removeTopChat &request) { if (!dialog_id.is_valid()) { return send_error_raw(id, 400, "Invalid chat identifier"); } - send_closure(top_dialog_manager_, &TopDialogManager::remove_dialog, get_top_dialog_category(*request.category_), - dialog_id, messages_manager_->get_input_peer(dialog_id, AccessRights::Read)); + top_dialog_manager_->remove_dialog(get_top_dialog_category(*request.category_), dialog_id, + messages_manager_->get_input_peer(dialog_id, AccessRights::Read)); send_closure(actor_id(this), &Td::send_result, id, td_api::make_object()); } diff --git a/td/telegram/Td.h b/td/telegram/Td.h index df7ca0c54..2fb82707d 100644 --- a/td/telegram/Td.h +++ b/td/telegram/Td.h @@ -178,6 +178,8 @@ class Td final : public Actor { ActorOwn stickers_manager_actor_; unique_ptr theme_manager_; ActorOwn theme_manager_actor_; + unique_ptr top_dialog_manager_; + ActorOwn top_dialog_manager_actor_; unique_ptr updates_manager_; ActorOwn updates_manager_actor_; unique_ptr web_pages_manager_; @@ -197,7 +199,6 @@ class Td final : public Actor { ActorOwn secret_chats_manager_; ActorOwn state_manager_; ActorOwn storage_manager_; - ActorOwn top_dialog_manager_; ActorOwn verify_phone_number_manager_; class ResultHandler : public std::enable_shared_from_this { diff --git a/td/telegram/TopDialogManager.cpp b/td/telegram/TopDialogManager.cpp index 9c4f6911c..ddfc2cccf 100644 --- a/td/telegram/TopDialogManager.cpp +++ b/td/telegram/TopDialogManager.cpp @@ -108,8 +108,7 @@ static tl_object_ptr get_top_peer_category(TopDia } void TopDialogManager::update_is_enabled(bool is_enabled) { - auto auth_manager = G()->td().get_actor_unsafe()->auth_manager_.get(); - if (auth_manager == nullptr || !auth_manager->is_authorized() || auth_manager->is_bot()) { + if (td_->auth_manager_ == nullptr || !td_->auth_manager_->is_authorized() || td_->auth_manager_->is_bot()) { return; } @@ -128,7 +127,7 @@ bool TopDialogManager::set_is_enabled(bool is_enabled) { LOG(DEBUG) << "Change top chats is_enabled to " << is_enabled; is_enabled_ = is_enabled; - init(); + try_start(); return true; } @@ -512,16 +511,19 @@ void TopDialogManager::do_save_top_dialogs() { } void TopDialogManager::start_up() { - do_start_up(); + init(); } -void TopDialogManager::do_start_up() { - auto auth_manager = G()->td().get_actor_unsafe()->auth_manager_.get(); - if (auth_manager == nullptr || !auth_manager->is_authorized()) { +void TopDialogManager::tear_down() { + parent_.reset(); +} + +void TopDialogManager::init() { + if (td_->auth_manager_ == nullptr || !td_->auth_manager_->is_authorized()) { return; } - is_active_ = G()->parameters().use_chat_info_db && !auth_manager->is_bot(); + is_active_ = G()->parameters().use_chat_info_db && !td_->auth_manager_->is_bot(); is_enabled_ = !G()->shared_config().get_option_boolean("disable_top_chats"); update_rating_e_decay(); @@ -530,11 +532,11 @@ void TopDialogManager::do_start_up() { send_toggle_top_peers(need_update_top_peers[0] == '1'); } - init(); + try_start(); loop(); } -void TopDialogManager::init() { +void TopDialogManager::try_start() { was_first_sync_ = false; first_unsync_change_ = Timestamp(); server_sync_state_ = SyncState::None; @@ -585,9 +587,9 @@ void TopDialogManager::init() { void TopDialogManager::on_first_sync() { was_first_sync_ = true; - if (!G()->close_flag() && G()->td().get_actor_unsafe()->auth_manager_->is_bot()) { + if (!G()->close_flag() && td_->auth_manager_->is_bot()) { is_active_ = false; - init(); + try_start(); } loop(); } diff --git a/td/telegram/TopDialogManager.h b/td/telegram/TopDialogManager.h index 7f9fed36e..2201a40a7 100644 --- a/td/telegram/TopDialogManager.h +++ b/td/telegram/TopDialogManager.h @@ -22,12 +22,14 @@ namespace td { +class Td; + class TopDialogManager final : public NetQueryCallback { public: - explicit TopDialogManager(ActorShared<> parent) : parent_(std::move(parent)) { + TopDialogManager(Td *td, ActorShared<> parent) : td_(td), parent_(std::move(parent)) { } - void do_start_up(); + void init(); void on_dialog_used(TopDialogCategory category, DialogId dialog_id, int32 date); @@ -44,6 +46,8 @@ class TopDialogManager final : public NetQueryCallback { static constexpr int32 SERVER_SYNC_DELAY = 86400; // seconds static constexpr int32 SERVER_SYNC_RESEND_DELAY = 60; // seconds static constexpr int32 DB_SYNC_DELAY = 5; // seconds + + Td *td_; ActorShared<> parent_; bool is_active_{false}; @@ -108,10 +112,13 @@ class TopDialogManager final : public NetQueryCallback { void on_result(NetQueryPtr net_query) final; - void init(); + void try_start(); void start_up() final; + void loop() final; + + void tear_down() final; }; } // namespace td diff --git a/td/telegram/cli.cpp b/td/telegram/cli.cpp index dd8775552..6c6cd724f 100644 --- a/td/telegram/cli.cpp +++ b/td/telegram/cli.cpp @@ -2422,7 +2422,7 @@ class CliClient final : public Actor { td_api::make_object(td_api::make_object( td_api::make_object(), get_network_type(network_type), sent_bytes, received_bytes))); - } else if (op == "top_chats") { + } else if (op == "gtc") { send_request(td_api::make_object(get_top_chat_category(args), 50)); } else if (op == "rtc") { string chat_id;