Add StickersManager::split_stickers_by_premium.

This commit is contained in:
levlam 2022-06-16 21:12:20 +03:00
parent 8dc2fbbf90
commit 762b1577e9
2 changed files with 25 additions and 16 deletions

View File

@ -3425,6 +3425,23 @@ void StickersManager::on_get_installed_sticker_sets_failed(bool is_masks, Status
fail_promises(load_installed_sticker_sets_queries_[is_masks], std::move(error)); fail_promises(load_installed_sticker_sets_queries_[is_masks], std::move(error));
} }
std::pair<vector<FileId>, vector<FileId>> StickersManager::split_stickers_by_premium(const vector<FileId> &sticker_ids) const {
vector<FileId> regular_sticker_ids;
vector<FileId> premium_sticker_ids;
for (const auto &sticker_id : sticker_ids) {
if (sticker_id.is_valid()) {
const Sticker *s = get_sticker(sticker_id);
CHECK(s != nullptr);
if (s->premium_animation_file_id.is_valid()) {
premium_sticker_ids.push_back(sticker_id);
} else {
regular_sticker_ids.push_back(sticker_id);
}
}
}
return {std::move(regular_sticker_ids), std::move(premium_sticker_ids)};
}
vector<FileId> StickersManager::get_stickers(string emoji, int32 limit, bool force, Promise<Unit> &&promise) { vector<FileId> StickersManager::get_stickers(string emoji, int32 limit, bool force, Promise<Unit> &&promise) {
if (limit <= 0) { if (limit <= 0) {
promise.set_error(Status::Error(400, "Parameter limit must be positive")); promise.set_error(Status::Error(400, "Parameter limit must be positive"));
@ -3606,19 +3623,9 @@ vector<FileId> StickersManager::get_stickers(string emoji, int32 limit, bool for
} }
} }
if (sorted.size() != limit_size_t) { if (sorted.size() != limit_size_t) {
vector<FileId> normal_sticker_ids; vector<FileId> regular_sticker_ids;
vector<FileId> premium_sticker_ids; vector<FileId> premium_sticker_ids;
for (const auto &sticker_id : result) { std::tie(regular_sticker_ids, premium_sticker_ids) = split_stickers_by_premium(result);
if (sticker_id.is_valid()) {
const Sticker *s = get_sticker(sticker_id);
CHECK(s != nullptr);
if (s->premium_animation_file_id.is_valid()) {
premium_sticker_ids.push_back(sticker_id);
} else {
normal_sticker_ids.push_back(sticker_id);
}
}
}
if (G()->shared_config().get_option_boolean("is_premium")) { if (G()->shared_config().get_option_boolean("is_premium")) {
auto normal_count = G()->shared_config().get_option_integer("stickers_normal_by_emoji_per_premium_num", 2); auto normal_count = G()->shared_config().get_option_integer("stickers_normal_by_emoji_per_premium_num", 2);
if (normal_count < 0) { if (normal_count < 0) {
@ -3631,14 +3638,14 @@ vector<FileId> StickersManager::get_stickers(string emoji, int32 limit, bool for
size_t normal_pos = 0; size_t normal_pos = 0;
size_t premium_pos = 0; size_t premium_pos = 0;
normal_count++; normal_count++;
for (size_t pos = 1; normal_pos < normal_sticker_ids.size() || premium_pos < premium_sticker_ids.size(); for (size_t pos = 1; normal_pos < regular_sticker_ids.size() || premium_pos < premium_sticker_ids.size();
pos++) { pos++) {
if (pos % normal_count == 0 && premium_pos < premium_sticker_ids.size()) { if (pos % normal_count == 0 && premium_pos < premium_sticker_ids.size()) {
auto sticker_id = premium_sticker_ids[premium_pos++]; auto sticker_id = premium_sticker_ids[premium_pos++];
LOG(INFO) << "Add premium sticker " << sticker_id << " from installed sticker set"; LOG(INFO) << "Add premium sticker " << sticker_id << " from installed sticker set";
sorted.push_back(sticker_id); sorted.push_back(sticker_id);
} else if (normal_pos < normal_sticker_ids.size()) { } else if (normal_pos < regular_sticker_ids.size()) {
auto sticker_id = normal_sticker_ids[normal_pos++]; auto sticker_id = regular_sticker_ids[normal_pos++];
LOG(INFO) << "Add normal sticker " << sticker_id << " from installed sticker set"; LOG(INFO) << "Add normal sticker " << sticker_id << " from installed sticker set";
sorted.push_back(sticker_id); sorted.push_back(sticker_id);
} }
@ -3647,7 +3654,7 @@ vector<FileId> StickersManager::get_stickers(string emoji, int32 limit, bool for
} }
} }
} else { } else {
for (const auto &sticker_id : normal_sticker_ids) { for (const auto &sticker_id : regular_sticker_ids) {
LOG(INFO) << "Add normal sticker " << sticker_id << " from installed sticker set"; LOG(INFO) << "Add normal sticker " << sticker_id << " from installed sticker set";
sorted.push_back(sticker_id); sorted.push_back(sticker_id);
if (sorted.size() == limit_size_t) { if (sorted.size() == limit_size_t) {

View File

@ -636,6 +636,8 @@ class StickersManager final : public Actor {
template <class ParserT> template <class ParserT>
void parse_sticker_set(StickerSet *sticker_set, ParserT &parser); void parse_sticker_set(StickerSet *sticker_set, ParserT &parser);
std::pair<vector<FileId>, vector<FileId>> split_stickers_by_premium(const vector<FileId> &sticker_ids) const;
Result<std::tuple<FileId, bool, bool, StickerFormat>> prepare_input_file( Result<std::tuple<FileId, bool, bool, StickerFormat>> prepare_input_file(
const tl_object_ptr<td_api::InputFile> &input_file, StickerFormat format, bool for_thumbnail); const tl_object_ptr<td_api::InputFile> &input_file, StickerFormat format, bool for_thumbnail);