diff --git a/td/telegram/ReactionManager.cpp b/td/telegram/ReactionManager.cpp index 378015aba..0cca44c13 100644 --- a/td/telegram/ReactionManager.cpp +++ b/td/telegram/ReactionManager.cpp @@ -15,12 +15,15 @@ #include "td/telegram/misc.h" #include "td/telegram/OptionManager.h" #include "td/telegram/ReactionManager.hpp" +#include "td/telegram/ReactionType.hpp" #include "td/telegram/StickerFormat.h" #include "td/telegram/StickersManager.h" #include "td/telegram/Td.h" #include "td/telegram/TdDb.h" #include "td/telegram/telegram_api.h" +#include "td/db/SqliteKeyValueAsync.h" + #include "td/utils/algorithm.h" #include "td/utils/buffer.h" #include "td/utils/FlatHashSet.h" @@ -254,6 +257,41 @@ td_api::object_ptr ReactionManager::SavedReactionTag:: return td_api::make_object(reaction_type_.get_reaction_type_object(), title_, count_); } +template +void ReactionManager::SavedReactionTag::store(StorerT &storer) const { + bool has_title = !title_.empty(); + bool has_count = count_ != 0; + BEGIN_STORE_FLAGS(); + STORE_FLAG(has_title); + STORE_FLAG(has_count); + END_STORE_FLAGS(); + td::store(reaction_type_, storer); + if (has_title) { + td::store(title_, storer); + } + if (has_count) { + td::store(count_, storer); + } +} + +template +void ReactionManager::SavedReactionTag::parse(ParserT &parser) { + bool has_title; + bool has_count; + BEGIN_PARSE_FLAGS(); + PARSE_FLAG(has_title); + PARSE_FLAG(has_count); + END_PARSE_FLAGS(); + td::parse(reaction_type_, parser); + hash_ = reaction_type_.get_hash(); + if (has_title) { + td::parse(title_, parser); + } + if (has_count) { + td::parse(count_, parser); + } +} + bool operator==(const ReactionManager::SavedReactionTag &lhs, const ReactionManager::SavedReactionTag &rhs) { return lhs.reaction_type_ == rhs.reaction_type_ && lhs.title_ == rhs.title_ && lhs.count_ == rhs.count_; } @@ -362,6 +400,23 @@ int64 ReactionManager::SavedReactionTags::calc_hash() const { return get_vector_hash(numbers); } +template +void ReactionManager::SavedReactionTags::store(StorerT &storer) const { + CHECK(is_inited_); + BEGIN_STORE_FLAGS(); + END_STORE_FLAGS(); + td::store(tags_, storer); +} + +template +void ReactionManager::SavedReactionTags::parse(ParserT &parser) { + BEGIN_PARSE_FLAGS(); + END_PARSE_FLAGS(); + td::parse(tags_, parser); + hash_ = calc_hash(); + is_inited_ = true; +} + ReactionManager::ReactionManager(Td *td, ActorShared<> parent) : td_(td), parent_(std::move(parent)) { } @@ -1002,6 +1057,10 @@ void ReactionManager::on_get_saved_messages_tags( } } +string ReactionManager::get_saved_messages_tags_database_key(SavedMessagesTopicId saved_messages_topic_id) { + return PSTRING() << "saved_messages_tags" << saved_messages_topic_id.get_unique_id(); +} + td_api::object_ptr ReactionManager::get_update_saved_messages_tags_object( SavedMessagesTopicId saved_messages_topic_id, const SavedReactionTags *tags) const { CHECK(tags != nullptr); @@ -1010,8 +1069,12 @@ td_api::object_ptr ReactionManager::get_update_ } void ReactionManager::send_update_saved_messages_tags(SavedMessagesTopicId saved_messages_topic_id, - const SavedReactionTags *tags) { + const SavedReactionTags *tags, bool from_database) { send_closure(G()->td(), &Td::send_update, get_update_saved_messages_tags_object(saved_messages_topic_id, tags)); + if (!from_database && G()->use_message_database()) { + G()->td_db()->get_sqlite_pmc()->set(get_saved_messages_tags_database_key(saved_messages_topic_id), + log_event_store(*tags).as_slice().str(), Promise()); + } } void ReactionManager::on_update_saved_reaction_tags(Promise &&promise) { diff --git a/td/telegram/ReactionManager.h b/td/telegram/ReactionManager.h index dd0f22e5b..d77a96e58 100644 --- a/td/telegram/ReactionManager.h +++ b/td/telegram/ReactionManager.h @@ -152,6 +152,12 @@ class ReactionManager final : public Actor { } td_api::object_ptr get_saved_messages_tag_object() const; + + template + void store(StorerT &storer) const; + + template + void parse(ParserT &parser); }; friend bool operator==(const SavedReactionTag &lhs, const SavedReactionTag &rhs); @@ -174,6 +180,12 @@ class ReactionManager final : public Actor { bool set_tag_title(const ReactionType &reaction_type, const string &title); int64 calc_hash() const; + + template + void store(StorerT &storer) const; + + template + void parse(ParserT &parser); }; td_api::object_ptr get_emoji_reaction_object(const string &emoji) const; @@ -210,10 +222,13 @@ class ReactionManager final : public Actor { void on_get_saved_messages_tags(SavedMessagesTopicId saved_messages_topic_id, Result> &&r_tags); + string get_saved_messages_tags_database_key(SavedMessagesTopicId saved_messages_topic_id); + td_api::object_ptr get_update_saved_messages_tags_object( SavedMessagesTopicId saved_messages_topic_id, const SavedReactionTags *tags) const; - void send_update_saved_messages_tags(SavedMessagesTopicId saved_messages_topic_id, const SavedReactionTags *tags); + void send_update_saved_messages_tags(SavedMessagesTopicId saved_messages_topic_id, const SavedReactionTags *tags, + bool from_database = false); Td *td_; ActorShared<> parent_; diff --git a/td/telegram/SavedMessagesTopicId.h b/td/telegram/SavedMessagesTopicId.h index f92ceaaa1..341da5802 100644 --- a/td/telegram/SavedMessagesTopicId.h +++ b/td/telegram/SavedMessagesTopicId.h @@ -53,6 +53,10 @@ class SavedMessagesTopicId { bool is_author_hidden() const; + int64 get_unique_id() const { + return dialog_id_.get(); + } + td_api::object_ptr get_saved_messages_topic_object(const Td *td) const; telegram_api::object_ptr get_input_peer(const Td *td) const;