From de1bf02774d66171e438dcb24aaa3e961bb4a726 Mon Sep 17 00:00:00 2001 From: levlam Date: Thu, 26 Dec 2019 21:44:35 +0300 Subject: [PATCH] Add updateUnreadChatCount.total_count. GitOrigin-RevId: e53105b6b7e185fbe68714948a606465d349d0cd --- td/generate/scheme/td_api.tl | 3 +- td/generate/scheme/td_api.tlo | Bin 166060 -> 166096 bytes td/telegram/MessagesManager.cpp | 82 +++++++++++++++++++++++++------- td/telegram/MessagesManager.h | 6 ++- 4 files changed, 72 insertions(+), 19 deletions(-) diff --git a/td/generate/scheme/td_api.tl b/td/generate/scheme/td_api.tl index b2e45c9c8..86f1a5b52 100644 --- a/td/generate/scheme/td_api.tl +++ b/td/generate/scheme/td_api.tl @@ -2894,9 +2894,10 @@ updateUnreadMessageCount chat_list:ChatList unread_count:int32 unread_unmuted_co //@description Number of unread chats, i.e. with unread messages or marked as unread, has changed. This update is sent only if a message database is used //@chat_list The chat list with changed number of unread messages +//@total_count Approximate total number of chats in the chat list //@unread_count Total number of unread chats @unread_unmuted_count Total number of unread unmuted chats //@marked_as_unread_count Total number of chats marked as unread @marked_as_unread_unmuted_count Total number of unmuted chats marked as unread -updateUnreadChatCount chat_list:ChatList unread_count:int32 unread_unmuted_count:int32 marked_as_unread_count:int32 marked_as_unread_unmuted_count:int32 = Update; +updateUnreadChatCount chat_list:ChatList total_count:int32 unread_count:int32 unread_unmuted_count:int32 marked_as_unread_count:int32 marked_as_unread_unmuted_count:int32 = Update; //@description An option changed its value @name The option name @value The new option value updateOption name:string value:OptionValue = Update; diff --git a/td/generate/scheme/td_api.tlo b/td/generate/scheme/td_api.tlo index 1fc4074b1128b48f9873942d805178fb061f609f..c55c3ac8849cd81816e88d9c22aa1e1aa465dcf7 100644 GIT binary patch delta 1872 zcmZ8iU1%It6z&<*It`1aQgOjm23&Qa6B?-Csv{ ~zjDt>mFfAGQ!}9wKaQl!E)P zqSyxm&1Q5@em2P_-86rjbhi1~rZlojkUZpJK!gY>ZXpi^^AN#42o;>!d%wxXJe~c{ zcfRwTbMKuL()CWd-Zmq3&%XHN#@De(DHb8~O7$1#ZjvFQ%1sJaBg?tiBp{=oWR&Qq zPJwOqlYZP2`u&#|OvSqJ-Aml?90gcQgWH)V(TY=P%8RPV05FG?80Qau4#=*VYov2b zQ(osbi#kMA){;r~s;tL?9bn=$W3+*0!t0jb>ZddV2xNzV7)_dG%B^*DY zjw4}=Lpe8&maa-8KN+VtrK_CZ(mRdoIn)*oC+a59*O)+sw<+HGL<#fxAz-@`2dir2 zmPtA-`t(l1fZd`PygiAVrQV{5f7MlJpBIc@_g|+{5G02OtCqG9h59g%;(y;^_ip|jLc|9PV8 za_`5jmwS4SR3BN_0<;JHXlnr;v_&Y!7OC&#{}s;;JosmN&?ye&Da^(l z+7QO-Y`jqYsv-|DX+yeTQ$p~xBCuEy@2szg!+v_!o%V4N-`>dGnwv)as7S3sCFdqY zv~`zE5rvkZY%Y;}^93K;_?Wta1M6MEjmWN`$KDERwKa;dQKIu~ zuY$L|T61(qxn+$`dlcDsrzC4FXD!IuJ=zq0_U^%js|jok-2Jg2H{GXx!QHqoXSA9Z zU3`_Imice_@He&L0X!NHpq%ir{WmCR+35y${-6+7d_1s@tEjJ|D!wk~F4^l8|2gR0 T4e#HZcj0P3-ciS#cUw-Fz ze!p|hcfQ0`x29GyH8RfBzH#;nh2?4Q3bocw!tM=8C_GBu$r_~| ziQOF~{W(|Y_g`K#6!GEZm$~tI3UDw1Zcl=w6~_~llUdqTVA+6Ta?by1U-eu${)9~K z5@gDZv_Qbk5D)%p5q6vE)pd<@c{-@;j*rzG+NbC(Ng4hDg&mO9Bn4$uPa@i%grURJ zMcD`j&UZYktM7hy+ijQk{2c3?;uYD;(6K&I!lLm+;AoD`Xgk!c92ft6`i6AvNdb?i zXh>p@Q_u>IVF<1n4IgS6KQslMt#Ndc8;80*4s~M!(f9=QOUL~QYL};A zn$F78NcylN@1;TRoP?+~NduC6ZxW*J$oOF9*3^-J?O%qPK_HxgayA1?N98#GlOb

AH;uavPb0&f7gtX!t=u&RY=8R5z#=oyi_M^d^b7`}UMJ1pbCsuO z=U5%pFUQST#%=Zn{I zBC3S=qb2%AD&Jc=6eTy>Cai?o>ORI}-siVh8v5?rYbP5nSOceGgB_=$(POp8I&c#v zDgU&46U77zD9|j>NYm4bfBtd#SFRSQ*)Oi1Us$F#ju)s$RNtxNt!0YJDzzeBt@)+m z{VHUOkhhCuNnYm)u-FP-U2z51AM9{i53J&+*jPniXqCF8z#Si}u96|K$QnegHR_X? z4J^4%X$fW5A-B8kjU~AONZ-J7}y e_ma|5dbC54pPOCG{p)i#@bLdb$%reL)c*lbuFJgu diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index d77a11e12..2eb68ee71 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -9564,6 +9564,16 @@ bool MessagesManager::need_unread_counter(int64 dialog_order) { return dialog_order != DEFAULT_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_; + } + if (list.last_dialog_date_ == MAX_DIALOG_DATE) { + return list.in_memory_dialog_total_count_; + } + return list.in_memory_dialog_total_count_ + 1; +} + void MessagesManager::recalc_unread_count(FolderId folder_id) { if (td_->auth_manager_->is_bot() || !G()->parameters().use_message_db) { return; @@ -9578,19 +9588,21 @@ void MessagesManager::recalc_unread_count(FolderId folder_id) { list.is_message_unread_count_inited_ = true; list.is_dialog_unread_count_inited_ = true; - int32 total_count = 0; - int32 muted_count = 0; + int32 message_total_count = 0; + int32 message_muted_count = 0; int32 dialog_total_count = 0; int32 dialog_muted_count = 0; int32 dialog_marked_count = 0; int32 dialog_muted_marked_count = 0; + int32 server_dialog_total_count = 0; + int32 secret_chat_total_count = 0; for (const auto &dialog_date : list.ordered_server_dialogs_) { auto dialog_id = dialog_date.get_dialog_id(); Dialog *d = get_dialog(dialog_id); CHECK(d != nullptr); int unread_count = d->server_unread_count + d->local_unread_count; if (need_unread_counter(d->order) && (unread_count > 0 || d->is_marked_as_unread)) { - total_count += unread_count; + message_total_count += unread_count; dialog_total_count++; if (unread_count == 0 && d->is_marked_as_unread) { dialog_marked_count++; @@ -9598,23 +9610,39 @@ void MessagesManager::recalc_unread_count(FolderId folder_id) { LOG(DEBUG) << "Have " << unread_count << " messages in " << dialog_id; if (is_dialog_muted(d)) { - muted_count += unread_count; + message_muted_count += unread_count; dialog_muted_count++; if (unread_count == 0 && d->is_marked_as_unread) { dialog_muted_marked_count++; } } } + if (d->order != DEFAULT_ORDER) { + if (dialog_id.get_type() == DialogType::SecretChat) { + secret_chat_total_count++; + } else { + server_dialog_total_count++; + } + } } - if (list.unread_message_total_count_ != total_count || list.unread_message_muted_count_ != muted_count) { - list.unread_message_total_count_ = total_count; - list.unread_message_muted_count_ = muted_count; + if (list.unread_message_total_count_ != message_total_count || + list.unread_message_muted_count_ != message_muted_count) { + list.unread_message_total_count_ = message_total_count; + list.unread_message_muted_count_ = message_muted_count; send_update_unread_message_count(folder_id, DialogId(), true, "recalc_unread_count"); } + + auto old_dialog_total_count = get_dialog_total_count(list); + if (list.last_dialog_date_ == MAX_DIALOG_DATE && (server_dialog_total_count != list.server_dialog_total_count_ || + secret_chat_total_count != list.secret_chat_total_count_)) { + list.server_dialog_total_count_ = server_dialog_total_count; + list.secret_chat_total_count_ = secret_chat_total_count; + } if (list.unread_dialog_total_count_ != dialog_total_count || list.unread_dialog_muted_count_ != dialog_muted_count || list.unread_dialog_marked_count_ != dialog_marked_count || - list.unread_dialog_muted_marked_count_ != dialog_muted_marked_count) { + list.unread_dialog_muted_marked_count_ != dialog_muted_marked_count || + old_dialog_total_count != get_dialog_total_count(list)) { list.unread_dialog_total_count_ = dialog_total_count; list.unread_dialog_muted_count_ = dialog_muted_count; list.unread_dialog_marked_count_ = dialog_marked_count; @@ -27988,13 +28016,25 @@ bool MessagesManager::set_dialog_order(Dialog *d, int64 new_order, bool need_sen bool is_removed_from_folder = new_order == DEFAULT_ORDER; bool is_added_to_folder = d->order == DEFAULT_ORDER; - if (is_removed_from_folder) { - list.in_memory_total_count_--; - } else if (is_added_to_folder) { - list.in_memory_total_count_++; + auto old_dialog_total_count = get_dialog_total_count(list); + if (is_removed_from_folder || is_added_to_folder) { + int32 delta = is_removed_from_folder ? -1 : 1; + list.in_memory_dialog_total_count_ += delta; + if (!is_loaded_from_database) { + int32 &total_count = dialog_id.get_type() == DialogType::SecretChat ? list.secret_chat_total_count_ + : list.server_dialog_total_count_; + if (total_count != -1) { + total_count += delta; + if (total_count < 0) { + LOG(ERROR) << "Total chat count became negative after leaving " << dialog_id; + total_count = 0; + } + } + } } - CHECK(static_cast(list.ordered_dialogs_.size()) <= list.in_memory_total_count_); - CHECK(static_cast(list.in_memory_total_count_) <= list.ordered_server_dialogs_.size()); + bool need_update_unread_chat_count = old_dialog_total_count != get_dialog_total_count(list); + CHECK(static_cast(list.ordered_dialogs_.size()) <= list.in_memory_dialog_total_count_); + CHECK(static_cast(list.in_memory_dialog_total_count_) <= list.ordered_server_dialogs_.size()); if (!is_loaded_from_database && had_unread_counter != has_unread_counter && !td_->auth_manager_->is_bot()) { auto unread_count = d->server_unread_count + d->local_unread_count; @@ -28030,6 +28070,7 @@ bool MessagesManager::set_dialog_order(Dialog *d, int64 new_order, bool need_sen list.unread_dialog_muted_marked_count_ += delta; } } + need_update_unread_chat_count = false; send_update_unread_chat_count(d->folder_id, dialog_id, true, change_source); } @@ -28045,6 +28086,9 @@ bool MessagesManager::set_dialog_order(Dialog *d, int64 new_order, bool need_sen clear_active_dialog_actions(dialog_id); } } + if (list.is_dialog_unread_count_inited_ && need_update_unread_chat_count) { + send_update_unread_chat_count(d->folder_id, dialog_id, true, "changed total_count"); + } d->order = new_order; @@ -28094,7 +28138,11 @@ void MessagesManager::update_last_dialog_date(FolderId folder_id) { } if (list.last_dialog_date_ == MAX_DIALOG_DATE) { + bool need_update_unread_chat_count = list.server_dialog_total_count_ == -1 || list.secret_chat_total_count_ == -1; recalc_unread_count(folder_id); + if (list.is_dialog_unread_count_inited_ && need_update_unread_chat_count) { + send_update_unread_chat_count(folder_id, DialogId(), true, "update_last_dialog_date"); + } } } @@ -30159,9 +30207,9 @@ td_api::object_ptr MessagesManager::get_update_un } } - return td_api::make_object(get_chat_list_object(folder_id), unread_count, - unread_unmuted_count, unread_marked_count, - unread_unmuted_marked_count); + return td_api::make_object( + get_chat_list_object(folder_id), get_dialog_total_count(list), unread_count, unread_unmuted_count, + unread_marked_count, unread_unmuted_marked_count); } void MessagesManager::get_current_state(vector> &updates) const { diff --git a/td/telegram/MessagesManager.h b/td/telegram/MessagesManager.h index 07cdf6a30..9613c8cc1 100644 --- a/td/telegram/MessagesManager.h +++ b/td/telegram/MessagesManager.h @@ -1213,7 +1213,9 @@ class MessagesManager : public Actor { int32 unread_dialog_muted_count_ = 0; int32 unread_dialog_marked_count_ = 0; int32 unread_dialog_muted_marked_count_ = 0; - int32 in_memory_total_count_ = 0; + int32 in_memory_dialog_total_count_ = 0; + int32 server_dialog_total_count_ = -1; + int32 secret_chat_total_count_ = -1; std::set ordered_dialogs_; // all dialogs with date <= last_dialog_date_ std::set ordered_server_dialogs_; // all known dialogs, including with default order @@ -1937,6 +1939,8 @@ class MessagesManager : public Actor { static bool need_unread_counter(int64 dialog_order); + static int32 get_dialog_total_count(const DialogList &list); + void recalc_unread_count(FolderId folder_id); td_api::object_ptr get_update_unread_message_count_object(