Move sort_input_dialog_ids to class DialogFilter.
This commit is contained in:
parent
51c4c1368b
commit
9acf785389
@ -6,8 +6,10 @@
|
|||||||
//
|
//
|
||||||
#include "td/telegram/DialogFilter.h"
|
#include "td/telegram/DialogFilter.h"
|
||||||
|
|
||||||
|
#include "td/telegram/ContactsManager.h"
|
||||||
#include "td/telegram/DialogId.h"
|
#include "td/telegram/DialogId.h"
|
||||||
#include "td/telegram/Global.h"
|
#include "td/telegram/Global.h"
|
||||||
|
#include "td/telegram/Td.h"
|
||||||
|
|
||||||
#include "td/utils/algorithm.h"
|
#include "td/utils/algorithm.h"
|
||||||
#include "td/utils/emoji.h"
|
#include "td/utils/emoji.h"
|
||||||
@ -408,6 +410,38 @@ unique_ptr<DialogFilter> DialogFilter::merge_dialog_filter_changes(const DialogF
|
|||||||
return new_filter;
|
return new_filter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DialogFilter::sort_input_dialog_ids(const Td *td, const char *source) {
|
||||||
|
if (!include_contacts && !include_non_contacts && !include_bots && !include_groups && !include_channels) {
|
||||||
|
excluded_dialog_ids.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
auto sort_input_dialog_ids = [contacts_manager =
|
||||||
|
td->contacts_manager_.get()](vector<InputDialogId> &input_dialog_ids) {
|
||||||
|
std::sort(input_dialog_ids.begin(), input_dialog_ids.end(),
|
||||||
|
[contacts_manager](InputDialogId lhs, InputDialogId rhs) {
|
||||||
|
auto get_order = [contacts_manager](InputDialogId input_dialog_id) {
|
||||||
|
auto dialog_id = input_dialog_id.get_dialog_id();
|
||||||
|
if (dialog_id.get_type() != DialogType::SecretChat) {
|
||||||
|
return dialog_id.get() * 10;
|
||||||
|
}
|
||||||
|
auto user_id = contacts_manager->get_secret_chat_user_id(dialog_id.get_secret_chat_id());
|
||||||
|
return DialogId(user_id).get() * 10 + 1;
|
||||||
|
};
|
||||||
|
return get_order(lhs) < get_order(rhs);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
sort_input_dialog_ids(excluded_dialog_ids);
|
||||||
|
sort_input_dialog_ids(included_dialog_ids);
|
||||||
|
|
||||||
|
FlatHashSet<DialogId, DialogIdHash> all_dialog_ids;
|
||||||
|
for_each_dialog([&](const InputDialogId &input_dialog_id) {
|
||||||
|
auto dialog_id = input_dialog_id.get_dialog_id();
|
||||||
|
CHECK(dialog_id.is_valid());
|
||||||
|
LOG_CHECK(all_dialog_ids.insert(dialog_id).second) << source << ' ' << dialog_id << ' ' << *this;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
bool DialogFilter::are_similar(const DialogFilter &lhs, const DialogFilter &rhs) {
|
bool DialogFilter::are_similar(const DialogFilter &lhs, const DialogFilter &rhs) {
|
||||||
if (lhs.title == rhs.title) {
|
if (lhs.title == rhs.title) {
|
||||||
return true;
|
return true;
|
||||||
|
@ -20,6 +20,8 @@
|
|||||||
|
|
||||||
namespace td {
|
namespace td {
|
||||||
|
|
||||||
|
class Td;
|
||||||
|
|
||||||
class DialogFilter {
|
class DialogFilter {
|
||||||
public:
|
public:
|
||||||
DialogFilterId dialog_filter_id;
|
DialogFilterId dialog_filter_id;
|
||||||
@ -71,6 +73,8 @@ class DialogFilter {
|
|||||||
const DialogFilter *old_server_filter,
|
const DialogFilter *old_server_filter,
|
||||||
const DialogFilter *new_server_filter);
|
const DialogFilter *new_server_filter);
|
||||||
|
|
||||||
|
void sort_input_dialog_ids(const Td *td, const char *source);
|
||||||
|
|
||||||
static bool are_similar(const DialogFilter &lhs, const DialogFilter &rhs);
|
static bool are_similar(const DialogFilter &lhs, const DialogFilter &rhs);
|
||||||
|
|
||||||
static bool are_equivalent(const DialogFilter &lhs, const DialogFilter &rhs);
|
static bool are_equivalent(const DialogFilter &lhs, const DialogFilter &rhs);
|
||||||
|
@ -17784,7 +17784,7 @@ void MessagesManager::on_get_dialog_filters(Result<vector<tl_object_ptr<telegram
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
sort_dialog_filter_input_dialog_ids(dialog_filter.get(), "on_get_dialog_filters 1");
|
dialog_filter->sort_input_dialog_ids(td_, "on_get_dialog_filters 1");
|
||||||
new_server_dialog_filters.push_back(std::move(dialog_filter));
|
new_server_dialog_filters.push_back(std::move(dialog_filter));
|
||||||
position++;
|
position++;
|
||||||
}
|
}
|
||||||
@ -17826,7 +17826,7 @@ void MessagesManager::on_get_dialog_filters(Result<vector<tl_object_ptr<telegram
|
|||||||
LOG(INFO) << "Old server filter: " << *old_server_filter;
|
LOG(INFO) << "Old server filter: " << *old_server_filter;
|
||||||
LOG(INFO) << "New server filter: " << *new_server_filter;
|
LOG(INFO) << "New server filter: " << *new_server_filter;
|
||||||
LOG(INFO) << "New local filter: " << *new_filter;
|
LOG(INFO) << "New local filter: " << *new_filter;
|
||||||
sort_dialog_filter_input_dialog_ids(new_filter.get(), "on_get_dialog_filters 2");
|
new_filter->sort_input_dialog_ids(td_, "on_get_dialog_filters 2");
|
||||||
if (*new_filter != *old_filter) {
|
if (*new_filter != *old_filter) {
|
||||||
is_changed = true;
|
is_changed = true;
|
||||||
edit_dialog_filter(std::move(new_filter), "on_get_dialog_filters");
|
edit_dialog_filter(std::move(new_filter), "on_get_dialog_filters");
|
||||||
@ -19644,39 +19644,6 @@ InputDialogId MessagesManager::get_input_dialog_id(DialogId dialog_id) const {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MessagesManager::sort_dialog_filter_input_dialog_ids(DialogFilter *dialog_filter, const char *source) const {
|
|
||||||
auto sort_input_dialog_ids = [contacts_manager =
|
|
||||||
td_->contacts_manager_.get()](vector<InputDialogId> &input_dialog_ids) {
|
|
||||||
std::sort(input_dialog_ids.begin(), input_dialog_ids.end(),
|
|
||||||
[contacts_manager](InputDialogId lhs, InputDialogId rhs) {
|
|
||||||
auto get_order = [contacts_manager](InputDialogId input_dialog_id) {
|
|
||||||
auto dialog_id = input_dialog_id.get_dialog_id();
|
|
||||||
if (dialog_id.get_type() != DialogType::SecretChat) {
|
|
||||||
return dialog_id.get() * 10;
|
|
||||||
}
|
|
||||||
auto user_id = contacts_manager->get_secret_chat_user_id(dialog_id.get_secret_chat_id());
|
|
||||||
return DialogId(user_id).get() * 10 + 1;
|
|
||||||
};
|
|
||||||
return get_order(lhs) < get_order(rhs);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
if (!dialog_filter->include_contacts && !dialog_filter->include_non_contacts && !dialog_filter->include_bots &&
|
|
||||||
!dialog_filter->include_groups && !dialog_filter->include_channels) {
|
|
||||||
dialog_filter->excluded_dialog_ids.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
sort_input_dialog_ids(dialog_filter->excluded_dialog_ids);
|
|
||||||
sort_input_dialog_ids(dialog_filter->included_dialog_ids);
|
|
||||||
|
|
||||||
FlatHashSet<DialogId, DialogIdHash> all_dialog_ids;
|
|
||||||
dialog_filter->for_each_dialog([&](const InputDialogId &input_dialog_id) {
|
|
||||||
auto dialog_id = input_dialog_id.get_dialog_id();
|
|
||||||
CHECK(dialog_id.is_valid());
|
|
||||||
LOG_CHECK(all_dialog_ids.insert(dialog_id).second) << source << ' ' << dialog_id << ' ' << dialog_filter;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
Result<unique_ptr<DialogFilter>> MessagesManager::create_dialog_filter(DialogFilterId dialog_filter_id,
|
Result<unique_ptr<DialogFilter>> MessagesManager::create_dialog_filter(DialogFilterId dialog_filter_id,
|
||||||
td_api::object_ptr<td_api::chatFilter> filter) {
|
td_api::object_ptr<td_api::chatFilter> filter) {
|
||||||
CHECK(filter != nullptr);
|
CHECK(filter != nullptr);
|
||||||
@ -19735,7 +19702,7 @@ Result<unique_ptr<DialogFilter>> MessagesManager::create_dialog_filter(DialogFil
|
|||||||
dialog_filter->include_channels = filter->include_channels_;
|
dialog_filter->include_channels = filter->include_channels_;
|
||||||
|
|
||||||
TRY_STATUS(dialog_filter->check_limits());
|
TRY_STATUS(dialog_filter->check_limits());
|
||||||
sort_dialog_filter_input_dialog_ids(dialog_filter.get(), "create_dialog_filter");
|
dialog_filter->sort_input_dialog_ids(td_, "create_dialog_filter");
|
||||||
|
|
||||||
return std::move(dialog_filter);
|
return std::move(dialog_filter);
|
||||||
}
|
}
|
||||||
@ -20579,7 +20546,7 @@ Status MessagesManager::toggle_dialog_is_pinned(DialogListId dialog_list_id, Dia
|
|||||||
}
|
}
|
||||||
|
|
||||||
TRY_STATUS(new_dialog_filter->check_limits());
|
TRY_STATUS(new_dialog_filter->check_limits());
|
||||||
sort_dialog_filter_input_dialog_ids(new_dialog_filter.get(), "toggle_dialog_is_pinned");
|
new_dialog_filter->sort_input_dialog_ids(td_, "toggle_dialog_is_pinned");
|
||||||
|
|
||||||
edit_dialog_filter(std::move(new_dialog_filter), "toggle_dialog_is_pinned");
|
edit_dialog_filter(std::move(new_dialog_filter), "toggle_dialog_is_pinned");
|
||||||
save_dialog_filters();
|
save_dialog_filters();
|
||||||
@ -20737,7 +20704,7 @@ Status MessagesManager::set_pinned_dialogs(DialogListId dialog_list_id, vector<D
|
|||||||
append(new_dialog_filter->included_dialog_ids, old_pinned_dialog_ids);
|
append(new_dialog_filter->included_dialog_ids, old_pinned_dialog_ids);
|
||||||
|
|
||||||
TRY_STATUS(new_dialog_filter->check_limits());
|
TRY_STATUS(new_dialog_filter->check_limits());
|
||||||
sort_dialog_filter_input_dialog_ids(new_dialog_filter.get(), "set_pinned_dialogs");
|
new_dialog_filter->sort_input_dialog_ids(td_, "set_pinned_dialogs");
|
||||||
|
|
||||||
edit_dialog_filter(std::move(new_dialog_filter), "set_pinned_dialogs");
|
edit_dialog_filter(std::move(new_dialog_filter), "set_pinned_dialogs");
|
||||||
save_dialog_filters();
|
save_dialog_filters();
|
||||||
@ -34607,7 +34574,7 @@ void MessagesManager::add_dialog_to_list(DialogId dialog_id, DialogListId dialog
|
|||||||
if (status.is_error()) {
|
if (status.is_error()) {
|
||||||
return promise.set_error(std::move(status));
|
return promise.set_error(std::move(status));
|
||||||
}
|
}
|
||||||
sort_dialog_filter_input_dialog_ids(new_dialog_filter.get(), "add_dialog_to_list");
|
new_dialog_filter->sort_input_dialog_ids(td_, "add_dialog_to_list");
|
||||||
|
|
||||||
edit_dialog_filter(std::move(new_dialog_filter), "add_dialog_to_list");
|
edit_dialog_filter(std::move(new_dialog_filter), "add_dialog_to_list");
|
||||||
save_dialog_filters();
|
save_dialog_filters();
|
||||||
|
@ -2861,8 +2861,6 @@ class MessagesManager final : public Actor {
|
|||||||
|
|
||||||
InputDialogId get_input_dialog_id(DialogId dialog_id) const;
|
InputDialogId get_input_dialog_id(DialogId dialog_id) const;
|
||||||
|
|
||||||
void sort_dialog_filter_input_dialog_ids(DialogFilter *dialog_filter, const char *source) const;
|
|
||||||
|
|
||||||
Result<unique_ptr<DialogFilter>> create_dialog_filter(DialogFilterId dialog_filter_id,
|
Result<unique_ptr<DialogFilter>> create_dialog_filter(DialogFilterId dialog_filter_id,
|
||||||
td_api::object_ptr<td_api::chatFilter> filter);
|
td_api::object_ptr<td_api::chatFilter> filter);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user