From 071d232908f4a5dc48b796741a5d1df2ddf8eb6b Mon Sep 17 00:00:00 2001 From: levlam Date: Wed, 7 Feb 2024 19:45:06 +0300 Subject: [PATCH] Add td_api::updateSavedMessagesTopicCount. --- td/generate/scheme/td_api.tl | 3 ++ td/telegram/SavedMessagesManager.cpp | 57 +++++++++++++++++++++++----- td/telegram/SavedMessagesManager.h | 11 ++++++ 3 files changed, 62 insertions(+), 9 deletions(-) diff --git a/td/generate/scheme/td_api.tl b/td/generate/scheme/td_api.tl index afb1f51e1..2cfc7c554 100644 --- a/td/generate/scheme/td_api.tl +++ b/td/generate/scheme/td_api.tl @@ -6510,6 +6510,9 @@ updateChatOnlineMemberCount chat_id:int53 online_member_count:int32 = Update; //@topic New data about the topic updateSavedMessagesTopic topic:savedMessagesTopic = Update; +//@description Number of Saved Messages topics has changed @topic_count Approximate total number of Saved Messages topics +updateSavedMessagesTopicCount topic_count:int32 = Update; + //@description Basic information about a topic in a forum chat was changed @chat_id Chat identifier @info New information about the topic updateForumTopicInfo chat_id:int53 info:forumTopicInfo = Update; diff --git a/td/telegram/SavedMessagesManager.cpp b/td/telegram/SavedMessagesManager.cpp index 9c012ef0f..56e6f4e0c 100644 --- a/td/telegram/SavedMessagesManager.cpp +++ b/td/telegram/SavedMessagesManager.cpp @@ -473,6 +473,8 @@ void SavedMessagesManager::on_topic_changed(SavedMessagesTopic *topic, const cha << source; send_update_saved_messages_topic(topic, source); + + update_saved_messages_topic_sent_total_count(source); } void SavedMessagesManager::load_saved_messages_topics(int32 limit, Promise &&promise) { @@ -648,6 +650,17 @@ void SavedMessagesManager::on_get_saved_messages_topics( on_topic_changed(topic, "on_get_saved_messages_topics"); } + if (!is_pinned) { + topic_list_.server_total_count_ = total_count; + + topic_list_.offset_date_ = last_message_date; + topic_list_.offset_dialog_id_ = last_dialog_id; + topic_list_.offset_message_id_ = last_message_id; + } else if (topic_list_.server_total_count_ <= total_count) { + topic_list_.server_total_count_ = total_count + 1; + } + update_saved_messages_topic_sent_total_count("on_get_saved_messages_topics"); + if (is_pinned) { if (!topic_list_.are_pinned_saved_messages_topics_inited_ && total_count < limit) { get_saved_dialogs(limit - total_count, std::move(promise)); @@ -658,22 +671,18 @@ void SavedMessagesManager::on_get_saved_messages_topics( set_last_topic_date({MIN_PINNED_TOPIC_ORDER - 1, SavedMessagesTopicId()}); } else if (is_last) { set_last_topic_date(MAX_TOPIC_DATE); + + if (dialogs.empty()) { + return promise.set_error(Status::Error(404, "Not Found")); + } } else if (last_message_date > 0) { set_last_topic_date({get_topic_order(last_message_date, last_message_id), SavedMessagesTopicId(last_dialog_id)}); } else { LOG(ERROR) << "Receive no suitable topics"; set_last_topic_date(MAX_TOPIC_DATE); + return promise.set_error(Status::Error(404, "Not Found")); } - if (!is_pinned) { - topic_list_.offset_date_ = last_message_date; - topic_list_.offset_dialog_id_ = last_dialog_id; - topic_list_.offset_message_id_ = last_message_id; - - if (is_last && dialogs.empty()) { - return promise.set_error(Status::Error(404, "Not Found")); - } - } promise.set_value(Unit()); } @@ -714,6 +723,32 @@ int64 SavedMessagesManager::get_next_pinned_saved_messages_topic_order() { return current_pinned_saved_messages_topic_order_; } +td_api::object_ptr +SavedMessagesManager::get_update_saved_messages_topic_count_object() const { + CHECK(topic_list_.sent_total_count_ != -1); + return td_api::make_object(topic_list_.sent_total_count_); +} + +void SavedMessagesManager::update_saved_messages_topic_sent_total_count(const char *source) { + if (td_->auth_manager_->is_bot()) { + return; + } + if (topic_list_.server_total_count_ == -1) { + return; + } + LOG(INFO) << "Update Saved Messages topic sent total count from " << source; + auto new_total_count = static_cast(topic_list_.ordered_topics_.size()); + if (topic_list_.last_topic_date_ != MAX_TOPIC_DATE) { + new_total_count = max(new_total_count, topic_list_.server_total_count_); + } else if (topic_list_.server_total_count_ != new_total_count) { + topic_list_.server_total_count_ = new_total_count; + } + if (topic_list_.sent_total_count_ != new_total_count) { + topic_list_.sent_total_count_ = new_total_count; + send_closure(G()->td(), &Td::send_update, get_update_saved_messages_topic_count_object()); + } +} + bool SavedMessagesManager::set_pinned_saved_messages_topics(vector saved_messages_topic_ids) { if (topic_list_.pinned_saved_messages_topic_ids_ == saved_messages_topic_ids) { return false; @@ -989,6 +1024,10 @@ void SavedMessagesManager::get_current_state(vector pinned_saved_messages_topic_ids_; bool are_pinned_saved_messages_topics_inited_ = false; @@ -179,6 +186,10 @@ class SavedMessagesManager final : public Actor { void send_update_saved_messages_topic(const SavedMessagesTopic *topic, const char *source) const; + td_api::object_ptr get_update_saved_messages_topic_count_object() const; + + void update_saved_messages_topic_sent_total_count(const char *source); + Td *td_; ActorShared<> parent_;