From ece581b797570b97009418804f33c3f4514e6de2 Mon Sep 17 00:00:00 2001 From: levlam Date: Mon, 12 Sep 2022 19:14:02 +0300 Subject: [PATCH] Load recent reactions. --- td/telegram/StickersManager.cpp | 90 +++++++++++++++++++++++++++++++++ td/telegram/StickersManager.h | 10 ++++ td/telegram/UpdatesManager.cpp | 1 + 3 files changed, 101 insertions(+) diff --git a/td/telegram/StickersManager.cpp b/td/telegram/StickersManager.cpp index 15497570f..5812c106f 100644 --- a/td/telegram/StickersManager.cpp +++ b/td/telegram/StickersManager.cpp @@ -93,6 +93,29 @@ class GetAvailableReactionsQuery final : public Td::ResultHandler { } }; +class GetRecentReactionsQuery final : public Td::ResultHandler { + public: + void send(int64 hash) { + send_query(G()->net_query_creator().create(telegram_api::messages_getRecentReactions(50, hash))); + } + + void on_result(BufferSlice packet) final { + auto result_ptr = fetch_result(packet); + if (result_ptr.is_error()) { + return on_error(result_ptr.move_as_error()); + } + + auto ptr = result_ptr.move_as_ok(); + LOG(INFO) << "Receive result for GetRecentReactionsQuery: " << to_string(ptr); + td_->stickers_manager_->on_get_recent_reactions(std::move(ptr)); + } + + void on_error(Status status) final { + LOG(INFO) << "Receive error for GetRecentReactionsQuery: " << status; + td_->stickers_manager_->on_get_recent_reactions(nullptr); + } +}; + class GetTopReactionsQuery final : public Td::ResultHandler { public: void send(int64 hash) { @@ -1530,6 +1553,16 @@ void StickersManager::reload_reactions() { td_->create_handler()->send(reactions_.hash_); } +void StickersManager::reload_recent_reactions() { + if (G()->close_flag() || recent_reactions_.is_being_reloaded_) { + return; + } + CHECK(!td_->auth_manager_->is_bot()); + recent_reactions_.is_being_reloaded_ = true; + load_recent_reactions(); // must be after is_being_reloaded_ is set to true to avoid recursion + td_->create_handler()->send(recent_reactions_.hash_); +} + void StickersManager::reload_top_reactions() { if (G()->close_flag() || top_reactions_.is_being_reloaded_) { return; @@ -3719,6 +3752,11 @@ void StickersManager::save_reactions() { G()->td_db()->get_binlog_pmc()->set("reactions", log_event_store(reactions_).as_slice().str()); } +void StickersManager::save_recent_reactions() { + LOG(INFO) << "Save recent reactions"; + G()->td_db()->get_binlog_pmc()->set("recent_reactions", log_event_store(recent_reactions_).as_slice().str()); +} + void StickersManager::save_top_reactions() { LOG(INFO) << "Save top reactions"; G()->td_db()->get_binlog_pmc()->set("top_reactions", log_event_store(top_reactions_).as_slice().str()); @@ -3771,6 +3809,27 @@ void StickersManager::load_reactions() { update_active_reactions(); } +void StickersManager::load_recent_reactions() { + if (are_recent_reactions_loaded_from_database_) { + return; + } + are_recent_reactions_loaded_from_database_ = true; + + string recent_reactions = G()->td_db()->get_binlog_pmc()->get("recent_reactions"); + if (recent_reactions.empty()) { + return reload_recent_reactions(); + } + + auto status = log_event_parse(recent_reactions_, recent_reactions); + if (status.is_error()) { + LOG(ERROR) << "Can't load recent reactions: " << status; + recent_reactions_ = {}; + return reload_recent_reactions(); + } + + LOG(INFO) << "Successfully loaded " << recent_reactions_.reactions_.size() << " recent reactions"; +} + void StickersManager::load_top_reactions() { if (are_top_reactions_loaded_from_database_) { return; @@ -3870,6 +3929,37 @@ void StickersManager::on_get_available_reactions( update_active_reactions(); } +void StickersManager::on_get_recent_reactions(tl_object_ptr &&reactions_ptr) { + CHECK(recent_reactions_.is_being_reloaded_); + recent_reactions_.is_being_reloaded_ = false; + + if (reactions_ptr == nullptr) { + // failed to get recent reactions + return; + } + + int32 constructor_id = reactions_ptr->get_id(); + if (constructor_id == telegram_api::messages_reactionsNotModified::ID) { + LOG(INFO) << "Top reactions are not modified"; + return; + } + + CHECK(constructor_id == telegram_api::messages_reactions::ID); + auto reactions = move_tl_object_as(reactions_ptr); + auto new_reactions = + transform(reactions->reactions_, [](const telegram_api::object_ptr &reaction) { + return get_message_reaction_string(reaction); + }); + if (new_reactions == recent_reactions_.reactions_ && recent_reactions_.hash_ == reactions->hash_) { + LOG(INFO) << "Top reactions are not modified"; + return; + } + recent_reactions_.reactions_ = std::move(new_reactions); + recent_reactions_.hash_ = reactions->hash_; + + save_recent_reactions(); +} + void StickersManager::on_get_top_reactions(tl_object_ptr &&reactions_ptr) { CHECK(top_reactions_.is_being_reloaded_); top_reactions_.is_being_reloaded_ = false; diff --git a/td/telegram/StickersManager.h b/td/telegram/StickersManager.h index b0fb9c38d..faf02a79f 100644 --- a/td/telegram/StickersManager.h +++ b/td/telegram/StickersManager.h @@ -175,12 +175,16 @@ class StickersManager final : public Actor { void reload_reactions(); + void reload_recent_reactions(); + void reload_top_reactions(); void reload_special_sticker_set_by_type(SpecialStickerSetType type, bool is_recursive = false); void on_get_available_reactions(tl_object_ptr &&available_reactions_ptr); + void on_get_recent_reactions(tl_object_ptr &&reactions_ptr); + void on_get_top_reactions(tl_object_ptr &&reactions_ptr); void on_get_installed_sticker_sets(StickerType sticker_type, @@ -846,12 +850,16 @@ class StickersManager final : public Actor { void save_reactions(); + void save_recent_reactions(); + void save_top_reactions(); void load_active_reactions(); void load_reactions(); + void load_recent_reactions(); + void load_top_reactions(); void update_active_reactions(); @@ -1035,9 +1043,11 @@ class StickersManager final : public Actor { Reactions reactions_; vector active_reactions_; + ReactionList recent_reactions_; ReactionList top_reactions_; bool are_reactions_loaded_from_database_ = false; + bool are_recent_reactions_loaded_from_database_ = false; bool are_top_reactions_loaded_from_database_ = false; FlatHashMap> emoji_language_codes_; diff --git a/td/telegram/UpdatesManager.cpp b/td/telegram/UpdatesManager.cpp index b65cc8db1..a691042a1 100644 --- a/td/telegram/UpdatesManager.cpp +++ b/td/telegram/UpdatesManager.cpp @@ -1710,6 +1710,7 @@ void UpdatesManager::try_reload_data() { td_->notification_settings_manager_->send_get_scope_notification_settings_query(NotificationSettingsScope::Channel, Auto()); td_->stickers_manager_->reload_reactions(); + td_->stickers_manager_->reload_recent_reactions(); td_->stickers_manager_->reload_top_reactions(); for (int32 type = 0; type < MAX_STICKER_TYPE; type++) { auto sticker_type = static_cast(type);