package com.github.insanusmokrassar.TelegramBotAPI.requests.send.media import com.github.insanusmokrassar.TelegramBotAPI.types.* import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.MultipartFile import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.Request import com.github.insanusmokrassar.TelegramBotAPI.types.InputMedia.MediaGroupMemberInputMedia import com.github.insanusmokrassar.TelegramBotAPI.types.InputMedia.ThumbedInputMedia import com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts.SendMessageRequest import com.github.insanusmokrassar.TelegramBotAPI.requests.send.media.base.* 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, disableNotification: Boolean = false, replyToMessageId: MessageIdentifier? = null ): Request> { if (media.size !in membersCountInMediaGroup) { throw IllegalArgumentException("Count of members for media group must be in $membersCountInMediaGroup range") } val files: List = 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 serializer = ArrayListSerializer(RawMessage.serializer()) @Serializable data class SendMediaGroupData internal constructor( @SerialName(chatIdField) override val chatId: ChatIdentifier, @Transient val media: List = emptyList(), @SerialName(disableNotificationField) @Optional override val disableNotification: Boolean = false, @SerialName(replyToMessageIdField) @Optional override val replyToMessageId: MessageIdentifier? = null ) : Data>, SendMessageRequest> { // TODO:: fix this nail when kotlin serialisation will support @ImplicitReflectionSerializer @SerialName(mediaField) private val convertedMedia: String get() = jsonArray { media.forEach { +it.toJsonWithoutNulls() } }.toString() override fun method(): String = "sendMediaGroup" override fun resultSerializer(): KSerializer> = serializer } data class SendMediaGroupFiles internal constructor( val files: List ) : Files by (files.map { it.fileId to it }.toMap())