package dev.inmo.tgbotapi.types.stickers import dev.inmo.tgbotapi.types.* import dev.inmo.tgbotapi.types.files.* import dev.inmo.tgbotapi.utils.nonstrictJsonFormat import kotlinx.serialization.* import kotlinx.serialization.descriptors.SerialDescriptor import kotlinx.serialization.encoding.Decoder import kotlinx.serialization.encoding.Encoder import kotlinx.serialization.json.JsonElement @Serializable data class SurrogateStickerSet( val name: StickerSetName, val title: String, val sticker_type: StickerType, val is_animated: Boolean? = false, val is_video: Boolean? = false, val stickers: List<@Serializable(StickerSerializer::class) Sticker> = emptyList(), val thumb: PhotoSize? = null ) @Serializable(StickerSet.Serializer::class) sealed interface StickerSet { val name: StickerSetName val title: String val stickerType: StickerType val stickers: List val thumbnail: PhotoSize? object Serializer : KSerializer { override val descriptor: SerialDescriptor = JsonElement.serializer().descriptor override fun deserialize(decoder: Decoder): StickerSet { val json = JsonElement.serializer().deserialize(decoder) val surrogate = nonstrictJsonFormat.decodeFromJsonElement(SurrogateStickerSet.serializer(), json) return when (surrogate.sticker_type) { StickerType.CustomEmoji -> when { else -> CustomEmojiStickerSet( surrogate.name, surrogate.title, surrogate.stickers.filterIsInstance(), surrogate.thumb ) } StickerType.Mask -> when { else -> MaskStickerSet( surrogate.name, surrogate.title, surrogate.stickers.filterIsInstance(), surrogate.thumb ) } StickerType.Regular -> when { else -> RegularStickerSet( surrogate.name, surrogate.title, surrogate.stickers.filterIsInstance(), surrogate.thumb ) } is StickerType.Unknown -> UnknownStickerSet( surrogate.name, surrogate.title, surrogate.stickers.filterIsInstance(), surrogate.sticker_type, surrogate.thumb, json ) } } override fun serialize(encoder: Encoder, value: StickerSet) { TODO("Not yet implemented") } } } @Serializable data class RegularStickerSet( @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 ) : StickerSet { @SerialName(stickerTypeField) @EncodeDefault override val stickerType: StickerType = StickerType.Regular } @Serializable data class MaskStickerSet( @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 ) : StickerSet { @SerialName(stickerTypeField) @EncodeDefault override val stickerType: StickerType = StickerType.Mask } @Serializable data class CustomEmojiStickerSet( @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 ) : StickerSet { @SerialName(stickerTypeField) @EncodeDefault override val stickerType: StickerType = StickerType.CustomEmoji } @Serializable data class UnknownStickerSet( @SerialName(nameField) override val name: StickerSetName, @SerialName(titleField) override val title: String, @SerialName(stickersField) override val stickers: List, @SerialName(stickerTypeField) override val stickerType: StickerType, @SerialName(thumbnailField) override val thumbnail: PhotoSize? = null, val raw: JsonElement ) : StickerSet