Return trending custom emoji in getStickers.

This commit is contained in:
levlam 2022-08-01 16:56:21 +03:00
parent 235418521f
commit d4135d59f6
2 changed files with 31 additions and 20 deletions

View File

@ -5916,7 +5916,7 @@ sharePhoneNumber user_id:int53 = Ok;
getUserProfilePhotos user_id:int53 offset:int32 limit:int32 = ChatPhotos; getUserProfilePhotos user_id:int53 offset:int32 limit:int32 = ChatPhotos;
//@description Returns stickers from the installed sticker sets that correspond to a given emoji. If the emoji is non-empty and sticker type is stickerTypeRegular, then favorite and recently used stickers may also be returned @sticker_type Type of the sticker sets to return @emoji String representation of emoji. If empty, returns all known installed stickers @limit The maximum number of stickers to be returned //@description Returns stickers from the installed sticker sets that correspond to a given emoji. If the emoji is non-empty, then favorite, recently used or trending stickers may also be returned @sticker_type Type of the sticker sets to return @emoji String representation of emoji. If empty, returns all known installed stickers @limit The maximum number of stickers to be returned
getStickers sticker_type:StickerType emoji:string limit:int32 = Stickers; getStickers sticker_type:StickerType emoji:string limit:int32 = Stickers;
//@description Searches for stickers from public sticker sets that correspond to a given emoji @emoji String representation of emoji; must be non-empty @limit The maximum number of stickers to be returned //@description Searches for stickers from public sticker sets that correspond to a given emoji @emoji String representation of emoji; must be non-empty @limit The maximum number of stickers to be returned

View File

@ -3831,30 +3831,35 @@ vector<FileId> StickersManager::get_stickers(StickerType sticker_type, string em
} }
remove_emoji_modifiers_in_place(emoji); remove_emoji_modifiers_in_place(emoji);
if (!emoji.empty() && sticker_type == StickerType::Regular) { if (!emoji.empty()) {
if (!are_recent_stickers_loaded_[0 /*is_attached*/]) { if (sticker_type == StickerType::Regular) {
load_recent_stickers(false, std::move(promise)); if (!are_recent_stickers_loaded_[0 /*is_attached*/]) {
return {}; load_recent_stickers(false, std::move(promise));
return {};
}
if (!are_favorite_stickers_loaded_) {
load_favorite_stickers(std::move(promise));
return {};
}
} else if (sticker_type == StickerType::CustomEmoji) {
if (!are_featured_sticker_sets_loaded_[type]) {
load_featured_sticker_sets(sticker_type, std::move(promise));
return {};
}
} }
if (!are_favorite_stickers_loaded_) { }
load_favorite_stickers(std::move(promise));
return {}; vector<StickerSetId> examined_sticker_set_ids = installed_sticker_set_ids_[type];
} if (!emoji.empty() && sticker_type == StickerType::CustomEmoji) {
/* td::append(examined_sticker_set_ids, featured_sticker_set_ids_[type]);
if (!are_featured_sticker_sets_loaded_[type]) {
load_featured_sticker_sets(sticker_type, std::move(promise));
return {};
}
*/
} }
vector<StickerSetId> sets_to_load; vector<StickerSetId> sets_to_load;
bool need_load = false; bool need_load = false;
for (const auto &sticker_set_id : installed_sticker_set_ids_[type]) { for (const auto &sticker_set_id : examined_sticker_set_ids) {
const StickerSet *sticker_set = get_sticker_set(sticker_set_id); const StickerSet *sticker_set = get_sticker_set(sticker_set_id);
CHECK(sticker_set != nullptr); CHECK(sticker_set != nullptr);
CHECK(sticker_set->is_inited); CHECK(sticker_set->is_inited);
CHECK(!sticker_set->is_archived);
if (!sticker_set->is_loaded) { if (!sticker_set->is_loaded) {
sets_to_load.push_back(sticker_set_id); sets_to_load.push_back(sticker_set_id);
if (!sticker_set->was_loaded) { if (!sticker_set->was_loaded) {
@ -3919,7 +3924,7 @@ vector<FileId> StickersManager::get_stickers(StickerType sticker_type, string em
vector<FileId> result; vector<FileId> result;
auto limit_size_t = static_cast<size_t>(limit); auto limit_size_t = static_cast<size_t>(limit);
if (emoji.empty()) { if (emoji.empty()) {
for (const auto &sticker_set_id : installed_sticker_set_ids_[type]) { for (const auto &sticker_set_id : examined_sticker_set_ids) {
const StickerSet *sticker_set = get_sticker_set(sticker_set_id); const StickerSet *sticker_set = get_sticker_set(sticker_set_id);
if (sticker_set == nullptr || !sticker_set->was_loaded) { if (sticker_set == nullptr || !sticker_set->was_loaded) {
continue; continue;
@ -3933,7 +3938,7 @@ vector<FileId> StickersManager::get_stickers(StickerType sticker_type, string em
} }
} else { } else {
vector<const StickerSet *> examined_sticker_sets; vector<const StickerSet *> examined_sticker_sets;
for (const auto &sticker_set_id : installed_sticker_set_ids_[type]) { for (const auto &sticker_set_id : examined_sticker_set_ids) {
const StickerSet *sticker_set = get_sticker_set(sticker_set_id); const StickerSet *sticker_set = get_sticker_set(sticker_set_id);
if (sticker_set == nullptr || !sticker_set->was_loaded) { if (sticker_set == nullptr || !sticker_set->was_loaded) {
continue; continue;
@ -3945,6 +3950,12 @@ vector<FileId> StickersManager::get_stickers(StickerType sticker_type, string em
} }
std::stable_sort( std::stable_sort(
examined_sticker_sets.begin(), examined_sticker_sets.end(), [](const StickerSet *lhs, const StickerSet *rhs) { examined_sticker_sets.begin(), examined_sticker_sets.end(), [](const StickerSet *lhs, const StickerSet *rhs) {
if (lhs->is_installed != rhs->is_installed) {
return lhs->is_installed;
}
if (lhs->is_archived != rhs->is_archived) {
return lhs->is_archived;
}
return is_sticker_format_animated(lhs->sticker_format) && !is_sticker_format_animated(rhs->sticker_format); return is_sticker_format_animated(lhs->sticker_format) && !is_sticker_format_animated(rhs->sticker_format);
}); });
for (auto sticker_set : examined_sticker_sets) { for (auto sticker_set : examined_sticker_sets) {
@ -4039,7 +4050,7 @@ vector<FileId> StickersManager::get_stickers(StickerType sticker_type, string em
break; break;
} }
} }
if (sorted.size() < limit_size_t && sticker_type == StickerType::Regular) { if (sorted.size() < limit_size_t) {
auto premium_count = G()->shared_config().get_option_integer("stickers_premium_by_emoji_num", 0); auto premium_count = G()->shared_config().get_option_integer("stickers_premium_by_emoji_num", 0);
if (premium_count > 0) { if (premium_count > 0) {
for (const auto &sticker_id : premium_sticker_ids) { for (const auto &sticker_id : premium_sticker_ids) {