Remove unknown pinned secret chats if failed to load them.

This commit is contained in:
levlam 2022-08-27 23:12:50 +03:00
parent b0f4c45104
commit 57d7a2b10c
2 changed files with 34 additions and 12 deletions

View File

@ -15116,13 +15116,8 @@ bool MessagesManager::set_dialog_is_pinned(DialogListId dialog_list_id, Dialog *
}
LOG(INFO) << "Set " << d->dialog_id << " is pinned in " << dialog_list_id << " to " << is_pinned;
if (dialog_list_id.is_folder() && G()->parameters().use_message_db) {
G()->td_db()->get_binlog_pmc()->set(
PSTRING() << "pinned_dialog_ids" << dialog_list_id.get_folder_id().get(),
implode(transform(list->pinned_dialogs_,
[](auto &pinned_dialog) { return PSTRING() << pinned_dialog.get_dialog_id().get(); }),
','));
}
save_pinned_folder_dialog_ids(*list);
if (need_update_dialog_lists) {
update_dialog_lists(d, std::move(positions), true, false, "set_dialog_is_pinned");
@ -15130,6 +15125,17 @@ bool MessagesManager::set_dialog_is_pinned(DialogListId dialog_list_id, Dialog *
return true;
}
void MessagesManager::save_pinned_folder_dialog_ids(const DialogList &list) const {
if (!list.dialog_list_id.is_folder() || !G()->parameters().use_message_db) {
return;
}
G()->td_db()->get_binlog_pmc()->set(
PSTRING() << "pinned_dialog_ids" << list.dialog_list_id.get_folder_id().get(),
implode(transform(list.pinned_dialogs_,
[](auto &pinned_dialog) { return PSTRING() << pinned_dialog.get_dialog_id().get(); }),
','));
}
void MessagesManager::set_dialog_reply_markup(Dialog *d, MessageId message_id) {
if (td_->auth_manager_->is_bot()) {
return;
@ -16777,8 +16783,9 @@ vector<DialogId> MessagesManager::get_dialogs(DialogListId dialog_list_id, Dialo
}
}
bool need_reload_pinned_dialogs = false;
if (!list.pinned_dialogs_.empty() && offset < list.pinned_dialogs_.back() && limit > 0) {
bool need_reload_pinned_dialogs = false;
bool need_remove_unknown_secret_chats = false;
for (auto &pinned_dialog : list.pinned_dialogs_) {
if (offset < pinned_dialog) {
auto dialog_id = pinned_dialog.get_dialog_id();
@ -16787,6 +16794,8 @@ vector<DialogId> MessagesManager::get_dialogs(DialogListId dialog_list_id, Dialo
LOG(ERROR) << "Failed to load pinned " << dialog_id << " from " << dialog_list_id;
if (dialog_id.get_type() != DialogType::SecretChat) {
need_reload_pinned_dialogs = true;
} else {
need_remove_unknown_secret_chats = true;
}
continue;
}
@ -16802,9 +16811,20 @@ vector<DialogId> MessagesManager::get_dialogs(DialogListId dialog_list_id, Dialo
}
}
}
}
if (need_reload_pinned_dialogs) {
reload_pinned_dialogs(dialog_list_id, Auto());
if (need_reload_pinned_dialogs) {
reload_pinned_dialogs(dialog_list_id, Auto());
}
if (need_remove_unknown_secret_chats) {
td::remove_if(list.pinned_dialogs_, [this, &list](const DialogDate &dialog_date) {
auto dialog_id = dialog_date.get_dialog_id();
if (dialog_id.get_type() == DialogType::SecretChat && !have_dialog_force(dialog_id, "get_dialogs 2")) {
list.pinned_dialog_id_orders_.erase(dialog_id);
return true;
}
return false;
});
save_pinned_folder_dialog_ids(list);
}
}
update_list_last_pinned_dialog_date(list);
@ -37510,7 +37530,7 @@ bool MessagesManager::do_update_list_last_pinned_dialog_date(DialogList &list) c
}
DialogDate max_dialog_date = MIN_DIALOG_DATE;
for (auto &pinned_dialog : list.pinned_dialogs_) {
for (const auto &pinned_dialog : list.pinned_dialogs_) {
if (!have_dialog(pinned_dialog.get_dialog_id())) {
break;
}

View File

@ -2601,6 +2601,8 @@ class MessagesManager final : public Actor {
bool set_dialog_is_pinned(DialogListId dialog_list_id, Dialog *d, bool is_pinned,
bool need_update_dialog_lists = true);
void save_pinned_folder_dialog_ids(const DialogList &list) const;
void set_dialog_is_marked_as_unread(Dialog *d, bool is_marked_as_unread);
void set_dialog_is_blocked(Dialog *d, bool is_blocked);