diff --git a/CHANGELOG.md b/CHANGELOG.md index 0daed1b25d..86a05f8b6a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ * Add support of functionality for premium feature from [Bot API 6.1](https://core.telegram.org/bots/api-changelog#june-20-2022) * Add support of `addedToAttachmentMenu` in `CommonUser` from [Bot API 6.1](https://core.telegram.org/bots/api-changelog#june-20-2022) * Add support of `secret_token` in `SetWebhook` request from [Bot API 6.1](https://core.telegram.org/bots/api-changelog#june-20-2022) +* Add support of `createInvoiceLink` request from [Bot API 6.1](https://core.telegram.org/bots/api-changelog#june-20-2022) ## 2.0.3 diff --git a/tgbotapi.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/send/payments/CreateInvoiceLink.kt b/tgbotapi.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/send/payments/CreateInvoiceLink.kt new file mode 100644 index 0000000000..00ae87149c --- /dev/null +++ b/tgbotapi.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/send/payments/CreateInvoiceLink.kt @@ -0,0 +1,31 @@ +package dev.inmo.tgbotapi.extensions.api.send.payments + +import dev.inmo.tgbotapi.bot.TelegramBot +import dev.inmo.tgbotapi.requests.send.payments.CreateInvoiceLink +import dev.inmo.tgbotapi.requests.send.payments.SendInvoice +import dev.inmo.tgbotapi.types.* +import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup +import dev.inmo.tgbotapi.types.chat.CommonUser +import dev.inmo.tgbotapi.types.payments.LabeledPrice +import dev.inmo.tgbotapi.types.payments.abstracts.Currency + +suspend fun TelegramBot.createInvoiceLink( + title: String, + description: String, + payload: String, + providerToken: String, + currency: Currency, + prices: List, + maxTipAmount: Int? = null, + suggestedTipAmounts: List? = null, + providerData: String? = null, + requireName: Boolean = false, + requirePhoneNumber: Boolean = false, + requireEmail: Boolean = false, + requireShippingAddress: Boolean = false, + shouldSendPhoneNumberToProvider: Boolean = false, + shouldSendEmailToProvider: Boolean = false, + priceDependOnShipAddress: Boolean = false +) = execute( + CreateInvoiceLink(title, description, payload, providerToken, currency, prices, maxTipAmount, suggestedTipAmounts ?.sorted(), providerData, requireName, requirePhoneNumber, requireEmail, requireShippingAddress, shouldSendPhoneNumberToProvider, shouldSendEmailToProvider, priceDependOnShipAddress) +) diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/send/payments/CreateInvoiceLink.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/send/payments/CreateInvoiceLink.kt new file mode 100644 index 0000000000..19a932e9d6 --- /dev/null +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/send/payments/CreateInvoiceLink.kt @@ -0,0 +1,105 @@ +package dev.inmo.tgbotapi.requests.send.payments + +import dev.inmo.tgbotapi.abstracts.CommonSendInvoiceData +import dev.inmo.tgbotapi.abstracts.types.* +import dev.inmo.tgbotapi.requests.abstracts.SimpleRequest +import dev.inmo.tgbotapi.requests.send.abstracts.SendMessageRequest +import dev.inmo.tgbotapi.types.* +import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup +import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage +import dev.inmo.tgbotapi.types.message.content.InvoiceContent +import dev.inmo.tgbotapi.types.payments.LabeledPrice +import dev.inmo.tgbotapi.types.payments.LabeledPricesSerializer +import dev.inmo.tgbotapi.types.payments.abstracts.Currency +import kotlinx.serialization.* +import kotlinx.serialization.builtins.serializer + +/** + * @param providerData - JSON-ENCODED FIELD + */ +@Serializable +data class CreateInvoiceLink( + @SerialName(titleField) + override val title: String, + @SerialName(descriptionField) + override val description: String, + @SerialName(payloadField) + override val payload: String, + @SerialName(providerTokenField) + override val providerToken: String, + @SerialName(currencyField) + override val currency: Currency, + @Serializable(LabeledPricesSerializer::class) + @SerialName(pricesField) + override val prices: List, + @SerialName(maxTipAmountField) + override val maxTipAmount: Int? = null, + @SerialName(suggestedTipAmountsField) + override val suggestedTipAmounts: List? = null, + @SerialName(providerDataField) + override val providerData: String? = null, + @SerialName(requireNameField) + override val requireName: Boolean = false, + @SerialName(requirePhoneNumberField) + override val requirePhoneNumber: Boolean = false, + @SerialName(requireEmailField) + override val requireEmail: Boolean = false, + @SerialName(requireShippingAddressField) + override val requireShippingAddress: Boolean = false, + @SerialName(shouldSendPhoneNumberToProviderField) + override val shouldSendPhoneNumberToProvider: Boolean = false, + @SerialName(shouldSendEmailToProviderField) + override val shouldSendEmailToProvider: Boolean = false, + @SerialName(priceDependOnShipAddressField) + override val priceDependOnShipAddress: Boolean = false +) : CommonSendInvoiceData, SimpleRequest { + override fun method(): String = "sendInvoice" + override val resultDeserializer: DeserializationStrategy + get() = String.serializer() + override val requestSerializer: SerializationStrategy<*> + get() = serializer() + + @SerialName(photoUrlField) + override var photoUrl: String? = null + private set + @SerialName(photoSizeField) + override var photoSize: Long? = null + private set + + @SerialName(photoWidthField) + override var photoWidth: Int? = null + private set + @SerialName(photoHeightField) + override var photoHeight: Int? = null + private set + + init { + suggestedTipAmounts ?.let { _ -> + require(suggestedTipAmounts.size in suggestedTipAmountsLimit) + maxTipAmount ?.let { _ -> + require( + suggestedTipAmounts.none { it > maxTipAmount } + ) + } + } + } + + override fun setPhoto( + photoUrl: String, + photoSize: Long?, + photoWidth: Int?, + photoHeight: Int? + ) { + this.photoUrl = photoUrl + this.photoSize = photoSize + this.photoWidth = photoWidth + this.photoHeight = photoHeight + } + + override fun unsetPhoto() { + photoUrl = null + photoSize = null + photoWidth = null + photoHeight = null + } +} diff --git a/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/ClassCasts.kt b/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/ClassCasts.kt index 0ea185d5b1..b887e80a70 100644 --- a/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/ClassCasts.kt +++ b/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/ClassCasts.kt @@ -3,6 +3,7 @@ package dev.inmo.tgbotapi.extensions.utils import dev.inmo.tgbotapi.abstracts.* +import dev.inmo.tgbotapi.requests.send.payments.CreateInvoiceLink import dev.inmo.tgbotapi.requests.send.payments.SendInvoice import dev.inmo.tgbotapi.types.* import dev.inmo.tgbotapi.types.queries.callback.* @@ -3273,7 +3274,16 @@ inline fun CommonSendInvoiceData.whenSendInvoice(block: (SendInvoice) -> T) inline fun CommonSendInvoiceData.asSendInvoice(): SendInvoice? = this as? SendInvoice @PreviewFeature -inline fun CommonSendInvoiceData.requireVoiceChatParticipantsInvited(): SendInvoice = this as SendInvoice +inline fun CommonSendInvoiceData.requireSendInvoice(): SendInvoice = this as SendInvoice + +@PreviewFeature +inline fun CommonSendInvoiceData.whenCreateInvoiceLink(block: (CreateInvoiceLink) -> T) = asCreateInvoiceLink() ?.let(block) + +@PreviewFeature +inline fun CommonSendInvoiceData.asCreateInvoiceLink(): CreateInvoiceLink? = this as? CreateInvoiceLink + +@PreviewFeature +inline fun CommonSendInvoiceData.requireCreateInvoiceLink(): CreateInvoiceLink = this as CreateInvoiceLink @PreviewFeature inline fun CommonSendInvoiceData.whenInputInvoiceMessageContent(block: (InputInvoiceMessageContent) -> T) = asInputInvoiceMessageContent() ?.let(block)