From c0d78b9f04bf276887a053f985080bd87abdc04f Mon Sep 17 00:00:00 2001 From: levlam Date: Fri, 9 Feb 2024 23:23:18 +0300 Subject: [PATCH] Add MessagesManager::set_folder_pinned_dialogs. --- td/telegram/MessagesManager.cpp | 125 +++++++++++++------------------- td/telegram/MessagesManager.h | 2 + 2 files changed, 52 insertions(+), 75 deletions(-) diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index 0de7397ce..a1ebbcbea 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -14578,43 +14578,8 @@ void MessagesManager::on_get_dialogs(FolderId folder_id, vectorare_pinned_dialogs_inited_; folder_list->are_pinned_dialogs_inited_ = true; if (pinned_dialog_ids != added_dialog_ids) { - LOG(INFO) << "Update pinned chats order from " << format::as_array(pinned_dialog_ids) << " to " - << format::as_array(added_dialog_ids); - FlatHashSet old_pinned_dialog_ids; - for (auto pinned_dialog_id : pinned_dialog_ids) { - old_pinned_dialog_ids.insert(pinned_dialog_id); - } - - std::reverse(pinned_dialog_ids.begin(), pinned_dialog_ids.end()); - std::reverse(added_dialog_ids.begin(), added_dialog_ids.end()); - auto old_it = pinned_dialog_ids.begin(); - for (auto dialog_id : added_dialog_ids) { - old_pinned_dialog_ids.erase(dialog_id); - while (old_it < pinned_dialog_ids.end()) { - if (*old_it == dialog_id) { - break; - } - ++old_it; - } - if (old_it < pinned_dialog_ids.end()) { - // leave dialog where it is - ++old_it; - continue; - } - if (set_dialog_is_pinned(dialog_id, true)) { - are_pinned_dialogs_saved = true; - } - } - for (auto dialog_id : old_pinned_dialog_ids) { - Dialog *d = get_dialog_force(dialog_id, "on_get_dialogs pinned"); - if (d == nullptr) { - LOG(ERROR) << "Failed to find " << dialog_id << " to unpin in " << folder_id; - force_create_dialog(dialog_id, "from_pinned_dialog_list", true); - d = get_dialog_force(dialog_id, "on_get_dialogs pinned 2"); - } - if (d != nullptr && set_dialog_is_pinned(DialogListId(folder_id), d, false)) { - are_pinned_dialogs_saved = true; - } + if (set_folder_pinned_dialogs(folder_id, std::move(pinned_dialog_ids), std::move(added_dialog_ids))) { + are_pinned_dialogs_saved = true; } } else { LOG(INFO) << "Pinned chats are not changed"; @@ -17735,6 +17700,51 @@ void MessagesManager::toggle_dialog_is_pinned_on_server(DialogId dialog_id, bool td_->create_handler(get_erase_log_event_promise(log_event_id))->send(dialog_id, is_pinned); } +bool MessagesManager::set_folder_pinned_dialogs(FolderId folder_id, vector old_dialog_ids, + vector new_dialog_ids) { + LOG(INFO) << "Reorder pinned chats in " << folder_id << " from " << old_dialog_ids << " to " << new_dialog_ids; + + std::reverse(old_dialog_ids.begin(), old_dialog_ids.end()); + std::reverse(new_dialog_ids.begin(), new_dialog_ids.end()); + + FlatHashSet all_old_pinned_dialog_ids; + for (auto dialog_id : old_dialog_ids) { + all_old_pinned_dialog_ids.insert(dialog_id); + } + + bool are_pinned_dialogs_saved = false; + auto old_it = old_dialog_ids.begin(); + for (auto dialog_id : new_dialog_ids) { + all_old_pinned_dialog_ids.erase(dialog_id); + while (old_it < old_dialog_ids.end()) { + if (*old_it == dialog_id) { + break; + } + ++old_it; + } + if (old_it < old_dialog_ids.end()) { + // leave dialog where it is + ++old_it; + continue; + } + if (set_dialog_is_pinned(dialog_id, true)) { + are_pinned_dialogs_saved = true; + } + } + for (auto dialog_id : all_old_pinned_dialog_ids) { + Dialog *d = get_dialog_force(dialog_id, "set_folder_pinned_dialogs 1"); + if (d == nullptr) { + LOG(ERROR) << "Failed to find " << dialog_id << " to unpin in " << folder_id; + force_create_dialog(dialog_id, "set_folder_pinned_dialogs 2", true); + d = get_dialog_force(dialog_id, "set_folder_pinned_dialogs 3"); + } + if (d != nullptr && set_dialog_is_pinned(DialogListId(folder_id), d, false)) { + are_pinned_dialogs_saved = true; + } + } + return are_pinned_dialogs_saved; +} + Status MessagesManager::set_pinned_dialogs(DialogListId dialog_list_id, vector dialog_ids) { if (td_->auth_manager_->is_bot()) { return Status::Error(400, "Bots can't reorder pinned chats"); @@ -17786,7 +17796,6 @@ Status MessagesManager::set_pinned_dialogs(DialogListId dialog_list_id, vector old_pinned_dialog_ids; - for (auto dialog_id : pinned_dialog_ids) { - old_pinned_dialog_ids.insert(dialog_id); - } - auto old_it = pinned_dialog_ids.begin(); - for (auto dialog_id : dialog_ids) { - old_pinned_dialog_ids.erase(dialog_id); - while (old_it < pinned_dialog_ids.end()) { - if (*old_it == dialog_id) { - break; - } - ++old_it; - } - if (old_it < pinned_dialog_ids.end()) { - // leave dialog where it is - ++old_it; - continue; - } - set_dialog_is_pinned(dialog_id, true); - } - for (auto dialog_id : old_pinned_dialog_ids) { - Dialog *d = get_dialog_force(dialog_id, "set_pinned_dialogs 2"); - if (d == nullptr) { - LOG(ERROR) << "Failed to find " << dialog_id << " to unpin in " << dialog_list_id; - force_create_dialog(dialog_id, "set_pinned_dialogs", true); - d = get_dialog_force(dialog_id, "set_pinned_dialogs 3"); - } - if (d != nullptr) { - set_dialog_is_pinned(dialog_list_id, d, false); - } - } + auto folder_id = dialog_list_id.get_folder_id(); + set_folder_pinned_dialogs(folder_id, std::move(pinned_dialog_ids), std::move(dialog_ids)); if (server_old_dialog_ids != server_new_dialog_ids) { - reorder_pinned_dialogs_on_server(dialog_list_id.get_folder_id(), server_new_dialog_ids, 0); + reorder_pinned_dialogs_on_server(folder_id, server_new_dialog_ids, 0); } return Status::OK(); } diff --git a/td/telegram/MessagesManager.h b/td/telegram/MessagesManager.h index 2983b5067..edb6db5c9 100644 --- a/td/telegram/MessagesManager.h +++ b/td/telegram/MessagesManager.h @@ -2600,6 +2600,8 @@ class MessagesManager final : public Actor { vector get_pinned_dialog_ids(DialogListId dialog_list_id) const; + bool set_folder_pinned_dialogs(FolderId folder_id, vector old_dialog_ids, vector new_dialog_ids); + void reload_pinned_dialogs(DialogListId dialog_list_id, Promise &&promise); void update_dialogs_hints(const Dialog *d);