From 408a6a9d746cf8cff0d5c21e178da29a7499e3dd Mon Sep 17 00:00:00 2001 From: levlam Date: Tue, 30 Aug 2022 01:18:20 +0300 Subject: [PATCH] Remove failed to load chats from chat filters. --- td/telegram/InputDialogId.cpp | 7 +++++ td/telegram/InputDialogId.h | 2 ++ td/telegram/MessagesManager.cpp | 53 +++++++++++++++++++++++++++++++-- td/telegram/MessagesManager.h | 3 ++ 4 files changed, 63 insertions(+), 2 deletions(-) diff --git a/td/telegram/InputDialogId.cpp b/td/telegram/InputDialogId.cpp index 3ffb79873..82bc2646d 100644 --- a/td/telegram/InputDialogId.cpp +++ b/td/telegram/InputDialogId.cpp @@ -10,6 +10,7 @@ #include "td/telegram/ChatId.h" #include "td/telegram/UserId.h" +#include "td/utils/algorithm.h" #include "td/utils/logging.h" namespace td { @@ -143,4 +144,10 @@ bool InputDialogId::contains(const vector &input_dialog_ids, Dial return false; } +bool InputDialogId::remove(vector &input_dialog_ids, DialogId dialog_id) { + return td::remove_if(input_dialog_ids, [dialog_id](InputDialogId input_dialog_id) { + return input_dialog_id.get_dialog_id() == dialog_id; + }); +} + } // namespace td diff --git a/td/telegram/InputDialogId.h b/td/telegram/InputDialogId.h index ac03ad0c3..d669b2bb7 100644 --- a/td/telegram/InputDialogId.h +++ b/td/telegram/InputDialogId.h @@ -40,6 +40,8 @@ class InputDialogId { static bool contains(const vector &input_dialog_ids, DialogId dialog_id); + static bool remove(vector &input_dialog_ids, DialogId dialog_id); + bool operator==(const InputDialogId &other) const { return dialog_id == other.dialog_id && access_hash == other.access_hash; } diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index a925aada8..827e9a44a 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -16580,18 +16580,67 @@ void MessagesManager::load_dialog_filter_dialogs(DialogFilterId dialog_filter_id const size_t MAX_SLICE_SIZE = 100; // server side limit MultiPromiseActorSafe mpas{"GetFilterDialogsOnServerMultiPromiseActor"}; mpas.add_promise(std::move(promise)); - mpas.set_ignore_errors(true); auto lock = mpas.get_promise(); for (size_t i = 0; i < input_dialog_ids.size(); i += MAX_SLICE_SIZE) { auto end_i = i + MAX_SLICE_SIZE; auto end = end_i < input_dialog_ids.size() ? input_dialog_ids.begin() + end_i : input_dialog_ids.end(); - td_->create_handler(mpas.get_promise())->send({input_dialog_ids.begin() + i, end}); + vector slice_input_dialog_ids = {input_dialog_ids.begin() + i, end}; + auto slice_dialog_ids = transform(slice_input_dialog_ids, + [](InputDialogId input_dialog_id) { return input_dialog_id.get_dialog_id(); }); + auto query_promise = + PromiseCreator::lambda([actor_id = actor_id(this), dialog_filter_id, dialog_ids = std::move(slice_dialog_ids), + promise = mpas.get_promise()](Result &&result) mutable { + if (result.is_error()) { + return promise.set_error(result.move_as_error()); + } + send_closure(actor_id, &MessagesManager::on_load_dialog_filter_dialogs, dialog_filter_id, + std::move(dialog_ids), std::move(promise)); + }); + td_->create_handler(std::move(query_promise))->send(std::move(slice_input_dialog_ids)); } lock.set_value(Unit()); } +void MessagesManager::on_load_dialog_filter_dialogs(DialogFilterId dialog_filter_id, vector &&dialog_ids, + Promise &&promise) { + TRY_STATUS_PROMISE(promise, G()->close_status()); + + td::remove_if(dialog_ids, + [this](DialogId dialog_id) { return have_dialog_force(dialog_id, "on_load_dialog_filter_dialogs"); }); + if (dialog_ids.empty()) { + LOG(INFO) << "All chats from " << dialog_filter_id << " were loaded"; + return promise.set_value(Unit()); + } + + LOG(INFO) << "Failed to load chats " << dialog_ids << " from " << dialog_filter_id; + + auto old_dialog_filter = get_dialog_filter(dialog_filter_id); + if (old_dialog_filter == nullptr) { + return promise.set_value(Unit()); + } + CHECK(is_update_chat_filters_sent_); + + auto new_dialog_filter = td::make_unique(*old_dialog_filter); + for (auto dialog_id : dialog_ids) { + InputDialogId::remove(new_dialog_filter->pinned_dialog_ids, dialog_id); + InputDialogId::remove(new_dialog_filter->included_dialog_ids, dialog_id); + InputDialogId::remove(new_dialog_filter->excluded_dialog_ids, dialog_id); + } + + if (*new_dialog_filter != *old_dialog_filter) { + LOG(INFO) << "Update " << dialog_filter_id << " from " << *old_dialog_filter << " to " << *new_dialog_filter; + edit_dialog_filter(std::move(new_dialog_filter), "on_load_dialog_filter_dialogs"); + save_dialog_filters(); + send_update_chat_filters(); + + synchronize_dialog_filters(); + } + + promise.set_value(Unit()); +} + void MessagesManager::load_dialog_filter(DialogFilterId dialog_filter_id, bool force, Promise &&promise) { CHECK(!td_->auth_manager_->is_bot()); if (!dialog_filter_id.is_valid()) { diff --git a/td/telegram/MessagesManager.h b/td/telegram/MessagesManager.h index db0406e30..cf4ed9c35 100644 --- a/td/telegram/MessagesManager.h +++ b/td/telegram/MessagesManager.h @@ -2784,6 +2784,9 @@ class MessagesManager final : public Actor { void load_dialog_filter_dialogs(DialogFilterId dialog_filter_id, vector &&input_dialog_ids, Promise &&promise); + void on_load_dialog_filter_dialogs(DialogFilterId dialog_filter_id, vector &&dialog_ids, + Promise &&promise); + void load_dialog_filter(const DialogFilter *filter, bool force, Promise &&promise); void on_get_recommended_dialog_filters(Result>> result,