tgbotapi/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendMediaGroup.kt

87 lines
3.1 KiB
Kotlin
Raw Normal View History

2018-12-26 08:07:24 +00:00
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.*
2019-01-17 02:43:51 +00:00
import com.github.insanusmokrassar.TelegramBotAPI.types.*
2019-02-23 10:34:55 +00:00
import com.github.insanusmokrassar.TelegramBotAPI.types.InputMedia.*
2019-08-18 06:59:11 +00:00
import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.Message
import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.TelegramBotAPIMessageDeserializeOnlySerializer
2018-12-26 08:07:24 +00:00
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<Message>> {
2018-12-26 08:07:24 +00:00
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)
)
}
}
2019-12-02 08:35:37 +00:00
private val messagesListSerializer = ArrayListSerializer(TelegramBotAPIMessageDeserializeOnlySerializer)
2018-12-26 08:07:24 +00:00
@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
2019-12-02 08:35:37 +00:00
) : DataRequest<List<Message>>, SendMessageRequest<List<Message>> {
2018-12-26 08:07:24 +00:00
@SerialName(mediaField)
private val convertedMedia: String
get() = jsonArray {
media.forEach {
2019-02-23 10:34:55 +00:00
+it.toJsonWithoutNulls(MediaGroupMemberInputMediaSerializer)
2018-12-26 08:07:24 +00:00
}
}.toString()
override fun method(): String = "sendMediaGroup"
2019-12-02 08:35:37 +00:00
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
override val resultDeserializer: DeserializationStrategy<List<Message>>
get() = messagesListSerializer
2018-12-26 08:07:24 +00:00
}
data class SendMediaGroupFiles internal constructor(
val files: List<MultipartFile>
) : Files by (files.map { it.fileId to it }.toMap())