diff --git a/td/generate/scheme/td_api.tl b/td/generate/scheme/td_api.tl index b3bf3a726..797ee1779 100644 --- a/td/generate/scheme/td_api.tl +++ b/td/generate/scheme/td_api.tl @@ -5177,6 +5177,9 @@ getCustomEmojiReactionAnimations = Files; //@message_id Identifier of the message getMessageAvailableReactions chat_id:int53 message_id:int53 = AvailableReactions; +//@description Clears the list of recently used reactions +clearRecentReactions = Ok; + //@description Adds a reaction to a message. Use getMessageAvailableReactions to receive the list of available reactions for the message //@chat_id Identifier of the chat to which the message belongs //@message_id Identifier of the message @@ -5632,7 +5635,7 @@ getRecentEmojiStatuses = EmojiStatuses; //@description Returns default emoji statuses getDefaultEmojiStatuses = EmojiStatuses; -//@description Clears recent emoji statuses +//@description Clears the list of recently used emoji statuses clearRecentEmojiStatuses = Ok; diff --git a/td/telegram/StickersManager.cpp b/td/telegram/StickersManager.cpp index 5812c106f..16e8d68db 100644 --- a/td/telegram/StickersManager.cpp +++ b/td/telegram/StickersManager.cpp @@ -139,6 +139,36 @@ class GetTopReactionsQuery final : public Td::ResultHandler { } }; +class ClearRecentReactionsQuery final : public Td::ResultHandler { + Promise promise_; + + public: + explicit ClearRecentReactionsQuery(Promise &&promise) : promise_(std::move(promise)) { + } + + void send() { + send_query(G()->net_query_creator().create(telegram_api::messages_clearRecentReactions())); + } + + 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()); + } + + td_->stickers_manager_->reload_recent_reactions(); + promise_.set_value(Unit()); + } + + void on_error(Status status) final { + if (!G()->is_expected_error(status)) { + LOG(ERROR) << "Receive error for clear recent reactions: " << status; + } + td_->stickers_manager_->reload_recent_reactions(); + promise_.set_error(std::move(status)); + } +}; + class GetAllStickersQuery final : public Td::ResultHandler { StickerType sticker_type_; @@ -1543,6 +1573,19 @@ td_api::object_ptr StickersManager::get_emoji_reaction_ob return nullptr; } +void StickersManager::clear_recent_reactions(Promise &&promise) { + load_recent_reactions(); + + if (recent_reactions_.reactions_.empty()) { + return promise.set_value(Unit()); + } + + recent_reactions_.hash_ = 0; + recent_reactions_.reactions_.clear(); + + td_->create_handler(std::move(promise))->send(); +} + void StickersManager::reload_reactions() { if (G()->close_flag() || reactions_.are_being_reloaded_) { return; diff --git a/td/telegram/StickersManager.h b/td/telegram/StickersManager.h index faf02a79f..6a2c1c165 100644 --- a/td/telegram/StickersManager.h +++ b/td/telegram/StickersManager.h @@ -173,6 +173,8 @@ class StickersManager final : public Actor { td_api::object_ptr get_emoji_reaction_object(const string &emoji); + void clear_recent_reactions(Promise &&promise); + void reload_reactions(); void reload_recent_reactions(); diff --git a/td/telegram/Td.cpp b/td/telegram/Td.cpp index b5a9b6f7b..6c0fc3542 100644 --- a/td/telegram/Td.cpp +++ b/td/telegram/Td.cpp @@ -5221,6 +5221,12 @@ void Td::on_request(uint64 id, const td_api::getMessageAvailableReactions &reque } } +void Td::on_request(uint64 id, const td_api::clearRecentReactions &request) { + CHECK_IS_USER(); + CREATE_OK_REQUEST_PROMISE(); + stickers_manager_->clear_recent_reactions(std::move(promise)); +} + void Td::on_request(uint64 id, td_api::addMessageReaction &request) { CHECK_IS_USER(); CREATE_OK_REQUEST_PROMISE(); diff --git a/td/telegram/Td.h b/td/telegram/Td.h index 433860e10..d63ebabda 100644 --- a/td/telegram/Td.h +++ b/td/telegram/Td.h @@ -662,6 +662,8 @@ class Td final : public Actor { void on_request(uint64 id, const td_api::getMessageAvailableReactions &request); + void on_request(uint64 id, const td_api::clearRecentReactions &request); + void on_request(uint64 id, td_api::addMessageReaction &request); void on_request(uint64 id, td_api::removeMessageReaction &request); diff --git a/td/telegram/cli.cpp b/td/telegram/cli.cpp index 1b9d08200..e5ba1374d 100644 --- a/td/telegram/cli.cpp +++ b/td/telegram/cli.cpp @@ -2247,6 +2247,8 @@ class CliClient final : public Actor { MessageId message_id; get_args(args, chat_id, message_id); send_request(td_api::make_object(chat_id, message_id)); + } else if (op == "crr") { + send_request(td_api::make_object()); } else if (op == "amr" || op == "react") { ChatId chat_id; MessageId message_id;