diff --git a/td/generate/scheme/td_api.tl b/td/generate/scheme/td_api.tl index da246537d..9f142aace 100644 --- a/td/generate/scheme/td_api.tl +++ b/td/generate/scheme/td_api.tl @@ -300,6 +300,20 @@ stickerTypeMask = StickerType; stickerTypeCustomEmoji = StickerType; +//@class StickerTypeFullInfo @description Contains full information about sticker type + +//@description The sticker is a regular sticker @premium_animation Premium animation of the sticker; may be null. If present, only Telegram Premium users can use the sticker +stickerTypeFullInfoRegular premium_animation:file = StickerTypeFullInfo; + +//@description The sticker is a mask in WEBP format to be placed on photos or videos @mask_position Position where the mask is placed; may be null +stickerTypeFullInfoMask mask_position:maskPosition = StickerTypeFullInfo; + +//@description The sticker is a custom emoji to be used inside message text and caption. Currently, only Telegram Premium users can use custom emoji +//@custom_emoji_id Identifier of the custom emoji +//@has_text_color True, if the sticker must be repainted to a text color in messages, the color of the Telegram Premium badge in emoji status, or another appropriate color in other places +stickerTypeFullInfoCustomEmoji custom_emoji_id:int64 has_text_color:Bool = StickerTypeFullInfo; + + //@description Represents a closed vector path. The path begins at the end point of the last command @commands List of vector path commands closedVectorPath commands:vector = ClosedVectorPath; @@ -368,16 +382,11 @@ photo has_stickers:Bool minithumbnail:minithumbnail sizes:vector = Ph //@height Sticker height; as defined by the sender //@emoji Emoji corresponding to the sticker //@format Sticker format -//@type Sticker type -//@mask_position Position where the mask is placed; may be null even the sticker is a mask -//@custom_emoji_id Identifier of the emoji if the sticker is a custom emoji -//@has_text_color True, if the sticker must be repainted to a text color in messages, the color of the Telegram Premium badge in emoji status, or other appropriate color in other places; for custom emoji only +//@full_type Sticker full type //@outline Sticker's outline represented as a list of closed vector paths; may be empty. The coordinate system origin is in the upper-left corner //@thumbnail Sticker thumbnail in WEBP or JPEG format; may be null -//@is_premium True, if only Premium users can use the sticker -//@premium_animation Premium animation of the sticker; may be null //@sticker File containing the sticker -sticker set_id:int64 width:int32 height:int32 emoji:string format:StickerFormat type:StickerType mask_position:maskPosition custom_emoji_id:int64 has_text_color:Bool outline:vector thumbnail:thumbnail is_premium:Bool premium_animation:file sticker:file = Sticker; +sticker set_id:int64 width:int32 height:int32 emoji:string format:StickerFormat full_type:StickerTypeFullInfo outline:vector thumbnail:thumbnail sticker:file = Sticker; //@description Describes a video file //@duration Duration of the video, in seconds; as defined by the sender diff --git a/td/telegram/InlineQueriesManager.cpp b/td/telegram/InlineQueriesManager.cpp index eed41df79..d81cb7a62 100644 --- a/td/telegram/InlineQueriesManager.cpp +++ b/td/telegram/InlineQueriesManager.cpp @@ -1169,14 +1169,20 @@ tl_object_ptr copy(const td_api::maskPosition &obj) { } template <> -tl_object_ptr copy(const td_api::StickerType &obj) { +tl_object_ptr copy(const td_api::StickerTypeFullInfo &obj) { switch (obj.get_id()) { - case td_api::stickerTypeRegular::ID: - return td_api::make_object(); - case td_api::stickerTypeMask::ID: - return td_api::make_object(); - case td_api::stickerTypeCustomEmoji::ID: - return td_api::make_object(); + case td_api::stickerTypeFullInfoRegular::ID: { + auto &info = static_cast(obj); + return td_api::make_object(copy(info.premium_animation_)); + } + case td_api::stickerTypeFullInfoMask::ID: { + auto &info = static_cast(obj); + return td_api::make_object(copy(info.mask_position_)); + } + case td_api::stickerTypeFullInfoCustomEmoji::ID: { + auto &info = static_cast(obj); + return td_api::make_object(info.custom_emoji_id_, info.has_text_color_); + } default: UNREACHABLE(); } @@ -1269,10 +1275,9 @@ tl_object_ptr copy(const td_api::photo &obj) { template <> tl_object_ptr copy(const td_api::sticker &obj) { - return td_api::make_object( - obj.set_id_, obj.width_, obj.height_, obj.emoji_, copy(obj.format_), copy(obj.type_), copy(obj.mask_position_), - obj.custom_emoji_id_, obj.has_text_color_, transform(obj.outline_, copy_closed_vector_path), copy(obj.thumbnail_), - obj.is_premium_, copy(obj.premium_animation_), copy(obj.sticker_)); + return td_api::make_object(obj.set_id_, obj.width_, obj.height_, obj.emoji_, copy(obj.format_), + copy(obj.full_type_), transform(obj.outline_, copy_closed_vector_path), + copy(obj.thumbnail_), copy(obj.sticker_)); } template <> diff --git a/td/telegram/MessageContent.cpp b/td/telegram/MessageContent.cpp index d3f37de98..08a678cb1 100644 --- a/td/telegram/MessageContent.cpp +++ b/td/telegram/MessageContent.cpp @@ -5371,7 +5371,10 @@ tl_object_ptr get_message_content_object(const MessageCo const auto *m = static_cast(content); auto sticker = td->stickers_manager_->get_sticker_object(m->file_id); CHECK(sticker != nullptr); - auto is_premium = m->is_premium && sticker->premium_animation_ != nullptr; + auto is_premium = + m->is_premium && sticker->full_type_->get_id() == td_api::stickerTypeFullInfoRegular::ID && + static_cast(sticker->full_type_.get())->premium_animation_ != + nullptr; return make_tl_object(std::move(sticker), is_premium); } case MessageContentType::Text: { diff --git a/td/telegram/StickersManager.cpp b/td/telegram/StickersManager.cpp index d5eff497c..c89323129 100644 --- a/td/telegram/StickersManager.cpp +++ b/td/telegram/StickersManager.cpp @@ -2176,15 +2176,9 @@ tl_object_ptr StickersManager::get_sticker_object(FileId file_i const auto *sticker = get_sticker(file_id); CHECK(sticker != nullptr); - auto mask_position = sticker->point_ >= 0 - ? make_tl_object(get_mask_point_object(sticker->point_), - sticker->x_shift_, sticker->y_shift_, sticker->scale_) - : nullptr; - const PhotoSize &thumbnail = sticker->m_thumbnail_.file_id.is_valid() ? sticker->m_thumbnail_ : sticker->s_thumbnail_; auto thumbnail_format = PhotoFormat::Webp; int64 document_id = 0; - CustomEmojiId custom_emoji_id; if (!sticker->set_id_.is_valid()) { auto sticker_file_view = td_->file_manager_->get_file_view(sticker->file_id_); if (sticker_file_view.is_encrypted()) { @@ -2202,8 +2196,6 @@ tl_object_ptr StickersManager::get_sticker_object(FileId file_i } } } - } else if (sticker->type_ == StickerType::CustomEmoji) { - custom_emoji_id = get_custom_emoji_id(sticker->file_id_); } auto thumbnail_object = get_thumbnail_object(td_->file_manager_.get(), thumbnail, thumbnail_format); int32 width = sticker->dimensions_.width; @@ -2222,15 +2214,34 @@ tl_object_ptr StickersManager::get_sticker_object(FileId file_i height *= 3; } } - auto premium_animation_object = sticker->premium_animation_file_id_.is_valid() - ? td_->file_manager_->get_file_object(sticker->premium_animation_file_id_) - : nullptr; + auto full_type = [&]() -> td_api::object_ptr { + switch (sticker->type_) { + case StickerType::Regular: { + auto premium_animation_object = sticker->premium_animation_file_id_.is_valid() + ? td_->file_manager_->get_file_object(sticker->premium_animation_file_id_) + : nullptr; + return td_api::make_object(std::move(premium_animation_object)); + } + case StickerType::Mask: { + td_api::object_ptr mask_position; + if (sticker->point_ >= 0) { + mask_position = td_api::make_object( + get_mask_point_object(sticker->point_), sticker->x_shift_, sticker->y_shift_, sticker->scale_); + } + return td_api::make_object(std::move(mask_position)); + } + case StickerType::CustomEmoji: + return td_api::make_object(get_custom_emoji_id(sticker->file_id_).get(), + sticker->has_text_color_); + default: + UNREACHABLE(); + return nullptr; + } + }(); return td_api::make_object( sticker->set_id_.get(), width, height, sticker->alt_, get_sticker_format_object(sticker->format_), - get_sticker_type_object(sticker->type_), std::move(mask_position), custom_emoji_id.get(), - sticker->has_text_color_, get_sticker_minithumbnail(sticker->minithumbnail_, sticker->set_id_, document_id, zoom), - std::move(thumbnail_object), sticker->is_premium_, std::move(premium_animation_object), - td_->file_manager_->get_file_object(file_id)); + std::move(full_type), get_sticker_minithumbnail(sticker->minithumbnail_, sticker->set_id_, document_id, zoom), + std::move(thumbnail_object), td_->file_manager_->get_file_object(file_id)); } tl_object_ptr StickersManager::get_stickers_object(const vector &sticker_ids) const {