package dev.inmo.tgbotapi.requests.send.media import dev.inmo.tgbotapi.requests.abstracts.* import dev.inmo.tgbotapi.requests.send.abstracts.ReplyingMarkupSendMessageRequest import dev.inmo.tgbotapi.requests.send.abstracts.SendMessageRequest import dev.inmo.tgbotapi.types.* 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.StickerContent import dev.inmo.tgbotapi.utils.mapOfNotNull import dev.inmo.tgbotapi.utils.toJsonWithoutNulls import kotlinx.serialization.* import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.JsonPrimitive import kotlinx.serialization.json.buildJsonObject import kotlinx.serialization.json.put fun SendSticker( chatId: ChatIdentifier, sticker: InputFile, threadId: MessageThreadId? = chatId.threadId, emoji: String? = null, disableNotification: Boolean = false, protectContent: Boolean = false, replyToMessageId: MessageId? = null, allowSendingWithoutReply: Boolean? = null, replyMarkup: KeyboardMarkup? = null ): Request> = SendStickerByFileId( chatId, sticker as? FileId, threadId, disableNotification, protectContent, replyToMessageId, allowSendingWithoutReply, replyMarkup ).let { when (sticker) { is MultipartFile -> SendStickerByFile(it, sticker, emoji) is FileId -> it } } private val commonResultDeserializer: DeserializationStrategy> = TelegramBotAPIMessageDeserializationStrategyClass() @Serializable data class SendStickerByFileId internal constructor( @SerialName(chatIdField) override val chatId: ChatIdentifier, @SerialName(stickerField) val sticker: FileId? = null, @SerialName(messageThreadIdField) override val threadId: MessageThreadId? = chatId.threadId, @SerialName(disableNotificationField) override val disableNotification: Boolean = false, @SerialName(protectContentField) override val protectContent: Boolean = false, @SerialName(replyToMessageIdField) override val replyToMessageId: MessageId? = null, @SerialName(allowSendingWithoutReplyField) override val allowSendingWithoutReply: Boolean? = null, @SerialName(replyMarkupField) override val replyMarkup: KeyboardMarkup? = null ) : SendMessageRequest>, ReplyingMarkupSendMessageRequest> { override fun method(): String = "sendSticker" override val resultDeserializer: DeserializationStrategy> get() = commonResultDeserializer override val requestSerializer: SerializationStrategy<*> get() = serializer() } data class SendStickerByFile internal constructor( @Transient private val sendStickerByFileId: SendStickerByFileId, val sticker: MultipartFile, val emoji: String? ) : MultipartRequest>, Request> by sendStickerByFileId { override val mediaMap: Map = mapOf(stickerField to sticker) override val paramsJson: JsonObject get() { return JsonObject( mapOfNotNull( emojiField to emoji ?.let { JsonPrimitive(it) } ) + sendStickerByFileId.toJsonWithoutNulls(SendStickerByFileId.serializer()) ) } }