Move set_dialog_filters_order to DialogFilter.

This commit is contained in:
levlam 2023-03-22 01:24:14 +03:00
parent f792137692
commit ecc57d7b93
4 changed files with 43 additions and 41 deletions

View File

@ -20,6 +20,8 @@
#include "td/utils/logging.h"
#include "td/utils/misc.h"
#include <utility>
namespace td {
int32 DialogFilter::get_max_filter_dialogs() {
@ -619,6 +621,41 @@ vector<DialogFilterId> DialogFilter::get_dialog_filter_ids(const vector<unique_p
return result;
}
bool DialogFilter::set_dialog_filters_order(vector<unique_ptr<DialogFilter>> &dialog_filters,
vector<DialogFilterId> dialog_filter_ids) {
auto old_dialog_filter_ids = get_dialog_filter_ids(dialog_filters, -1);
if (old_dialog_filter_ids == dialog_filter_ids) {
return false;
}
LOG(INFO) << "Reorder chat filters from " << old_dialog_filter_ids << " to " << dialog_filter_ids;
if (dialog_filter_ids.size() != old_dialog_filter_ids.size()) {
for (auto dialog_filter_id : old_dialog_filter_ids) {
if (!td::contains(dialog_filter_ids, dialog_filter_id)) {
dialog_filter_ids.push_back(dialog_filter_id);
}
}
CHECK(dialog_filter_ids.size() == old_dialog_filter_ids.size());
}
if (old_dialog_filter_ids == dialog_filter_ids) {
return false;
}
CHECK(dialog_filter_ids.size() == dialog_filters.size());
for (size_t i = 0; i < dialog_filters.size(); i++) {
for (size_t j = i; j < dialog_filters.size(); j++) {
if (dialog_filters[j]->dialog_filter_id == dialog_filter_ids[i]) {
if (i != j) {
std::swap(dialog_filters[i], dialog_filters[j]);
}
break;
}
}
CHECK(dialog_filters[i]->dialog_filter_id == dialog_filter_ids[i]);
}
return true;
}
bool DialogFilter::are_similar(const DialogFilter &lhs, const DialogFilter &rhs) {
if (lhs.title == rhs.title) {
return true;

View File

@ -99,6 +99,9 @@ class DialogFilter {
static vector<DialogFilterId> get_dialog_filter_ids(const vector<unique_ptr<DialogFilter>> &dialog_filters,
int32 main_dialog_list_position);
static bool set_dialog_filters_order(vector<unique_ptr<DialogFilter>> &dialog_filters,
vector<DialogFilterId> dialog_filter_ids);
static bool are_similar(const DialogFilter &lhs, const DialogFilter &rhs);
static bool are_equivalent(const DialogFilter &lhs, const DialogFilter &rhs);

View File

@ -17899,7 +17899,7 @@ void MessagesManager::on_get_dialog_filters(Result<vector<tl_object_ptr<telegram
}
}
is_changed = true;
set_dialog_filters_order(dialog_filters_, new_dialog_filter_order);
DialogFilter::set_dialog_filters_order(dialog_filters_, new_dialog_filter_order);
}
server_dialog_filters_ = std::move(new_server_dialog_filters);
@ -19893,7 +19893,7 @@ void MessagesManager::reorder_dialog_filters(vector<DialogFilterId> dialog_filte
main_dialog_list_position = 0;
}
if (set_dialog_filters_order(dialog_filters_, dialog_filter_ids) ||
if (DialogFilter::set_dialog_filters_order(dialog_filters_, dialog_filter_ids) ||
main_dialog_list_position != main_dialog_list_position_) {
main_dialog_list_position_ = main_dialog_list_position;
@ -19924,7 +19924,7 @@ void MessagesManager::on_reorder_dialog_filters(vector<DialogFilterId> dialog_fi
if (result.is_error()) {
// TODO rollback dialog_filters_ changes if error isn't 429
} else {
if (set_dialog_filters_order(server_dialog_filters_, std::move(dialog_filter_ids)) ||
if (DialogFilter::set_dialog_filters_order(server_dialog_filters_, std::move(dialog_filter_ids)) ||
server_main_dialog_list_position_ != main_dialog_list_position) {
server_main_dialog_list_position_ = main_dialog_list_position;
save_dialog_filters();
@ -19935,41 +19935,6 @@ void MessagesManager::on_reorder_dialog_filters(vector<DialogFilterId> dialog_fi
synchronize_dialog_filters();
}
bool MessagesManager::set_dialog_filters_order(vector<unique_ptr<DialogFilter>> &dialog_filters,
vector<DialogFilterId> dialog_filter_ids) {
auto old_dialog_filter_ids = DialogFilter::get_dialog_filter_ids(dialog_filters, -1);
if (old_dialog_filter_ids == dialog_filter_ids) {
return false;
}
LOG(INFO) << "Reorder chat filters from " << old_dialog_filter_ids << " to " << dialog_filter_ids;
if (dialog_filter_ids.size() != old_dialog_filter_ids.size()) {
for (auto dialog_filter_id : old_dialog_filter_ids) {
if (!td::contains(dialog_filter_ids, dialog_filter_id)) {
dialog_filter_ids.push_back(dialog_filter_id);
}
}
CHECK(dialog_filter_ids.size() == old_dialog_filter_ids.size());
}
if (old_dialog_filter_ids == dialog_filter_ids) {
return false;
}
CHECK(dialog_filter_ids.size() == dialog_filters.size());
for (size_t i = 0; i < dialog_filters.size(); i++) {
for (size_t j = i; j < dialog_filters.size(); j++) {
if (dialog_filters[j]->dialog_filter_id == dialog_filter_ids[i]) {
if (i != j) {
std::swap(dialog_filters[i], dialog_filters[j]);
}
break;
}
}
CHECK(dialog_filters[i]->dialog_filter_id == dialog_filter_ids[i]);
}
return true;
}
void MessagesManager::add_dialog_filter(unique_ptr<DialogFilter> dialog_filter, bool at_beginning, const char *source) {
if (td_->auth_manager_->is_bot()) {
// just in case

View File

@ -2884,9 +2884,6 @@ class MessagesManager final : public Actor {
int32 delete_dialog_filter(DialogFilterId dialog_filter_id, const char *source);
static bool set_dialog_filters_order(vector<unique_ptr<DialogFilter>> &dialog_filters,
vector<DialogFilterId> dialog_filter_ids);
const DialogFilter *get_server_dialog_filter(DialogFilterId dialog_filter_id) const;
DialogFilter *get_dialog_filter(DialogFilterId dialog_filter_id);