mirror of
https://github.com/InsanusMokrassar/TelegramBotAPI.git
synced 2024-06-16 23:05:26 +00:00
88 lines
3.2 KiB
Kotlin
88 lines
3.2 KiB
Kotlin
package com.github.insanusmokrassar.TelegramBotAPI.requests.send.media
|
|
|
|
import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.MultipartFile
|
|
import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.Request
|
|
import com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts.SendMessageRequest
|
|
import com.github.insanusmokrassar.TelegramBotAPI.requests.send.media.base.*
|
|
import com.github.insanusmokrassar.TelegramBotAPI.types.*
|
|
import com.github.insanusmokrassar.TelegramBotAPI.types.InputMedia.*
|
|
import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.MediaGroupMessage
|
|
import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.TelegramBotAPIMessageDeserializeOnlySerializerClass
|
|
import com.github.insanusmokrassar.TelegramBotAPI.utils.toJsonWithoutNulls
|
|
import kotlinx.serialization.*
|
|
import kotlinx.serialization.internal.ArrayListSerializer
|
|
import kotlinx.serialization.json.jsonArray
|
|
|
|
val membersCountInMediaGroup: IntRange = 2 .. 10
|
|
|
|
fun SendMediaGroup(
|
|
chatId: ChatIdentifier,
|
|
media: List<MediaGroupMemberInputMedia>,
|
|
disableNotification: Boolean = false,
|
|
replyToMessageId: MessageIdentifier? = null
|
|
): Request<List<MediaGroupMessage>> {
|
|
if (media.size !in membersCountInMediaGroup) {
|
|
throw IllegalArgumentException("Count of members for media group must be in $membersCountInMediaGroup range")
|
|
}
|
|
|
|
val files: List<MultipartFile> = media.flatMap {
|
|
listOfNotNull(
|
|
it.file as? MultipartFile,
|
|
if (it is ThumbedInputMedia) {
|
|
it.thumb as? MultipartFile
|
|
} else {
|
|
null
|
|
}
|
|
)
|
|
}
|
|
|
|
val data = SendMediaGroupData(
|
|
chatId,
|
|
media,
|
|
disableNotification,
|
|
replyToMessageId
|
|
)
|
|
|
|
return if (files.isEmpty()) {
|
|
data
|
|
} else {
|
|
MultipartRequestImpl(
|
|
data,
|
|
SendMediaGroupFiles(files)
|
|
)
|
|
}
|
|
}
|
|
|
|
private val messagesListSerializer: ArrayListSerializer<MediaGroupMessage>
|
|
= ArrayListSerializer(TelegramBotAPIMessageDeserializeOnlySerializerClass())
|
|
|
|
@Serializable
|
|
data class SendMediaGroupData internal constructor(
|
|
@SerialName(chatIdField)
|
|
override val chatId: ChatIdentifier,
|
|
val media: List<MediaGroupMemberInputMedia> = emptyList(),
|
|
@SerialName(disableNotificationField)
|
|
override val disableNotification: Boolean = false,
|
|
@SerialName(replyToMessageIdField)
|
|
override val replyToMessageId: MessageIdentifier? = null
|
|
) : DataRequest<List<MediaGroupMessage>>, SendMessageRequest<List<MediaGroupMessage>> {
|
|
@SerialName(mediaField)
|
|
private val convertedMedia: String
|
|
get() = jsonArray {
|
|
media.forEach {
|
|
+it.toJsonWithoutNulls(MediaGroupMemberInputMediaSerializer)
|
|
}
|
|
}.toString()
|
|
|
|
|
|
override fun method(): String = "sendMediaGroup"
|
|
override val requestSerializer: SerializationStrategy<*>
|
|
get() = serializer()
|
|
override val resultDeserializer: DeserializationStrategy<List<MediaGroupMessage>>
|
|
get() = messagesListSerializer
|
|
}
|
|
|
|
data class SendMediaGroupFiles internal constructor(
|
|
val files: List<MultipartFile>
|
|
) : Files by (files.map { it.fileId to it }.toMap())
|