diff --git a/td/telegram/StickersManager.cpp b/td/telegram/StickersManager.cpp index 543ed1a71..a749ed57f 100644 --- a/td/telegram/StickersManager.cpp +++ b/td/telegram/StickersManager.cpp @@ -6535,6 +6535,35 @@ void StickersManager::add_sticker_to_set(UserId user_id, string &short_name, return promise.set_error(Status::Error(400, "Sticker set name can't be empty")); } + auto it = short_name_to_sticker_set_id_.find(short_name); + const StickerSet *sticker_set = it == short_name_to_sticker_set_id_.end() ? nullptr : get_sticker_set(it->second); + if (sticker_set != nullptr && sticker_set->was_loaded) { + return do_add_sticker_to_set(user_id, short_name, std::move(sticker), std::move(promise)); + } + + do_reload_sticker_set( + StickerSetId(), make_tl_object(short_name), 0, + PromiseCreator::lambda([actor_id = actor_id(this), user_id, short_name, sticker = std::move(sticker), + promise = std::move(promise)](Result result) mutable { + if (result.is_error()) { + promise.set_error(result.move_as_error()); + } else { + send_closure(actor_id, &StickersManager::do_add_sticker_to_set, user_id, std::move(short_name), + std::move(sticker), std::move(promise)); + } + })); +} + +void StickersManager::do_add_sticker_to_set(UserId user_id, string short_name, + tl_object_ptr &&sticker, Promise &&promise) { + TRY_STATUS_PROMISE(promise, G()->close_status()); + + auto it = short_name_to_sticker_set_id_.find(short_name); + const StickerSet *sticker_set = it == short_name_to_sticker_set_id_.end() ? nullptr : get_sticker_set(it->second); + if (sticker_set == nullptr || !sticker_set->was_loaded) { + return promise.set_error(Status::Error(400, "Sticker set not found")); + } + auto r_file_id = prepare_input_sticker(sticker.get()); if (r_file_id.is_error()) { return promise.set_error(r_file_id.move_as_error()); diff --git a/td/telegram/StickersManager.h b/td/telegram/StickersManager.h index c128125fe..210d74b80 100644 --- a/td/telegram/StickersManager.h +++ b/td/telegram/StickersManager.h @@ -692,6 +692,9 @@ class StickersManager final : public Actor { void on_added_sticker_uploaded(int64 random_id, Result result); + void do_add_sticker_to_set(UserId user_id, string short_name, tl_object_ptr &&sticker, + Promise &&promise); + void on_sticker_set_thumbnail_uploaded(int64 random_id, Result result); void do_set_sticker_set_thumbnail(UserId user_id, string short_name, tl_object_ptr &&thumbnail,