diff --git a/tgbotapi.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/stickers/CreateNewStickerSet.kt b/tgbotapi.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/stickers/CreateNewStickerSet.kt index 68ec50773e..fa9099e30b 100644 --- a/tgbotapi.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/stickers/CreateNewStickerSet.kt +++ b/tgbotapi.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/stickers/CreateNewStickerSet.kt @@ -11,11 +11,10 @@ suspend fun TelegramBot.createNewStickerSet( userId: UserId, name: String, title: String, - stickersFormat: StickerFormat, stickers: List, needsRepainting: Boolean = false ) = execute( - CreateNewStickerSet(userId, name, title, stickersFormat, stickers, needsRepainting) + CreateNewStickerSet(userId, name, title, stickers, needsRepainting) ) @@ -23,9 +22,8 @@ suspend fun TelegramBot.createNewStickerSet( user: CommonUser, name: String, title: String, - stickersFormat: StickerFormat, stickers: List, needsRepainting: Boolean = false, ) = createNewStickerSet( - user.id, name, title, stickersFormat, stickers, needsRepainting + user.id, name, title, stickers, needsRepainting ) diff --git a/tgbotapi.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/stickers/SetStickerSetThumb.kt b/tgbotapi.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/stickers/SetStickerSetThumbnail.kt similarity index 71% rename from tgbotapi.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/stickers/SetStickerSetThumb.kt rename to tgbotapi.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/stickers/SetStickerSetThumbnail.kt index b00314f048..492533e890 100644 --- a/tgbotapi.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/stickers/SetStickerSetThumb.kt +++ b/tgbotapi.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/stickers/SetStickerSetThumbnail.kt @@ -4,6 +4,7 @@ import dev.inmo.tgbotapi.bot.TelegramBot import dev.inmo.tgbotapi.requests.abstracts.FileId import dev.inmo.tgbotapi.requests.abstracts.MultipartFile import dev.inmo.tgbotapi.requests.stickers.SetStickerSetThumbnail +import dev.inmo.tgbotapi.types.StickerFormat import dev.inmo.tgbotapi.types.StickerSetName import dev.inmo.tgbotapi.types.chat.CommonUser import dev.inmo.tgbotapi.types.UserId @@ -12,63 +13,71 @@ import dev.inmo.tgbotapi.types.stickers.StickerSet suspend fun TelegramBot.setStickerSetThumbnail( userId: UserId, stickerSetName: StickerSetName, + format: StickerFormat, thumbnail: FileId ) = execute( - SetStickerSetThumbnail(userId, stickerSetName, thumbnail) + SetStickerSetThumbnail(userId, stickerSetName, format, thumbnail) ) suspend fun TelegramBot.setStickerSetThumbnail( userId: UserId, stickerSetName: StickerSetName, + format: StickerFormat, thumbnail: MultipartFile ) = execute( - SetStickerSetThumbnail(userId, stickerSetName, thumbnail) + SetStickerSetThumbnail(userId, stickerSetName, format, thumbnail) ) suspend fun TelegramBot.setStickerSetThumbnail( user: CommonUser, stickerSetName: StickerSetName, + format: StickerFormat, thumbnail: FileId ) = setStickerSetThumbnail( - user.id, stickerSetName, thumbnail + user.id, stickerSetName, format, thumbnail ) suspend fun TelegramBot.setStickerSetThumbnail( user: CommonUser, stickerSetName: StickerSetName, + format: StickerFormat, thumbnail: MultipartFile ) = setStickerSetThumbnail( - user.id, stickerSetName, thumbnail + user.id, stickerSetName, format, thumbnail ) suspend fun TelegramBot.setStickerSetThumbnail( userId: UserId, stickerSet: StickerSet, + format: StickerFormat, thumbnail: FileId ) = setStickerSetThumbnail( - userId, stickerSet.name, thumbnail + userId, stickerSet.name, format, thumbnail ) suspend fun TelegramBot.setStickerSetThumbnail( userId: UserId, stickerSet: StickerSet, + format: StickerFormat, thumbnail: MultipartFile ) = setStickerSetThumbnail( - userId, stickerSet.name, thumbnail + userId, stickerSet.name, format, thumbnail ) suspend fun TelegramBot.setStickerSetThumbnail( user: CommonUser, stickerSet: StickerSet, + format: StickerFormat, thumbnail: FileId ) = setStickerSetThumbnail( - user.id, stickerSet, thumbnail + user.id, stickerSet, format, thumbnail ) suspend fun TelegramBot.setStickerSetThumbnail( user: CommonUser, stickerSet: StickerSet, + format: StickerFormat, thumbnail: MultipartFile ) = setStickerSetThumbnail( - user.id, stickerSet, thumbnail + user.id, stickerSet, format, thumbnail ) diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/stickers/CreateNewStickerSet.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/stickers/CreateNewStickerSet.kt index 596afe5897..d9c45f6a6b 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/stickers/CreateNewStickerSet.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/stickers/CreateNewStickerSet.kt @@ -21,14 +21,13 @@ fun CreateNewStickerSet( userId: UserId, name: StickerSetName, title: String, - stickersFormat: StickerFormat, stickers: List, needsRepainting: Boolean? = null ): Request { val data = when(stickers.first()) { - is InputSticker.Mask -> CreateNewStickerSet.Mask(userId, name, title, stickersFormat, stickers.filterIsInstance()) - is InputSticker.WithKeywords.CustomEmoji -> CreateNewStickerSet.CustomEmoji(userId, name, title, stickersFormat, stickers.filterIsInstance(), needsRepainting) - is InputSticker.WithKeywords.Regular -> CreateNewStickerSet.Regular(userId, name, title, stickersFormat, stickers.filterIsInstance()) + is InputSticker.Mask -> CreateNewStickerSet.Mask(userId, name, title, stickers.filterIsInstance()) + is InputSticker.WithKeywords.CustomEmoji -> CreateNewStickerSet.CustomEmoji(userId, name, title, stickers.filterIsInstance(), needsRepainting) + is InputSticker.WithKeywords.Regular -> CreateNewStickerSet.Regular(userId, name, title, stickers.filterIsInstance()) } val multipartParts = stickers.mapNotNull { (it.sticker as? MultipartFile) @@ -63,14 +62,12 @@ fun CreateNewStickerSet( userId: UserId, name: String, title: String, - stickersFormat: StickerFormat, stickers: List, needsRepainting: Boolean? = null ) = CreateNewStickerSet( userId = userId, name = StickerSetName(name), title = title, - stickersFormat = stickersFormat, stickers = stickers, needsRepainting = needsRepainting ) @@ -79,7 +76,6 @@ fun CreateNewStickerSet( sealed interface CreateNewStickerSet : CreateStickerSetAction { val stickerType: StickerType val stickers: List - val stickersFormat: StickerFormat override val requestSerializer: SerializationStrategy<*> get() = serializer() @@ -94,8 +90,6 @@ sealed interface CreateNewStickerSet : CreateStickerSetAction { override val name: StickerSetName, @SerialName(titleField) override val title: String, - @SerialName(stickerFormatField) - override val stickersFormat: StickerFormat, @SerialName(stickersField) override val stickers: List ) : CreateNewStickerSet { @@ -111,8 +105,6 @@ sealed interface CreateNewStickerSet : CreateStickerSetAction { override val name: StickerSetName, @SerialName(titleField) override val title: String, - @SerialName(stickerFormatField) - override val stickersFormat: StickerFormat, @SerialName(stickersField) override val stickers: List ) : CreateNewStickerSet { @@ -128,8 +120,6 @@ sealed interface CreateNewStickerSet : CreateStickerSetAction { override val name: StickerSetName, @SerialName(titleField) override val title: String, - @SerialName(stickerFormatField) - override val stickersFormat: StickerFormat, @SerialName(stickersField) override val stickers: List, @SerialName(needsRepaintingField) @@ -148,8 +138,6 @@ sealed interface CreateNewStickerSet : CreateStickerSetAction { override val name: StickerSetName, @SerialName(titleField) override val title: String, - @SerialName(stickerFormatField) - val stickersFormat: StickerFormat, @SerialName(stickersField) val stickers: List, @SerialName(stickerTypeField) @@ -172,7 +160,6 @@ object CreateNewStickerSetSerializer : KSerializer, it.userId, it.name, it.title, - it.stickersFormat, it.stickers, it.stickerType, (it as? CreateNewStickerSet.CustomEmoji)?.needsRepainting @@ -184,7 +171,6 @@ object CreateNewStickerSetSerializer : KSerializer, it.userId, it.name, it.title, - it.stickersFormat, it.stickers.filterIsInstance(), it.needsRepainting ) @@ -192,14 +178,12 @@ object CreateNewStickerSetSerializer : KSerializer, it.userId, it.name, it.title, - it.stickersFormat, it.stickers.filterIsInstance(), ) StickerType.Regular -> CreateNewStickerSet.Regular( it.userId, it.name, it.title, - it.stickersFormat, it.stickers.filterIsInstance(), ) is StickerType.Unknown -> error("Unable to create new sticker set due to error in type format: ${it.stickerType}") diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/stickers/InputSticker.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/stickers/InputSticker.kt index b0a9cd4591..2cd9f3cd8b 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/stickers/InputSticker.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/stickers/InputSticker.kt @@ -2,11 +2,7 @@ package dev.inmo.tgbotapi.requests.stickers import dev.inmo.micro_utils.serialization.mapper.MapperSerializer import dev.inmo.tgbotapi.requests.abstracts.InputFile -import dev.inmo.tgbotapi.types.StickerType -import dev.inmo.tgbotapi.types.emojiListField -import dev.inmo.tgbotapi.types.keywordsField -import dev.inmo.tgbotapi.types.maskPositionField -import dev.inmo.tgbotapi.types.stickerField +import dev.inmo.tgbotapi.types.* import dev.inmo.tgbotapi.types.stickers.MaskPosition import dev.inmo.tgbotapi.utils.internal.ClassCastsIncluded import kotlinx.serialization.KSerializer @@ -17,12 +13,15 @@ import kotlinx.serialization.Serializable @Serializable(InputStickerSerializer::class) sealed interface InputSticker { val sticker: InputFile + val format: StickerFormat val emojisList: List @Serializable data class Mask( @SerialName(stickerField) override val sticker: InputFile, + @SerialName(formatField) + override val format: StickerFormat, @SerialName(emojiListField) override val emojisList: List, @SerialName(maskPositionField) @@ -37,6 +36,8 @@ sealed interface InputSticker { data class Regular( @SerialName(stickerField) override val sticker: InputFile, + @SerialName(formatField) + override val format: StickerFormat, @SerialName(emojiListField) override val emojisList: List, @SerialName(keywordsField) @@ -47,6 +48,8 @@ sealed interface InputSticker { data class CustomEmoji( @SerialName(stickerField) override val sticker: InputFile, + @SerialName(formatField) + override val format: StickerFormat, @SerialName(emojiListField) override val emojisList: List, @SerialName(keywordsField) @@ -61,6 +64,7 @@ object InputStickerSerializer : KSerializer, MapperSerializer SurrogateInputSticker( it.sticker, + it.format, it.emojisList, emptyList(), it.maskPosition, @@ -68,6 +72,7 @@ object InputStickerSerializer : KSerializer, MapperSerializer SurrogateInputSticker( it.sticker, + it.format, it.emojisList, it.keywords, null, @@ -75,6 +80,7 @@ object InputStickerSerializer : KSerializer, MapperSerializer SurrogateInputSticker( it.sticker, + it.format, it.emojisList, it.keywords, null, @@ -86,21 +92,25 @@ object InputStickerSerializer : KSerializer, MapperSerializer InputSticker.WithKeywords.CustomEmoji( it.sticker, + it.format, it.emojisList, it.keywords ) StickerType.Mask -> InputSticker.Mask( it.sticker, + it.format, it.emojisList, it.maskPosition ) StickerType.Regular -> InputSticker.WithKeywords.Regular( it.sticker, + it.format, it.emojisList, it.keywords ) is StickerType.Unknown -> InputSticker.WithKeywords.Regular( it.sticker, + it.format, it.emojisList, it.keywords ) @@ -111,6 +121,8 @@ object InputStickerSerializer : KSerializer, MapperSerializer, @SerialName(keywordsField) diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/stickers/SetStickerSetThumbnail.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/stickers/SetStickerSetThumbnail.kt index 619e681f00..020a57e16c 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/stickers/SetStickerSetThumbnail.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/stickers/SetStickerSetThumbnail.kt @@ -9,10 +9,11 @@ import kotlinx.serialization.* fun SetStickerSetThumbnail( userId: UserId, stickerSetName: StickerSetName, + format: StickerFormat, thumbnail: MultipartFile ): Request { return CommonMultipartFileRequest( - SetStickerSetThumbnail(userId, stickerSetName), + SetStickerSetThumbnail(userId, stickerSetName, format), mapOf(thumbnailField to thumbnail) ) } @@ -20,10 +21,12 @@ fun SetStickerSetThumbnail( fun SetStickerSetThumbnail( userId: UserId, stickerSetName: String, + format: StickerFormat, thumbnail: MultipartFile ): Request = SetStickerSetThumbnail( userId = userId, - stickerSetName = StickerSetName(stickerSetName), + stickerSetName = StickerSetName(stickerSetName, ), + format = format, thumbnail = thumbnail ) @@ -33,6 +36,8 @@ data class SetStickerSetThumbnail ( override val userId: UserId, @SerialName(nameField) override val name: StickerSetName, + @SerialName(formatField) + val format: StickerFormat, @SerialName(thumbnailField) val thumbnail: FileId? = null ) : OwnerStickerSetAction { diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/Common.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/Common.kt index e90d985ae6..3f99398572 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/Common.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/Common.kt @@ -379,6 +379,7 @@ const val oldChatMemberField = "old_chat_member" const val newChatMemberField = "new_chat_member" const val stickerTypeField = "sticker_type" const val stickerFormatField = "sticker_format" +const val formatField = "format" const val needsRepaintingField = "needs_repainting" const val okField = "ok" diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/stickers/StickerSet.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/stickers/StickerSet.kt index 98cc168745..edbe00caf8 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/stickers/StickerSet.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/stickers/StickerSet.kt @@ -25,12 +25,7 @@ sealed interface StickerSet { val name: StickerSetName val title: String val stickerType: StickerType - val stickerFormat: StickerFormat val stickers: List - val isAnimated: Boolean - get() = false - val isVideo: Boolean - get() = false val thumbnail: PhotoSize? object Serializer : KSerializer { @@ -42,69 +37,33 @@ sealed interface StickerSet { return when (surrogate.sticker_type) { StickerType.CustomEmoji -> when { - surrogate.is_animated == true -> CustomEmojiAnimatedStickerSet( + else -> CustomEmojiStickerSet( surrogate.name, surrogate.title, - surrogate.stickers.filterIsInstance(), - surrogate.thumb - ) - surrogate.is_video == true -> CustomEmojiVideoStickerSet( - surrogate.name, - surrogate.title, - surrogate.stickers.filterIsInstance(), - surrogate.thumb - ) - else -> CustomEmojiSimpleStickerSet( - surrogate.name, - surrogate.title, - surrogate.stickers.filterIsInstance(), + surrogate.stickers.filterIsInstance(), surrogate.thumb ) } StickerType.Mask -> when { - surrogate.is_animated == true -> MaskAnimatedStickerSet( + else -> MaskStickerSet( surrogate.name, surrogate.title, - surrogate.stickers.filterIsInstance(), - surrogate.thumb - ) - surrogate.is_video == true -> MaskVideoStickerSet( - surrogate.name, - surrogate.title, - surrogate.stickers.filterIsInstance(), - surrogate.thumb - ) - else -> MaskSimpleStickerSet( - surrogate.name, - surrogate.title, - surrogate.stickers.filterIsInstance(), + surrogate.stickers.filterIsInstance(), surrogate.thumb ) } StickerType.Regular -> when { - surrogate.is_animated == true -> RegularAnimatedStickerSet( + else -> RegularStickerSet( surrogate.name, surrogate.title, - surrogate.stickers.filterIsInstance(), - surrogate.thumb - ) - surrogate.is_video == true -> RegularVideoStickerSet( - surrogate.name, - surrogate.title, - surrogate.stickers.filterIsInstance(), - surrogate.thumb - ) - else -> RegularSimpleStickerSet( - surrogate.name, - surrogate.title, - surrogate.stickers.filterIsInstance(), + surrogate.stickers.filterIsInstance(), surrogate.thumb ) } is StickerType.Unknown -> UnknownStickerSet( surrogate.name, surrogate.title, - surrogate.stickers.filterIsInstance(), + surrogate.stickers.filterIsInstance(), surrogate.sticker_type, surrogate.thumb, json @@ -119,180 +78,48 @@ sealed interface StickerSet { } @Serializable -sealed interface AnimatedStickerSet : StickerSet { - override val isAnimated: Boolean - get() = true - @SerialName(stickerFormatField) - @EncodeDefault - override val stickerFormat: StickerFormat - get() = StickerFormat.Animated -} -@Serializable -sealed interface VideoStickerSet : StickerSet { - override val isVideo: Boolean - get() = true - @SerialName(stickerFormatField) - @EncodeDefault - override val stickerFormat: StickerFormat - get() = StickerFormat.Video -} -@Serializable -sealed interface RegularStickerSet : StickerSet -@Serializable -sealed interface MaskStickerSet : StickerSet -@Serializable -sealed interface CustomEmojiStickerSet : StickerSet - -@Serializable -data class RegularSimpleStickerSet( +data class RegularStickerSet( @SerialName(nameField) override val name: StickerSetName, @SerialName(titleField) override val title: String, @SerialName(stickersField) - override val stickers: List, + override val stickers: List, @SerialName(thumbnailField) override val thumbnail: PhotoSize? = null -) : RegularStickerSet { - @SerialName(stickerTypeField) - @EncodeDefault - override val stickerType: StickerType = StickerType.Regular - @SerialName(stickerFormatField) - @EncodeDefault - override val stickerFormat: StickerFormat = StickerFormat.Static -} - -@Serializable -data class RegularAnimatedStickerSet( - @SerialName(nameField) - override val name: StickerSetName, - @SerialName(titleField) - override val title: String, - @SerialName(stickersField) - override val stickers: List, - @SerialName(thumbnailField) - override val thumbnail: PhotoSize? = null -) : RegularStickerSet, AnimatedStickerSet { +) : StickerSet { @SerialName(stickerTypeField) @EncodeDefault override val stickerType: StickerType = StickerType.Regular } @Serializable -data class RegularVideoStickerSet( +data class MaskStickerSet( @SerialName(nameField) override val name: StickerSetName, @SerialName(titleField) override val title: String, @SerialName(stickersField) - override val stickers: List, + override val stickers: List, @SerialName(thumbnailField) override val thumbnail: PhotoSize? = null -) : RegularStickerSet, VideoStickerSet { - @SerialName(stickerTypeField) - @EncodeDefault - override val stickerType: StickerType = StickerType.Regular -} - -@Serializable -data class MaskSimpleStickerSet( - @SerialName(nameField) - override val name: StickerSetName, - @SerialName(titleField) - override val title: String, - @SerialName(stickersField) - override val stickers: List, - @SerialName(thumbnailField) - override val thumbnail: PhotoSize? = null -) : MaskStickerSet { - @SerialName(stickerTypeField) - @EncodeDefault - override val stickerType: StickerType = StickerType.Mask - - @SerialName(stickerFormatField) - @EncodeDefault - override val stickerFormat: StickerFormat = StickerFormat.Static -} - -@Serializable -data class MaskAnimatedStickerSet( - @SerialName(nameField) - override val name: StickerSetName, - @SerialName(titleField) - override val title: String, - @SerialName(stickersField) - override val stickers: List, - @SerialName(thumbnailField) - override val thumbnail: PhotoSize? = null -) : MaskStickerSet, AnimatedStickerSet { +) : StickerSet { @SerialName(stickerTypeField) @EncodeDefault override val stickerType: StickerType = StickerType.Mask } @Serializable -data class MaskVideoStickerSet( +data class CustomEmojiStickerSet( @SerialName(nameField) override val name: StickerSetName, @SerialName(titleField) override val title: String, @SerialName(stickersField) - override val stickers: List, + override val stickers: List, @SerialName(thumbnailField) override val thumbnail: PhotoSize? = null -) : MaskStickerSet, VideoStickerSet { - @SerialName(stickerTypeField) - @EncodeDefault - override val stickerType: StickerType = StickerType.Mask -} - -@Serializable -data class CustomEmojiSimpleStickerSet( - @SerialName(nameField) - override val name: StickerSetName, - @SerialName(titleField) - override val title: String, - @SerialName(stickersField) - override val stickers: List, - @SerialName(thumbnailField) - override val thumbnail: PhotoSize? = null -) : CustomEmojiStickerSet { - @SerialName(stickerTypeField) - @EncodeDefault - override val stickerType: StickerType = StickerType.CustomEmoji - - @SerialName(stickerFormatField) - @EncodeDefault - override val stickerFormat: StickerFormat = StickerFormat.Static -} - -@Serializable -data class CustomEmojiAnimatedStickerSet( - @SerialName(nameField) - override val name: StickerSetName, - @SerialName(titleField) - override val title: String, - @SerialName(stickersField) - override val stickers: List, - @SerialName(thumbnailField) - override val thumbnail: PhotoSize? = null -) : CustomEmojiStickerSet, AnimatedStickerSet { - @SerialName(stickerTypeField) - @EncodeDefault - override val stickerType: StickerType = StickerType.CustomEmoji -} - -@Serializable -data class CustomEmojiVideoStickerSet( - @SerialName(nameField) - override val name: StickerSetName, - @SerialName(titleField) - override val title: String, - @SerialName(stickersField) - override val stickers: List, - @SerialName(thumbnailField) - override val thumbnail: PhotoSize? = null -) : CustomEmojiStickerSet, VideoStickerSet { +) : StickerSet { @SerialName(stickerTypeField) @EncodeDefault override val stickerType: StickerType = StickerType.CustomEmoji @@ -311,4 +138,4 @@ data class UnknownStickerSet( @SerialName(thumbnailField) override val thumbnail: PhotoSize? = null, val raw: JsonElement -) : CustomEmojiStickerSet, VideoStickerSet +) : StickerSet