1
0
mirror of https://github.com/InsanusMokrassar/TelegramBotAPI.git synced 2024-06-18 07:45:27 +00:00
tgbotapi/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/files/Sticker.kt

570 lines
19 KiB
Kotlin
Raw Normal View History

2020-10-04 11:06:30 +00:00
package dev.inmo.tgbotapi.types.files
2018-12-26 08:07:24 +00:00
2022-04-17 12:15:24 +00:00
import dev.inmo.tgbotapi.requests.abstracts.FileId
2023-03-11 11:39:02 +00:00
import dev.inmo.tgbotapi.requests.stickers.InputSticker
2022-04-17 12:15:24 +00:00
import dev.inmo.tgbotapi.types.*
import dev.inmo.tgbotapi.types.stickers.MaskPosition
import dev.inmo.tgbotapi.utils.RiskFeature
2022-08-13 05:58:42 +00:00
import dev.inmo.tgbotapi.utils.nonstrictJsonFormat
2022-04-17 12:15:24 +00:00
import kotlinx.serialization.*
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
2022-08-13 05:58:42 +00:00
import kotlinx.serialization.json.JsonElement
2018-12-26 08:07:24 +00:00
2022-04-17 12:15:24 +00:00
@Serializable
@RiskFeature("This class is used for serialization/deserialization of Sticker interface")
data class StickerSurrogate(
val file_id: FileId,
val file_unique_id: FileUniqueId,
val type: StickerType,
2022-04-17 12:15:24 +00:00
val width: Int,
val height: Int,
val is_animated: Boolean? = null,
val is_video: Boolean? = null,
2023-05-06 06:00:08 +00:00
val thumbnail: PhotoSize? = null,
2022-04-17 12:15:24 +00:00
val emoji: String? = null,
val set_name: StickerSetName? = null,
val premium_animation: File? = null,
2022-04-17 12:15:24 +00:00
val mask_position: MaskPosition? = null,
val custom_emoji_id: CustomEmojiId? = null,
2023-03-10 19:30:12 +00:00
val file_size: Long? = null,
val needs_repainting: Boolean = false
2022-04-17 12:15:24 +00:00
)
// TODO:: Serializer
@Serializable(StickerSerializer::class)
2024-01-07 14:00:07 +00:00
sealed interface Sticker : TelegramMediaFile, SizedMediaFile, ThumbedMediaFile, MediaContentVariant {
2022-04-17 12:15:24 +00:00
val emoji: String?
val stickerSetName: StickerSetName?
2023-03-10 18:46:20 +00:00
val stickerFormat: StickerFormat
2022-04-17 12:15:24 +00:00
val isAnimated
get() = false
2022-04-17 12:15:24 +00:00
val isVideo
get() = false
2023-05-06 06:00:08 +00:00
val type: StickerType
2023-03-11 11:39:02 +00:00
fun asInputSticker(emojis: List<String> = emoji ?.let { listOf(it) } ?: error("Unable to create input sticker without emojis")): InputSticker
2022-04-17 12:15:24 +00:00
}
2022-11-20 07:28:23 +00:00
@OptIn(RiskFeature::class)
2022-04-17 12:15:24 +00:00
object StickerSerializer : KSerializer<Sticker> {
override val descriptor: SerialDescriptor = StickerSurrogate.serializer().descriptor
override fun deserialize(decoder: Decoder): Sticker {
2022-08-13 05:58:42 +00:00
val json = JsonElement.serializer().deserialize(decoder)
val surrogate = nonstrictJsonFormat.decodeFromJsonElement(StickerSurrogate.serializer(), json)
2022-04-17 12:15:24 +00:00
return when (surrogate.type) {
StickerType.Regular -> when {
surrogate.is_animated == true -> RegularAnimatedSticker(
surrogate.file_id,
surrogate.file_unique_id,
surrogate.width,
surrogate.height,
2023-05-06 06:00:08 +00:00
surrogate.thumbnail,
surrogate.emoji,
surrogate.set_name,
surrogate.premium_animation,
surrogate.file_size
)
surrogate.is_video == true -> RegularVideoSticker(
surrogate.file_id,
surrogate.file_unique_id,
surrogate.width,
surrogate.height,
2023-05-06 06:00:08 +00:00
surrogate.thumbnail,
surrogate.emoji,
surrogate.set_name,
surrogate.premium_animation,
surrogate.file_size
)
else -> RegularSimpleSticker(
surrogate.file_id,
surrogate.file_unique_id,
surrogate.width,
surrogate.height,
2023-05-06 06:00:08 +00:00
surrogate.thumbnail,
surrogate.emoji,
surrogate.set_name,
surrogate.premium_animation,
surrogate.file_size
)
}
2022-08-13 05:58:42 +00:00
StickerType.Mask -> when {
surrogate.is_animated == true -> MaskAnimatedSticker(
surrogate.file_id,
surrogate.file_unique_id,
surrogate.width,
surrogate.height,
surrogate.mask_position,
2023-05-06 06:00:08 +00:00
surrogate.thumbnail,
2022-08-13 05:58:42 +00:00
surrogate.emoji,
surrogate.set_name,
surrogate.file_size
)
surrogate.is_video == true -> MaskVideoSticker(
surrogate.file_id,
surrogate.file_unique_id,
surrogate.width,
surrogate.height,
surrogate.mask_position,
2023-05-06 06:00:08 +00:00
surrogate.thumbnail,
2022-08-13 05:58:42 +00:00
surrogate.emoji,
surrogate.set_name,
surrogate.file_size
)
else -> MaskSimpleSticker(
surrogate.file_id,
surrogate.file_unique_id,
surrogate.width,
surrogate.height,
surrogate.mask_position,
2023-05-06 06:00:08 +00:00
surrogate.thumbnail,
2022-08-13 05:58:42 +00:00
surrogate.emoji,
surrogate.set_name,
surrogate.file_size
)
}
StickerType.CustomEmoji -> when {
surrogate.is_animated == true -> CustomEmojiAnimatedSticker(
surrogate.file_id,
surrogate.file_unique_id,
surrogate.width,
surrogate.height,
surrogate.custom_emoji_id ?: error("For custom emoji stickers field custom_emoji_id should be presented"),
2023-05-06 06:00:08 +00:00
surrogate.thumbnail,
surrogate.emoji,
surrogate.set_name,
2023-03-10 19:30:12 +00:00
surrogate.file_size,
surrogate.needs_repainting
)
surrogate.is_video == true -> CustomEmojiVideoSticker(
surrogate.file_id,
surrogate.file_unique_id,
surrogate.width,
surrogate.height,
surrogate.custom_emoji_id ?: error("For custom emoji stickers field custom_emoji_id should be presented"),
2023-05-06 06:00:08 +00:00
surrogate.thumbnail,
surrogate.emoji,
surrogate.set_name,
2023-03-10 19:30:12 +00:00
surrogate.file_size,
surrogate.needs_repainting
)
else -> CustomEmojiSimpleSticker(
surrogate.file_id,
surrogate.file_unique_id,
surrogate.width,
surrogate.height,
surrogate.custom_emoji_id ?: error("For custom emoji stickers field custom_emoji_id should be presented"),
2023-05-06 06:00:08 +00:00
surrogate.thumbnail,
surrogate.emoji,
surrogate.set_name,
2023-03-10 19:30:12 +00:00
surrogate.file_size,
surrogate.needs_repainting
)
}
2022-08-13 05:58:42 +00:00
is StickerType.Unknown -> UnknownSticker(
surrogate.file_id,
surrogate.file_unique_id,
surrogate.width,
surrogate.height,
2023-05-06 06:00:08 +00:00
surrogate.thumbnail,
2022-08-13 05:58:42 +00:00
surrogate.emoji,
surrogate.set_name,
surrogate.file_size,
2023-03-10 18:46:20 +00:00
when {
surrogate.is_animated == true -> StickerFormat.Animated
surrogate.is_video == true -> StickerFormat.Video
else -> StickerFormat.Static
},
2023-05-06 06:00:08 +00:00
surrogate.type,
2022-08-13 05:58:42 +00:00
json
)
2022-04-17 12:15:24 +00:00
}
}
override fun serialize(encoder: Encoder, value: Sticker) {
2023-05-06 06:00:08 +00:00
with(value) {
StickerSurrogate.serializer().serialize(
encoder,
StickerSurrogate(
fileId,
fileUniqueId,
type,
width,
height,
isAnimated,
isVideo,
thumbnail,
emoji,
stickerSetName,
(this as? RegularSticker) ?.premiumAnimationFile,
(this as? MaskSticker) ?.maskPosition,
(this as? CustomEmojiSticker) ?.customEmojiId,
fileSize,
(this as? CustomEmojiSticker) ?.needsRepainting ?: false
)
)
}
2022-04-17 12:15:24 +00:00
}
}
2022-08-13 05:58:42 +00:00
@Serializable
sealed interface VideoSticker : Sticker {
override val isVideo: Boolean
get() = true
2023-03-10 18:46:20 +00:00
override val stickerFormat: StickerFormat
get() = StickerFormat.Video
}
2022-08-13 05:58:42 +00:00
@Serializable
sealed interface AnimatedSticker : Sticker {
override val isAnimated: Boolean
get() = true
2023-03-10 18:46:20 +00:00
override val stickerFormat: StickerFormat
get() = StickerFormat.Animated
}
2022-08-13 05:58:42 +00:00
@Serializable
sealed interface RegularSticker : Sticker {
val premiumAnimationFile: File?
2023-03-11 11:39:02 +00:00
2023-05-06 06:00:08 +00:00
override val type: StickerType.Regular
get() = StickerType.Regular
2023-03-11 11:39:02 +00:00
override fun asInputSticker(emojis: List<String>) = InputSticker.WithKeywords.Regular(
fileId,
emojis,
emptyList()
)
}
2022-04-17 12:15:24 +00:00
@Serializable
2022-08-13 05:58:42 +00:00
data class RegularSimpleSticker(
@SerialName(fileIdField)
override val fileId: FileId,
@SerialName(fileUniqueIdField)
override val fileUniqueId: FileUniqueId,
@SerialName(widthField)
override val width: Int,
@SerialName(heightField)
override val height: Int,
2023-03-10 06:01:08 +00:00
@SerialName(thumbnailField)
override val thumbnail: PhotoSize? = null,
@SerialName(emojiField)
override val emoji: String? = null,
@SerialName(stickerSetNameField)
override val stickerSetName: StickerSetName? = null,
2022-08-13 05:58:42 +00:00
@SerialName(premiumAnimationField)
2023-03-10 18:46:20 +00:00
override val premiumAnimationFile: File? = null,
@SerialName(fileSizeField)
override val fileSize: Long? = null,
2023-03-10 18:46:20 +00:00
) : RegularSticker {
@SerialName(stickerFormatField)
@EncodeDefault
override val stickerFormat: StickerFormat = StickerFormat.Static
2023-05-06 06:00:08 +00:00
@SerialName(stickerTypeField)
@Serializable(StickerType.Serializer::class)
@EncodeDefault
override val type: StickerType.Regular
get() = StickerType.Regular
2023-03-10 18:46:20 +00:00
}
2023-03-10 08:59:59 +00:00
@Serializable
2022-08-13 05:58:42 +00:00
data class RegularAnimatedSticker(
2022-04-17 12:15:24 +00:00
@SerialName(fileIdField)
override val fileId: FileId,
@SerialName(fileUniqueIdField)
override val fileUniqueId: FileUniqueId,
@SerialName(widthField)
override val width: Int,
@SerialName(heightField)
override val height: Int,
2023-03-10 06:01:08 +00:00
@SerialName(thumbnailField)
override val thumbnail: PhotoSize? = null,
2022-04-17 12:15:24 +00:00
@SerialName(emojiField)
override val emoji: String? = null,
@SerialName(stickerSetNameField)
override val stickerSetName: StickerSetName? = null,
2022-06-21 11:34:14 +00:00
@SerialName(premiumAnimationField)
2023-03-10 18:46:20 +00:00
override val premiumAnimationFile: File? = null,
2022-04-17 12:15:24 +00:00
@SerialName(fileSizeField)
override val fileSize: Long? = null,
2023-05-06 06:00:08 +00:00
) : RegularSticker, AnimatedSticker {
@SerialName(stickerTypeField)
@Serializable(StickerType.Serializer::class)
@EncodeDefault
override val type: StickerType.Regular
get() = StickerType.Regular
}
2022-04-17 12:15:24 +00:00
@Serializable
2022-08-13 05:58:42 +00:00
data class RegularVideoSticker(
2022-04-17 12:15:24 +00:00
@SerialName(fileIdField)
override val fileId: FileId,
@SerialName(fileUniqueIdField)
override val fileUniqueId: FileUniqueId,
@SerialName(widthField)
override val width: Int,
@SerialName(heightField)
override val height: Int,
2023-03-10 06:01:08 +00:00
@SerialName(thumbnailField)
override val thumbnail: PhotoSize? = null,
2022-04-17 12:15:24 +00:00
@SerialName(emojiField)
override val emoji: String? = null,
@SerialName(stickerSetNameField)
override val stickerSetName: StickerSetName? = null,
2022-06-21 11:34:14 +00:00
@SerialName(premiumAnimationField)
2023-03-10 18:46:20 +00:00
override val premiumAnimationFile: File? = null,
2022-04-17 12:15:24 +00:00
@SerialName(fileSizeField)
override val fileSize: Long? = null,
2023-05-06 06:00:08 +00:00
) : RegularSticker, VideoSticker {
@SerialName(stickerTypeField)
@Serializable(StickerType.Serializer::class)
@EncodeDefault
override val type: StickerType.Regular
get() = StickerType.Regular
}
2022-08-13 05:58:42 +00:00
2022-04-17 12:15:24 +00:00
@Serializable
2022-08-13 05:58:42 +00:00
sealed interface MaskSticker : Sticker {
val maskPosition: MaskPosition?
2023-03-11 11:39:02 +00:00
2023-05-06 06:00:08 +00:00
override val type: StickerType.Mask
get() = StickerType.Mask
2023-03-11 11:39:02 +00:00
override fun asInputSticker(emojis: List<String>) = InputSticker.Mask(
fileId,
emojis,
maskPosition
)
2022-08-13 05:58:42 +00:00
}
@Serializable
data class MaskSimpleSticker(
2022-04-17 12:15:24 +00:00
@SerialName(fileIdField)
override val fileId: FileId,
@SerialName(fileUniqueIdField)
override val fileUniqueId: FileUniqueId,
@SerialName(widthField)
override val width: Int,
@SerialName(heightField)
override val height: Int,
2022-08-13 05:58:42 +00:00
@SerialName(maskPositionField)
override val maskPosition: MaskPosition? = null,
2023-03-10 06:01:08 +00:00
@SerialName(thumbnailField)
override val thumbnail: PhotoSize? = null,
2022-04-17 12:15:24 +00:00
@SerialName(emojiField)
override val emoji: String? = null,
@SerialName(stickerSetNameField)
override val stickerSetName: StickerSetName? = null,
@SerialName(fileSizeField)
override val fileSize: Long? = null,
2023-03-10 18:46:20 +00:00
) : MaskSticker {
@SerialName(stickerFormatField)
@EncodeDefault
override val stickerFormat: StickerFormat = StickerFormat.Static
2023-05-06 06:00:08 +00:00
@SerialName(stickerTypeField)
@Serializable(StickerType.Serializer::class)
@EncodeDefault
override val type: StickerType.Mask
get() = StickerType.Mask
2023-03-10 18:46:20 +00:00
}
2022-08-13 05:58:42 +00:00
@Serializable
data class MaskAnimatedSticker(
@SerialName(fileIdField)
override val fileId: FileId,
@SerialName(fileUniqueIdField)
override val fileUniqueId: FileUniqueId,
@SerialName(widthField)
override val width: Int,
@SerialName(heightField)
override val height: Int,
@SerialName(maskPositionField)
override val maskPosition: MaskPosition? = null,
2023-03-10 06:01:08 +00:00
@SerialName(thumbnailField)
override val thumbnail: PhotoSize? = null,
2022-08-13 05:58:42 +00:00
@SerialName(emojiField)
override val emoji: String? = null,
@SerialName(stickerSetNameField)
override val stickerSetName: StickerSetName? = null,
@SerialName(fileSizeField)
override val fileSize: Long? = null,
2023-05-06 06:00:08 +00:00
) : MaskSticker, AnimatedSticker {
@SerialName(stickerTypeField)
@Serializable(StickerType.Serializer::class)
@EncodeDefault
override val type: StickerType.Mask
get() = StickerType.Mask
}
2022-08-13 05:58:42 +00:00
@Serializable
data class MaskVideoSticker(
@SerialName(fileIdField)
override val fileId: FileId,
@SerialName(fileUniqueIdField)
override val fileUniqueId: FileUniqueId,
@SerialName(widthField)
override val width: Int,
@SerialName(heightField)
override val height: Int,
@SerialName(maskPositionField)
override val maskPosition: MaskPosition? = null,
2023-03-10 06:01:08 +00:00
@SerialName(thumbnailField)
override val thumbnail: PhotoSize? = null,
2022-08-13 05:58:42 +00:00
@SerialName(emojiField)
override val emoji: String? = null,
@SerialName(stickerSetNameField)
override val stickerSetName: StickerSetName? = null,
@SerialName(fileSizeField)
override val fileSize: Long? = null,
2023-05-06 06:00:08 +00:00
) : MaskSticker, VideoSticker {
@SerialName(stickerTypeField)
@Serializable(StickerType.Serializer::class)
@EncodeDefault
override val type: StickerType.Mask
get() = StickerType.Mask
}
2022-08-13 05:58:42 +00:00
@Serializable
sealed interface CustomEmojiSticker : Sticker {
val customEmojiId: CustomEmojiId
2023-03-10 08:00:57 +00:00
val needsRepainting: Boolean
2023-03-11 11:39:02 +00:00
2023-05-06 06:00:08 +00:00
override val type: StickerType.CustomEmoji
get() = StickerType.CustomEmoji
2023-03-11 11:39:02 +00:00
override fun asInputSticker(emojis: List<String>) = InputSticker.WithKeywords.CustomEmoji(
fileId,
emojis,
emptyList()
)
}
@Serializable
data class CustomEmojiSimpleSticker(
@SerialName(fileIdField)
override val fileId: FileId,
@SerialName(fileUniqueIdField)
override val fileUniqueId: FileUniqueId,
@SerialName(widthField)
override val width: Int,
@SerialName(heightField)
override val height: Int,
@SerialName(customEmojiIdField)
override val customEmojiId: CustomEmojiId,
2023-03-10 06:01:08 +00:00
@SerialName(thumbnailField)
override val thumbnail: PhotoSize? = null,
@SerialName(emojiField)
override val emoji: String? = null,
@SerialName(stickerSetNameField)
override val stickerSetName: StickerSetName? = null,
@SerialName(fileSizeField)
override val fileSize: Long? = null,
2023-03-10 08:00:57 +00:00
@SerialName(needsRepaintingField)
override val needsRepainting: Boolean = false
2023-03-10 18:46:20 +00:00
) : CustomEmojiSticker {
@SerialName(stickerFormatField)
@EncodeDefault
override val stickerFormat: StickerFormat = StickerFormat.Static
2023-05-06 06:00:08 +00:00
@SerialName(stickerTypeField)
@Serializable(StickerType.Serializer::class)
@EncodeDefault
override val type: StickerType.CustomEmoji
get() = StickerType.CustomEmoji
2023-03-10 18:46:20 +00:00
}
@Serializable
data class CustomEmojiAnimatedSticker(
@SerialName(fileIdField)
override val fileId: FileId,
@SerialName(fileUniqueIdField)
override val fileUniqueId: FileUniqueId,
@SerialName(widthField)
override val width: Int,
@SerialName(heightField)
override val height: Int,
@SerialName(customEmojiIdField)
override val customEmojiId: CustomEmojiId,
2023-03-10 06:01:08 +00:00
@SerialName(thumbnailField)
override val thumbnail: PhotoSize? = null,
@SerialName(emojiField)
override val emoji: String? = null,
@SerialName(stickerSetNameField)
override val stickerSetName: StickerSetName? = null,
@SerialName(fileSizeField)
override val fileSize: Long? = null,
2023-03-10 08:00:57 +00:00
@SerialName(needsRepaintingField)
override val needsRepainting: Boolean = false,
2023-05-06 06:00:08 +00:00
) : CustomEmojiSticker, AnimatedSticker {
@SerialName(stickerTypeField)
@Serializable(StickerType.Serializer::class)
@EncodeDefault
override val type: StickerType.CustomEmoji
get() = StickerType.CustomEmoji
}
@Serializable
data class CustomEmojiVideoSticker(
@SerialName(fileIdField)
override val fileId: FileId,
@SerialName(fileUniqueIdField)
override val fileUniqueId: FileUniqueId,
@SerialName(widthField)
override val width: Int,
@SerialName(heightField)
override val height: Int,
@SerialName(customEmojiIdField)
override val customEmojiId: CustomEmojiId,
2023-03-10 06:01:08 +00:00
@SerialName(thumbnailField)
override val thumbnail: PhotoSize? = null,
@SerialName(emojiField)
override val emoji: String? = null,
@SerialName(stickerSetNameField)
override val stickerSetName: StickerSetName? = null,
@SerialName(fileSizeField)
override val fileSize: Long? = null,
2023-03-10 08:00:57 +00:00
@SerialName(needsRepaintingField)
override val needsRepainting: Boolean = false,
2023-05-06 06:00:08 +00:00
) : CustomEmojiSticker, VideoSticker {
@SerialName(stickerTypeField)
@Serializable(StickerType.Serializer::class)
@EncodeDefault
override val type: StickerType.CustomEmoji
get() = StickerType.CustomEmoji
}
2022-08-13 05:58:42 +00:00
@Serializable
data class UnknownSticker(
@SerialName(fileIdField)
override val fileId: FileId,
@SerialName(fileUniqueIdField)
override val fileUniqueId: FileUniqueId,
@SerialName(widthField)
override val width: Int,
@SerialName(heightField)
override val height: Int,
2023-03-10 06:01:08 +00:00
@SerialName(thumbnailField)
override val thumbnail: PhotoSize? = null,
2022-08-13 05:58:42 +00:00
@SerialName(emojiField)
override val emoji: String? = null,
@SerialName(stickerSetNameField)
override val stickerSetName: StickerSetName? = null,
@SerialName(fileSizeField)
override val fileSize: Long? = null,
2023-03-10 18:46:20 +00:00
@SerialName(stickerFormatField)
override val stickerFormat: StickerFormat = StickerFormat.Static,
2023-05-06 06:00:08 +00:00
@SerialName(stickerTypeField)
@Serializable(StickerType.Serializer::class)
override val type: StickerType = StickerType.Regular,
2022-08-13 05:58:42 +00:00
val raw: JsonElement
2023-03-11 11:39:02 +00:00
) : Sticker {
override fun asInputSticker(emojis: List<String>) = InputSticker.WithKeywords.Regular(
fileId,
emojis,
emptyList()
)
}