mirror of
https://github.com/InsanusMokrassar/TelegramBotAPI.git
synced 2026-09-17 05:25:17 +00:00
Complete Bot API 10.3 ephemeral media support
This commit is contained in:
@@ -6,7 +6,10 @@ import dev.inmo.tgbotapi.requests.abstracts.SimpleRequest
|
||||
import dev.inmo.tgbotapi.requests.edit.abstracts.*
|
||||
import dev.inmo.tgbotapi.types.*
|
||||
import dev.inmo.tgbotapi.types.business_connection.BusinessConnectionId
|
||||
import dev.inmo.tgbotapi.types.media.CoveredTelegramMedia
|
||||
import dev.inmo.tgbotapi.types.media.PhotoedTelegramMedia
|
||||
import dev.inmo.tgbotapi.types.media.TelegramFreeMedia
|
||||
import dev.inmo.tgbotapi.types.media.ThumbedTelegramMedia
|
||||
import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
|
||||
import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage
|
||||
import dev.inmo.tgbotapi.types.message.abstracts.TelegramBotAPIMessageDeserializationStrategyClass
|
||||
@@ -34,9 +37,12 @@ data class EditChatMessageMedia(
|
||||
override val data: SimpleRequest<ContentMessage<MediaContent>>
|
||||
get() = this
|
||||
override val mediaMap: Map<String, MultipartFile> by lazy {
|
||||
(media.file as? MultipartFile) ?.let {
|
||||
mapOf(it.fileId to it)
|
||||
} ?: emptyMap()
|
||||
listOfNotNull(
|
||||
media.file as? MultipartFile,
|
||||
(media as? PhotoedTelegramMedia) ?.photo as? MultipartFile,
|
||||
(media as? ThumbedTelegramMedia) ?.thumb as? MultipartFile,
|
||||
(media as? CoveredTelegramMedia) ?.cover as? MultipartFile
|
||||
).associateBy { it.fileId }
|
||||
}
|
||||
|
||||
// init {
|
||||
|
||||
@@ -6,6 +6,7 @@ import dev.inmo.tgbotapi.requests.abstracts.SimpleRequest
|
||||
import dev.inmo.tgbotapi.requests.edit.abstracts.*
|
||||
import dev.inmo.tgbotapi.types.*
|
||||
import dev.inmo.tgbotapi.types.media.CoveredTelegramMedia
|
||||
import dev.inmo.tgbotapi.types.media.PhotoedTelegramMedia
|
||||
import dev.inmo.tgbotapi.types.media.TelegramFreeMedia
|
||||
import dev.inmo.tgbotapi.types.media.ThumbedTelegramMedia
|
||||
import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
|
||||
@@ -48,6 +49,7 @@ data class EditEphemeralMessageMedia(
|
||||
override val mediaMap: Map<String, MultipartFile> by lazy {
|
||||
listOfNotNull(
|
||||
media.file as? MultipartFile,
|
||||
(media as? PhotoedTelegramMedia) ?.photo as? MultipartFile,
|
||||
(media as? ThumbedTelegramMedia) ?.thumb as? MultipartFile,
|
||||
(media as? CoveredTelegramMedia) ?.cover as? MultipartFile
|
||||
).associateBy { it.fileId }
|
||||
|
||||
@@ -53,6 +53,11 @@ fun <T : MediaGroupPartContent> SendMediaGroup(
|
||||
val files: List<MultipartFile> = media.flatMap {
|
||||
listOfNotNull(
|
||||
it.file as? MultipartFile,
|
||||
if (it is PhotoedTelegramMedia) {
|
||||
it.photo as? MultipartFile
|
||||
} else {
|
||||
null
|
||||
},
|
||||
if (it is ThumbedTelegramMedia) {
|
||||
it.thumb as? MultipartFile
|
||||
} else {
|
||||
|
||||
@@ -15,6 +15,7 @@ import dev.inmo.tgbotapi.types.message.ParseMode
|
||||
import dev.inmo.tgbotapi.types.message.parseModeField
|
||||
import dev.inmo.tgbotapi.types.buttons.KeyboardMarkup
|
||||
import dev.inmo.tgbotapi.types.media.CoveredTelegramMedia
|
||||
import dev.inmo.tgbotapi.types.media.PhotoedTelegramMedia
|
||||
import dev.inmo.tgbotapi.types.media.ThumbedTelegramMedia
|
||||
import dev.inmo.tgbotapi.types.message.*
|
||||
import dev.inmo.tgbotapi.types.message.RawMessageEntity
|
||||
@@ -67,6 +68,11 @@ fun SendPaidMedia(
|
||||
val files: List<MultipartFile> = media.flatMap {
|
||||
listOfNotNull(
|
||||
it.file as? MultipartFile,
|
||||
if (it is PhotoedTelegramMedia) {
|
||||
it.photo as? MultipartFile
|
||||
} else {
|
||||
null
|
||||
},
|
||||
if (it is ThumbedTelegramMedia) {
|
||||
it.thumb as? MultipartFile
|
||||
} else {
|
||||
@@ -130,6 +136,11 @@ fun SendPaidMedia(
|
||||
val files: List<MultipartFile> = media.flatMap {
|
||||
listOfNotNull(
|
||||
it.file as? MultipartFile,
|
||||
if (it is PhotoedTelegramMedia) {
|
||||
it.photo as? MultipartFile
|
||||
} else {
|
||||
null
|
||||
},
|
||||
if (it is ThumbedTelegramMedia) {
|
||||
it.thumb as? MultipartFile
|
||||
} else {
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
package dev.inmo.tgbotapi.types.media
|
||||
|
||||
import dev.inmo.tgbotapi.requests.abstracts.InputFile
|
||||
|
||||
sealed interface PhotoedTelegramMedia : TelegramMedia {
|
||||
val photo: InputFile
|
||||
}
|
||||
@@ -50,7 +50,7 @@ fun TelegramMediaLivePhoto(
|
||||
data class TelegramMediaLivePhoto internal constructor(
|
||||
override val file: InputFile,
|
||||
@SerialName(photoField)
|
||||
val photo: InputFile,
|
||||
override val photo: InputFile,
|
||||
@SerialName(captionField)
|
||||
override val text: String? = null,
|
||||
@SerialName(parseModeField)
|
||||
@@ -64,7 +64,8 @@ data class TelegramMediaLivePhoto internal constructor(
|
||||
) : TelegramFreeMedia,
|
||||
VisualMediaGroupMemberTelegramMedia,
|
||||
InputPollMedia,
|
||||
InputPollOptionMedia {
|
||||
InputPollOptionMedia,
|
||||
PhotoedTelegramMedia {
|
||||
@EncodeDefault
|
||||
override val type: String = TYPE
|
||||
override val textSources: TextSourcesList? by lazy {
|
||||
|
||||
@@ -12,8 +12,8 @@ import kotlinx.serialization.*
|
||||
data class TelegramPaidMediaLivePhoto(
|
||||
override val file: InputFile,
|
||||
@SerialName(photoField)
|
||||
val photo: InputFile,
|
||||
) : VisualTelegramPaidMedia {
|
||||
override val photo: InputFile,
|
||||
) : VisualTelegramPaidMedia, PhotoedTelegramMedia {
|
||||
override val type: String = TYPE
|
||||
|
||||
@SerialName(mediaField)
|
||||
|
||||
@@ -3,22 +3,30 @@ package dev.inmo.tgbotapi.types
|
||||
import dev.inmo.tgbotapi.requests.send.SendTextMessage
|
||||
import dev.inmo.tgbotapi.requests.abstracts.asMultipartFile
|
||||
import dev.inmo.tgbotapi.requests.abstracts.json
|
||||
import dev.inmo.tgbotapi.requests.abstracts.MultipartRequest
|
||||
import dev.inmo.tgbotapi.requests.chat.members.PromoteChatMember
|
||||
import dev.inmo.tgbotapi.requests.edit.caption.EditEphemeralMessageCaption
|
||||
import dev.inmo.tgbotapi.requests.edit.media.EditChatMessageMedia
|
||||
import dev.inmo.tgbotapi.requests.edit.media.EditEphemeralMessageMedia
|
||||
import dev.inmo.tgbotapi.requests.edit.text.EditEphemeralMessageRichText
|
||||
import dev.inmo.tgbotapi.requests.edit.text.EditEphemeralMessageText
|
||||
import dev.inmo.tgbotapi.requests.send.media.SendPaidMedia
|
||||
import dev.inmo.tgbotapi.requests.send.media.SendVisualMediaGroup
|
||||
import dev.inmo.tgbotapi.types.chat.member.ChatCommonAdministratorRights
|
||||
import dev.inmo.tgbotapi.types.media.TelegramMediaPhoto
|
||||
import dev.inmo.tgbotapi.types.media.TelegramMediaLivePhoto
|
||||
import dev.inmo.tgbotapi.types.media.TelegramPaidMediaLivePhoto
|
||||
import dev.inmo.tgbotapi.types.media.TelegramMediaVideo
|
||||
import dev.inmo.tgbotapi.types.rich.InputRichMessageHTML
|
||||
import dev.inmo.tgbotapi.types.rich.InputRichMessageMedia
|
||||
import dev.inmo.tgbotapi.utils.RiskFeature
|
||||
import kotlinx.serialization.json.Json
|
||||
import kotlinx.serialization.json.jsonObject
|
||||
import kotlin.test.Test
|
||||
import kotlin.test.assertEquals
|
||||
import kotlin.test.assertFailsWith
|
||||
import kotlin.test.assertFalse
|
||||
import kotlin.test.assertIs
|
||||
|
||||
class EphemeralMessageParametersTest {
|
||||
private val json = Json { encodeDefaults = true }
|
||||
@@ -62,6 +70,51 @@ class EphemeralMessageParametersTest {
|
||||
assertEquals(setOf(media.file.fileId), request.mediaMap.keys)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `EditEphemeralMessageMedia includes live photo and static photo multipart files`() {
|
||||
val media = TelegramMediaLivePhoto(
|
||||
file = "live photo".encodeToByteArray().asMultipartFile("live-photo.mov"),
|
||||
photo = "static photo".encodeToByteArray().asMultipartFile("photo.jpg")
|
||||
)
|
||||
val request = EditEphemeralMessageMedia(ChatId(RawChatId(1L)), ChatId(RawChatId(2L)), EphemeralMessageId(3L), media)
|
||||
|
||||
assertEquals(setOf(media.file.fileId, media.photo.fileId), request.mediaMap.keys)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `EditChatMessageMedia includes live photo and static photo multipart files`() {
|
||||
val media = TelegramMediaLivePhoto(
|
||||
file = "live photo".encodeToByteArray().asMultipartFile("live-photo.mov"),
|
||||
photo = "static photo".encodeToByteArray().asMultipartFile("photo.jpg")
|
||||
)
|
||||
val request = EditChatMessageMedia(ChatId(RawChatId(1L)), MessageId(3L), media)
|
||||
|
||||
assertEquals(setOf(media.file.fileId, media.photo.fileId), request.mediaMap.keys)
|
||||
}
|
||||
|
||||
@OptIn(RiskFeature::class)
|
||||
@Test
|
||||
fun `SendVisualMediaGroup includes live photo and static photo multipart files`() {
|
||||
val media = TelegramMediaLivePhoto(
|
||||
file = "live photo".encodeToByteArray().asMultipartFile("live-photo.mov"),
|
||||
photo = "static photo".encodeToByteArray().asMultipartFile("photo.jpg")
|
||||
)
|
||||
val request = SendVisualMediaGroup(ChatId(RawChatId(1L)), listOf(media, media))
|
||||
|
||||
assertEquals(setOf(media.file.fileId, media.photo.fileId), assertIs<MultipartRequest<*>>(request).mediaMap.keys)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `SendPaidMedia includes live photo and static photo multipart files`() {
|
||||
val media = TelegramPaidMediaLivePhoto(
|
||||
file = "live photo".encodeToByteArray().asMultipartFile("live-photo.mov"),
|
||||
photo = "static photo".encodeToByteArray().asMultipartFile("photo.jpg")
|
||||
)
|
||||
val request = SendPaidMedia(ChatId(RawChatId(1L)), 1, listOf(media))
|
||||
|
||||
assertEquals(setOf(media.file.fileId, media.photo.fileId), assertIs<MultipartRequest<*>>(request).mediaMap.keys)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `EditEphemeralMessageMedia includes multipart thumbnail and cover`() {
|
||||
val video = TelegramMediaVideo(
|
||||
|
||||
Reference in New Issue
Block a user