From 9df2ba6e64401d4f3106e2b40d351c9d1320b907 Mon Sep 17 00:00:00 2001 From: levlam Date: Tue, 23 Jan 2024 16:01:27 +0300 Subject: [PATCH] Add td_api::getSavedMessagesTags. --- td/generate/scheme/td_api.tl | 10 ++++ td/telegram/ReactionManager.cpp | 95 +++++++++++++++++++++++++++++++++ td/telegram/ReactionManager.h | 25 +++++++++ td/telegram/Td.cpp | 6 +++ td/telegram/Td.h | 2 + td/telegram/cli.cpp | 2 + 6 files changed, 140 insertions(+) diff --git a/td/generate/scheme/td_api.tl b/td/generate/scheme/td_api.tl index 2aab11b7d..252769dd6 100644 --- a/td/generate/scheme/td_api.tl +++ b/td/generate/scheme/td_api.tl @@ -1624,6 +1624,13 @@ chatAvailableReactionsAll = ChatAvailableReactions; chatAvailableReactionsSome reactions:vector = ChatAvailableReactions; +//@description Represents a tag used in Saved Messages @tag The tag @label Label of the tag; 0-12 characters @count Number of times the tag was used +savedMessagesTag tag:ReactionType label:string count:int32 = SavedMessagesTag; + +//@description Contains a list of tags used in Saved Messages @tags List of tags +savedMessagesTags tags:vector = SavedMessagesTags; + + //@description Describes a video chat //@group_call_id Group call identifier of an active video chat; 0 if none. Full information about the video chat can be received through the method getGroupCall //@has_participants True, if the video chat has participants @@ -7669,6 +7676,9 @@ getMessageAddedReactions chat_id:int53 message_id:int53 reaction_type:ReactionTy //@description Changes type of default reaction for the current user @reaction_type New type of the default reaction setDefaultReactionType reaction_type:ReactionType = Ok; +//@description Returns tags used in Saved Messages +getSavedMessagesTags = SavedMessagesTags; + //@description Searches for a given quote in a text. Returns found quote start position in UTF-16 code units. Returns a 404 error if the quote is not found. Can be called synchronously //@text Text in which to search for the quote diff --git a/td/telegram/ReactionManager.cpp b/td/telegram/ReactionManager.cpp index dd700828f..c2196a4b2 100644 --- a/td/telegram/ReactionManager.cpp +++ b/td/telegram/ReactionManager.cpp @@ -166,6 +166,49 @@ class SetDefaultReactionQuery final : public Td::ResultHandler { } }; +class GetSavedReactionTagsQuery final : public Td::ResultHandler { + Promise> promise_; + + public: + explicit GetSavedReactionTagsQuery( + Promise> &&promise) + : promise_(std::move(promise)) { + } + + void send(int64 hash) { + send_query(G()->net_query_creator().create(telegram_api::messages_getSavedReactionTags(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 GetSavedReactionTagsQuery: " << to_string(ptr); + promise_.set_value(std::move(ptr)); + } + + void on_error(Status status) final { + promise_.set_error(std::move(status)); + } +}; + +ReactionManager::SavedReactionTag::SavedReactionTag(telegram_api::object_ptr &&tag) + : reaction_type_(tag->reaction_), title_(std::move(tag->title_)), count_(tag->count_) { +} + +td_api::object_ptr ReactionManager::SavedReactionTag::get_saved_messages_tag_object() const { + return td_api::make_object(reaction_type_.get_reaction_type_object(), title_, count_); +} + +td_api::object_ptr ReactionManager::SavedReactionTags::get_saved_messages_tags_object() + const { + return td_api::make_object( + transform(tags_, [](const SavedReactionTag &tag) { return tag.get_saved_messages_tag_object(); })); +} + ReactionManager::ReactionManager(Td *td, ActorShared<> parent) : td_(td), parent_(std::move(parent)) { } @@ -652,6 +695,58 @@ void ReactionManager::send_set_default_reaction_query() { ReactionType(td_->option_manager_->get_option_string("default_reaction"))); } +void ReactionManager::get_saved_messages_tags(Promise> &&promise) { + if (tags_.is_inited_) { + // return promise.set_value(tags_.get_saved_messages_tags_object()); + } + + auto &promises = pending_get_saved_reaction_tags_queries_; + promises.push_back(std::move(promise)); + if (promises.size() != 1) { + return; + } + auto query_promise = PromiseCreator::lambda( + [actor_id = actor_id(this)](Result> r_tags) { + send_closure(actor_id, &ReactionManager::on_get_saved_messages_tags, std::move(r_tags)); + }); + td_->create_handler(std::move(query_promise))->send(tags_.hash_); +} + +void ReactionManager::on_get_saved_messages_tags( + Result> &&r_tags) { + G()->ignore_result_if_closing(r_tags); + auto promises = std::move(pending_get_saved_reaction_tags_queries_); + reset_to_empty(pending_get_saved_reaction_tags_queries_); + CHECK(!promises.empty()); + + if (r_tags.is_error()) { + return fail_promises(promises, r_tags.move_as_error()); + } + + auto tags_ptr = r_tags.move_as_ok(); + switch (tags_ptr->get_id()) { + case telegram_api::messages_savedReactionTagsNotModified::ID: + // nothing to do + break; + case telegram_api::messages_savedReactionTags::ID: { + auto tags = telegram_api::move_object_as(tags_ptr); + vector saved_reaction_tags; + for (auto &tag : tags->tags_) { + saved_reaction_tags.emplace_back(std::move(tag)); + } + tags_.tags_ = std::move(saved_reaction_tags); + tags_.hash_ = tags->hash_; + break; + } + default: + UNREACHABLE(); + } + + for (auto &promise : promises) { + promise.set_value(tags_.get_saved_messages_tags_object()); + } +} + void ReactionManager::get_current_state(vector> &updates) const { if (td_->auth_manager_->is_bot()) { return; diff --git a/td/telegram/ReactionManager.h b/td/telegram/ReactionManager.h index 91b6d337a..8750e6a06 100644 --- a/td/telegram/ReactionManager.h +++ b/td/telegram/ReactionManager.h @@ -66,6 +66,8 @@ class ReactionManager final : public Actor { void send_set_default_reaction_query(); + void get_saved_messages_tags(Promise> &&promise); + void get_current_state(vector> &updates) const; private: @@ -119,6 +121,24 @@ class ReactionManager final : public Actor { void parse(ParserT &parser); }; + struct SavedReactionTag { + ReactionType reaction_type_; + string title_; + int32 count_ = 0; + + explicit SavedReactionTag(telegram_api::object_ptr &&tag); + + td_api::object_ptr get_saved_messages_tag_object() const; + }; + + struct SavedReactionTags { + vector tags_; + int64 hash_ = 0; + bool is_inited_ = false; + + td_api::object_ptr get_saved_messages_tags_object() const; + }; + td_api::object_ptr get_emoji_reaction_object(const string &emoji) const; ReactionList &get_reaction_list(ReactionListType reaction_list_type); @@ -143,6 +163,8 @@ class ReactionManager final : public Actor { td_api::object_ptr get_update_active_emoji_reactions_object() const; + void on_get_saved_messages_tags(Result> &&r_tags); + Td *td_; ActorShared<> parent_; @@ -155,6 +177,9 @@ class ReactionManager final : public Actor { ReactionList reaction_lists_[MAX_REACTION_LIST_TYPE]; + SavedReactionTags tags_; + vector>> pending_get_saved_reaction_tags_queries_; + bool are_reactions_loaded_from_database_ = false; }; diff --git a/td/telegram/Td.cpp b/td/telegram/Td.cpp index cc76851f3..7297476a3 100644 --- a/td/telegram/Td.cpp +++ b/td/telegram/Td.cpp @@ -5460,6 +5460,12 @@ void Td::on_request(uint64 id, const td_api::setDefaultReactionType &request) { reaction_manager_->set_default_reaction(ReactionType(request.reaction_type_), std::move(promise)); } +void Td::on_request(uint64 id, const td_api::getSavedMessagesTags &request) { + CHECK_IS_USER(); + CREATE_REQUEST_PROMISE(); + reaction_manager_->get_saved_messages_tags(std::move(promise)); +} + void Td::on_request(uint64 id, td_api::getMessagePublicForwards &request) { CHECK_IS_USER(); CLEAN_INPUT_STRING(request.offset_); diff --git a/td/telegram/Td.h b/td/telegram/Td.h index 1eb511a47..3dea2ce85 100644 --- a/td/telegram/Td.h +++ b/td/telegram/Td.h @@ -793,6 +793,8 @@ class Td final : public Actor { void on_request(uint64 id, const td_api::setDefaultReactionType &request); + void on_request(uint64 id, const td_api::getSavedMessagesTags &request); + void on_request(uint64 id, td_api::getMessagePublicForwards &request); void on_request(uint64 id, td_api::getStoryPublicForwards &request); diff --git a/td/telegram/cli.cpp b/td/telegram/cli.cpp index 6f91ac751..77d9323c3 100644 --- a/td/telegram/cli.cpp +++ b/td/telegram/cli.cpp @@ -2864,6 +2864,8 @@ class CliClient final : public Actor { get_args(args, chat_id, message_id, reaction, offset, limit); send_request(td_api::make_object( chat_id, message_id, as_reaction_type(reaction), offset, as_limit(limit))); + } else if (op == "gsmts") { + send_request(td_api::make_object()); } else if (op == "gmpf") { ChatId chat_id; MessageId message_id;