From bf6345248fd6e9310eb54306af5700eedebe7386 Mon Sep 17 00:00:00 2001 From: levlam Date: Fri, 5 Jan 2024 15:21:35 +0300 Subject: [PATCH] Return keywords in searchEmojis. --- td/generate/scheme/td_api.tl | 12 +++++++++--- td/telegram/StickersManager.cpp | 18 ++++++++++-------- td/telegram/StickersManager.h | 6 +++--- td/telegram/Td.cpp | 10 +++++++--- 4 files changed, 29 insertions(+), 17 deletions(-) diff --git a/td/generate/scheme/td_api.tl b/td/generate/scheme/td_api.tl index 1ca317a39..e236dda05 100644 --- a/td/generate/scheme/td_api.tl +++ b/td/generate/scheme/td_api.tl @@ -3342,6 +3342,12 @@ userStatusLastWeek = UserStatus; userStatusLastMonth = UserStatus; +//@description Represents an emoji with its keyword @emoji The emoji @keyword The keyword +emojiKeyword emoji:string keyword:string = EmojiKeyword; + +//@description Represents a list of emoji with their keywords @emoji_keywords List of emoji with their keywords +emojiKeywords emoji_keywords:vector = EmojiKeywords; + //@description Represents a list of stickers @stickers List of stickers stickers stickers:vector = Stickers; @@ -8901,12 +8907,12 @@ removeFavoriteSticker sticker:InputFile = Ok; //@description Returns emoji corresponding to a sticker. The list is only for informational purposes, because a sticker is always sent with a fixed emoji from the corresponding Sticker object @sticker Sticker file identifier getStickerEmojis sticker:InputFile = Emojis; -//@description Searches for emojis by keywords. Supported only if the file database is enabled +//@description Searches for emojis by keywords. Supported only if the file database is enabled. Order of results is unspecified //@text Text to search for //@input_language_codes List of possible IETF language tags of the user's input language; may be empty if unknown -searchEmojis text:string input_language_codes:vector = Emojis; +searchEmojis text:string input_language_codes:vector = EmojiKeywords; -//@description Return emojis matching the keyword. Supported only if the file database is enabled +//@description Return emojis matching the keyword. Supported only if the file database is enabled. Order of results is unspecified //@text Text to search for //@input_language_codes List of possible IETF language tags of the user's input language; may be empty if unknown getKeywordEmojis text:string input_language_codes:vector = Emojis; diff --git a/td/telegram/StickersManager.cpp b/td/telegram/StickersManager.cpp index 50509bab5..f42ae191c 100644 --- a/td/telegram/StickersManager.cpp +++ b/td/telegram/StickersManager.cpp @@ -9478,13 +9478,14 @@ string StickersManager::get_language_emojis_database_key(const string &language_ return PSTRING() << "emoji$" << language_code << '$' << text; } -vector StickersManager::search_language_emojis(const string &language_code, const string &text) { +vector> StickersManager::search_language_emojis(const string &language_code, + const string &text) { LOG(INFO) << "Search emoji for \"" << text << "\" in language " << language_code; auto key = get_language_emojis_database_key(language_code, text); - vector result; - G()->td_db()->get_sqlite_sync_pmc()->get_by_prefix(key, [&result](Slice key, Slice value) { - for (auto &emoji : full_split(value, '$')) { - result.push_back(emoji.str()); + vector> result; + G()->td_db()->get_sqlite_sync_pmc()->get_by_prefix(key, [&text, &result](Slice key, Slice value) { + for (const auto &emoji : full_split(value, '$')) { + result.emplace_back(emoji.str(), PSTRING() << text << key); } return true; }); @@ -9889,14 +9890,15 @@ bool StickersManager::prepare_search_emoji_query(const string &text, const vecto return true; } -vector StickersManager::search_emojis(const string &text, const vector &input_language_codes, - bool force, Promise &&promise) { +vector> StickersManager::search_emojis(const string &text, + const vector &input_language_codes, bool force, + Promise &&promise) { SearchEmojiQuery query; if (!prepare_search_emoji_query(text, input_language_codes, force, promise, query)) { return {}; } - vector result; + vector> result; for (auto &language_code : query.language_codes_) { combine(result, search_language_emojis(language_code, query.text_)); } diff --git a/td/telegram/StickersManager.h b/td/telegram/StickersManager.h index 74cdf4afe..ebd2c5bfd 100644 --- a/td/telegram/StickersManager.h +++ b/td/telegram/StickersManager.h @@ -373,8 +373,8 @@ class StickersManager final : public Actor { vector get_sticker_emojis(const tl_object_ptr &input_file, Promise &&promise); - vector search_emojis(const string &text, const vector &input_language_codes, bool force, - Promise &&promise); + vector> search_emojis(const string &text, const vector &input_language_codes, + bool force, Promise &&promise); vector get_keyword_emojis(const string &text, const vector &input_language_codes, bool force, Promise &&promise); @@ -950,7 +950,7 @@ class StickersManager final : public Actor { void on_get_language_codes(const string &key, Result> &&result); - static vector search_language_emojis(const string &language_code, const string &text); + static vector> search_language_emojis(const string &language_code, const string &text); static vector get_keyword_language_emojis(const string &language_code, const string &text); diff --git a/td/telegram/Td.cpp b/td/telegram/Td.cpp index 424d22d61..a6b845e19 100644 --- a/td/telegram/Td.cpp +++ b/td/telegram/Td.cpp @@ -2294,14 +2294,18 @@ class SearchEmojisRequest final : public RequestActor<> { string text_; vector input_language_codes_; - vector emojis_; + vector> emoji_keywords_; void do_run(Promise &&promise) final { - emojis_ = td_->stickers_manager_->search_emojis(text_, input_language_codes_, get_tries() < 2, std::move(promise)); + emoji_keywords_ = + td_->stickers_manager_->search_emojis(text_, input_language_codes_, get_tries() < 2, std::move(promise)); } void do_send_result() final { - send_result(td_api::make_object(std::move(emojis_))); + send_result(td_api::make_object( + transform(emoji_keywords_, [](const std::pair &emoji_keyword) { + return td_api::make_object(emoji_keyword.first, emoji_keyword.second); + }))); } public: