diff --git a/td/generate/scheme/td_api.tl b/td/generate/scheme/td_api.tl index e4ddee99b..1ca317a39 100644 --- a/td/generate/scheme/td_api.tl +++ b/td/generate/scheme/td_api.tl @@ -8903,9 +8903,13 @@ getStickerEmojis sticker:InputFile = Emojis; //@description Searches for emojis by keywords. Supported only if the file database is enabled //@text Text to search for -//@exact_match Pass true if only emojis, which exactly match the text, needs to be returned //@input_language_codes List of possible IETF language tags of the user's input language; may be empty if unknown -searchEmojis text:string exact_match:Bool input_language_codes:vector = Emojis; +searchEmojis text:string input_language_codes:vector = Emojis; + +//@description Return emojis matching the keyword. Supported only if the file database is enabled +//@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; //@description Returns available emojis categories @type Type of emoji categories to return; pass null to get default emoji categories getEmojiCategories type:EmojiCategoryType = EmojiCategories; diff --git a/td/telegram/StickersManager.cpp b/td/telegram/StickersManager.cpp index d0d9f0866..50509bab5 100644 --- a/td/telegram/StickersManager.cpp +++ b/td/telegram/StickersManager.cpp @@ -9478,23 +9478,24 @@ 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, - bool exact_match) { - LOG(INFO) << "Search for \"" << text << "\" in language " << language_code; +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); - if (exact_match) { - string emojis = G()->td_db()->get_sqlite_sync_pmc()->get(key); - return full_split(emojis, '$'); - } else { - 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()); - } - return true; - }); - return result; - } + 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()); + } + return true; + }); + return result; +} + +vector StickersManager::get_keyword_language_emojis(const string &language_code, const string &text) { + LOG(INFO) << "Get emoji for \"" << text << "\" in language " << language_code; + auto key = get_language_emojis_database_key(language_code, text); + string emojis = G()->td_db()->get_sqlite_sync_pmc()->get(key); + return full_split(emojis, '$'); } string StickersManager::get_emoji_language_codes_database_key(const vector &language_codes) { @@ -9786,7 +9787,7 @@ void StickersManager::on_get_emoji_keywords_difference( } } if (is_good) { - vector emojis = search_language_emojis(language_code, text, true); + vector emojis = get_keyword_language_emojis(language_code, text); bool is_changed = false; for (auto &emoji : keyword->emoticons_) { if (!td::contains(emojis, emoji)) { @@ -9806,7 +9807,7 @@ void StickersManager::on_get_emoji_keywords_difference( case telegram_api::emojiKeywordDeleted::ID: { auto keyword = telegram_api::move_object_as(keyword_ptr); auto text = utf8_to_lower(keyword->keyword_); - vector emojis = search_language_emojis(language_code, text, true); + vector emojis = get_keyword_language_emojis(language_code, text); bool is_changed = false; for (auto &emoji : keyword->emoticons_) { if (td::remove(emojis, emoji)) { @@ -9888,9 +9889,8 @@ bool StickersManager::prepare_search_emoji_query(const string &text, const vecto return true; } -vector StickersManager::search_emojis(const string &text, bool exact_match, - 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 {}; @@ -9898,7 +9898,24 @@ vector StickersManager::search_emojis(const string &text, bool exact_mat vector result; for (auto &language_code : query.language_codes_) { - combine(result, search_language_emojis(language_code, query.text_, exact_match)); + combine(result, search_language_emojis(language_code, query.text_)); + } + td::unique(result); + + promise.set_value(Unit()); + return result; +} + +vector StickersManager::get_keyword_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; + for (auto &language_code : query.language_codes_) { + combine(result, get_keyword_language_emojis(language_code, query.text_)); } td::unique(result); diff --git a/td/telegram/StickersManager.h b/td/telegram/StickersManager.h index d3db61a60..74cdf4afe 100644 --- a/td/telegram/StickersManager.h +++ b/td/telegram/StickersManager.h @@ -373,8 +373,11 @@ class StickersManager final : public Actor { vector get_sticker_emojis(const tl_object_ptr &input_file, Promise &&promise); - vector search_emojis(const string &text, bool exact_match, 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); int64 get_emoji_suggestions_url(const string &language_code, Promise &&promise); @@ -947,7 +950,9 @@ 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, bool exact_match); + 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); void load_emoji_keywords(const string &language_code, Promise &&promise); diff --git a/td/telegram/Td.cpp b/td/telegram/Td.cpp index 8e487dc54..424d22d61 100644 --- a/td/telegram/Td.cpp +++ b/td/telegram/Td.cpp @@ -2292,14 +2292,12 @@ class GetStickerEmojisRequest final : public RequestActor<> { class SearchEmojisRequest final : public RequestActor<> { string text_; - bool exact_match_; vector input_language_codes_; vector emojis_; void do_run(Promise &&promise) final { - emojis_ = td_->stickers_manager_->search_emojis(text_, exact_match_, input_language_codes_, get_tries() < 2, - std::move(promise)); + emojis_ = td_->stickers_manager_->search_emojis(text_, input_language_codes_, get_tries() < 2, std::move(promise)); } void do_send_result() final { @@ -2307,11 +2305,33 @@ class SearchEmojisRequest final : public RequestActor<> { } public: - SearchEmojisRequest(ActorShared td, uint64 request_id, string &&text, bool exact_match, - vector &&input_language_codes) + SearchEmojisRequest(ActorShared td, uint64 request_id, string &&text, vector &&input_language_codes) + : RequestActor(std::move(td), request_id) + , text_(std::move(text)) + , input_language_codes_(std::move(input_language_codes)) { + set_tries(3); + } +}; + +class GetKeywordEmojisRequest final : public RequestActor<> { + string text_; + vector input_language_codes_; + + vector emojis_; + + void do_run(Promise &&promise) final { + emojis_ = + td_->stickers_manager_->get_keyword_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_))); + } + + public: + GetKeywordEmojisRequest(ActorShared td, uint64 request_id, string &&text, vector &&input_language_codes) : RequestActor(std::move(td), request_id) , text_(std::move(text)) - , exact_match_(exact_match) , input_language_codes_(std::move(input_language_codes)) { set_tries(3); } @@ -7939,8 +7959,16 @@ void Td::on_request(uint64 id, td_api::searchEmojis &request) { for (auto &input_language_code : request.input_language_codes_) { CLEAN_INPUT_STRING(input_language_code); } - CREATE_REQUEST(SearchEmojisRequest, std::move(request.text_), request.exact_match_, - std::move(request.input_language_codes_)); + CREATE_REQUEST(SearchEmojisRequest, std::move(request.text_), std::move(request.input_language_codes_)); +} + +void Td::on_request(uint64 id, td_api::getKeywordEmojis &request) { + CHECK_IS_USER(); + CLEAN_INPUT_STRING(request.text_); + for (auto &input_language_code : request.input_language_codes_) { + CLEAN_INPUT_STRING(input_language_code); + } + CREATE_REQUEST(GetKeywordEmojisRequest, std::move(request.text_), std::move(request.input_language_codes_)); } void Td::on_request(uint64 id, const td_api::getEmojiCategories &request) { diff --git a/td/telegram/Td.h b/td/telegram/Td.h index b91532046..33edf11c4 100644 --- a/td/telegram/Td.h +++ b/td/telegram/Td.h @@ -1445,6 +1445,8 @@ class Td final : public Actor { void on_request(uint64 id, td_api::searchEmojis &request); + void on_request(uint64 id, td_api::getKeywordEmojis &request); + void on_request(uint64 id, const td_api::getEmojiCategories &request); void on_request(uint64 id, td_api::getAnimatedEmoji &request); diff --git a/td/telegram/cli.cpp b/td/telegram/cli.cpp index 795cb70a3..9b539a9cd 100644 --- a/td/telegram/cli.cpp +++ b/td/telegram/cli.cpp @@ -3454,11 +3454,13 @@ class CliClient final : public Actor { } else if (op == "gse") { send_request(td_api::make_object(as_input_file_id(args))); } else if (op == "se") { - send_request(td_api::make_object(args, false, vector())); - } else if (op == "see") { - send_request(td_api::make_object(args, true, vector())); + send_request(td_api::make_object(args, vector())); } else if (op == "seru") { - send_request(td_api::make_object(args, false, vector{"ru_RU"})); + send_request(td_api::make_object(args, vector{"ru_RU"})); + } else if (op == "gke") { + send_request(td_api::make_object(args, vector())); + } else if (op == "gkeru") { + send_request(td_api::make_object(args, vector{"ru_RU"})); } else if (op == "gec" || op == "geces" || op == "geccp") { auto type = [&]() -> td_api::object_ptr { if (op == "geces") {