diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index 2eb68ee7..eeca2114 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -9566,7 +9566,8 @@ bool MessagesManager::need_unread_counter(int64 dialog_order) { int32 MessagesManager::get_dialog_total_count(const DialogList &list) { if (list.server_dialog_total_count_ != -1 && list.secret_chat_total_count_ != -1) { - return list.server_dialog_total_count_ + list.secret_chat_total_count_; + return std::max(list.server_dialog_total_count_ + list.secret_chat_total_count_, + list.in_memory_dialog_total_count_); } if (list.last_dialog_date_ == MAX_DIALOG_DATE) { return list.in_memory_dialog_total_count_; @@ -9574,6 +9575,16 @@ int32 MessagesManager::get_dialog_total_count(const DialogList &list) { return list.in_memory_dialog_total_count_ + 1; } +void MessagesManager::repair_server_dialog_total_count(FolderId folder_id) { + if (td_->auth_manager_->is_bot()) { + return; + } + + send_closure(td_->create_net_actor(Promise()), &GetDialogListActor::send, folder_id, + 2147483647, ServerMessageId(), DialogId(), 1, + get_sequence_dispatcher_id(DialogId(), MessageContentType::None)); +} + void MessagesManager::recalc_unread_count(FolderId folder_id) { if (td_->auth_manager_->is_bot() || !G()->parameters().use_message_db) { return; @@ -11966,13 +11977,17 @@ void MessagesManager::on_get_dialogs(FolderId folder_id, vector(dialogs.size()); + } } if (from_pinned_dialog_list) { max_dialog_date = DialogDate(get_dialog_order(MessageId(), MIN_PINNED_DIALOG_DATE - 1), DialogId()); @@ -11987,6 +12002,7 @@ void MessagesManager::on_get_dialogs(FolderId folder_id, vectortop_message_)); if (!last_message_id.is_valid() && from_dialog_list) { // skip dialogs without messages + total_count--; continue; } @@ -12126,6 +12142,16 @@ void MessagesManager::on_get_dialogs(FolderId folder_id, vector= 0); + if (list.server_dialog_total_count_ != total_count) { + auto old_dialog_total_count = get_dialog_total_count(list); + list.server_dialog_total_count_ = total_count; + if (list.is_dialog_unread_count_inited_ && old_dialog_total_count != get_dialog_total_count(list)) { + send_update_unread_chat_count(folder_id, DialogId(), true, "on_get_dialogs"); + } + } + } if (from_pinned_dialog_list) { auto pinned_dialog_ids = remove_secret_chat_dialog_ids(get_pinned_dialogs(folder_id)); std::reverse(pinned_dialog_ids.begin(), pinned_dialog_ids.end()); diff --git a/td/telegram/MessagesManager.h b/td/telegram/MessagesManager.h index 9613c8cc..b39705b8 100644 --- a/td/telegram/MessagesManager.h +++ b/td/telegram/MessagesManager.h @@ -1941,6 +1941,8 @@ class MessagesManager : public Actor { static int32 get_dialog_total_count(const DialogList &list); + void repair_server_dialog_total_count(FolderId folder_id); + void recalc_unread_count(FolderId folder_id); td_api::object_ptr get_update_unread_message_count_object(