From 9b16d5d82b1ed368cd19b6aeea3869021579b83a Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Sun, 10 May 2020 14:37:55 +0600 Subject: [PATCH] add MimeType --- CHANGELOG.md | 3 ++ .../CommonAbstracts/MimeTyped.kt | 4 ++- .../InlineQueryResultDocumentImpl.kt | 3 +- .../InlineQueryResultVideoImpl.kt | 3 +- .../types/files/AnimationFile.kt | 3 +- .../TelegramBotAPI/types/files/AudioFile.kt | 3 +- .../types/files/DocumentFile.kt | 3 +- .../TelegramBotAPI/types/files/VideoFile.kt | 3 +- .../TelegramBotAPI/types/files/VoiceFile.kt | 7 ++-- .../TelegramBotAPI/utils/MimeType.kt | 11 +++++++ .../TelegramBotAPI/utils/MimeType.kt | 33 +++++++++++++++++++ .../TelegramBotAPI/utils/MimeType.kt | 26 +++++++++++++++ 12 files changed, 92 insertions(+), 10 deletions(-) create mode 100644 TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/MimeType.kt create mode 100644 TelegramBotAPI/src/jsMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/MimeType.kt create mode 100644 TelegramBotAPI/src/jvmMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/MimeType.kt diff --git a/CHANGELOG.md b/CHANGELOG.md index e118cee785..6cc072ad74 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -55,6 +55,9 @@ * Versions: * Coroutines: `1.3.5` -> `1.3.6` * Klock: `1.10.5` -> `1.11.1` +* `TelegramBotAPI`: + * Expected class `MimeType` was added + * Field `MimeTyped#mimeType` now typed by `MimeType` instead of `String` ### 0.27.1 diff --git a/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/CommonAbstracts/MimeTyped.kt b/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/CommonAbstracts/MimeTyped.kt index e1c4f3f8b7..0ff4cac7af 100644 --- a/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/CommonAbstracts/MimeTyped.kt +++ b/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/CommonAbstracts/MimeTyped.kt @@ -1,5 +1,7 @@ package com.github.insanusmokrassar.TelegramBotAPI.CommonAbstracts +import com.github.insanusmokrassar.TelegramBotAPI.utils.MimeType + interface MimeTyped { - val mimeType: String? // TODO::replace by something like enum or interface + val mimeType: MimeType? } \ No newline at end of file diff --git a/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/InlineQueryResultDocumentImpl.kt b/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/InlineQueryResultDocumentImpl.kt index a5998af969..269a3cd9b9 100644 --- a/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/InlineQueryResultDocumentImpl.kt +++ b/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/InlineQueryResultDocumentImpl.kt @@ -8,6 +8,7 @@ import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.ParseMode import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.parseModeField import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.InlineKeyboardMarkup import com.github.insanusmokrassar.TelegramBotAPI.types.files.abstracts.mimeTypeField +import com.github.insanusmokrassar.TelegramBotAPI.utils.MimeType import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -20,7 +21,7 @@ data class InlineQueryResultDocumentImpl( @SerialName(titleField) override val title: String, @SerialName(mimeTypeField) - override val mimeType: String, + override val mimeType: MimeType, @SerialName(thumbUrlField) override val thumbUrl: String? = null, @SerialName(thumbWidthField) diff --git a/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/InlineQueryResultVideoImpl.kt b/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/InlineQueryResultVideoImpl.kt index 3d0a52404d..fce72b9817 100644 --- a/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/InlineQueryResultVideoImpl.kt +++ b/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/InlineQueryResultVideoImpl.kt @@ -8,6 +8,7 @@ import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.ParseMode import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.parseModeField import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.InlineKeyboardMarkup import com.github.insanusmokrassar.TelegramBotAPI.types.files.abstracts.mimeTypeField +import com.github.insanusmokrassar.TelegramBotAPI.utils.MimeType import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -20,7 +21,7 @@ data class InlineQueryResultVideoImpl( @SerialName(thumbUrlField) override val thumbUrl: String, @SerialName(mimeTypeField) - override val mimeType: String, + override val mimeType: MimeType, @SerialName(titleField) override val title: String, @SerialName(videoWidthField) diff --git a/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/AnimationFile.kt b/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/AnimationFile.kt index ced764d938..81d5d91033 100644 --- a/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/AnimationFile.kt +++ b/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/AnimationFile.kt @@ -4,6 +4,7 @@ import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.FileId import com.github.insanusmokrassar.TelegramBotAPI.types.FileUniqueId import com.github.insanusmokrassar.TelegramBotAPI.types.fileUniqueIdField import com.github.insanusmokrassar.TelegramBotAPI.types.files.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.utils.MimeType import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -20,7 +21,7 @@ data class AnimationFile( @SerialName(fileNameField) override val fileName: String? = null, @SerialName(mimeTypeField) - override val mimeType: String? = null, + override val mimeType: MimeType? = null, @SerialName(fileSizeField) override val fileSize: Long? = null ) : TelegramMediaFile, MimedMediaFile, ThumbedMediaFile, PlayableMediaFile, CustomNamedMediaFile, SizedMediaFile diff --git a/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/AudioFile.kt b/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/AudioFile.kt index 70681158ac..839ef60c09 100644 --- a/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/AudioFile.kt +++ b/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/AudioFile.kt @@ -5,6 +5,7 @@ import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.FileId import com.github.insanusmokrassar.TelegramBotAPI.types.FileUniqueId import com.github.insanusmokrassar.TelegramBotAPI.types.fileUniqueIdField import com.github.insanusmokrassar.TelegramBotAPI.types.files.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.utils.MimeType import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -18,7 +19,7 @@ data class AudioFile( override val performer: String? = null, override val title: String? = null, @SerialName(mimeTypeField) - override val mimeType: String? = null, + override val mimeType: MimeType? = null, @SerialName(fileSizeField) override val fileSize: Long? = null, override val thumb: PhotoSize? = null diff --git a/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/DocumentFile.kt b/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/DocumentFile.kt index 80034393c5..64b5a8833b 100644 --- a/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/DocumentFile.kt +++ b/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/DocumentFile.kt @@ -4,6 +4,7 @@ import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.FileId import com.github.insanusmokrassar.TelegramBotAPI.types.FileUniqueId import com.github.insanusmokrassar.TelegramBotAPI.types.fileUniqueIdField import com.github.insanusmokrassar.TelegramBotAPI.types.files.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.utils.MimeType import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -17,7 +18,7 @@ data class DocumentFile( override val fileSize: Long? = null, override val thumb: PhotoSize? = null, @SerialName(mimeTypeField) - override val mimeType: String? = null, + override val mimeType: MimeType? = null, @SerialName(fileNameField) override val fileName: String? = null ) : TelegramMediaFile, MimedMediaFile, ThumbedMediaFile, CustomNamedMediaFile diff --git a/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/VideoFile.kt b/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/VideoFile.kt index a232dafc7a..0034e85543 100644 --- a/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/VideoFile.kt +++ b/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/VideoFile.kt @@ -4,6 +4,7 @@ import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.FileId import com.github.insanusmokrassar.TelegramBotAPI.types.FileUniqueId import com.github.insanusmokrassar.TelegramBotAPI.types.fileUniqueIdField import com.github.insanusmokrassar.TelegramBotAPI.types.files.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.utils.MimeType import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -18,7 +19,7 @@ data class VideoFile( override val duration: Long? = null, override val thumb: PhotoSize? = null, @SerialName(mimeTypeField) - override val mimeType: String? = null, + override val mimeType: MimeType? = null, @SerialName(fileSizeField) override val fileSize: Long? = null ) : TelegramMediaFile, MimedMediaFile, ThumbedMediaFile, PlayableMediaFile, SizedMediaFile diff --git a/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/VoiceFile.kt b/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/VoiceFile.kt index 6bcc6226f8..389fc542cf 100644 --- a/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/VoiceFile.kt +++ b/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/VoiceFile.kt @@ -1,9 +1,9 @@ package com.github.insanusmokrassar.TelegramBotAPI.types.files import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.FileId -import com.github.insanusmokrassar.TelegramBotAPI.types.FileUniqueId -import com.github.insanusmokrassar.TelegramBotAPI.types.fileUniqueIdField +import com.github.insanusmokrassar.TelegramBotAPI.types.* import com.github.insanusmokrassar.TelegramBotAPI.types.files.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.utils.MimeType import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -13,9 +13,10 @@ data class VoiceFile( override val fileId: FileId, @SerialName(fileUniqueIdField) override val fileUniqueId: FileUniqueId, + @SerialName(durationField) override val duration: Long? = null, @SerialName(mimeTypeField) - override val mimeType: String? = null, + override val mimeType: MimeType? = null, @SerialName(fileSizeField) override val fileSize: Long? = null ) : TelegramMediaFile, MimedMediaFile, PlayableMediaFile diff --git a/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/MimeType.kt b/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/MimeType.kt new file mode 100644 index 0000000000..65cb95b5ec --- /dev/null +++ b/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/MimeType.kt @@ -0,0 +1,11 @@ +package com.github.insanusmokrassar.TelegramBotAPI.utils + +import kotlinx.serialization.* + +@Serializable(MimeTypeSerializer::class) +expect class MimeType { + val raw: String +} + +@Serializer(MimeType::class) +internal expect object MimeTypeSerializer : KSerializer diff --git a/TelegramBotAPI/src/jsMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/MimeType.kt b/TelegramBotAPI/src/jsMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/MimeType.kt new file mode 100644 index 0000000000..a99e334557 --- /dev/null +++ b/TelegramBotAPI/src/jsMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/MimeType.kt @@ -0,0 +1,33 @@ +package com.github.insanusmokrassar.TelegramBotAPI.utils + +import kotlinx.serialization.* +import org.w3c.dom.get +import kotlin.browser.window + +private val mimesCache = mutableMapOf() + +@Serializable(MimeTypeSerializer::class) +actual class MimeType( + actual val raw: String +) { + @Transient + val jsMimeType = window.navigator.mimeTypes[raw] + + override fun toString(): String = raw +} + +@Serializer(MimeType::class) +internal actual object MimeTypeSerializer : KSerializer { + override val descriptor: SerialDescriptor = PrimitiveDescriptor("mimeType", PrimitiveKind.STRING) + + override fun deserialize(decoder: Decoder): MimeType { + val mimeType = decoder.decodeString() + return mimesCache.getOrPut(mimeType) { + MimeType(mimeType) + } + } + + override fun serialize(encoder: Encoder, value: MimeType) { + encoder.encodeString(value.raw) + } +} diff --git a/TelegramBotAPI/src/jvmMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/MimeType.kt b/TelegramBotAPI/src/jvmMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/MimeType.kt new file mode 100644 index 0000000000..b3f85ace6d --- /dev/null +++ b/TelegramBotAPI/src/jvmMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/MimeType.kt @@ -0,0 +1,26 @@ +package com.github.insanusmokrassar.TelegramBotAPI.utils + +import kotlinx.serialization.* + +private val mimesCache = mutableMapOf() + +@Serializable(MimeTypeSerializer::class) +actual class MimeType( + actual val raw: String +) : javax.activation.MimeType(raw) + +@Serializer(MimeType::class) +internal actual object MimeTypeSerializer : KSerializer { + override val descriptor: SerialDescriptor = PrimitiveDescriptor("mimeType", PrimitiveKind.STRING) + + override fun deserialize(decoder: Decoder): MimeType { + val mimeType = decoder.decodeString() + return mimesCache.getOrPut(mimeType) { + MimeType(mimeType) + } + } + + override fun serialize(encoder: Encoder, value: MimeType) { + encoder.encodeString(value.raw) + } +}