diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/gifts/Gift.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/gifts/Gift.kt index cdf71fd8e5..685bfb3303 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/gifts/Gift.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/gifts/Gift.kt @@ -11,55 +11,133 @@ import kotlinx.serialization.encoding.Encoder @Serializable(Gift.Companion::class) sealed interface Gift { - val id: GiftId - val sticker: Sticker - val starCount: Int - val totalCount: Int? - val upgradeStarCount: Int? - val remainingCount: Int? + @Serializable(Regular.Companion::class) + sealed interface Regular : Gift { + val id: GiftId + val sticker: Sticker + val starCount: Int + val totalCount: Int? + val upgradeStarCount: Int? + val remainingCount: Int? - @Serializable - data class Unlimited( - @SerialName(idField) - override val id: GiftId, - @SerialName(stickerField) - override val sticker: Sticker, - @SerialName(starCountField) - override val starCount: Int, - @SerialName(upgradeStarCountField) - override val upgradeStarCount: Int? = null - ) : Gift { - override val totalCount: Int? - get() = null - override val remainingCount: Int? - get() = null + @Serializable + data class Unlimited( + @SerialName(idField) + override val id: GiftId, + @SerialName(stickerField) + override val sticker: Sticker, + @SerialName(starCountField) + override val starCount: Int, + @SerialName(upgradeStarCountField) + override val upgradeStarCount: Int? = null + ) : Regular { + override val totalCount: Int? + get() = null + override val remainingCount: Int? + get() = null + } + + @Serializable + data class Limited( + @SerialName(idField) + override val id: GiftId, + @SerialName(stickerField) + override val sticker: Sticker, + @SerialName(starCountField) + override val starCount: Int, + @SerialName(totalCountField) + override val totalCount: Int, + @SerialName(remainingCountField) + override val remainingCount: Int, + @SerialName(upgradeStarCountField) + override val upgradeStarCount: Int? = null, + ) : Regular + + companion object : KSerializer { + @Serializable + @Suppress("propertyName") + private data class RegularGiftSurrogate( + val id: GiftId, + val sticker: Sticker, + val star_count: Int, + val total_count: Int? = null, + val remaining_count: Int? = null, + val upgrade_star_count: Int? = null, + ) + + override val descriptor: SerialDescriptor + get() = RegularGiftSurrogate.serializer().descriptor + + override fun deserialize(decoder: Decoder): Regular { + val surrogate = RegularGiftSurrogate.serializer().deserialize(decoder) + + return if (surrogate.total_count != null && surrogate.remaining_count != null) { + Limited( + id = surrogate.id, + sticker = surrogate.sticker, + starCount = surrogate.star_count, + totalCount = surrogate.total_count, + remainingCount = surrogate.remaining_count, + upgradeStarCount = surrogate.upgrade_star_count, + ) + } else { + Unlimited( + id = surrogate.id, + sticker = surrogate.sticker, + starCount = surrogate.star_count, + upgradeStarCount = surrogate.upgrade_star_count, + ) + } + } + + override fun serialize(encoder: Encoder, value: Regular) { + val surrogate = RegularGiftSurrogate( + id = value.id, + sticker = value.sticker, + star_count = value.starCount, + total_count = value.totalCount, + remaining_count = value.remainingCount, + upgrade_star_count = value.upgradeStarCount + ) + RegularGiftSurrogate.serializer().serialize(encoder, surrogate) + } + } } @Serializable - data class Limited( - @SerialName(idField) - override val id: GiftId, - @SerialName(stickerField) - override val sticker: Sticker, - @SerialName(starCountField) - override val starCount: Int, - @SerialName(totalCountField) - override val totalCount: Int, - @SerialName(remainingCountField) - override val remainingCount: Int, - @SerialName(upgradeStarCountField) - override val upgradeStarCount: Int? = null, + data class Unique( + @SerialName(baseNameField) + val baseName: String, + @SerialName(nameField) + val name: String, + @SerialName(numberField) + val number: Int, + @SerialName(modelField) + val model: UniqueGiftModel, + @SerialName(symbolField) + val symbol: UniqueGiftSymbol, + @SerialName(backdropField) + val backdrop: UniqueGiftBackdrop ) : Gift companion object : KSerializer { @Serializable - private data class GiftSurrogate( - val id: GiftId, - val sticker: Sticker, - val star_count: Int, + @Suppress("unused", "propertyName") + private class GiftSurrogate( + // regular gift fields + val id: GiftId?, + val sticker: Sticker?, + val star_count: Int?, val total_count: Int? = null, val remaining_count: Int? = null, val upgrade_star_count: Int? = null, + // unique gift fields + val base_name: String? = null, + val name: String? = null, + val number: Int? = null, + val model: UniqueGiftModel? = null, + val symbol: UniqueGiftSymbol? = null, + val backdrop: UniqueGiftBackdrop? = null, ) override val descriptor: SerialDescriptor @@ -68,33 +146,37 @@ sealed interface Gift { override fun deserialize(decoder: Decoder): Gift { val surrogate = GiftSurrogate.serializer().deserialize(decoder) - return if (surrogate.total_count != null && surrogate.remaining_count != null) { - Limited( - id = surrogate.id, - sticker = surrogate.sticker, - starCount = surrogate.star_count, - totalCount = surrogate.total_count, - remainingCount = surrogate.remaining_count, - upgradeStarCount = surrogate.upgrade_star_count, + return if (surrogate.base_name != null && surrogate.name != null && surrogate.number != null && surrogate.model != null && surrogate.symbol != null && surrogate.backdrop != null) { + Unique( + baseName = surrogate.base_name, + name = surrogate.name, + number = surrogate.number, + model = surrogate.model, + symbol = surrogate.symbol, + backdrop = surrogate.backdrop, ) } else { - Unlimited( - id = surrogate.id, - sticker = surrogate.sticker, - starCount = surrogate.star_count, - upgradeStarCount = surrogate.upgrade_star_count, - ) + decoder.decodeSerializableValue(Regular.serializer()) } } - override fun serialize(encoder: Encoder, value: Gift) { + override fun serialize( + encoder: Encoder, + value: Gift + ) { val surrogate = GiftSurrogate( - id = value.id, - sticker = value.sticker, - star_count = value.starCount, - total_count = value.totalCount, - remaining_count = value.remainingCount, - upgrade_star_count = value.upgradeStarCount + id = (value as? Regular)?.id, + sticker = (value as? Regular)?.sticker, + star_count = (value as? Regular)?.starCount, + total_count = (value as? Regular.Limited)?.totalCount, + remaining_count = (value as? Regular.Limited)?.remainingCount, + upgrade_star_count = (value as? Regular)?.upgradeStarCount, + base_name = (value as? Unique)?.baseName, + name = (value as? Unique)?.name, + number = (value as? Unique)?.number, + model = (value as? Unique)?.model, + symbol = (value as? Unique)?.symbol, + backdrop = (value as? Unique)?.backdrop, ) GiftSurrogate.serializer().serialize(encoder, surrogate) } diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/gifts/GiftInfo.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/gifts/GiftInfo.kt index 64a3966406..676a179281 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/gifts/GiftInfo.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/gifts/GiftInfo.kt @@ -12,11 +12,12 @@ import kotlin.jvm.JvmName @Serializable sealed interface GiftInfo { val ownedGiftId: GiftId? + val gift: Gift @Serializable data class Regular( @SerialName(giftField) - val gift: Gift, + override val gift: Gift.Regular, @SerialName(ownedGiftIdField) override val ownedGiftId: GiftId? = null, @SerialName(convertStarCountField) @@ -35,7 +36,7 @@ sealed interface GiftInfo { companion object { @JvmName("PublicConstructor") operator fun invoke( - gift: Gift, + gift: Gift.Regular, ownedGiftId: GiftId? = null, convertStarCount: Int? = null, prepaidUpgradeStarCount: Int? = null, @@ -60,7 +61,7 @@ sealed interface GiftInfo { @Serializable data class Unique( @SerialName(giftField) - val gift: UniqueGift, + override val gift: Gift.Unique, @SerialName(originField) val origin: String? = null, @SerialName(ownedGiftIdField) diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/gifts/UniqueGift.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/gifts/UniqueGift.kt deleted file mode 100644 index 30f30c7e6e..0000000000 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/gifts/UniqueGift.kt +++ /dev/null @@ -1,22 +0,0 @@ -package dev.inmo.tgbotapi.types.gifts - -import dev.inmo.tgbotapi.types.* -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable - - -@Serializable -data class UniqueGift( - @SerialName(baseNameField) - val baseName: String, - @SerialName(nameField) - val name: String, - @SerialName(numberField) - val number: Int, - @SerialName(modelField) - val model: UniqueGiftModel, - @SerialName(symbolField) - val symbol: UniqueGiftSymbol, - @SerialName(backdropField) - val backdrop: UniqueGiftBackdrop -)