1
0
mirror of https://github.com/InsanusMokrassar/TelegramBotAPI.git synced 2025-09-05 08:09:21 +00:00

refactor: merged UniqueGift and regular Gift types into one interface

This commit is contained in:
bpavuk
2025-04-17 18:16:52 +03:00
parent 09dee188d2
commit 93e937aa6a
3 changed files with 145 additions and 84 deletions

View File

@@ -11,55 +11,133 @@ import kotlinx.serialization.encoding.Encoder
@Serializable(Gift.Companion::class) @Serializable(Gift.Companion::class)
sealed interface Gift { sealed interface Gift {
val id: GiftId @Serializable(Regular.Companion::class)
val sticker: Sticker sealed interface Regular : Gift {
val starCount: Int val id: GiftId
val totalCount: Int? val sticker: Sticker
val upgradeStarCount: Int? val starCount: Int
val remainingCount: Int? val totalCount: Int?
val upgradeStarCount: Int?
val remainingCount: Int?
@Serializable @Serializable
data class Unlimited( data class Unlimited(
@SerialName(idField) @SerialName(idField)
override val id: GiftId, override val id: GiftId,
@SerialName(stickerField) @SerialName(stickerField)
override val sticker: Sticker, override val sticker: Sticker,
@SerialName(starCountField) @SerialName(starCountField)
override val starCount: Int, override val starCount: Int,
@SerialName(upgradeStarCountField) @SerialName(upgradeStarCountField)
override val upgradeStarCount: Int? = null override val upgradeStarCount: Int? = null
) : Gift { ) : Regular {
override val totalCount: Int? override val totalCount: Int?
get() = null get() = null
override val remainingCount: Int? override val remainingCount: Int?
get() = null 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<Regular> {
@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 @Serializable
data class Limited( data class Unique(
@SerialName(idField) @SerialName(baseNameField)
override val id: GiftId, val baseName: String,
@SerialName(stickerField) @SerialName(nameField)
override val sticker: Sticker, val name: String,
@SerialName(starCountField) @SerialName(numberField)
override val starCount: Int, val number: Int,
@SerialName(totalCountField) @SerialName(modelField)
override val totalCount: Int, val model: UniqueGiftModel,
@SerialName(remainingCountField) @SerialName(symbolField)
override val remainingCount: Int, val symbol: UniqueGiftSymbol,
@SerialName(upgradeStarCountField) @SerialName(backdropField)
override val upgradeStarCount: Int? = null, val backdrop: UniqueGiftBackdrop
) : Gift ) : Gift
companion object : KSerializer<Gift> { companion object : KSerializer<Gift> {
@Serializable @Serializable
private data class GiftSurrogate( @Suppress("unused", "propertyName")
val id: GiftId, private class GiftSurrogate(
val sticker: Sticker, // regular gift fields
val star_count: Int, val id: GiftId?,
val sticker: Sticker?,
val star_count: Int?,
val total_count: Int? = null, val total_count: Int? = null,
val remaining_count: Int? = null, val remaining_count: Int? = null,
val upgrade_star_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 override val descriptor: SerialDescriptor
@@ -68,33 +146,37 @@ sealed interface Gift {
override fun deserialize(decoder: Decoder): Gift { override fun deserialize(decoder: Decoder): Gift {
val surrogate = GiftSurrogate.serializer().deserialize(decoder) val surrogate = GiftSurrogate.serializer().deserialize(decoder)
return if (surrogate.total_count != null && surrogate.remaining_count != null) { return if (surrogate.base_name != null && surrogate.name != null && surrogate.number != null && surrogate.model != null && surrogate.symbol != null && surrogate.backdrop != null) {
Limited( Unique(
id = surrogate.id, baseName = surrogate.base_name,
sticker = surrogate.sticker, name = surrogate.name,
starCount = surrogate.star_count, number = surrogate.number,
totalCount = surrogate.total_count, model = surrogate.model,
remainingCount = surrogate.remaining_count, symbol = surrogate.symbol,
upgradeStarCount = surrogate.upgrade_star_count, backdrop = surrogate.backdrop,
) )
} else { } else {
Unlimited( decoder.decodeSerializableValue(Regular.serializer())
id = surrogate.id,
sticker = surrogate.sticker,
starCount = surrogate.star_count,
upgradeStarCount = surrogate.upgrade_star_count,
)
} }
} }
override fun serialize(encoder: Encoder, value: Gift) { override fun serialize(
encoder: Encoder,
value: Gift
) {
val surrogate = GiftSurrogate( val surrogate = GiftSurrogate(
id = value.id, id = (value as? Regular)?.id,
sticker = value.sticker, sticker = (value as? Regular)?.sticker,
star_count = value.starCount, star_count = (value as? Regular)?.starCount,
total_count = value.totalCount, total_count = (value as? Regular.Limited)?.totalCount,
remaining_count = value.remainingCount, remaining_count = (value as? Regular.Limited)?.remainingCount,
upgrade_star_count = value.upgradeStarCount 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) GiftSurrogate.serializer().serialize(encoder, surrogate)
} }

View File

@@ -12,11 +12,12 @@ import kotlin.jvm.JvmName
@Serializable @Serializable
sealed interface GiftInfo { sealed interface GiftInfo {
val ownedGiftId: GiftId? val ownedGiftId: GiftId?
val gift: Gift
@Serializable @Serializable
data class Regular( data class Regular(
@SerialName(giftField) @SerialName(giftField)
val gift: Gift, override val gift: Gift.Regular,
@SerialName(ownedGiftIdField) @SerialName(ownedGiftIdField)
override val ownedGiftId: GiftId? = null, override val ownedGiftId: GiftId? = null,
@SerialName(convertStarCountField) @SerialName(convertStarCountField)
@@ -35,7 +36,7 @@ sealed interface GiftInfo {
companion object { companion object {
@JvmName("PublicConstructor") @JvmName("PublicConstructor")
operator fun invoke( operator fun invoke(
gift: Gift, gift: Gift.Regular,
ownedGiftId: GiftId? = null, ownedGiftId: GiftId? = null,
convertStarCount: Int? = null, convertStarCount: Int? = null,
prepaidUpgradeStarCount: Int? = null, prepaidUpgradeStarCount: Int? = null,
@@ -60,7 +61,7 @@ sealed interface GiftInfo {
@Serializable @Serializable
data class Unique( data class Unique(
@SerialName(giftField) @SerialName(giftField)
val gift: UniqueGift, override val gift: Gift.Unique,
@SerialName(originField) @SerialName(originField)
val origin: String? = null, val origin: String? = null,
@SerialName(ownedGiftIdField) @SerialName(ownedGiftIdField)

View File

@@ -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
)