Add separate td_api::getKeywordEmojis.

This commit is contained in:
levlam 2024-01-05 14:36:01 +03:00
parent 4dc89d0b8d
commit f4bafbdc86
6 changed files with 97 additions and 39 deletions

View File

@ -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<string> = Emojis;
searchEmojis text:string input_language_codes:vector<string> = 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<string> = Emojis;
//@description Returns available emojis categories @type Type of emoji categories to return; pass null to get default emoji categories
getEmojiCategories type:EmojiCategoryType = EmojiCategories;

View File

@ -9478,23 +9478,24 @@ string StickersManager::get_language_emojis_database_key(const string &language_
return PSTRING() << "emoji$" << language_code << '$' << text;
}
vector<string> StickersManager::search_language_emojis(const string &language_code, const string &text,
bool exact_match) {
LOG(INFO) << "Search for \"" << text << "\" in language " << language_code;
vector<string> 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<string> 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<string> 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<string> 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<string> &language_codes) {
@ -9786,7 +9787,7 @@ void StickersManager::on_get_emoji_keywords_difference(
}
}
if (is_good) {
vector<string> emojis = search_language_emojis(language_code, text, true);
vector<string> 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<telegram_api::emojiKeywordDeleted>(keyword_ptr);
auto text = utf8_to_lower(keyword->keyword_);
vector<string> emojis = search_language_emojis(language_code, text, true);
vector<string> 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<string> StickersManager::search_emojis(const string &text, bool exact_match,
const vector<string> &input_language_codes, bool force,
Promise<Unit> &&promise) {
vector<string> StickersManager::search_emojis(const string &text, const vector<string> &input_language_codes,
bool force, Promise<Unit> &&promise) {
SearchEmojiQuery query;
if (!prepare_search_emoji_query(text, input_language_codes, force, promise, query)) {
return {};
@ -9898,7 +9898,24 @@ vector<string> StickersManager::search_emojis(const string &text, bool exact_mat
vector<string> 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<string> StickersManager::get_keyword_emojis(const string &text, const vector<string> &input_language_codes,
bool force, Promise<Unit> &&promise) {
SearchEmojiQuery query;
if (!prepare_search_emoji_query(text, input_language_codes, force, promise, query)) {
return {};
}
vector<string> result;
for (auto &language_code : query.language_codes_) {
combine(result, get_keyword_language_emojis(language_code, query.text_));
}
td::unique(result);

View File

@ -373,8 +373,11 @@ class StickersManager final : public Actor {
vector<string> get_sticker_emojis(const tl_object_ptr<td_api::InputFile> &input_file, Promise<Unit> &&promise);
vector<string> search_emojis(const string &text, bool exact_match, const vector<string> &input_language_codes,
bool force, Promise<Unit> &&promise);
vector<string> search_emojis(const string &text, const vector<string> &input_language_codes, bool force,
Promise<Unit> &&promise);
vector<string> get_keyword_emojis(const string &text, const vector<string> &input_language_codes, bool force,
Promise<Unit> &&promise);
int64 get_emoji_suggestions_url(const string &language_code, Promise<Unit> &&promise);
@ -947,7 +950,9 @@ class StickersManager final : public Actor {
void on_get_language_codes(const string &key, Result<vector<string>> &&result);
static vector<string> search_language_emojis(const string &language_code, const string &text, bool exact_match);
static vector<string> search_language_emojis(const string &language_code, const string &text);
static vector<string> get_keyword_language_emojis(const string &language_code, const string &text);
void load_emoji_keywords(const string &language_code, Promise<Unit> &&promise);

View File

@ -2292,14 +2292,12 @@ class GetStickerEmojisRequest final : public RequestActor<> {
class SearchEmojisRequest final : public RequestActor<> {
string text_;
bool exact_match_;
vector<string> input_language_codes_;
vector<string> emojis_;
void do_run(Promise<Unit> &&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> td, uint64 request_id, string &&text, bool exact_match,
vector<string> &&input_language_codes)
SearchEmojisRequest(ActorShared<Td> td, uint64 request_id, string &&text, vector<string> &&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<string> input_language_codes_;
vector<string> emojis_;
void do_run(Promise<Unit> &&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<td_api::emojis>(std::move(emojis_)));
}
public:
GetKeywordEmojisRequest(ActorShared<Td> td, uint64 request_id, string &&text, vector<string> &&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) {

View File

@ -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);

View File

@ -3454,11 +3454,13 @@ class CliClient final : public Actor {
} else if (op == "gse") {
send_request(td_api::make_object<td_api::getStickerEmojis>(as_input_file_id(args)));
} else if (op == "se") {
send_request(td_api::make_object<td_api::searchEmojis>(args, false, vector<string>()));
} else if (op == "see") {
send_request(td_api::make_object<td_api::searchEmojis>(args, true, vector<string>()));
send_request(td_api::make_object<td_api::searchEmojis>(args, vector<string>()));
} else if (op == "seru") {
send_request(td_api::make_object<td_api::searchEmojis>(args, false, vector<string>{"ru_RU"}));
send_request(td_api::make_object<td_api::searchEmojis>(args, vector<string>{"ru_RU"}));
} else if (op == "gke") {
send_request(td_api::make_object<td_api::getKeywordEmojis>(args, vector<string>()));
} else if (op == "gkeru") {
send_request(td_api::make_object<td_api::getKeywordEmojis>(args, vector<string>{"ru_RU"}));
} else if (op == "gec" || op == "geces" || op == "geccp") {
auto type = [&]() -> td_api::object_ptr<td_api::EmojiCategoryType> {
if (op == "geces") {