Fix updating is_pinned when receiving Dialog.
GitOrigin-RevId: 276719cb66e06d226146b09dfdc5b2cd588f989e
This commit is contained in:
parent
b8fa651764
commit
876c67d711
@ -13013,7 +13013,11 @@ void MessagesManager::on_get_dialogs(FolderId folder_id, vector<tl_object_ptr<te
|
||||
}
|
||||
|
||||
// set is_pinned only after updating dialog pos to ensure that order is initialized
|
||||
set_dialog_is_pinned(DialogListId(d->folder_id), d, (dialog->flags_ & DIALOG_FLAG_IS_PINNED) != 0);
|
||||
bool is_pinned = (dialog->flags_ & DIALOG_FLAG_IS_PINNED) != 0;
|
||||
bool was_pinned = get_dialog_pinned_order(DialogListId(d->folder_id), dialog_id) != DEFAULT_ORDER;
|
||||
if (is_pinned != was_pinned) {
|
||||
set_dialog_is_pinned(DialogListId(d->folder_id), d, is_pinned);
|
||||
}
|
||||
|
||||
if (!G()->parameters().use_message_db || is_new || !d->is_last_read_inbox_message_id_inited ||
|
||||
d->need_repair_server_unread_count) {
|
||||
@ -30614,6 +30618,10 @@ void MessagesManager::update_dialog_lists(
|
||||
bool is_in_list = new_order.order != DEFAULT_ORDER && new_order.private_order != 0;
|
||||
CHECK(was_in_list == is_dialog_in_list(d, dialog_list_id));
|
||||
|
||||
LOG(DEBUG) << "Updated position of " << dialog_id << " in " << dialog_list_id << " from " << old_order << " to "
|
||||
<< new_order;
|
||||
|
||||
bool need_update_unread_chat_count = false;
|
||||
if (was_in_list != is_in_list) {
|
||||
const int32 delta = was_in_list ? -1 : 1;
|
||||
list.in_memory_dialog_total_count_ += delta;
|
||||
@ -30630,7 +30638,7 @@ void MessagesManager::update_dialog_lists(
|
||||
}
|
||||
|
||||
if (!is_loaded_from_database) {
|
||||
bool need_update_unread_chat_count =
|
||||
need_update_unread_chat_count =
|
||||
list.is_dialog_unread_count_inited_ && old_order.total_dialog_count != get_dialog_total_count(list);
|
||||
auto unread_count = d->server_unread_count + d->local_unread_count;
|
||||
const char *change_source = was_in_list ? "on_dialog_leave" : "on_dialog_join";
|
||||
@ -30667,6 +30675,10 @@ void MessagesManager::update_dialog_lists(
|
||||
add_dialog_to_list(d, dialog_list_id);
|
||||
}
|
||||
}
|
||||
if (!need_update_unread_chat_count && !is_loaded_from_database && list.is_dialog_unread_count_inited_ &&
|
||||
old_order.total_dialog_count != get_dialog_total_count(list)) {
|
||||
send_update_unread_chat_count(list, dialog_id, true, "changed total count");
|
||||
}
|
||||
|
||||
if (need_send_update && need_send_update_chat_position(old_order, new_order)) {
|
||||
send_update_chat_position(dialog_list_id, d, source);
|
||||
@ -31135,13 +31147,8 @@ MessagesManager::get_dialog_orders(const Dialog *d) const {
|
||||
CHECK(d != nullptr);
|
||||
std::unordered_map<DialogListId, MessagesManager::DialogOrderInList, DialogListIdHash> orders;
|
||||
if (!td_->auth_manager_->is_bot()) {
|
||||
for (auto &dialog_list_id : get_dialog_list_ids(d)) {
|
||||
orders.emplace(dialog_list_id, get_dialog_order_in_list(get_dialog_list(dialog_list_id), d));
|
||||
}
|
||||
if (is_dialog_sponsored(d)) {
|
||||
CHECK(orders.empty());
|
||||
DialogListId dialog_list_id(FolderId::main());
|
||||
orders.emplace(dialog_list_id, get_dialog_order_in_list(get_dialog_list(dialog_list_id), d));
|
||||
for (auto &dialog_list : dialog_lists_) {
|
||||
orders.emplace(dialog_list.first, get_dialog_order_in_list(&dialog_list.second, d));
|
||||
}
|
||||
}
|
||||
return orders;
|
||||
@ -31705,7 +31712,11 @@ void MessagesManager::on_get_channel_difference(
|
||||
update_dialog_pos(d, "updates.channelDifferenceTooLong");
|
||||
|
||||
// set is_pinned only after updating dialog pos to ensure that order is initialized
|
||||
set_dialog_is_pinned(DialogListId(d->folder_id), d, (dialog->flags_ & DIALOG_FLAG_IS_PINNED) != 0);
|
||||
bool is_pinned = (dialog->flags_ & DIALOG_FLAG_IS_PINNED) != 0;
|
||||
bool was_pinned = get_dialog_pinned_order(DialogListId(d->folder_id), dialog_id) != DEFAULT_ORDER;
|
||||
if (is_pinned != was_pinned) {
|
||||
set_dialog_is_pinned(DialogListId(d->folder_id), d, is_pinned);
|
||||
}
|
||||
|
||||
set_channel_pts(d, new_pts, "channel difference too long");
|
||||
break;
|
||||
|
@ -1339,6 +1339,13 @@ class MessagesManager : public Actor {
|
||||
bool is_sponsored = false;
|
||||
|
||||
int32 total_dialog_count = 0;
|
||||
|
||||
friend StringBuilder &operator<<(StringBuilder &string_builder, const DialogOrderInList &order) {
|
||||
return string_builder << "order = " << order.order << ", private_order = " << order.private_order
|
||||
<< ", public_order = " << order.public_order << ", is_pinned = " << order.is_pinned
|
||||
<< ", is_sponsored = " << order.is_sponsored
|
||||
<< ", total_dialog_count = " << order.total_dialog_count;
|
||||
}
|
||||
};
|
||||
|
||||
class MessagesIteratorBase {
|
||||
|
Loading…
Reference in New Issue
Block a user