From d824cec905c9714dcdb7259ea35a7efd652525a6 Mon Sep 17 00:00:00 2001 From: levlam Date: Wed, 1 Feb 2023 03:48:06 +0300 Subject: [PATCH] Add get_custom_emoji_stickers_unlimited. --- td/telegram/StickersManager.cpp | 56 ++++++++++++++++++++++++++------- td/telegram/StickersManager.h | 6 ++++ 2 files changed, 50 insertions(+), 12 deletions(-) diff --git a/td/telegram/StickersManager.cpp b/td/telegram/StickersManager.cpp index 238785a88..2cb5e2b8a 100644 --- a/td/telegram/StickersManager.cpp +++ b/td/telegram/StickersManager.cpp @@ -4989,12 +4989,12 @@ void StickersManager::on_find_custom_emojis_success(const string &emoji, transform(std::move(emoji_list->document_id_), [](int64 document_id) { return CustomEmojiId(document_id); }); auto hash = emoji_list->hash_; - get_custom_emoji_stickers(custom_emoji_ids, true, - PromiseCreator::lambda([actor_id = actor_id(this), emoji, hash, custom_emoji_ids]( - Result> &&result) { - send_closure(actor_id, &StickersManager::on_load_custom_emojis, std::move(emoji), - hash, custom_emoji_ids, std::move(result)); - })); + get_custom_emoji_stickers_unlimited( + custom_emoji_ids, PromiseCreator::lambda([actor_id = actor_id(this), emoji, hash, custom_emoji_ids]( + Result> &&result) { + send_closure(actor_id, &StickersManager::on_load_custom_emojis, std::move(emoji), hash, custom_emoji_ids, + std::move(result)); + })); break; } default: @@ -6420,14 +6420,44 @@ td_api::object_ptr StickersManager::get_custom_emoji_stickers_ return td_api::make_object(std::move(stickers)); } +void StickersManager::get_custom_emoji_stickers_unlimited(vector custom_emoji_ids, + Promise> &&promise) { + if (custom_emoji_ids.size() <= MAX_GET_CUSTOM_EMOJI_STICKERS) { + return get_custom_emoji_stickers(std::move(custom_emoji_ids), true, std::move(promise)); + } + + MultiPromiseActorSafe mpas{"GetCustomEmojiStickersMultiPromiseActor"}; + mpas.add_promise( + PromiseCreator::lambda([actor_id = actor_id(this), custom_emoji_ids, promise = std::move(promise)](Unit) mutable { + send_closure(actor_id, &StickersManager::on_get_custom_emoji_stickers_unlimited, std::move(custom_emoji_ids), + std::move(promise)); + })); + auto lock = mpas.get_promise(); + for (size_t i = 0; i < custom_emoji_ids.size(); i += MAX_GET_CUSTOM_EMOJI_STICKERS) { + auto end_i = td::min(i + MAX_GET_CUSTOM_EMOJI_STICKERS, custom_emoji_ids.size()); + get_custom_emoji_stickers({custom_emoji_ids.begin() + i, custom_emoji_ids.begin() + end_i}, true, + PromiseCreator::lambda([promise = mpas.get_promise()]( + Result> result) mutable { + if (result.is_ok()) { + promise.set_value(Unit()); + } else { + promise.set_error(result.move_as_error()); + } + })); + } + lock.set_value(Unit()); +} + +void StickersManager::on_get_custom_emoji_stickers_unlimited(vector custom_emoji_ids, + Promise> &&promise) { + TRY_STATUS_PROMISE(promise, G()->close_status()); + promise.set_value(get_custom_emoji_stickers_object(custom_emoji_ids)); +} + void StickersManager::get_custom_emoji_stickers(vector custom_emoji_ids, bool use_database, Promise> &&promise) { TRY_STATUS_PROMISE(promise, G()->close_status()); - if (!promise) { - return; - } - if (custom_emoji_ids.size() > MAX_GET_CUSTOM_EMOJI_STICKERS) { return promise.set_error(Status::Error(400, "Too many custom emoji identifiers specified")); } @@ -6507,7 +6537,7 @@ string StickersManager::get_default_dialog_photo_custom_emoji_ids_database_key(b void StickersManager::get_default_dialog_photo_custom_emoji_stickers( bool for_user, bool force_reload, Promise> &&promise) { if (are_default_dialog_photo_custom_emoji_ids_loaded_[for_user] && !force_reload) { - return get_custom_emoji_stickers(default_dialog_photo_custom_emoji_ids_[for_user], true, std::move(promise)); + return get_custom_emoji_stickers_unlimited(default_dialog_photo_custom_emoji_ids_[for_user], std::move(promise)); } auto &queries = default_dialog_photo_custom_emoji_ids_load_queries_[for_user]; @@ -6647,6 +6677,8 @@ void StickersManager::on_get_default_dialog_photo_custom_emoji_ids( void StickersManager::on_get_default_dialog_photo_custom_emoji_ids_success(bool for_user, vector custom_emoji_ids, int64 hash) { + LOG(INFO) << "Load " << custom_emoji_ids.size() << " default " << (for_user ? "profile" : "chat") + << " photo custom emoji identifiers"; default_dialog_photo_custom_emoji_ids_[for_user] = std::move(custom_emoji_ids); default_dialog_photo_custom_emoji_ids_hash_[for_user] = hash; are_default_dialog_photo_custom_emoji_ids_loaded_[for_user] = true; @@ -6654,7 +6686,7 @@ void StickersManager::on_get_default_dialog_photo_custom_emoji_ids_success(bool auto promises = std::move(default_dialog_photo_custom_emoji_ids_load_queries_[for_user]); reset_to_empty(default_dialog_photo_custom_emoji_ids_load_queries_[for_user]); for (auto &promise : promises) { - get_custom_emoji_stickers(default_dialog_photo_custom_emoji_ids_[for_user], true, std::move(promise)); + get_custom_emoji_stickers_unlimited(default_dialog_photo_custom_emoji_ids_[for_user], std::move(promise)); } } diff --git a/td/telegram/StickersManager.h b/td/telegram/StickersManager.h index 502941ddb..bf209e01a 100644 --- a/td/telegram/StickersManager.h +++ b/td/telegram/StickersManager.h @@ -649,6 +649,12 @@ class StickersManager final : public Actor { void on_load_custom_emojis(string emoji, int64 hash, vector custom_emoji_ids, Result> &&result); + void get_custom_emoji_stickers_unlimited(vector custom_emoji_ids, + Promise> &&promise); + + void on_get_custom_emoji_stickers_unlimited(vector custom_emoji_ids, + Promise> &&promise); + void on_search_stickers_finished(StickerType sticker_type, const string &emoji, const FoundStickers &found_stickers); void on_search_stickers_succeeded(StickerType sticker_type, const string &emoji, vector &&sticker_ids);