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