diff --git a/td/telegram/DialogFilter.cpp b/td/telegram/DialogFilter.cpp index 610e1871a..36547dd91 100644 --- a/td/telegram/DialogFilter.cpp +++ b/td/telegram/DialogFilter.cpp @@ -172,6 +172,23 @@ bool DialogFilter::is_empty(bool for_server) const { } } +bool DialogFilter::can_include_dialog(DialogId dialog_id) const { + if (InputDialogId::contains(included_dialog_ids, dialog_id) || + InputDialogId::contains(pinned_dialog_ids, dialog_id)) { + // the dialog is already included + return false; + } + + if (included_dialog_ids.size() + pinned_dialog_ids.size() < narrow_cast(get_max_filter_dialogs())) { + // fast path + return true; + } + + auto new_dialog_filter = make_unique(*this); + new_dialog_filter->include_dialog(InputDialogId(dialog_id)); + return new_dialog_filter->check_limits().is_ok(); +} + Status DialogFilter::check_limits() const { auto get_server_dialog_count = [](const vector &input_dialog_ids) { int32 result = 0; diff --git a/td/telegram/DialogFilter.h b/td/telegram/DialogFilter.h index ca96e93f1..ee452bc82 100644 --- a/td/telegram/DialogFilter.h +++ b/td/telegram/DialogFilter.h @@ -70,6 +70,8 @@ class DialogFilter { return dialog_filter_id; } + bool can_include_dialog(DialogId dialog_id) const; + Status check_limits() const; static string get_emoji_by_icon_name(const string &icon_name); diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index 463b877a0..c292bd5e7 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -34443,23 +34443,8 @@ vector MessagesManager::get_dialog_lists_to_add_dialog(DialogId di } for (const auto &dialog_filter : dialog_filters_) { - auto dialog_filter_id = dialog_filter->dialog_filter_id; - if (!InputDialogId::contains(dialog_filter->included_dialog_ids, dialog_id) && - !InputDialogId::contains(dialog_filter->pinned_dialog_ids, dialog_id)) { - // the dialog isn't added yet to the dialog list - // check that it can be actually added - if (dialog_filter->included_dialog_ids.size() + dialog_filter->pinned_dialog_ids.size() < - narrow_cast(DialogFilter::get_max_filter_dialogs())) { - // fast path - result.push_back(DialogListId(dialog_filter_id)); - continue; - } - - auto new_dialog_filter = make_unique(*dialog_filter); - new_dialog_filter->include_dialog(get_input_dialog_id(dialog_id)); - if (new_dialog_filter->check_limits().is_ok()) { - result.push_back(DialogListId(dialog_filter_id)); - } + if (dialog_filter->can_include_dialog(dialog_id)) { + result.push_back(DialogListId(dialog_filter->get_dialog_filter_id())); } } return result;