From d1172d8530eb039b612c6b1a54b4ae5861acd679 Mon Sep 17 00:00:00 2001 From: levlam Date: Wed, 23 Aug 2023 18:28:07 +0300 Subject: [PATCH] Allow to use getTopChats without chat info database. --- td/generate/scheme/td_api.tl | 2 +- td/telegram/TdDb.cpp | 2 +- td/telegram/TopDialogManager.cpp | 31 ++++++++++++++----------------- 3 files changed, 16 insertions(+), 19 deletions(-) diff --git a/td/generate/scheme/td_api.tl b/td/generate/scheme/td_api.tl index 227794612..2e19d5917 100644 --- a/td/generate/scheme/td_api.tl +++ b/td/generate/scheme/td_api.tl @@ -6371,7 +6371,7 @@ searchChatsOnServer query:string limit:int32 = Chats; //@location Current user location searchChatsNearby location:location = ChatsNearby; -//@description Returns a list of frequently used chats. Supported only if the chat info database is enabled @category Category of chats to be returned @limit The maximum number of chats to be returned; up to 30 +//@description Returns a list of frequently used chats @category Category of chats to be returned @limit The maximum number of chats to be returned; up to 30 getTopChats category:TopChatCategory limit:int32 = Chats; //@description Removes a chat from the list of frequently used chats. Supported only if the chat info database is enabled @category Category of frequently used chats @chat_id Chat identifier diff --git a/td/telegram/TdDb.cpp b/td/telegram/TdDb.cpp index fd60f7735..de78cbeba 100644 --- a/td/telegram/TdDb.cpp +++ b/td/telegram/TdDb.cpp @@ -421,7 +421,7 @@ Status TdDb::init_sqlite(const Parameters ¶meters, const DbKey &key, const D binlog_pmc.erase_by_prefix("unread_message_count"); binlog_pmc.erase_by_prefix("unread_dialog_count"); binlog_pmc.erase("sponsored_dialog_id"); - binlog_pmc.erase_by_prefix("top_dialogs"); + binlog_pmc.erase_by_prefix("top_dialogs#"); binlog_pmc.erase("dlds_counter"); binlog_pmc.erase_by_prefix("dlds#"); binlog_pmc.erase("fetched_marks_as_unread"); diff --git a/td/telegram/TopDialogManager.cpp b/td/telegram/TopDialogManager.cpp index 8dad3d92f..65208dfa0 100644 --- a/td/telegram/TopDialogManager.cpp +++ b/td/telegram/TopDialogManager.cpp @@ -277,11 +277,8 @@ void TopDialogManager::get_top_dialogs(TopDialogCategory category, int32 limit, if (limit <= 0) { return promise.set_error(Status::Error(400, "Limit must be positive")); } - if (!is_active_) { - return promise.set_error(Status::Error(400, "Not supported without chat info database")); - } if (!is_enabled_) { - return promise.set_error(Status::Error(400, "Top chats computation is disabled")); + return promise.set_error(Status::Error(400, "Top chat computation is disabled")); } GetTopDialogsQuery query; @@ -527,16 +524,17 @@ void TopDialogManager::on_get_top_peers(Resulttd_db()->get_binlog_pmc()->set(key, log_event_store(top_dialogs).as_slice().str()); + if (G()->use_chat_info_database()) { + auto top_dialog_category = TopDialogCategory(top_dialog_category_i); + auto key = PSTRING() << "top_dialogs#" << get_top_dialog_category_name(top_dialog_category); + G()->td_db()->get_binlog_pmc()->set(key, log_event_store(top_dialogs).as_slice().str()); + } } db_sync_state_ = SyncState::Ok; first_unsync_change_ = Timestamp(); @@ -555,7 +553,7 @@ void TopDialogManager::init() { return; } - is_active_ = G()->use_chat_info_database() && !td_->auth_manager_->is_bot(); + is_active_ = !td_->auth_manager_->is_bot(); is_enabled_ = !G()->get_option_boolean("disable_top_chats"); update_rating_e_decay(); @@ -587,10 +585,10 @@ void TopDialogManager::try_start() { if (last_server_sync_.is_in_past()) { server_sync_state_ = SyncState::Ok; } - is_synchronized_ = true; + is_synchronized_ = G()->use_chat_info_database(); } - if (is_enabled_) { + if (is_enabled_ && G()->use_chat_info_database()) { for (size_t top_dialog_category_i = 0; top_dialog_category_i < by_category_.size(); top_dialog_category_i++) { auto top_dialog_category = TopDialogCategory(top_dialog_category_i); auto key = PSTRING() << "top_dialogs#" << get_top_dialog_category_name(top_dialog_category); @@ -607,9 +605,7 @@ void TopDialogManager::try_start() { } else { G()->td_db()->get_binlog_pmc()->erase_by_prefix("top_dialogs#"); for (auto &top_dialogs : by_category_) { - top_dialogs.is_dirty = false; - top_dialogs.rating_timestamp = 0; - top_dialogs.dialogs.clear(); + top_dialogs = {}; } } db_sync_state_ = SyncState::Ok; @@ -632,7 +628,7 @@ void TopDialogManager::loop() { return; } - if (!pending_get_top_dialogs_.empty()) { + if (!pending_get_top_dialogs_.empty() && (is_synchronized_ || !is_enabled_)) { for (auto &query : pending_get_top_dialogs_) { do_get_top_dialogs(std::move(query)); } @@ -642,7 +638,8 @@ void TopDialogManager::loop() { // server sync Timestamp server_sync_timeout; if (server_sync_state_ == SyncState::Ok) { - server_sync_timeout = Timestamp::at(last_server_sync_.at() + SERVER_SYNC_DELAY); + server_sync_timeout = pending_get_top_dialogs_.empty() ? Timestamp::at(last_server_sync_.at() + SERVER_SYNC_DELAY) + : Timestamp::now_cached(); if (server_sync_timeout.is_in_past()) { server_sync_state_ = SyncState::None; } @@ -651,7 +648,7 @@ void TopDialogManager::loop() { Timestamp wakeup_timeout; if (server_sync_state_ == SyncState::Ok) { wakeup_timeout.relax(server_sync_timeout); - } else if (server_sync_state_ == SyncState::None && was_first_sync_) { + } else if (server_sync_state_ == SyncState::None && (was_first_sync_ || !pending_get_top_dialogs_.empty())) { server_sync_state_ = SyncState::Pending; do_get_top_peers(); }