package dev.inmo.tgbotapi.requests.send.media import dev.inmo.tgbotapi.CommonAbstracts.* import dev.inmo.tgbotapi.requests.abstracts.* import dev.inmo.tgbotapi.requests.send.abstracts.* import dev.inmo.tgbotapi.requests.send.media.base.* import dev.inmo.tgbotapi.types.* import dev.inmo.tgbotapi.types.MessageEntity.* import dev.inmo.tgbotapi.types.ParseMode.ParseMode import dev.inmo.tgbotapi.types.ParseMode.parseModeField import dev.inmo.tgbotapi.types.buttons.KeyboardMarkup import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage import dev.inmo.tgbotapi.types.message.abstracts.TelegramBotAPIMessageDeserializationStrategyClass import dev.inmo.tgbotapi.types.message.content.media.AudioContent import dev.inmo.tgbotapi.utils.mapOfNotNull import dev.inmo.tgbotapi.utils.throwRangeError import kotlinx.serialization.* fun SendAudio( chatId: ChatIdentifier, audio: InputFile, thumb: InputFile? = null, text: String? = null, parseMode: ParseMode? = null, duration: Long? = null, performer: String? = null, title: String? = null, disableNotification: Boolean = false, replyToMessageId: MessageIdentifier? = null, allowSendingWithoutReply: Boolean? = null, replyMarkup: KeyboardMarkup? = null ): Request> { val audioAsFileId = (audio as? FileId) ?.fileId val audioAsFile = audio as? MultipartFile val thumbAsFileId = (thumb as? FileId) ?.fileId val thumbAsFile = thumb as? MultipartFile val data = SendAudioData( chatId, audioAsFileId, thumbAsFileId, text, parseMode, null, duration, performer, title, disableNotification, replyToMessageId, allowSendingWithoutReply, replyMarkup ) return if (audioAsFile == null && thumbAsFile == null) { data } else { MultipartRequestImpl( data, SendAudioFiles(audioAsFile, thumbAsFile) ) } } fun SendAudio( chatId: ChatIdentifier, audio: InputFile, thumb: InputFile? = null, entities: List, duration: Long? = null, performer: String? = null, title: String? = null, disableNotification: Boolean = false, replyToMessageId: MessageIdentifier? = null, allowSendingWithoutReply: Boolean? = null, replyMarkup: KeyboardMarkup? = null ): Request> { val audioAsFileId = (audio as? FileId) ?.fileId val audioAsFile = audio as? MultipartFile val thumbAsFileId = (thumb as? FileId) ?.fileId val thumbAsFile = thumb as? MultipartFile val data = SendAudioData( chatId, audioAsFileId, thumbAsFileId, entities.makeString(), null, entities.toRawMessageEntities(), duration, performer, title, disableNotification, replyToMessageId, allowSendingWithoutReply, replyMarkup ) return if (audioAsFile == null && thumbAsFile == null) { data } else { MultipartRequestImpl( data, SendAudioFiles(audioAsFile, thumbAsFile) ) } } private val commonResultDeserializer: DeserializationStrategy> = TelegramBotAPIMessageDeserializationStrategyClass() @Serializable data class SendAudioData internal constructor( @SerialName(chatIdField) override val chatId: ChatIdentifier, @SerialName(audioField) val audio: String? = null, @SerialName(thumbField) override val thumb: String? = null, @SerialName(captionField) override val text: String? = null, @SerialName(parseModeField) override val parseMode: ParseMode? = null, @SerialName(captionEntitiesField) private val rawEntities: List? = null, @SerialName(durationField) override val duration: Long? = null, @SerialName(performerField) override val performer: String? = null, @SerialName(titleField) override val title: String? = null, @SerialName(disableNotificationField) override val disableNotification: Boolean = false, @SerialName(replyToMessageIdField) override val replyToMessageId: MessageIdentifier? = null, @SerialName(allowSendingWithoutReplyField) override val allowSendingWithoutReply: Boolean? = null, @SerialName(replyMarkupField) override val replyMarkup: KeyboardMarkup? = null ) : DataRequest>, SendMessageRequest>, ReplyingMarkupSendMessageRequest>, TextableSendMessageRequest>, ThumbedSendMessageRequest>, TitledSendMessageRequest>, DuratedSendMessageRequest>, Performerable { override val textSources: List? by lazy { rawEntities ?.asTextSources(text ?: return@lazy null) } init { text ?.let { if (it.length !in captionLength) { throwRangeError("Caption length", captionLength, it.length) } } } override fun method(): String = "sendAudio" override val resultDeserializer: DeserializationStrategy> get() = commonResultDeserializer override val requestSerializer: SerializationStrategy<*> get() = serializer() } data class SendAudioFiles internal constructor( val audio: MultipartFile? = null, val thumb: MultipartFile? = null ) : Files by mapOfNotNull( audioField to audio, thumbField to thumb )