2024-01-02 15:55:28 +00:00
|
|
|
package dev.inmo.tgbotapi.types
|
|
|
|
|
2024-01-10 08:59:41 +00:00
|
|
|
import kotlinx.serialization.*
|
2024-01-08 13:16:17 +00:00
|
|
|
import kotlinx.serialization.descriptors.SerialDescriptor
|
|
|
|
import kotlinx.serialization.encoding.Decoder
|
|
|
|
import kotlinx.serialization.encoding.Encoder
|
2024-01-02 15:55:28 +00:00
|
|
|
|
2024-01-08 13:16:17 +00:00
|
|
|
@Serializable(LinkPreviewOptions.Companion::class)
|
2024-01-02 15:55:28 +00:00
|
|
|
sealed interface LinkPreviewOptions {
|
|
|
|
val isDisabled: Boolean
|
|
|
|
val url: String?
|
|
|
|
val preferSmallMedia: Boolean
|
|
|
|
val preferLargeMedia: Boolean
|
|
|
|
val showAboveText: Boolean
|
|
|
|
|
|
|
|
@Serializable
|
|
|
|
data object Disabled : LinkPreviewOptions {
|
|
|
|
@Required
|
2024-01-10 08:59:41 +00:00
|
|
|
@EncodeDefault
|
2024-01-02 15:55:28 +00:00
|
|
|
@SerialName(isDisabledField)
|
|
|
|
override val isDisabled: Boolean = true
|
|
|
|
override val url: String?
|
|
|
|
get() = null
|
|
|
|
override val preferSmallMedia: Boolean
|
|
|
|
get() = false
|
|
|
|
override val preferLargeMedia: Boolean
|
|
|
|
get() = false
|
|
|
|
override val showAboveText: Boolean
|
|
|
|
get() = false
|
|
|
|
}
|
|
|
|
|
|
|
|
@Serializable
|
|
|
|
data class Large(
|
|
|
|
@SerialName(urlField)
|
|
|
|
override val url: String?,
|
|
|
|
@SerialName(showAboveTextField)
|
|
|
|
override val showAboveText: Boolean
|
|
|
|
) : LinkPreviewOptions {
|
|
|
|
@Required
|
2024-01-10 08:59:41 +00:00
|
|
|
@EncodeDefault
|
2024-01-02 15:55:28 +00:00
|
|
|
@SerialName(isDisabledField)
|
|
|
|
override val isDisabled: Boolean = false
|
|
|
|
@Required
|
2024-01-10 08:59:41 +00:00
|
|
|
@EncodeDefault
|
2024-01-02 15:55:28 +00:00
|
|
|
@SerialName(preferLargeMediaField)
|
|
|
|
override val preferLargeMedia: Boolean = true
|
|
|
|
override val preferSmallMedia: Boolean
|
|
|
|
get() = false
|
|
|
|
}
|
|
|
|
|
|
|
|
@Serializable
|
|
|
|
data class Small(
|
|
|
|
@SerialName(urlField)
|
|
|
|
override val url: String?,
|
|
|
|
@SerialName(showAboveTextField)
|
|
|
|
override val showAboveText: Boolean
|
|
|
|
) : LinkPreviewOptions {
|
|
|
|
@Required
|
2024-01-10 08:59:41 +00:00
|
|
|
@EncodeDefault
|
2024-01-02 15:55:28 +00:00
|
|
|
@SerialName(isDisabledField)
|
|
|
|
override val isDisabled: Boolean = false
|
|
|
|
@Required
|
2024-01-10 08:59:41 +00:00
|
|
|
@EncodeDefault
|
2024-01-02 15:55:28 +00:00
|
|
|
@SerialName(preferSmallMediaField)
|
|
|
|
override val preferSmallMedia: Boolean = true
|
|
|
|
override val preferLargeMedia: Boolean
|
|
|
|
get() = false
|
|
|
|
}
|
|
|
|
|
|
|
|
@Serializable
|
2024-01-09 11:34:07 +00:00
|
|
|
data class Default(
|
2024-01-02 15:55:28 +00:00
|
|
|
@SerialName(urlField)
|
|
|
|
override val url: String?,
|
|
|
|
@SerialName(showAboveTextField)
|
|
|
|
override val showAboveText: Boolean
|
|
|
|
) : LinkPreviewOptions {
|
|
|
|
@Required
|
2024-01-10 08:59:41 +00:00
|
|
|
@EncodeDefault
|
2024-01-02 15:55:28 +00:00
|
|
|
@SerialName(isDisabledField)
|
|
|
|
override val isDisabled: Boolean = false
|
|
|
|
override val preferSmallMedia: Boolean
|
|
|
|
get() = false
|
|
|
|
override val preferLargeMedia: Boolean
|
|
|
|
get() = false
|
|
|
|
}
|
2024-01-08 13:16:17 +00:00
|
|
|
|
|
|
|
@Serializable
|
|
|
|
private data class Surrogate(
|
|
|
|
@SerialName(isDisabledField)
|
2024-01-09 12:05:03 +00:00
|
|
|
val isDisabled: Boolean = false,
|
2024-01-08 13:16:17 +00:00
|
|
|
@SerialName(urlField)
|
|
|
|
val url: String? = null,
|
|
|
|
@SerialName(preferSmallMediaField)
|
|
|
|
val preferSmallMedia: Boolean = false,
|
|
|
|
@SerialName(preferLargeMediaField)
|
|
|
|
val preferLargeMedia: Boolean = false,
|
|
|
|
@SerialName(showAboveTextField)
|
|
|
|
val showAboveText: Boolean = false,
|
|
|
|
) {
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
companion object : KSerializer<LinkPreviewOptions> {
|
|
|
|
override val descriptor: SerialDescriptor
|
|
|
|
get() = Surrogate.serializer().descriptor
|
|
|
|
|
|
|
|
override fun deserialize(decoder: Decoder): LinkPreviewOptions {
|
|
|
|
val surrogate = Surrogate.serializer().deserialize(decoder)
|
|
|
|
|
|
|
|
return when {
|
|
|
|
surrogate.isDisabled -> Disabled
|
|
|
|
surrogate.preferLargeMedia -> Large(surrogate.url, surrogate.showAboveText)
|
|
|
|
surrogate.preferSmallMedia -> Small(surrogate.url, surrogate.showAboveText)
|
2024-01-09 11:34:07 +00:00
|
|
|
else -> Default(surrogate.url, surrogate.showAboveText)
|
2024-01-08 13:16:17 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun serialize(encoder: Encoder, value: LinkPreviewOptions) {
|
|
|
|
when (value) {
|
|
|
|
is Disabled -> Disabled.serializer().serialize(encoder, value)
|
|
|
|
is Large -> Large.serializer().serialize(encoder, value)
|
2024-01-09 11:34:07 +00:00
|
|
|
is Default -> Default.serializer().serialize(encoder, value)
|
2024-01-08 13:16:17 +00:00
|
|
|
is Small -> Small.serializer().serialize(encoder, value)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
2024-01-02 15:55:28 +00:00
|
|
|
}
|