From 8964e08ce602770612ea54e796d1fbbe97385100 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Thu, 1 May 2025 15:38:07 +0600 Subject: [PATCH] add support of InputStoryContent --- .../kotlin/dev/inmo/tgbotapi/types/Common.kt | 2 + .../types/stories/InputStoryContent.kt | 55 ++++++++++++++++++- 2 files changed, 54 insertions(+), 3 deletions(-) diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/Common.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/Common.kt index c5b676da79..c463ffe322 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/Common.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/Common.kt @@ -277,7 +277,9 @@ const val switchInlineQueryCurrentChatField = "switch_inline_query_current_chat" const val switchInlineQueryChosenChatField = "switch_inline_query_chosen_chat" const val switchInlineQueryField = "switch_inline_query" const val isAnimatedField = "is_animated" +const val isAnimationField = "is_animation" const val isVideoField = "is_video" +const val coverFrameTimeStampField = "cover_frame_timestamp" const val inviteLinkField = "invite_link" const val viaChatFolderInviteLinkField = "via_chat_folder_invite_link" const val viaJoinRequestField = "via_join_request" diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/stories/InputStoryContent.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/stories/InputStoryContent.kt index bb8b7d9f3b..46586026d6 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/stories/InputStoryContent.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/stories/InputStoryContent.kt @@ -1,10 +1,19 @@ package dev.inmo.tgbotapi.types.stories import dev.inmo.tgbotapi.requests.abstracts.MultipartFile -import dev.inmo.tgbotapi.types.photoField +import dev.inmo.tgbotapi.types.* +import dev.inmo.tgbotapi.utils.decodeDataAndJson +import kotlinx.serialization.EncodeDefault +import kotlinx.serialization.KSerializer import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import kotlinx.serialization.builtins.serializer +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder +import kotlinx.serialization.json.JsonObject +@Serializable sealed interface InputStoryContent { sealed interface Type { val name: String @@ -17,12 +26,52 @@ sealed interface InputStoryContent { @SerialName(photoField) val photo: MultipartFile ) : InputStoryContent { - override val type: Type - get() = Companion + @EncodeDefault + override val type: Type = Companion + override val media: Pair + get() = photoField to photo companion object : Type { override val name: String get() = "photo" } } + @Serializable + data class Video ( + @SerialName(videoField) + val video: MultipartFile, + @SerialName(durationField) + val duration: DoubleSeconds? = null, + @SerialName(coverFrameTimeStampField) + val coverFrameTimeStamp: DoubleSeconds? = null, + @SerialName(isAnimationField) + val isAnimation: Boolean = false + ) : InputStoryContent { + @EncodeDefault + override val type: Type = Companion + override val media: Pair + get() = videoField to video + + companion object : Type { + override val name: String + get() = "video" + } + } + + companion object : KSerializer { + private val serializer = JsonObject.serializer() + override val descriptor: SerialDescriptor + get() = serializer.descriptor + + override fun serialize(encoder: Encoder, value: InputStoryContent) { + when (value) { + is Photo -> Photo.serializer().serialize(encoder, value) + is Video -> Video.serializer().serialize(encoder, value) + } + } + + override fun deserialize(decoder: Decoder): InputStoryContent { + throw UnsupportedOperationException("InputStoryContent cannot be deserialized for now") + } + } }