From dc8903fc71ad69aab1b1a8e49a0bca52e4cd8fd8 Mon Sep 17 00:00:00 2001 From: levlam Date: Fri, 17 Jun 2022 08:59:54 +0300 Subject: [PATCH] Allow to get stcikerSetInfo with preferred premium stickers. --- td/telegram/StickersManager.cpp | 39 ++++++++++++++++++++++++++------- td/telegram/StickersManager.h | 4 ++-- 2 files changed, 33 insertions(+), 10 deletions(-) diff --git a/td/telegram/StickersManager.cpp b/td/telegram/StickersManager.cpp index 2b1515005..9d9301e7f 100644 --- a/td/telegram/StickersManager.cpp +++ b/td/telegram/StickersManager.cpp @@ -2020,7 +2020,7 @@ tl_object_ptr StickersManager::get_sticker_sets_object(int3 vector> result; result.reserve(sticker_set_ids.size()); for (auto sticker_set_id : sticker_set_ids) { - auto sticker_set_info = get_sticker_set_info_object(sticker_set_id, covers_limit); + auto sticker_set_info = get_sticker_set_info_object(sticker_set_id, covers_limit, false); if (sticker_set_info->size_ != 0) { result.push_back(std::move(sticker_set_info)); } @@ -2037,17 +2037,39 @@ tl_object_ptr StickersManager::get_sticker_sets_object(int3 } tl_object_ptr StickersManager::get_sticker_set_info_object(StickerSetId sticker_set_id, - size_t covers_limit) const { + size_t covers_limit, + bool prefer_premium) const { const StickerSet *sticker_set = get_sticker_set(sticker_set_id); CHECK(sticker_set != nullptr); CHECK(sticker_set->is_inited); sticker_set->was_update_sent = true; - std::vector> stickers; - for (auto sticker_id : sticker_set->sticker_ids) { - stickers.push_back(get_sticker_object(sticker_id)); - if (stickers.size() >= covers_limit) { - break; + vector> stickers; + if (prefer_premium) { + vector regular_sticker_ids; + vector premium_sticker_ids; + std::tie(regular_sticker_ids, premium_sticker_ids) = split_stickers_by_premium(sticker_set->sticker_ids); + size_t max_premium_stickers = 3; + if (regular_sticker_ids.size() + max_premium_stickers < covers_limit) { + max_premium_stickers = covers_limit - regular_sticker_ids.size(); + } + if (premium_sticker_ids.size() > max_premium_stickers) { + premium_sticker_ids.resize(max_premium_stickers); + } + + append(premium_sticker_ids, regular_sticker_ids); + for (auto sticker_id : premium_sticker_ids) { + stickers.push_back(get_sticker_object(sticker_id)); + if (stickers.size() >= covers_limit) { + break; + } + } + } else { + for (auto sticker_id : sticker_set->sticker_ids) { + stickers.push_back(get_sticker_object(sticker_id)); + if (stickers.size() >= covers_limit) { + break; + } } } @@ -3425,7 +3447,8 @@ void StickersManager::on_get_installed_sticker_sets_failed(bool is_masks, Status fail_promises(load_installed_sticker_sets_queries_[is_masks], std::move(error)); } -std::pair, vector> StickersManager::split_stickers_by_premium(const vector &sticker_ids) const { +std::pair, vector> StickersManager::split_stickers_by_premium( + const vector &sticker_ids) const { vector regular_sticker_ids; vector premium_sticker_ids; for (const auto &sticker_id : sticker_ids) { diff --git a/td/telegram/StickersManager.h b/td/telegram/StickersManager.h index 078afab4e..2899f88d8 100644 --- a/td/telegram/StickersManager.h +++ b/td/telegram/StickersManager.h @@ -497,8 +497,8 @@ class StickersManager final : public Actor { static tl_object_ptr get_mask_point_object(int32 point); - tl_object_ptr get_sticker_set_info_object(StickerSetId sticker_set_id, - size_t covers_limit) const; + tl_object_ptr get_sticker_set_info_object(StickerSetId sticker_set_id, size_t covers_limit, + bool prefer_premium) const; Sticker *get_sticker(FileId file_id); const Sticker *get_sticker(FileId file_id) const;