From 6c91b9aa6b881b20142cb75b4fecca24dbee0061 Mon Sep 17 00:00:00 2001 From: levlam Date: Wed, 21 Sep 2022 18:55:21 +0300 Subject: [PATCH] Create all dialogs before initializing inactive_channel_ids_. --- td/telegram/ContactsManager.cpp | 42 ++++++++++++++++++++++----------- td/telegram/ContactsManager.h | 8 ++++--- 2 files changed, 33 insertions(+), 17 deletions(-) diff --git a/td/telegram/ContactsManager.cpp b/td/telegram/ContactsManager.cpp index c62c5dbae..d7cd587b1 100644 --- a/td/telegram/ContactsManager.cpp +++ b/td/telegram/ContactsManager.cpp @@ -2588,11 +2588,9 @@ class GetInactiveChannelsQuery final : public Td::ResultHandler { auto result = result_ptr.move_as_ok(); LOG(INFO) << "Receive result for GetInactiveChannelsQuery: " << to_string(result); - // TODO use result->dates_ + // don't need to use result->dates_, because chat.last_message.date is more reliable td_->contacts_manager_->on_get_users(std::move(result->users_), "GetInactiveChannelsQuery"); - td_->contacts_manager_->on_get_inactive_channels(std::move(result->chats_)); - - promise_.set_value(Unit()); + td_->contacts_manager_->on_get_inactive_channels(std::move(result->chats_), std::move(promise_)); } void on_error(Status status) final { @@ -8305,26 +8303,42 @@ void ContactsManager::update_dialogs_for_discussion(DialogId dialog_id, bool is_ } vector ContactsManager::get_inactive_channels(Promise &&promise) { - if (inactive_channels_inited_) { + if (inactive_channel_ids_inited_) { promise.set_value(Unit()); - return transform(inactive_channels_, [&](ChannelId channel_id) { - DialogId dialog_id{channel_id}; - td_->messages_manager_->force_create_dialog(dialog_id, "get_inactive_channels"); - return dialog_id; - }); + return transform(inactive_channel_ids_, [&](ChannelId channel_id) { return DialogId(channel_id); }); } td_->create_handler(std::move(promise))->send(); return {}; } -void ContactsManager::on_get_inactive_channels(vector> &&chats) { - inactive_channels_inited_ = true; - inactive_channels_ = get_channel_ids(std::move(chats), "on_get_inactive_channels"); +void ContactsManager::on_get_inactive_channels(vector> &&chats, + Promise &&promise) { + auto channel_ids = get_channel_ids(std::move(chats), "on_get_inactive_channels"); + + MultiPromiseActorSafe mpas{"GetInactiveChannelsMultiPromiseActor"}; + mpas.add_promise(PromiseCreator::lambda([actor_id = actor_id(this), channel_ids, + promise = std::move(promise)](Unit) mutable { + send_closure(actor_id, &ContactsManager::on_create_inactive_channels, std::move(channel_ids), std::move(promise)); + })); + mpas.set_ignore_errors(true); + auto lock_promise = mpas.get_promise(); + + for (auto channel_id : channel_ids) { + td_->messages_manager_->create_dialog(DialogId(channel_id), false, mpas.get_promise()); + } + + lock_promise.set_value(Unit()); +} + +void ContactsManager::on_create_inactive_channels(vector &&channel_ids, Promise &&promise) { + inactive_channel_ids_inited_ = true; + inactive_channel_ids_ = std::move(channel_ids); + promise.set_value(Unit()); } void ContactsManager::remove_inactive_channel(ChannelId channel_id) { - if (inactive_channels_inited_ && td::remove(inactive_channels_, channel_id)) { + if (inactive_channel_ids_inited_ && td::remove(inactive_channel_ids_, channel_id)) { LOG(DEBUG) << "Remove " << channel_id << " from list of inactive channels"; } } diff --git a/td/telegram/ContactsManager.h b/td/telegram/ContactsManager.h index 537665621..542b172b8 100644 --- a/td/telegram/ContactsManager.h +++ b/td/telegram/ContactsManager.h @@ -252,7 +252,7 @@ class ContactsManager final : public Actor { void on_get_dialogs_for_discussion(vector> &&chats); - void on_get_inactive_channels(vector> &&chats); + void on_get_inactive_channels(vector> &&chats, Promise &&promise); void remove_inactive_channel(ChannelId channel_id); @@ -1608,6 +1608,8 @@ class ContactsManager final : public Actor { vector get_dialog_ids(vector> &&chats, const char *source); + void on_create_inactive_channels(vector &&channel_ids, Promise &&promise); + void update_dialogs_for_discussion(DialogId dialog_id, bool is_suitable); void send_edit_chat_admin_query(ChatId chat_id, UserId user_id, bool is_administrator, Promise &&promise); @@ -1757,8 +1759,8 @@ class ContactsManager final : public Actor { bool dialogs_for_discussion_inited_ = false; vector dialogs_for_discussion_; - bool inactive_channels_inited_ = false; - vector inactive_channels_; + bool inactive_channel_ids_inited_ = false; + vector inactive_channel_ids_; FlatHashMap>, UserIdHash> load_user_from_database_queries_; FlatHashSet loaded_from_database_users_;