From c96f62b34f77f79f2eb0262c0210f34e5f2e355e Mon Sep 17 00:00:00 2001 From: levlam Date: Wed, 22 Apr 2020 15:02:56 +0300 Subject: [PATCH] Assume Russian language in searchEmojis with Cyrillic text. GitOrigin-RevId: e9f0212882bafadde17f49a345847f4df8010e73 --- td/telegram/StickersManager.cpp | 20 ++++++++++++++++++-- td/telegram/StickersManager.h | 3 ++- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/td/telegram/StickersManager.cpp b/td/telegram/StickersManager.cpp index fc30cbe8b..c657288cf 100644 --- a/td/telegram/StickersManager.cpp +++ b/td/telegram/StickersManager.cpp @@ -5770,7 +5770,8 @@ void StickersManager::on_get_language_codes(const string &key, Result StickersManager::get_emoji_language_codes(const string &input_language_code, Promise &promise) { +vector StickersManager::get_emoji_language_codes(const string &input_language_code, Slice text, + Promise &promise) { vector language_codes = td_->language_pack_manager_->get_actor_unsafe()->get_used_language_codes(); auto system_language_code = G()->mtproto_header().get_system_language_code(); if (!system_language_code.empty() && system_language_code.find('$') == string::npos) { @@ -5779,6 +5780,21 @@ vector StickersManager::get_emoji_language_codes(const string &input_lan if (!input_language_code.empty() && input_language_code.find('$') == string::npos) { language_codes.push_back(input_language_code); } + if (!text.empty()) { + uint32 code = 0; + next_utf8_unsafe(text.ubegin(), &code, "get_emoji_language_codes"); + if ((0x410 <= code && code <= 0x44F) || code == 0x401 || code == 0x451) { + // the first letter is cyrillic + if (!td::contains(language_codes, "ru") && !td::contains(language_codes, "uk") && + !td::contains(language_codes, "bg") && !td::contains(language_codes, "be") && + !td::contains(language_codes, "mk") && !td::contains(language_codes, "sr") && + !td::contains(language_codes, "mn") && !td::contains(language_codes, "ky") && + !td::contains(language_codes, "kk") && !td::contains(language_codes, "uz") && + !td::contains(language_codes, "tk")) { + language_codes.push_back("ru"); + } + } + } if (language_codes.empty()) { LOG(ERROR) << "List of language codes is empty"; @@ -6007,7 +6023,7 @@ vector StickersManager::search_emojis(const string &text, bool exact_mat return {}; } - auto language_codes = get_emoji_language_codes(input_language_code, promise); + auto language_codes = get_emoji_language_codes(input_language_code, text, promise); if (language_codes.empty()) { // promise was consumed return {}; diff --git a/td/telegram/StickersManager.h b/td/telegram/StickersManager.h index 8f2ed0c43..09ebc5219 100644 --- a/td/telegram/StickersManager.h +++ b/td/telegram/StickersManager.h @@ -22,6 +22,7 @@ #include "td/utils/buffer.h" #include "td/utils/common.h" #include "td/utils/Hints.h" +#include "td/utils/Slice.h" #include "td/utils/Status.h" #include "td/telegram/td_api.h" @@ -590,7 +591,7 @@ class StickersManager : public Actor { double get_emoji_language_code_last_difference_time(const string &language_code); - vector get_emoji_language_codes(const string &input_language_code, Promise &promise); + vector get_emoji_language_codes(const string &input_language_code, Slice text, Promise &promise); void load_language_codes(vector language_codes, string key, Promise &&promise);