diff --git a/td/generate/scheme/td_api.tl b/td/generate/scheme/td_api.tl index 4723be972..a624bb1ad 100644 --- a/td/generate/scheme/td_api.tl +++ b/td/generate/scheme/td_api.tl @@ -4023,9 +4023,8 @@ proxies proxies:vector = Proxies; //@sticker File with the sticker; must fit in a 512x512 square. For WEBP stickers and masks the file must be in PNG format, which will be converted to WEBP server-side. Otherwise, the file must be local or uploaded within a week. See https://core.telegram.org/animated_stickers#technical-requirements for technical requirements //@emojis Emojis corresponding to the sticker //@format Sticker format -//@type Sticker type //@mask_position Position where the mask is placed; pass null if not specified -inputSticker sticker:InputFile emojis:string format:StickerFormat type:StickerType mask_position:maskPosition = InputSticker; +inputSticker sticker:InputFile emojis:string format:StickerFormat mask_position:maskPosition = InputSticker; //@description Represents a date range @start_date Point in time (Unix timestamp) at which the date range begins @end_date Point in time (Unix timestamp) at which the date range ends @@ -6412,9 +6411,10 @@ checkStickerSetName name:string = CheckStickerSetNameResult; //@user_id Sticker set owner; ignored for regular users //@title Sticker set title; 1-64 characters //@name Sticker set name. Can contain only English letters, digits and underscores. Must end with *"_by_"* (** is case insensitive) for bots; 1-64 characters +//@sticker_type Type of the stickers in the set //@stickers List of stickers to be added to the set; must be non-empty. All stickers must have the same format. For TGS stickers, uploadStickerFile must be used before the sticker is shown //@source Source of the sticker set; may be empty if unknown -createNewStickerSet user_id:int53 title:string name:string stickers:vector source:string = StickerSet; +createNewStickerSet user_id:int53 title:string name:string sticker_type:StickerType stickers:vector source:string = StickerSet; //@description Adds a new sticker to a set; for bots only. Returns the sticker set //@user_id Sticker set owner @name Sticker set name @sticker Sticker to add to the set diff --git a/td/telegram/StickersManager.cpp b/td/telegram/StickersManager.cpp index a749ed57f..faef4c68e 100644 --- a/td/telegram/StickersManager.cpp +++ b/td/telegram/StickersManager.cpp @@ -6095,7 +6095,7 @@ void StickersManager::reorder_installed_sticker_sets(StickerType sticker_type, } Result> StickersManager::prepare_input_sticker( - td_api::inputSticker *sticker) { + td_api::inputSticker *sticker, StickerType sticker_type) { if (sticker == nullptr) { return Status::Error(400, "Input sticker must be non-empty"); } @@ -6108,8 +6108,7 @@ Result> StickersManager::prepare_i return Status::Error(400, "Sticker format must be non-empty"); } - return prepare_input_file(sticker->sticker_, get_sticker_format(sticker->format_), - ::td::get_sticker_type(sticker->type_), false); + return prepare_input_file(sticker->sticker_, get_sticker_format(sticker->format_), sticker_type, false); } Result> StickersManager::prepare_input_file( @@ -6173,7 +6172,8 @@ FileId StickersManager::upload_sticker_file(UserId user_id, tl_object_ptr StickersManager::get_check } void StickersManager::create_new_sticker_set(UserId user_id, string &title, string &short_name, - vector> &&stickers, string software, - Promise &&promise) { + StickerType sticker_type, + vector> &&stickers, + string software, Promise &&promise) { bool is_bot = td_->auth_manager_->is_bot(); if (!is_bot) { user_id = td_->contacts_manager_->get_my_id(); @@ -6307,10 +6308,9 @@ void StickersManager::create_new_sticker_set(UserId user_id, string &title, stri vector local_file_ids; vector url_file_ids; FlatHashSet sticker_formats; - FlatHashSet sticker_types; StickerFormat sticker_format = StickerFormat::Unknown; for (auto &sticker : stickers) { - auto r_file_id = prepare_input_sticker(sticker.get()); + auto r_file_id = prepare_input_sticker(sticker.get(), sticker_type); if (r_file_id.is_error()) { return promise.set_error(r_file_id.move_as_error()); } @@ -6322,7 +6322,6 @@ void StickersManager::create_new_sticker_set(UserId user_id, string &title, stri return promise.set_error(Status::Error(400, "Animated stickers can't be uploaded by URL")); } sticker_formats.insert(static_cast(get_sticker_format(sticker->format_)) + 1); - sticker_types.insert(static_cast(::td::get_sticker_type(sticker->type_)) + 1); file_ids.push_back(file_id); if (is_url) { @@ -6334,15 +6333,13 @@ void StickersManager::create_new_sticker_set(UserId user_id, string &title, stri if (sticker_formats.size() != 1) { return promise.set_error(Status::Error(400, "All stickers must be of the same format")); } - if (sticker_types.size() != 1) { - return promise.set_error(Status::Error(400, "All stickers must be of the same type")); - } auto pending_new_sticker_set = make_unique(); pending_new_sticker_set->user_id = user_id; pending_new_sticker_set->title = std::move(title); pending_new_sticker_set->short_name = short_name; pending_new_sticker_set->sticker_format = sticker_format; + pending_new_sticker_set->sticker_type = sticker_type; pending_new_sticker_set->file_ids = std::move(file_ids); pending_new_sticker_set->stickers = std::move(stickers); pending_new_sticker_set->software = std::move(software); @@ -6510,8 +6507,8 @@ void StickersManager::on_new_stickers_uploaded(int64 random_id, Result res auto &promise = pending_new_sticker_set->promise; TRY_RESULT_PROMISE(promise, input_user, td_->contacts_manager_->get_input_user(pending_new_sticker_set->user_id)); - StickerType sticker_type = ::td::get_sticker_type(pending_new_sticker_set->stickers[0]->type_); StickerFormat sticker_format = pending_new_sticker_set->sticker_format; + StickerType sticker_type = pending_new_sticker_set->sticker_type; auto sticker_count = pending_new_sticker_set->stickers.size(); vector> input_stickers; @@ -6564,7 +6561,7 @@ void StickersManager::do_add_sticker_to_set(UserId user_id, string short_name, return promise.set_error(Status::Error(400, "Sticker set not found")); } - auto r_file_id = prepare_input_sticker(sticker.get()); + auto r_file_id = prepare_input_sticker(sticker.get(), sticker_set->sticker_type); 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 210d74b80..2dfe7774f 100644 --- a/td/telegram/StickersManager.h +++ b/td/telegram/StickersManager.h @@ -230,8 +230,8 @@ class StickersManager final : public Actor { static td_api::object_ptr get_check_sticker_set_name_result_object( CheckStickerSetNameResult result); - void create_new_sticker_set(UserId user_id, string &title, string &short_name, - vector> &&stickers, string software, + void create_new_sticker_set(UserId user_id, string &title, string &short_name, StickerType sticker_type, + vector> &&stickers, string software, Promise &&promise); void add_sticker_to_set(UserId user_id, string &short_name, tl_object_ptr &&sticker, @@ -425,6 +425,7 @@ class StickersManager final : public Actor { UserId user_id; string title; string short_name; + StickerType sticker_type = StickerType::Regular; StickerFormat sticker_format = StickerFormat::Unknown; vector file_ids; vector> stickers; @@ -674,7 +675,8 @@ class StickersManager final : public Actor { Result> prepare_input_file( const tl_object_ptr &input_file, StickerFormat format, StickerType type, bool for_thumbnail); - Result> prepare_input_sticker(td_api::inputSticker *sticker); + Result> prepare_input_sticker(td_api::inputSticker *sticker, + StickerType sticker_type); tl_object_ptr get_input_sticker(const td_api::inputSticker *sticker, FileId file_id) const; diff --git a/td/telegram/Td.cpp b/td/telegram/Td.cpp index 592e44a5a..c42435106 100644 --- a/td/telegram/Td.cpp +++ b/td/telegram/Td.cpp @@ -2236,12 +2236,13 @@ class CreateNewStickerSetRequest final : public RequestOnceActor { UserId user_id_; string title_; string name_; - vector> stickers_; + StickerType sticker_type_; + vector> stickers_; string software_; void do_run(Promise &&promise) final { - td_->stickers_manager_->create_new_sticker_set(user_id_, title_, name_, std::move(stickers_), std::move(software_), - std::move(promise)); + td_->stickers_manager_->create_new_sticker_set(user_id_, title_, name_, sticker_type_, std::move(stickers_), + std::move(software_), std::move(promise)); } void do_send_result() final { @@ -2254,11 +2255,13 @@ class CreateNewStickerSetRequest final : public RequestOnceActor { public: CreateNewStickerSetRequest(ActorShared td, uint64 request_id, int64 user_id, string &&title, string &&name, - vector> &&stickers, string &&software) + StickerType sticker_type, vector> &&stickers, + string &&software) : RequestOnceActor(std::move(td), request_id) , user_id_(user_id) , title_(std::move(title)) , name_(std::move(name)) + , sticker_type_(sticker_type) , stickers_(std::move(stickers)) , software_(std::move(software)) { } @@ -7090,7 +7093,7 @@ void Td::on_request(uint64 id, td_api::createNewStickerSet &request) { CLEAN_INPUT_STRING(request.name_); CLEAN_INPUT_STRING(request.source_); CREATE_REQUEST(CreateNewStickerSetRequest, request.user_id_, std::move(request.title_), std::move(request.name_), - std::move(request.stickers_), std::move(request.source_)); + get_sticker_type(request.sticker_type_), std::move(request.stickers_), std::move(request.source_)); } void Td::on_request(uint64 id, td_api::addStickerToSet &request) { diff --git a/td/telegram/cli.cpp b/td/telegram/cli.cpp index 7fb505df5..ab1c659dd 100644 --- a/td/telegram/cli.cpp +++ b/td/telegram/cli.cpp @@ -2724,10 +2724,10 @@ class CliClient final : public Actor { } else if (op == "cssn") { const string &name = args; send_request(td_api::make_object(name)); - } else if (op == "usf" || op == "usfa" || op == "usfv" || op == "usfm" || op == "usfe") { + } else if (op == "usf" || op == "usfa" || op == "usfv") { send_request(td_api::make_object( -1, td_api::make_object(as_input_file(args), "😀", as_sticker_format(op), - as_sticker_type(op), as_mask_position(op)))); + as_mask_position(op)))); } else if (op == "cnss" || op == "cnssa" || op == "cnssv" || op == "cnssm" || op == "cnsse") { string title; string name; @@ -2736,10 +2736,10 @@ class CliClient final : public Actor { auto input_stickers = transform(autosplit(stickers), [op](Slice sticker) -> td_api::object_ptr { return td_api::make_object(as_input_file(sticker), "😀", as_sticker_format(op), - as_sticker_type(op), as_mask_position(op)); + as_mask_position(op)); }); - send_request( - td_api::make_object(my_id_, title, name, std::move(input_stickers), "tg_cli")); + send_request(td_api::make_object(my_id_, title, name, as_sticker_type(op), + std::move(input_stickers), "tg_cli")); } else if (op == "sss") { send_request(td_api::make_object(args)); } else if (op == "siss") {