From 8e1cafb1b656aa6eac655e8b86bc3e0f86e3f8d4 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Fri, 30 Oct 2020 19:36:48 +0600 Subject: [PATCH 01/18] start 0.29.3 --- CHANGELOG.md | 2 ++ gradle.properties | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0c3b61ffa9..34491c6985 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ # TelegramBotAPI changelog +## 0.29.3 + ## 0.29.2 * `Common`: diff --git a/gradle.properties b/gradle.properties index fab9a91783..5e067b1efe 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,7 +15,7 @@ ktor_version=1.4.1 javax_activation_version=1.1.1 library_group=dev.inmo -library_version=0.29.2 +library_version=0.29.3 gradle_bintray_plugin_version=1.8.5 github_release_plugin_version=2.2.12 From 46fe16fd73951e28d12df3de880ae9fd1c076f5d Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Fri, 30 Oct 2020 19:37:26 +0600 Subject: [PATCH 02/18] Revert "Revert "add slot machine, but currently it is not working"" This reverts commit f317e144e672c970986f039ede71d89dff13a9e8. --- CHANGELOG.md | 3 +++ .../kotlin/dev/inmo/tgbotapi/types/dice/DiceAnimationType.kt | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 34491c6985..9f83e783d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ ## 0.29.3 +* `Core`: + * New dice type `SlotMachineDiceAnimationType` + ## 0.29.2 * `Common`: diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/dice/DiceAnimationType.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/dice/DiceAnimationType.kt index 806e43d16f..89ea0878cf 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/dice/DiceAnimationType.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/dice/DiceAnimationType.kt @@ -22,6 +22,10 @@ object BasketballDiceAnimationType : DiceAnimationType() { override val emoji: String = "\uD83C\uDFC0" } @Serializable(DiceAnimationTypeSerializer::class) +object SlotMachineDiceAnimationType : DiceAnimationType() { + override val emoji: String = "\uD83C\uDFB0" +} +@Serializable(DiceAnimationTypeSerializer::class) data class CustomDiceAnimationType( override val emoji: String ) : DiceAnimationType() @@ -34,6 +38,7 @@ internal object DiceAnimationTypeSerializer : KSerializer { CubeDiceAnimationType.emoji -> CubeDiceAnimationType DartsDiceAnimationType.emoji -> DartsDiceAnimationType BasketballDiceAnimationType.emoji -> BasketballDiceAnimationType + SlotMachineDiceAnimationType.emoji -> BasketballDiceAnimationType else -> CustomDiceAnimationType(type) } } From b457d11067296a8c7ed5b12c2fbe62170158ea13 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Fri, 30 Oct 2020 19:45:55 +0600 Subject: [PATCH 03/18] Revert "Revert "Revert "add slot machine, but currently it is not working""" This reverts commit 46fe16fd73951e28d12df3de880ae9fd1c076f5d. --- CHANGELOG.md | 3 --- .../kotlin/dev/inmo/tgbotapi/types/dice/DiceAnimationType.kt | 5 ----- 2 files changed, 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9f83e783d5..34491c6985 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,9 +2,6 @@ ## 0.29.3 -* `Core`: - * New dice type `SlotMachineDiceAnimationType` - ## 0.29.2 * `Common`: diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/dice/DiceAnimationType.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/dice/DiceAnimationType.kt index 89ea0878cf..806e43d16f 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/dice/DiceAnimationType.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/dice/DiceAnimationType.kt @@ -22,10 +22,6 @@ object BasketballDiceAnimationType : DiceAnimationType() { override val emoji: String = "\uD83C\uDFC0" } @Serializable(DiceAnimationTypeSerializer::class) -object SlotMachineDiceAnimationType : DiceAnimationType() { - override val emoji: String = "\uD83C\uDFB0" -} -@Serializable(DiceAnimationTypeSerializer::class) data class CustomDiceAnimationType( override val emoji: String ) : DiceAnimationType() @@ -38,7 +34,6 @@ internal object DiceAnimationTypeSerializer : KSerializer { CubeDiceAnimationType.emoji -> CubeDiceAnimationType DartsDiceAnimationType.emoji -> DartsDiceAnimationType BasketballDiceAnimationType.emoji -> BasketballDiceAnimationType - SlotMachineDiceAnimationType.emoji -> BasketballDiceAnimationType else -> CustomDiceAnimationType(type) } } From 80d4bdfe178344cca499d459266d211f93fe81fd Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Fri, 30 Oct 2020 20:38:02 +0600 Subject: [PATCH 04/18] make audio and documents able to be media group items --- .../types/InputMedia/InputMediaAudio.kt | 28 ++++++++++++++++--- .../types/InputMedia/InputMediaDocument.kt | 22 ++++++++++++--- .../MediaGroupMemberInputMediaSerializer.kt | 4 +++ .../message/content/media/AudioContent.kt | 12 +++++--- .../message/content/media/DocumentContent.kt | 10 +++++-- 5 files changed, 62 insertions(+), 14 deletions(-) diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/InputMediaAudio.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/InputMediaAudio.kt index 461d4f217b..f430f993eb 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/InputMediaAudio.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/InputMediaAudio.kt @@ -5,9 +5,13 @@ import dev.inmo.tgbotapi.CommonAbstracts.Performerable import dev.inmo.tgbotapi.requests.abstracts.* import dev.inmo.tgbotapi.types.ParseMode.ParseMode import dev.inmo.tgbotapi.types.ParseMode.parseModeField +import dev.inmo.tgbotapi.types.files.AudioFile +import dev.inmo.tgbotapi.types.files.PhotoSize import dev.inmo.tgbotapi.types.mediaField -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable +import dev.inmo.tgbotapi.types.message.content.media.AudioContent +import kotlinx.serialization.* + +internal const val audioInputMediaType = "audio" @Serializable data class InputMediaAudio( @@ -19,10 +23,26 @@ data class InputMediaAudio( override val performer: String? = null, override val title: String? = null, override val thumb: InputFile? = null -) : InputMedia, DuratedInputMedia, ThumbedInputMedia, TitledInputMedia, CaptionedOutput, Performerable { - override val type: String = "audio" +) : InputMedia, MediaGroupMemberInputMedia, DuratedInputMedia, ThumbedInputMedia, TitledInputMedia, CaptionedOutput, Performerable { + override val type: String = audioInputMediaType + + override fun serialize(format: StringFormat): String = format.encodeToString(serializer(), this) @SerialName(mediaField) override val media: String init { media = file.fileId } // crutch until js compiling will be fixed } + +fun AudioFile.toInputMediaAudio( + caption: String? = null, + parseMode: ParseMode? = null, + title: String? = this.title +): InputMediaAudio = InputMediaAudio( + fileId, + caption, + parseMode, + duration, + performer, + title, + thumb ?.fileId +) diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/InputMediaDocument.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/InputMediaDocument.kt index 9d40fa4660..e6d918a278 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/InputMediaDocument.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/InputMediaDocument.kt @@ -4,9 +4,11 @@ import dev.inmo.tgbotapi.CommonAbstracts.CaptionedOutput import dev.inmo.tgbotapi.requests.abstracts.* import dev.inmo.tgbotapi.types.ParseMode.ParseMode import dev.inmo.tgbotapi.types.ParseMode.parseModeField +import dev.inmo.tgbotapi.types.files.DocumentFile import dev.inmo.tgbotapi.types.mediaField -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable +import kotlinx.serialization.* + +internal const val documentInputMediaType = "document" @Serializable data class InputMediaDocument( @@ -15,10 +17,22 @@ data class InputMediaDocument( @SerialName(parseModeField) override val parseMode: ParseMode? = null, override val thumb: InputFile? = null -) : InputMedia, ThumbedInputMedia, CaptionedOutput { - override val type: String = "document" +) : InputMedia, MediaGroupMemberInputMedia, ThumbedInputMedia, CaptionedOutput { + override val type: String = documentInputMediaType + + override fun serialize(format: StringFormat): String = format.encodeToString(serializer(), this) @SerialName(mediaField) override val media: String init { media = file.fileId } // crutch until js compiling will be fixed } + +fun DocumentFile.toInputMediaDocument( + caption: String? = null, + parseMode: ParseMode? = null +) = InputMediaDocument( + fileId, + caption, + parseMode, + thumb ?.fileId +) diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/MediaGroupMemberInputMediaSerializer.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/MediaGroupMemberInputMediaSerializer.kt index 12faeb251c..2933aa558b 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/MediaGroupMemberInputMediaSerializer.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/MediaGroupMemberInputMediaSerializer.kt @@ -16,6 +16,8 @@ internal object MediaGroupMemberInputMediaSerializer : KSerializer InputMediaPhoto.serializer().serialize(encoder, value) is InputMediaVideo -> InputMediaVideo.serializer().serialize(encoder, value) + is InputMediaAudio -> InputMediaAudio.serializer().serialize(encoder, value) + is InputMediaDocument -> InputMediaDocument.serializer().serialize(encoder, value) } } @@ -25,6 +27,8 @@ internal object MediaGroupMemberInputMediaSerializer : KSerializer nonstrictJsonFormat.decodeFromJsonElement(InputMediaPhoto.serializer(), json) videoInputMediaType -> nonstrictJsonFormat.decodeFromJsonElement(InputMediaVideo.serializer(), json) + audioInputMediaType -> nonstrictJsonFormat.decodeFromJsonElement(InputMediaAudio.serializer(), json) + documentInputMediaType -> nonstrictJsonFormat.decodeFromJsonElement(InputMediaDocument.serializer(), json) else -> error("Illegal type of incoming MediaGroupMemberInputMedia") } } diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/AudioContent.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/AudioContent.kt index dde0d121f2..07be31f7ca 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/AudioContent.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/AudioContent.kt @@ -1,18 +1,17 @@ package dev.inmo.tgbotapi.types.message.content.media -import dev.inmo.tgbotapi.CommonAbstracts.CaptionedInput import dev.inmo.tgbotapi.CommonAbstracts.TextPart import dev.inmo.tgbotapi.requests.abstracts.Request import dev.inmo.tgbotapi.requests.send.media.SendAudio import dev.inmo.tgbotapi.types.ChatIdentifier -import dev.inmo.tgbotapi.types.InputMedia.InputMediaAudio +import dev.inmo.tgbotapi.types.InputMedia.* import dev.inmo.tgbotapi.types.MessageIdentifier import dev.inmo.tgbotapi.types.ParseMode.HTMLParseMode import dev.inmo.tgbotapi.types.ParseMode.MarkdownV2 import dev.inmo.tgbotapi.types.buttons.KeyboardMarkup import dev.inmo.tgbotapi.types.files.AudioFile import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage -import dev.inmo.tgbotapi.types.message.content.abstracts.MediaContent +import dev.inmo.tgbotapi.types.message.content.abstracts.* import dev.inmo.tgbotapi.utils.toHtmlCaptions import dev.inmo.tgbotapi.utils.toMarkdownV2Captions @@ -20,7 +19,7 @@ data class AudioContent( override val media: AudioFile, override val caption: String? = null, override val captionEntities: List = emptyList() -) : MediaContent, CaptionedInput { +) : MediaGroupContent { override fun createResend( chatId: ChatIdentifier, disableNotification: Boolean, @@ -40,6 +39,11 @@ data class AudioContent( replyMarkup ) + override fun toMediaGroupMemberInputMedia(): MediaGroupMemberInputMedia = media.toInputMediaAudio( + toHtmlCaptions().firstOrNull(), + HTMLParseMode + ) + override fun asInputMedia(): InputMediaAudio = InputMediaAudio( media.fileId, toMarkdownV2Captions().firstOrNull(), diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/DocumentContent.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/DocumentContent.kt index 660347256a..530482b6db 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/DocumentContent.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/DocumentContent.kt @@ -5,7 +5,7 @@ import dev.inmo.tgbotapi.CommonAbstracts.TextPart import dev.inmo.tgbotapi.requests.abstracts.Request import dev.inmo.tgbotapi.requests.send.media.SendDocument import dev.inmo.tgbotapi.types.ChatIdentifier -import dev.inmo.tgbotapi.types.InputMedia.InputMediaDocument +import dev.inmo.tgbotapi.types.InputMedia.* import dev.inmo.tgbotapi.types.MessageIdentifier import dev.inmo.tgbotapi.types.ParseMode.HTMLParseMode import dev.inmo.tgbotapi.types.ParseMode.MarkdownV2 @@ -13,6 +13,7 @@ import dev.inmo.tgbotapi.types.buttons.KeyboardMarkup import dev.inmo.tgbotapi.types.files.DocumentFile import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage import dev.inmo.tgbotapi.types.message.content.abstracts.MediaContent +import dev.inmo.tgbotapi.types.message.content.abstracts.MediaGroupContent import dev.inmo.tgbotapi.utils.toHtmlCaptions import dev.inmo.tgbotapi.utils.toMarkdownV2Captions @@ -20,7 +21,7 @@ data class DocumentContent( override val media: DocumentFile, override val caption: String? = null, override val captionEntities: List = emptyList() -) : MediaContent, CaptionedInput { +) : MediaGroupContent { override fun createResend( chatId: ChatIdentifier, disableNotification: Boolean, @@ -37,6 +38,11 @@ data class DocumentContent( replyMarkup ) + override fun toMediaGroupMemberInputMedia(): MediaGroupMemberInputMedia = media.toInputMediaDocument( + toHtmlCaptions().firstOrNull(), + HTMLParseMode + ) + override fun asInputMedia(): InputMediaDocument = InputMediaDocument( media.fileId, toMarkdownV2Captions().firstOrNull(), From 7d72d72f2cace1a8f01d85ab28d6ac300d382562 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Fri, 30 Oct 2020 20:38:04 +0600 Subject: [PATCH 05/18] Revert "Revert "Revert "Revert "add slot machine, but currently it is not working"""" This reverts commit b457d11067296a8c7ed5b12c2fbe62170158ea13. --- CHANGELOG.md | 3 +++ .../kotlin/dev/inmo/tgbotapi/types/dice/DiceAnimationType.kt | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 34491c6985..9f83e783d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ ## 0.29.3 +* `Core`: + * New dice type `SlotMachineDiceAnimationType` + ## 0.29.2 * `Common`: diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/dice/DiceAnimationType.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/dice/DiceAnimationType.kt index 806e43d16f..89ea0878cf 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/dice/DiceAnimationType.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/dice/DiceAnimationType.kt @@ -22,6 +22,10 @@ object BasketballDiceAnimationType : DiceAnimationType() { override val emoji: String = "\uD83C\uDFC0" } @Serializable(DiceAnimationTypeSerializer::class) +object SlotMachineDiceAnimationType : DiceAnimationType() { + override val emoji: String = "\uD83C\uDFB0" +} +@Serializable(DiceAnimationTypeSerializer::class) data class CustomDiceAnimationType( override val emoji: String ) : DiceAnimationType() @@ -34,6 +38,7 @@ internal object DiceAnimationTypeSerializer : KSerializer { CubeDiceAnimationType.emoji -> CubeDiceAnimationType DartsDiceAnimationType.emoji -> DartsDiceAnimationType BasketballDiceAnimationType.emoji -> BasketballDiceAnimationType + SlotMachineDiceAnimationType.emoji -> BasketballDiceAnimationType else -> CustomDiceAnimationType(type) } } From 06ba21fc1f4d3639c642cd0d83de43def85915c7 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Fri, 30 Oct 2020 20:40:44 +0600 Subject: [PATCH 06/18] add changelog for audio and document media items --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9f83e783d5..f4bec53ebb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,12 @@ * `Core`: * New dice type `SlotMachineDiceAnimationType` + * `InputMediaAudio` now implements `MediaGroupMemberInputMedia` + * New extension `AudioFile#toInputMediaAudio` + * `AudioContent` now implements `MediaGroupContent` + * `InputMediaDocument` now implements `MediaGroupMemberInputMedia` + * New extension `DocumentFile#toInputMediaDocument` + * `DocumentContent` now implements `MediaGroupContent` ## 0.29.2 From 9e771fa04a8d66392a6fe26aff348fe7da8c592d Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Mon, 2 Nov 2020 11:13:16 +0600 Subject: [PATCH 07/18] fixes --- .../tgbotapi/types/dice/DiceAnimationType.kt | 2 +- .../inmo/tgbotapi/types/message/RawMessage.kt | 19 +++++++++---------- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/dice/DiceAnimationType.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/dice/DiceAnimationType.kt index 89ea0878cf..74ded7764f 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/dice/DiceAnimationType.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/dice/DiceAnimationType.kt @@ -38,7 +38,7 @@ internal object DiceAnimationTypeSerializer : KSerializer { CubeDiceAnimationType.emoji -> CubeDiceAnimationType DartsDiceAnimationType.emoji -> DartsDiceAnimationType BasketballDiceAnimationType.emoji -> BasketballDiceAnimationType - SlotMachineDiceAnimationType.emoji -> BasketballDiceAnimationType + SlotMachineDiceAnimationType.emoji -> SlotMachineDiceAnimationType else -> CustomDiceAnimationType(type) } } diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/RawMessage.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/RawMessage.kt index 4ac90d2823..5f6991b77a 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/RawMessage.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/RawMessage.kt @@ -220,17 +220,20 @@ internal data class RawMessage( } } ?: content?.let { content -> media_group_id?.let { + val checkedContent = when (content) { + is PhotoContent -> content + is VideoContent -> content + is AudioContent -> content + is DocumentContent -> content + else -> error("Unsupported content for media group") + } when (from) { null -> ChannelMediaGroupMessage( messageId, chat, date.asDate, it, - when (content) { - is PhotoContent -> content - is VideoContent -> content - else -> error("Unsupported content for media group") - }, + checkedContent, edit_date?.asDate, forwarded, reply_to_message?.asMessage, @@ -242,11 +245,7 @@ internal data class RawMessage( chat, date.asDate, it, - when (content) { - is PhotoContent -> content - is VideoContent -> content - else -> error("Unsupported content for media group") - }, + checkedContent, edit_date?.asDate, forwarded, reply_to_message?.asMessage, From e9a05c4930221f6d058bdb954e7e905e920e4e15 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Mon, 2 Nov 2020 12:02:12 +0600 Subject: [PATCH 08/18] include audio playlists, documents and slot machine dice --- .../requests/send/media/SendMediaGroup.kt | 37 ++++++++++++++++++- .../types/InputMedia/InputMediaPhoto.kt | 2 +- .../types/InputMedia/InputMediaVideo.kt | 2 +- .../InputMedia/MediaGroupMemberInputMedia.kt | 3 ++ .../inmo/tgbotapi/types/files/DocumentFile.kt | 9 +++++ .../content/abstracts/MediaGroupContent.kt | 4 +- .../message/content/media/DocumentContent.kt | 12 ++++++ .../message/content/media/PhotoContent.kt | 5 +-- .../message/content/media/VideoContent.kt | 3 +- .../dev/inmo/tgbotapi/utils/Annotations.kt | 18 +++++++++ 10 files changed, 87 insertions(+), 8 deletions(-) diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/send/media/SendMediaGroup.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/send/media/SendMediaGroup.kt index fb458dbd9a..a64820dcff 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/send/media/SendMediaGroup.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/send/media/SendMediaGroup.kt @@ -8,12 +8,14 @@ import dev.inmo.tgbotapi.types.* import dev.inmo.tgbotapi.types.InputMedia.* import dev.inmo.tgbotapi.types.message.abstracts.MediaGroupMessage import dev.inmo.tgbotapi.types.message.abstracts.TelegramBotAPIMessageDeserializeOnlySerializerClass +import dev.inmo.tgbotapi.utils.* import dev.inmo.tgbotapi.utils.throwRangeError -import dev.inmo.tgbotapi.utils.toJsonWithoutNulls import kotlinx.serialization.* import kotlinx.serialization.builtins.ListSerializer import kotlinx.serialization.json.buildJsonArray +@RiskFeature("Media groups contains restrictions related to combinations of media types. Currently it is possible to" + + " combine photo + video OR audio OR documents") fun SendMediaGroup( chatId: ChatIdentifier, media: List, @@ -52,6 +54,39 @@ fun SendMediaGroup( } } +/** + * Use this method to be sure that you are correctly sending playlist with audios + */ +@Suppress("NOTHING_TO_INLINE") +inline fun SendPlaylist( + chatId: ChatIdentifier, + media: List, + disableNotification: Boolean = false, + replyToMessageId: MessageIdentifier? = null +) = SendMediaGroup(chatId, media, disableNotification, replyToMessageId) + +/** + * Use this method to be sure that you are correctly sending documents media group + */ +@Suppress("NOTHING_TO_INLINE") +inline fun SendDocumentsGroup( + chatId: ChatIdentifier, + media: List, + disableNotification: Boolean = false, + replyToMessageId: MessageIdentifier? = null +) = SendMediaGroup(chatId, media, disableNotification, replyToMessageId) + +/** + * Use this method to be sure that you are correctly sending visual media group + */ +@Suppress("NOTHING_TO_INLINE") +inline fun SendVisualMediaGroup( + chatId: ChatIdentifier, + media: List, + disableNotification: Boolean = false, + replyToMessageId: MessageIdentifier? = null +) = SendMediaGroup(chatId, media, disableNotification, replyToMessageId) + private val messagesListSerializer: KSerializer> = ListSerializer(TelegramBotAPIMessageDeserializeOnlySerializerClass()) diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/InputMediaPhoto.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/InputMediaPhoto.kt index 432fd8a578..55aa777d6b 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/InputMediaPhoto.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/InputMediaPhoto.kt @@ -17,7 +17,7 @@ data class InputMediaPhoto( override val caption: String? = null, @SerialName(parseModeField) override val parseMode: ParseMode? = null -) : InputMedia, MediaGroupMemberInputMedia { +) : InputMedia, VisualMediaGroupMemberInputMedia { override val type: String = photoInputMediaType override fun serialize(format: StringFormat): String = format.encodeToString(serializer(), this) diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/InputMediaVideo.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/InputMediaVideo.kt index 8be815907a..81e78aaa8f 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/InputMediaVideo.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/InputMediaVideo.kt @@ -19,7 +19,7 @@ data class InputMediaVideo( override val height: Int? = null, override val duration: Long? = null, override val thumb: InputFile? = null -) : InputMedia, SizedInputMedia, DuratedInputMedia, ThumbedInputMedia, MediaGroupMemberInputMedia { +) : InputMedia, SizedInputMedia, DuratedInputMedia, ThumbedInputMedia, VisualMediaGroupMemberInputMedia { override val type: String = videoInputMediaType override fun serialize(format: StringFormat): String = format.encodeToString(serializer(), this) diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/MediaGroupMemberInputMedia.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/MediaGroupMemberInputMedia.kt index a587f121d5..202f40c366 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/MediaGroupMemberInputMedia.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/MediaGroupMemberInputMedia.kt @@ -18,3 +18,6 @@ internal fun T.buildArguments(withSerializer: SerializationStrategy) = ar interface MediaGroupMemberInputMedia : InputMedia, CaptionedOutput { fun serialize(format: StringFormat): String } + +@Serializable(MediaGroupMemberInputMediaSerializer::class) +interface VisualMediaGroupMemberInputMedia : MediaGroupMemberInputMedia diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/files/DocumentFile.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/files/DocumentFile.kt index 41c0ac7854..fc592389ac 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/files/DocumentFile.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/files/DocumentFile.kt @@ -22,3 +22,12 @@ data class DocumentFile( @SerialName(fileNameField) override val fileName: String? = null ) : TelegramMediaFile, MimedMediaFile, ThumbedMediaFile, CustomNamedMediaFile + +inline fun T.asDocumentFile() = DocumentFile( + fileId, + fileUniqueId, + fileSize, + (this as? ThumbedMediaFile) ?.thumb, + (this as? MimedMediaFile) ?.mimeType, + (this as? CustomNamedMediaFile) ?.fileName +) diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/abstracts/MediaGroupContent.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/abstracts/MediaGroupContent.kt index 18cc8686cd..7e46867647 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/abstracts/MediaGroupContent.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/abstracts/MediaGroupContent.kt @@ -5,4 +5,6 @@ import dev.inmo.tgbotapi.types.InputMedia.MediaGroupMemberInputMedia interface MediaGroupContent : MediaContent, CaptionedInput { fun toMediaGroupMemberInputMedia(): MediaGroupMemberInputMedia -} \ No newline at end of file +} + +interface VisualMediaGroupContent : MediaGroupContent diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/DocumentContent.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/DocumentContent.kt index 530482b6db..9163fafcb8 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/DocumentContent.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/DocumentContent.kt @@ -11,6 +11,7 @@ import dev.inmo.tgbotapi.types.ParseMode.HTMLParseMode import dev.inmo.tgbotapi.types.ParseMode.MarkdownV2 import dev.inmo.tgbotapi.types.buttons.KeyboardMarkup import dev.inmo.tgbotapi.types.files.DocumentFile +import dev.inmo.tgbotapi.types.files.asDocumentFile import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage import dev.inmo.tgbotapi.types.message.content.abstracts.MediaContent import dev.inmo.tgbotapi.types.message.content.abstracts.MediaGroupContent @@ -50,3 +51,14 @@ data class DocumentContent( media.thumb ?.fileId ) } + +inline fun T.asDocumentContent() = when (this) { + is CaptionedInput -> DocumentContent( + media.asDocumentFile(), + caption, + captionEntities + ) + else -> DocumentContent( + media.asDocumentFile() + ) +} diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/PhotoContent.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/PhotoContent.kt index e691370ab3..0b37841c06 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/PhotoContent.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/PhotoContent.kt @@ -12,8 +12,7 @@ import dev.inmo.tgbotapi.types.ParseMode.MarkdownV2 import dev.inmo.tgbotapi.types.buttons.KeyboardMarkup import dev.inmo.tgbotapi.types.files.* import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage -import dev.inmo.tgbotapi.types.message.content.abstracts.MediaCollectionContent -import dev.inmo.tgbotapi.types.message.content.abstracts.MediaGroupContent +import dev.inmo.tgbotapi.types.message.content.abstracts.* import dev.inmo.tgbotapi.utils.toHtmlCaptions import dev.inmo.tgbotapi.utils.toMarkdownV2Captions @@ -21,7 +20,7 @@ data class PhotoContent( override val mediaCollection: Photo, override val caption: String? = null, override val captionEntities: List = emptyList() -) : MediaCollectionContent, MediaGroupContent { +) : MediaCollectionContent, VisualMediaGroupContent { override val media: PhotoSize = mediaCollection.biggest() ?: throw IllegalStateException("Can't locate any photo size for this content") override fun createResend( diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/VideoContent.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/VideoContent.kt index 0461d17a63..7d76c656da 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/VideoContent.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/VideoContent.kt @@ -13,6 +13,7 @@ import dev.inmo.tgbotapi.types.buttons.KeyboardMarkup import dev.inmo.tgbotapi.types.files.VideoFile import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage import dev.inmo.tgbotapi.types.message.content.abstracts.MediaGroupContent +import dev.inmo.tgbotapi.types.message.content.abstracts.VisualMediaGroupContent import dev.inmo.tgbotapi.utils.toHtmlCaptions import dev.inmo.tgbotapi.utils.toMarkdownV2Captions @@ -20,7 +21,7 @@ data class VideoContent( override val media: VideoFile, override val caption: String? = null, override val captionEntities: List = emptyList() -) : MediaGroupContent { +) : VisualMediaGroupContent { override fun createResend( chatId: ChatIdentifier, disableNotification: Boolean, diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/utils/Annotations.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/utils/Annotations.kt index 9de1d0cd70..f89e623676 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/utils/Annotations.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/utils/Annotations.kt @@ -17,3 +17,21 @@ package dev.inmo.tgbotapi.utils AnnotationTarget.TYPE_PARAMETER ) annotation class PreviewFeature + +@RequiresOptIn( + "This feature can work unstable and may have some restrictions in Telegram System", + RequiresOptIn.Level.WARNING +) +@Target( + AnnotationTarget.CLASS, + AnnotationTarget.CONSTRUCTOR, + AnnotationTarget.FIELD, + AnnotationTarget.PROPERTY, + AnnotationTarget.PROPERTY_GETTER, + AnnotationTarget.PROPERTY_SETTER, + AnnotationTarget.FUNCTION, + AnnotationTarget.TYPE, + AnnotationTarget.TYPEALIAS, + AnnotationTarget.TYPE_PARAMETER +) +annotation class RiskFeature(val message: String) From 1ee73dd406b8fc7f26d55a4c239c3e59e96ddf84 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Mon, 2 Nov 2020 12:39:12 +0600 Subject: [PATCH 09/18] sending media groups api updates --- .../requests/send/media/SendMediaGroup.kt | 17 ++- .../types/InputMedia/InputMediaAudio.kt | 2 +- .../types/InputMedia/InputMediaDocument.kt | 2 +- .../InputMedia/MediaGroupMemberInputMedia.kt | 3 + .../message/content/media/AudioContent.kt | 2 +- .../message/content/media/DocumentContent.kt | 2 +- .../message/content/media/PhotoContent.kt | 2 +- .../message/content/media/VideoContent.kt | 2 +- .../api/send/media/SendMediaGroup.kt | 109 +++++++++++++++++- 9 files changed, 129 insertions(+), 12 deletions(-) diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/send/media/SendMediaGroup.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/send/media/SendMediaGroup.kt index a64820dcff..c49a398ec4 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/send/media/SendMediaGroup.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/send/media/SendMediaGroup.kt @@ -14,8 +14,10 @@ import kotlinx.serialization.* import kotlinx.serialization.builtins.ListSerializer import kotlinx.serialization.json.buildJsonArray -@RiskFeature("Media groups contains restrictions related to combinations of media types. Currently it is possible to" + - " combine photo + video OR audio OR documents") +const val rawSendingMediaGroupsWarning = "Media groups contains restrictions related to combinations of media" + + " types. Currently it is possible to combine photo + video OR audio OR documents" + +@RiskFeature(rawSendingMediaGroupsWarning) fun SendMediaGroup( chatId: ChatIdentifier, media: List, @@ -56,28 +58,35 @@ fun SendMediaGroup( /** * Use this method to be sure that you are correctly sending playlist with audios + * + * @see InputMediaAudio */ @Suppress("NOTHING_TO_INLINE") inline fun SendPlaylist( chatId: ChatIdentifier, - media: List, + media: List, disableNotification: Boolean = false, replyToMessageId: MessageIdentifier? = null ) = SendMediaGroup(chatId, media, disableNotification, replyToMessageId) /** * Use this method to be sure that you are correctly sending documents media group + * + * @see InputMediaDocument */ @Suppress("NOTHING_TO_INLINE") inline fun SendDocumentsGroup( chatId: ChatIdentifier, - media: List, + media: List, disableNotification: Boolean = false, replyToMessageId: MessageIdentifier? = null ) = SendMediaGroup(chatId, media, disableNotification, replyToMessageId) /** * Use this method to be sure that you are correctly sending visual media group + * + * @see InputMediaPhoto + * @see InputMediaVideo */ @Suppress("NOTHING_TO_INLINE") inline fun SendVisualMediaGroup( diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/InputMediaAudio.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/InputMediaAudio.kt index f430f993eb..d5585c58f4 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/InputMediaAudio.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/InputMediaAudio.kt @@ -23,7 +23,7 @@ data class InputMediaAudio( override val performer: String? = null, override val title: String? = null, override val thumb: InputFile? = null -) : InputMedia, MediaGroupMemberInputMedia, DuratedInputMedia, ThumbedInputMedia, TitledInputMedia, CaptionedOutput, Performerable { +) : InputMedia, AudioMediaGroupMemberInputMedia, DuratedInputMedia, ThumbedInputMedia, TitledInputMedia, CaptionedOutput, Performerable { override val type: String = audioInputMediaType override fun serialize(format: StringFormat): String = format.encodeToString(serializer(), this) diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/InputMediaDocument.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/InputMediaDocument.kt index e6d918a278..e58029e6c2 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/InputMediaDocument.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/InputMediaDocument.kt @@ -17,7 +17,7 @@ data class InputMediaDocument( @SerialName(parseModeField) override val parseMode: ParseMode? = null, override val thumb: InputFile? = null -) : InputMedia, MediaGroupMemberInputMedia, ThumbedInputMedia, CaptionedOutput { +) : InputMedia, DocumentMediaGroupMemberInputMedia, ThumbedInputMedia, CaptionedOutput { override val type: String = documentInputMediaType override fun serialize(format: StringFormat): String = format.encodeToString(serializer(), this) diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/MediaGroupMemberInputMedia.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/MediaGroupMemberInputMedia.kt index 202f40c366..83965179f8 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/MediaGroupMemberInputMedia.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/MediaGroupMemberInputMedia.kt @@ -19,5 +19,8 @@ interface MediaGroupMemberInputMedia : InputMedia, CaptionedOutput { fun serialize(format: StringFormat): String } +interface AudioMediaGroupMemberInputMedia: MediaGroupMemberInputMedia +interface DocumentMediaGroupMemberInputMedia: MediaGroupMemberInputMedia + @Serializable(MediaGroupMemberInputMediaSerializer::class) interface VisualMediaGroupMemberInputMedia : MediaGroupMemberInputMedia diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/AudioContent.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/AudioContent.kt index 07be31f7ca..a87f5bd337 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/AudioContent.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/AudioContent.kt @@ -39,7 +39,7 @@ data class AudioContent( replyMarkup ) - override fun toMediaGroupMemberInputMedia(): MediaGroupMemberInputMedia = media.toInputMediaAudio( + override fun toMediaGroupMemberInputMedia(): InputMediaAudio = media.toInputMediaAudio( toHtmlCaptions().firstOrNull(), HTMLParseMode ) diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/DocumentContent.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/DocumentContent.kt index 9163fafcb8..acbea12dd9 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/DocumentContent.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/DocumentContent.kt @@ -39,7 +39,7 @@ data class DocumentContent( replyMarkup ) - override fun toMediaGroupMemberInputMedia(): MediaGroupMemberInputMedia = media.toInputMediaDocument( + override fun toMediaGroupMemberInputMedia(): InputMediaDocument = media.toInputMediaDocument( toHtmlCaptions().firstOrNull(), HTMLParseMode ) diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/PhotoContent.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/PhotoContent.kt index 0b37841c06..3aae309f48 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/PhotoContent.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/PhotoContent.kt @@ -38,7 +38,7 @@ data class PhotoContent( replyMarkup ) - override fun toMediaGroupMemberInputMedia(): MediaGroupMemberInputMedia = InputMediaPhoto( + override fun toMediaGroupMemberInputMedia(): InputMediaPhoto = InputMediaPhoto( media.fileId, toHtmlCaptions().firstOrNull(), HTMLParseMode diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/VideoContent.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/VideoContent.kt index 7d76c656da..8dd6efed24 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/VideoContent.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/VideoContent.kt @@ -42,7 +42,7 @@ data class VideoContent( replyMarkup ) - override fun toMediaGroupMemberInputMedia(): MediaGroupMemberInputMedia = InputMediaVideo( + override fun toMediaGroupMemberInputMedia(): InputMediaVideo = InputMediaVideo( media.fileId, toHtmlCaptions().firstOrNull(), HTMLParseMode, diff --git a/tgbotapi.extensions.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/send/media/SendMediaGroup.kt b/tgbotapi.extensions.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/send/media/SendMediaGroup.kt index 1f0cf52f6a..03e5d13e3d 100644 --- a/tgbotapi.extensions.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/send/media/SendMediaGroup.kt +++ b/tgbotapi.extensions.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/send/media/SendMediaGroup.kt @@ -1,13 +1,18 @@ package dev.inmo.tgbotapi.extensions.api.send.media import dev.inmo.tgbotapi.bot.TelegramBot -import dev.inmo.tgbotapi.requests.send.media.SendMediaGroup +import dev.inmo.tgbotapi.requests.send.media.* import dev.inmo.tgbotapi.types.ChatIdentifier -import dev.inmo.tgbotapi.types.InputMedia.MediaGroupMemberInputMedia +import dev.inmo.tgbotapi.types.InputMedia.* import dev.inmo.tgbotapi.types.MessageIdentifier import dev.inmo.tgbotapi.types.chat.abstracts.Chat import dev.inmo.tgbotapi.types.message.abstracts.Message +import dev.inmo.tgbotapi.utils.RiskFeature +/** + * @see SendMediaGroup + */ +@RiskFeature(rawSendingMediaGroupsWarning) suspend fun TelegramBot.sendMediaGroup( chatId: ChatIdentifier, media: List, @@ -19,6 +24,10 @@ suspend fun TelegramBot.sendMediaGroup( ) ) +/** + * @see SendMediaGroup + */ +@RiskFeature(rawSendingMediaGroupsWarning) suspend fun TelegramBot.sendMediaGroup( chat: Chat, media: List, @@ -28,12 +37,108 @@ suspend fun TelegramBot.sendMediaGroup( chat.id, media, disableNotification, replyToMessageId ) +/** + * @see SendPlaylist + */ +suspend fun TelegramBot.sendPlaylist( + chatId: ChatIdentifier, + media: List, + disableNotification: Boolean = false, + replyToMessageId: MessageIdentifier? = null +) = execute( + SendPlaylist( + chatId, media, disableNotification, replyToMessageId + ) +) + +/** + * @see SendPlaylist + */ +suspend fun TelegramBot.sendPlaylist( + chat: Chat, + media: List, + disableNotification: Boolean = false, + replyToMessageId: MessageIdentifier? = null +) = sendPlaylist( + chat.id, media, disableNotification, replyToMessageId +) + +/** + * @see SendDocumentsGroup + */ +suspend fun TelegramBot.sendDocumentsGroup( + chatId: ChatIdentifier, + media: List, + disableNotification: Boolean = false, + replyToMessageId: MessageIdentifier? = null +) = execute( + SendDocumentsGroup( + chatId, media, disableNotification, replyToMessageId + ) +) + +/** + * @see SendDocumentsGroup + */ +suspend fun TelegramBot.sendDocumentsGroup( + chat: Chat, + media: List, + disableNotification: Boolean = false, + replyToMessageId: MessageIdentifier? = null +) = sendDocumentsGroup( + chat.id, media, disableNotification, replyToMessageId +) + +/** + * @see SendVisualMediaGroup + */ +suspend fun TelegramBot.sendVisualMediaGroup( + chatId: ChatIdentifier, + media: List, + disableNotification: Boolean = false, + replyToMessageId: MessageIdentifier? = null +) = execute( + SendVisualMediaGroup( + chatId, media, disableNotification, replyToMessageId + ) +) + +/** + * @see SendVisualMediaGroup + */ +suspend fun TelegramBot.sendVisualMediaGroup( + chat: Chat, + media: List, + disableNotification: Boolean = false, + replyToMessageId: MessageIdentifier? = null +) = sendVisualMediaGroup( + chat.id, media, disableNotification, replyToMessageId +) + suspend inline fun TelegramBot.replyWithMediaGroup( to: Message, media: List, disableNotification: Boolean = false ) = sendMediaGroup(to.chat, media, disableNotification, to.messageId) +suspend inline fun TelegramBot.replyWithPlaylist( + to: Message, + media: List, + disableNotification: Boolean = false +) = sendPlaylist(to.chat, media, disableNotification, to.messageId) + +suspend inline fun TelegramBot.replyWithDocumentsGroup( + to: Message, + media: List, + disableNotification: Boolean = false +) = sendDocumentsGroup(to.chat, media, disableNotification, to.messageId) + +suspend inline fun TelegramBot.replyWithVisualMediaGroup( + to: Message, + media: List, + disableNotification: Boolean = false +) = sendVisualMediaGroup(to.chat, media, disableNotification, to.messageId) + suspend inline fun TelegramBot.reply( to: Message, media: List, From d96d47e32c52308d724c26861cefd16e563a6638 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Mon, 2 Nov 2020 12:51:09 +0600 Subject: [PATCH 10/18] make different interfaces for audio and documents media content --- .../types/message/content/abstracts/MediaGroupContent.kt | 2 ++ .../tgbotapi/types/message/content/media/AudioContent.kt | 2 +- .../tgbotapi/types/message/content/media/DocumentContent.kt | 5 ++--- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/abstracts/MediaGroupContent.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/abstracts/MediaGroupContent.kt index 7e46867647..a284c0c4b8 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/abstracts/MediaGroupContent.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/abstracts/MediaGroupContent.kt @@ -8,3 +8,5 @@ interface MediaGroupContent : MediaContent, CaptionedInput { } interface VisualMediaGroupContent : MediaGroupContent +interface AudioMediaGroupContent : MediaGroupContent +interface DocumentMediaGroupContent : MediaGroupContent diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/AudioContent.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/AudioContent.kt index a87f5bd337..a4d84c2ef3 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/AudioContent.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/AudioContent.kt @@ -19,7 +19,7 @@ data class AudioContent( override val media: AudioFile, override val caption: String? = null, override val captionEntities: List = emptyList() -) : MediaGroupContent { +) : AudioMediaGroupContent { override fun createResend( chatId: ChatIdentifier, disableNotification: Boolean, diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/DocumentContent.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/DocumentContent.kt index acbea12dd9..36f8f75bfc 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/DocumentContent.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/DocumentContent.kt @@ -13,8 +13,7 @@ import dev.inmo.tgbotapi.types.buttons.KeyboardMarkup import dev.inmo.tgbotapi.types.files.DocumentFile import dev.inmo.tgbotapi.types.files.asDocumentFile import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage -import dev.inmo.tgbotapi.types.message.content.abstracts.MediaContent -import dev.inmo.tgbotapi.types.message.content.abstracts.MediaGroupContent +import dev.inmo.tgbotapi.types.message.content.abstracts.* import dev.inmo.tgbotapi.utils.toHtmlCaptions import dev.inmo.tgbotapi.utils.toMarkdownV2Captions @@ -22,7 +21,7 @@ data class DocumentContent( override val media: DocumentFile, override val caption: String? = null, override val captionEntities: List = emptyList() -) : MediaGroupContent { +) : DocumentMediaGroupContent { override fun createResend( chatId: ChatIdentifier, disableNotification: Boolean, From 5dd7207e090855ee6e7683ad3bd6585f90d98a72 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Mon, 2 Nov 2020 12:56:29 +0600 Subject: [PATCH 11/18] update serialization version --- CHANGELOG.md | 3 +++ gradle.properties | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f4bec53ebb..d4febf847f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ ## 0.29.3 +* `Common`: + * Version updates: + * `Serialization`: `1.0.0` -> `1.0.1` * `Core`: * New dice type `SlotMachineDiceAnimationType` * `InputMediaAudio` now implements `MediaGroupMemberInputMedia` diff --git a/gradle.properties b/gradle.properties index 5e067b1efe..4cbff7cb7d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,7 +7,7 @@ kotlin.incremental.js=true kotlin_version=1.4.10 kotlin_coroutines_version=1.4.0 -kotlin_serialisation_runtime_version=1.0.0 +kotlin_serialisation_runtime_version=1.0.1 klock_version=1.12.1 uuid_version=0.2.2 ktor_version=1.4.1 From f0e9267664a8d114c0b6f5a984ed991dbe347b7e Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Mon, 2 Nov 2020 13:16:46 +0600 Subject: [PATCH 12/18] fixes in files and filling of changelog --- CHANGELOG.md | 40 ++++++++++++++++--- .../inmo/tgbotapi/types/files/DocumentFile.kt | 3 +- .../inmo/tgbotapi/types/files/VideoFile.kt | 18 +++++++++ .../message/content/media/AudioContent.kt | 14 ++----- .../message/content/media/DocumentContent.kt | 14 +++---- .../message/content/media/PhotoContent.kt | 14 ++----- .../message/content/media/VideoContent.kt | 22 +++------- 7 files changed, 71 insertions(+), 54 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d4febf847f..49a338db59 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,13 +6,41 @@ * Version updates: * `Serialization`: `1.0.0` -> `1.0.1` * `Core`: + * New annotation `RiskFeature`. This annotation will be applied to the things which contains unsafe types usage + * `SendMediaGroup` factory now marked with `RiskFeature` + * Media groups updates: + * New functions `SendPlaylist` + * New functions `SendDocumentsGroup` + * New functions `SendVisualMediaGroup` + * New type `VisualMediaGroupMemberInputMedia : MediaGroupMemberInputMedia` + * `InputMediaPhoto` now implements `VisualMediaGroupMemberInputMedia` instead of `MediaGroupMemberInputMedia` + * `InputMediaVideo` now implements `VisualMediaGroupMemberInputMedia` instead of `MediaGroupMemberInputMedia` + * New type `VisualMediaGroupContent : MediaGroupContent` + * `PhotoContent` now implements `VisualMediaGroupContent` instead of `MediaGroupContent` + * `VideoContent` now implements `VisualMediaGroupContent` instead of `MediaGroupContent` + * New type `AudioMediaGroupContent : MediaGroupContent` + * `AudioContent` now implements `AudioMediaGroupContent` instead of `MediaContent` and `CaptionedInput` + * New type `DocumentMediaGroupContent : MediaGroupContent` + * `DocumentContent` now implements `DocumentMediaGroupContent` instead of `MediaContent` and `CaptionedInput` + * New type `AudioMediaGroupMemberInputMedia : MediaGroupMemberInputMedia` + * `InputMediaAudio` now implements `AudioMediaGroupMemberInputMedia` + * New type `DocumentMediaGroupMemberInputMedia : MediaGroupMemberInputMedia` + * `InputMediaDocument` now implements `DocumentMediaGroupMemberInputMedia` + * New extension `AudioFile#toInputMediaAudio` + * `AudioContent` now implements `MediaGroupContent` + * New extension `DocumentFile#toInputMediaDocument` + * `DocumentContent` now implements `MediaGroupContent` * New dice type `SlotMachineDiceAnimationType` - * `InputMediaAudio` now implements `MediaGroupMemberInputMedia` - * New extension `AudioFile#toInputMediaAudio` - * `AudioContent` now implements `MediaGroupContent` - * `InputMediaDocument` now implements `MediaGroupMemberInputMedia` - * New extension `DocumentFile#toInputMediaDocument` - * `DocumentContent` now implements `MediaGroupContent` + * New extension `TelegramMediaFile#asDocumentFile` + * New extension `VideoFile#toInputMediaVideo` +* `API`: + * New extensions for media groups: + * `TelegramBot#sendPlaylist` + * `TelegramBot#replyWithPlaylist` + * `TelegramBot#sendDocumentsGroup` + * `TelegramBot#replyWithDocumentsGroup` + * `TelegramBot#sendVisualMediaGroup` + * `TelegramBot#replyWithVisualMediaGroup` ## 0.29.2 diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/files/DocumentFile.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/files/DocumentFile.kt index fc592389ac..103fbb78d5 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/files/DocumentFile.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/files/DocumentFile.kt @@ -23,7 +23,8 @@ data class DocumentFile( override val fileName: String? = null ) : TelegramMediaFile, MimedMediaFile, ThumbedMediaFile, CustomNamedMediaFile -inline fun T.asDocumentFile() = DocumentFile( +@Suppress("NOTHING_TO_INLINE") +inline fun TelegramMediaFile.asDocumentFile() = DocumentFile( fileId, fileUniqueId, fileSize, diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/files/VideoFile.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/files/VideoFile.kt index 84555e0a76..5780caa07c 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/files/VideoFile.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/files/VideoFile.kt @@ -2,9 +2,13 @@ package dev.inmo.tgbotapi.types.files import dev.inmo.tgbotapi.requests.abstracts.FileId import dev.inmo.tgbotapi.types.FileUniqueId +import dev.inmo.tgbotapi.types.InputMedia.InputMediaVideo +import dev.inmo.tgbotapi.types.ParseMode.HTMLParseMode +import dev.inmo.tgbotapi.types.ParseMode.ParseMode import dev.inmo.tgbotapi.types.fileUniqueIdField import dev.inmo.tgbotapi.types.files.abstracts.* import dev.inmo.tgbotapi.utils.MimeType +import dev.inmo.tgbotapi.utils.toHtmlCaptions import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -23,3 +27,17 @@ data class VideoFile( @SerialName(fileSizeField) override val fileSize: Long? = null ) : TelegramMediaFile, MimedMediaFile, ThumbedMediaFile, PlayableMediaFile, SizedMediaFile + +@Suppress("NOTHING_TO_INLINE") +inline fun VideoFile.toInputMediaVideo( + caption: String? = null, + parseMode: ParseMode? = null +) = InputMediaVideo( + fileId, + caption, + parseMode, + width, + height, + duration, + thumb ?.fileId +) diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/AudioContent.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/AudioContent.kt index a4d84c2ef3..e662354d3a 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/AudioContent.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/AudioContent.kt @@ -39,18 +39,10 @@ data class AudioContent( replyMarkup ) - override fun toMediaGroupMemberInputMedia(): InputMediaAudio = media.toInputMediaAudio( + override fun toMediaGroupMemberInputMedia(): InputMediaAudio = asInputMedia() + + override fun asInputMedia(): InputMediaAudio = media.toInputMediaAudio( toHtmlCaptions().firstOrNull(), HTMLParseMode ) - - override fun asInputMedia(): InputMediaAudio = InputMediaAudio( - media.fileId, - toMarkdownV2Captions().firstOrNull(), - MarkdownV2, - media.duration, - media.performer, - media.title, - media.thumb ?.fileId - ) } diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/DocumentContent.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/DocumentContent.kt index 36f8f75bfc..f69c415813 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/DocumentContent.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/DocumentContent.kt @@ -38,20 +38,16 @@ data class DocumentContent( replyMarkup ) - override fun toMediaGroupMemberInputMedia(): InputMediaDocument = media.toInputMediaDocument( + override fun toMediaGroupMemberInputMedia(): InputMediaDocument = asInputMedia() + + override fun asInputMedia(): InputMediaDocument = media.toInputMediaDocument( toHtmlCaptions().firstOrNull(), HTMLParseMode ) - - override fun asInputMedia(): InputMediaDocument = InputMediaDocument( - media.fileId, - toMarkdownV2Captions().firstOrNull(), - MarkdownV2, - media.thumb ?.fileId - ) } -inline fun T.asDocumentContent() = when (this) { +@Suppress("NOTHING_TO_INLINE") +inline fun MediaContent.asDocumentContent() = when (this) { is CaptionedInput -> DocumentContent( media.asDocumentFile(), caption, diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/PhotoContent.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/PhotoContent.kt index 3aae309f48..de7b9eb17a 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/PhotoContent.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/PhotoContent.kt @@ -4,8 +4,7 @@ import dev.inmo.tgbotapi.CommonAbstracts.TextPart import dev.inmo.tgbotapi.requests.abstracts.Request import dev.inmo.tgbotapi.requests.send.media.SendPhoto import dev.inmo.tgbotapi.types.ChatIdentifier -import dev.inmo.tgbotapi.types.InputMedia.InputMediaPhoto -import dev.inmo.tgbotapi.types.InputMedia.MediaGroupMemberInputMedia +import dev.inmo.tgbotapi.types.InputMedia.* import dev.inmo.tgbotapi.types.MessageIdentifier import dev.inmo.tgbotapi.types.ParseMode.HTMLParseMode import dev.inmo.tgbotapi.types.ParseMode.MarkdownV2 @@ -38,15 +37,10 @@ data class PhotoContent( replyMarkup ) - override fun toMediaGroupMemberInputMedia(): InputMediaPhoto = InputMediaPhoto( - media.fileId, + override fun toMediaGroupMemberInputMedia(): InputMediaPhoto = asInputMedia() + + override fun asInputMedia(): InputMediaPhoto = media.toInputMediaPhoto( toHtmlCaptions().firstOrNull(), HTMLParseMode ) - - override fun asInputMedia(): InputMediaPhoto = InputMediaPhoto( - media.fileId, - toMarkdownV2Captions().firstOrNull(), - MarkdownV2 - ) } diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/VideoContent.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/VideoContent.kt index 8dd6efed24..1049043f37 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/VideoContent.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/media/VideoContent.kt @@ -11,6 +11,7 @@ import dev.inmo.tgbotapi.types.ParseMode.HTMLParseMode import dev.inmo.tgbotapi.types.ParseMode.MarkdownV2 import dev.inmo.tgbotapi.types.buttons.KeyboardMarkup import dev.inmo.tgbotapi.types.files.VideoFile +import dev.inmo.tgbotapi.types.files.toInputMediaVideo import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage import dev.inmo.tgbotapi.types.message.content.abstracts.MediaGroupContent import dev.inmo.tgbotapi.types.message.content.abstracts.VisualMediaGroupContent @@ -42,23 +43,10 @@ data class VideoContent( replyMarkup ) - override fun toMediaGroupMemberInputMedia(): InputMediaVideo = InputMediaVideo( - media.fileId, - toHtmlCaptions().firstOrNull(), - HTMLParseMode, - media.width, - media.height, - media.duration, - media.thumb ?.fileId - ) + override fun toMediaGroupMemberInputMedia(): InputMediaVideo = asInputMedia() - override fun asInputMedia(): InputMediaVideo = InputMediaVideo( - media.fileId, - toMarkdownV2Captions().firstOrNull(), - MarkdownV2, - media.width, - media.height, - media.duration, - media.thumb ?.fileId + override fun asInputMedia(): InputMediaVideo = media.toInputMediaVideo( + toHtmlCaptions().firstOrNull(), + HTMLParseMode ) } From d04895842398f307e529993b6752fda8dbfc1bf0 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Mon, 2 Nov 2020 13:25:40 +0600 Subject: [PATCH 13/18] WrongFileIdentifierException --- CHANGELOG.md | 1 + .../dev/inmo/tgbotapi/bot/exceptions/RequestException.kt | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 49a338db59..7b0eed28c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,6 +33,7 @@ * New dice type `SlotMachineDiceAnimationType` * New extension `TelegramMediaFile#asDocumentFile` * New extension `VideoFile#toInputMediaVideo` + * New exteption `WrongFileIdentifierException` * `API`: * New extensions for media groups: * `TelegramBot#sendPlaylist` diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/bot/exceptions/RequestException.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/bot/exceptions/RequestException.kt index de4d1d0480..b354610645 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/bot/exceptions/RequestException.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/bot/exceptions/RequestException.kt @@ -15,6 +15,7 @@ fun newRequestException( description.contains("Bad Request: message is not modified") -> MessageIsNotModifiedException(response, plainAnswer, message, cause) description == "Unauthorized" -> UnauthorizedException(response, plainAnswer, message, cause) description.contains("PHOTO_INVALID_DIMENSIONS") -> InvalidPhotoDimensionsException(response, plainAnswer, message, cause) + description.contains("wrong file identifier") -> WrongFileIdentifierException(response, plainAnswer, message, cause) else -> null } } ?: CommonRequestException(response, plainAnswer, message, cause) @@ -45,3 +46,6 @@ class MessageToEditNotFoundException(response: Response, plainAnswer: String, me class InvalidPhotoDimensionsException(response: Response, plainAnswer: String, message: String?, cause: Throwable?) : RequestException(response, plainAnswer, message, cause) + +class WrongFileIdentifierException(response: Response, plainAnswer: String, message: String?, cause: Throwable?) : + RequestException(response, plainAnswer, message, cause) From bbc56fe94c6686cef75a32ce5ecc5638452946c0 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Mon, 2 Nov 2020 13:26:06 +0600 Subject: [PATCH 14/18] hotfix in changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7b0eed28c0..d359487b1d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,7 +33,7 @@ * New dice type `SlotMachineDiceAnimationType` * New extension `TelegramMediaFile#asDocumentFile` * New extension `VideoFile#toInputMediaVideo` - * New exteption `WrongFileIdentifierException` + * New exception `WrongFileIdentifierException` * `API`: * New extensions for media groups: * `TelegramBot#sendPlaylist` From 957649603b63518f9ef26d56b28b3dad7d271e8a Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Mon, 2 Nov 2020 13:51:20 +0600 Subject: [PATCH 15/18] fix for media fields in input media --- .../inmo/tgbotapi/requests/abstracts/InputFile.kt | 15 ++++++++------- .../types/InputMedia/InputMediaAnimation.kt | 2 +- .../tgbotapi/types/InputMedia/InputMediaAudio.kt | 2 +- .../types/InputMedia/InputMediaDocument.kt | 2 +- .../tgbotapi/types/InputMedia/InputMediaPhoto.kt | 2 +- .../tgbotapi/types/InputMedia/InputMediaVideo.kt | 2 +- 6 files changed, 13 insertions(+), 12 deletions(-) diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/abstracts/InputFile.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/abstracts/InputFile.kt index 653d09f957..29ba40120d 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/abstracts/InputFile.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/abstracts/InputFile.kt @@ -1,6 +1,5 @@ package dev.inmo.tgbotapi.requests.abstracts -import dev.inmo.tgbotapi.types.InputMedia.toInputMediaFileAttachmentName import dev.inmo.tgbotapi.utils.StorageFile import kotlinx.serialization.* import kotlinx.serialization.descriptors.* @@ -12,6 +11,14 @@ sealed class InputFile { abstract val fileId: String } +internal inline val InputFile.attachFileId + get() = "attach://$fileId" +internal inline val InputFile.fileIdToSend + get() = when (this) { + is FileId -> fileId + is MultipartFile -> attachFileId + } + // TODO:: add checks for file url/file id regex /** * Contains file id or file url @@ -30,12 +37,6 @@ internal object InputFileSerializer : KSerializer { override fun deserialize(decoder: Decoder): FileId = FileId(decoder.decodeString()) } -internal val InputFile.asMediaData: String - get() = when (this) { - is FileId -> fileId - is MultipartFile -> fileId.toInputMediaFileAttachmentName() - } - // TODO:: add checks for files size /** * Contains info about file for sending diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/InputMediaAnimation.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/InputMediaAnimation.kt index 6d96174261..c56a9044f3 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/InputMediaAnimation.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/InputMediaAnimation.kt @@ -23,5 +23,5 @@ data class InputMediaAnimation( @SerialName(mediaField) override val media: String - init { media = file.fileId } // crutch until js compiling will be fixed + init { media = file.fileIdToSend } // crutch until js compiling will be fixed } diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/InputMediaAudio.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/InputMediaAudio.kt index d5585c58f4..1c3b547428 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/InputMediaAudio.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/InputMediaAudio.kt @@ -30,7 +30,7 @@ data class InputMediaAudio( @SerialName(mediaField) override val media: String - init { media = file.fileId } // crutch until js compiling will be fixed + init { media = file.fileIdToSend } // crutch until js compiling will be fixed } fun AudioFile.toInputMediaAudio( diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/InputMediaDocument.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/InputMediaDocument.kt index e58029e6c2..465b630c6a 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/InputMediaDocument.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/InputMediaDocument.kt @@ -24,7 +24,7 @@ data class InputMediaDocument( @SerialName(mediaField) override val media: String - init { media = file.fileId } // crutch until js compiling will be fixed + init { media = file.fileIdToSend } // crutch until js compiling will be fixed } fun DocumentFile.toInputMediaDocument( diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/InputMediaPhoto.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/InputMediaPhoto.kt index 55aa777d6b..32a5c1b482 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/InputMediaPhoto.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/InputMediaPhoto.kt @@ -24,7 +24,7 @@ data class InputMediaPhoto( @SerialName(mediaField) override val media: String - init { media = file.fileId } // crutch until js compiling will be fixed + init { media = file.fileIdToSend } // crutch until js compiling will be fixed } fun PhotoSize.toInputMediaPhoto( diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/InputMediaVideo.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/InputMediaVideo.kt index 81e78aaa8f..302a1579d3 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/InputMediaVideo.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/InputMediaVideo.kt @@ -26,5 +26,5 @@ data class InputMediaVideo( @SerialName(mediaField) override val media: String - init { media = file.fileId } // crutch until js compiling will be fixed + init { media = file.fileIdToSend } // crutch until js compiling will be fixed } From d7bca1569325fe3c358100398e3fc31b2e94e01d Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Mon, 2 Nov 2020 13:57:44 +0600 Subject: [PATCH 16/18] deprecations --- CHANGELOG.md | 2 ++ .../kotlin/dev/inmo/tgbotapi/types/InputMedia/InputMedia.kt | 1 + .../dev/inmo/tgbotapi/types/InputMedia/ThumbedInputMedia.kt | 1 + 3 files changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d359487b1d..f8f107fc2f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,6 +34,8 @@ * New extension `TelegramMediaFile#asDocumentFile` * New extension `VideoFile#toInputMediaVideo` * New exception `WrongFileIdentifierException` + * Extension `String#toInputMediaFileAttachmentName` now is deprecated + * Property `ThumbedInputMedia#thumbMedia` now is deprecated * `API`: * New extensions for media groups: * `TelegramBot#sendPlaylist` diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/InputMedia.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/InputMedia.kt index 7942ed7ccf..48e99180ca 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/InputMedia.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/InputMedia.kt @@ -3,6 +3,7 @@ package dev.inmo.tgbotapi.types.InputMedia import dev.inmo.tgbotapi.requests.abstracts.InputFile import kotlinx.serialization.Serializable +@Deprecated("Will be removed due to redundancy for end-side users") fun String.toInputMediaFileAttachmentName() = "attach://$this" @Serializable(InputMediaSerializer::class) diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/ThumbedInputMedia.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/ThumbedInputMedia.kt index 5588de4677..1bda788bf4 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/ThumbedInputMedia.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/InputMedia/ThumbedInputMedia.kt @@ -9,6 +9,7 @@ interface ThumbedInputMedia : InputMedia { val thumb: InputFile? @Serializable @SerialName(thumbField) + @Deprecated("Will be removed due to useless state") val thumbMedia: String? get() = thumb ?.let { when (it) { From 20b931138c81b3a93c6417178976e2fe14d1e1ee Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Mon, 2 Nov 2020 14:11:26 +0600 Subject: [PATCH 17/18] update FlowsUpdatesFilter --- .../utils/shortcuts/FlowsUpdatesFilter.kt | 30 +++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/tgbotapi.extensions.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/shortcuts/FlowsUpdatesFilter.kt b/tgbotapi.extensions.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/shortcuts/FlowsUpdatesFilter.kt index 6e08232a35..3c5fe89a8a 100644 --- a/tgbotapi.extensions.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/shortcuts/FlowsUpdatesFilter.kt +++ b/tgbotapi.extensions.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/shortcuts/FlowsUpdatesFilter.kt @@ -6,8 +6,7 @@ import dev.inmo.tgbotapi.extensions.utils.updates.asContentMessagesFlow import dev.inmo.tgbotapi.types.message.abstracts.CommonMessage import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage import dev.inmo.tgbotapi.types.message.content.* -import dev.inmo.tgbotapi.types.message.content.abstracts.MediaGroupContent -import dev.inmo.tgbotapi.types.message.content.abstracts.MessageContent +import dev.inmo.tgbotapi.types.message.content.abstracts.* import dev.inmo.tgbotapi.types.message.content.media.* import dev.inmo.tgbotapi.types.message.payments.InvoiceContent import dev.inmo.tgbotapi.types.update.MediaGroupUpdates.SentMediaGroupUpdate @@ -101,6 +100,12 @@ fun Flow.audioMessages() = filterContentMessages(scopeToIncludeChannels) +fun FlowsUpdatesFilter.audioMessagesWithMediaGroups( + scopeToIncludeChannels: CoroutineScope? = null +) = merge( + filterContentMessages(scopeToIncludeChannels), + mediaGroupAudioMessages(scopeToIncludeChannels).flatMap() +) fun Flow.contactMessages() = filterContentMessages() fun FlowsUpdatesFilter.contactMessages( @@ -116,6 +121,12 @@ fun Flow.documentMessages() = filterContentMessages(scopeToIncludeChannels) +fun FlowsUpdatesFilter.documentMessagesWithMediaGroups( + scopeToIncludeChannels: CoroutineScope? = null +) = merge( + filterContentMessages(scopeToIncludeChannels), + mediaGroupDocumentMessages(scopeToIncludeChannels).flatMap() +) fun Flow.gameMessages() = filterContentMessages() fun FlowsUpdatesFilter.gameMessages( @@ -210,3 +221,18 @@ fun Flow.mediaGroupVideosMessages() = filterMediaGroupMess fun FlowsUpdatesFilter.mediaGroupVideosMessages( scopeToIncludeChannels: CoroutineScope? = null ) = filterMediaGroupMessages(scopeToIncludeChannels) + +fun Flow.mediaGroupVisualMessages() = filterMediaGroupMessages() +fun FlowsUpdatesFilter.mediaGroupVisualMessages( + scopeToIncludeChannels: CoroutineScope? = null +) = filterMediaGroupMessages(scopeToIncludeChannels) + +fun Flow.mediaGroupAudioMessages() = filterMediaGroupMessages() +fun FlowsUpdatesFilter.mediaGroupAudioMessages( + scopeToIncludeChannels: CoroutineScope? = null +) = filterMediaGroupMessages(scopeToIncludeChannels) + +fun Flow.mediaGroupDocumentMessages() = filterMediaGroupMessages() +fun FlowsUpdatesFilter.mediaGroupDocumentMessages( + scopeToIncludeChannels: CoroutineScope? = null +) = filterMediaGroupMessages(scopeToIncludeChannels) From 18c9d4e4683a79cb0441e8a4bc0438e8caf0dc09 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Mon, 2 Nov 2020 14:14:08 +0600 Subject: [PATCH 18/18] fill changelog --- CHANGELOG.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f8f107fc2f..13a35bcad7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -44,6 +44,17 @@ * `TelegramBot#replyWithDocumentsGroup` * `TelegramBot#sendVisualMediaGroup` * `TelegramBot#replyWithVisualMediaGroup` +* `Utils`: + * New extensions for `Flow`s: + * `Flow#mediaGroupVisualMessages` + * `Flow#mediaGroupAudioMessages` + * `Flow#mediaGroupDocumentMessages` + * New extensions for `FlowsUpdatesFilter`: + * `FlowsUpdatesFilter#audioMessagesWithMediaGroups` + * `FlowsUpdatesFilter#mediaGroupAudioMessages` + * `FlowsUpdatesFilter#documentMessagesWithMediaGroups` + * `FlowsUpdatesFilter#mediaGroupDocumentMessages` + * `FlowsUpdatesFilter#mediaGroupVisualMessages` ## 0.29.2