From 2258791139d2b236fa7b198856cabff786501caa Mon Sep 17 00:00:00 2001 From: Andrew Anfanik Date: Sun, 8 Dec 2024 02:17:00 +0200 Subject: [PATCH 01/16] Create KBaseRequest, RequestParameterDelegate & rewrite CreateInvoiceLink to Kotlin --- .../request/CreateInvoiceLink.java | 97 ------------------- .../telegrambot/request/CreateInvoiceLink.kt | 54 +++++++++++ .../telegrambot/request/KBaseRequest.kt | 14 +++ .../kotlin/RequestParameterDelegate.kt | 52 ++++++++++ 4 files changed, 120 insertions(+), 97 deletions(-) delete mode 100644 library/src/main/java/com/pengrad/telegrambot/request/CreateInvoiceLink.java create mode 100644 library/src/main/java/com/pengrad/telegrambot/request/CreateInvoiceLink.kt create mode 100644 library/src/main/java/com/pengrad/telegrambot/request/KBaseRequest.kt create mode 100644 library/src/main/java/com/pengrad/telegrambot/utility/kotlin/RequestParameterDelegate.kt diff --git a/library/src/main/java/com/pengrad/telegrambot/request/CreateInvoiceLink.java b/library/src/main/java/com/pengrad/telegrambot/request/CreateInvoiceLink.java deleted file mode 100644 index 5661a63d..00000000 --- a/library/src/main/java/com/pengrad/telegrambot/request/CreateInvoiceLink.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.pengrad.telegrambot.request; - -import com.pengrad.telegrambot.model.request.LabeledPrice; -import com.pengrad.telegrambot.response.StringResponse; - -/** - * Mirco Ianese - * 21 Jun 2022 - */ -public class CreateInvoiceLink extends BaseRequest { - - public CreateInvoiceLink(String title, String description, String payload, String currency, LabeledPrice... prices) { - super(StringResponse.class); - add("title", title).add("description", description).add("payload", payload) - .add("currency", currency).add("prices", prices); - } - - - /** - * Backward compatibility: API 7.4, parameter "provider_token" became optional - * @deprecated Use constrcutor without 'provider_token' instead - */ - @Deprecated - public CreateInvoiceLink(String title, String description, String payload, String providerToken, - String currency, LabeledPrice... prices) { - super(StringResponse.class); - add("title", title).add("description", description).add("payload", payload) - .add("provider_token", providerToken).add("currency", currency).add("prices", prices); - } - - public CreateInvoiceLink providerToken(String providerToken) { - return add("provider_token", providerToken); - } - - /** - * @param maxTipAmount The maximum accepted amount for tips in the smallest units of the currency - */ - public CreateInvoiceLink maxTipAmount(int maxTipAmount) { - return add("max_tip_amount", maxTipAmount); - } - - /** - * @param suggestedTipAmounts An array of suggested amounts of tip in the smallest units of the currency. At most 4 suggested tip amounts can be specified. The suggested tip amounts must be positive, passed in a strictly increased order and must not exceed max_tip_amount. - */ - public CreateInvoiceLink suggestedTipAmounts(Integer[] suggestedTipAmounts) { - return add("suggested_tip_amounts", suggestedTipAmounts); - } - - public CreateInvoiceLink providerData(String providerData) { - return add("provider_data", providerData); - } - - public CreateInvoiceLink photoUrl(String photoUrl) { - return add("photo_url", photoUrl); - } - - public CreateInvoiceLink photoSize(Integer photoSize) { - return add("photo_size", photoSize); - } - - public CreateInvoiceLink photoWidth(Integer photoWidth) { - return add("photo_width", photoWidth); - } - - public CreateInvoiceLink photoHeight(Integer photoHeight) { - return add("photo_height", photoHeight); - } - - public CreateInvoiceLink needName(boolean needName) { - return add("need_name", needName); - } - - public CreateInvoiceLink needPhoneNumber(boolean needPhoneNumber) { - return add("need_phone_number", needPhoneNumber); - } - - public CreateInvoiceLink needEmail(boolean needEmail) { - return add("need_email", needEmail); - } - - public CreateInvoiceLink needShippingAddress(boolean needShippingAddress) { - return add("need_shipping_address", needShippingAddress); - } - - public CreateInvoiceLink sendEmailToProvider(boolean sendEmailToProvider) { - return add("send_email_to_provider", sendEmailToProvider); - } - - public CreateInvoiceLink sendPhoneNumberToProvider(boolean sendPhoneNumberToProvider) { - return add("send_phone_number_to_provider", sendPhoneNumberToProvider); - } - - public CreateInvoiceLink isFlexible(boolean isFlexible) { - return add("is_flexible", isFlexible); - } - -} diff --git a/library/src/main/java/com/pengrad/telegrambot/request/CreateInvoiceLink.kt b/library/src/main/java/com/pengrad/telegrambot/request/CreateInvoiceLink.kt new file mode 100644 index 00000000..11a37149 --- /dev/null +++ b/library/src/main/java/com/pengrad/telegrambot/request/CreateInvoiceLink.kt @@ -0,0 +1,54 @@ +package com.pengrad.telegrambot.request + +import com.pengrad.telegrambot.model.request.LabeledPrice +import com.pengrad.telegrambot.response.StringResponse +import com.pengrad.telegrambot.utility.kotlin.optionalRequestParameter +import com.pengrad.telegrambot.utility.kotlin.requestParameter + +class CreateInvoiceLink( + title: String, + description: String, + payload: String, + currency: String, + vararg prices: LabeledPrice +) : KBaseRequest(StringResponse::class) { + + /** + * Backward compatibility: API 7.4, parameter "provider_token" became optional + * @deprecated Use constructor without 'provider_token' instead + */ + @Deprecated("Use constructor without 'providerToken' parameter", ReplaceWith("CreateInvoiceLink(title, description, payload, currency, *prices)")) + constructor( + title: String, + description: String, + payload: String, + providerToken: String, + currency: String, + vararg prices: LabeledPrice + ) : this(title, description, payload, currency, *prices) { + this.providerToken = providerToken + } + + val title: String by requestParameter(title) + val description: String by requestParameter(description) + val payload: String by requestParameter(payload) + val currency: String by requestParameter(currency) + val prices: Array by requestParameter(arrayOf(*prices)) + + @set:JvmName("providerToken") var providerToken: String? by optionalRequestParameter(customParameterName = "provider_token") + @set:JvmName("maxTipAmount") var maxTipAmount: Int? by optionalRequestParameter(customParameterName = "max_tip_amount") + @set:JvmName("suggestedTipAmounts") var suggestedTipAmounts: Array? by optionalRequestParameter(customParameterName = "suggested_tip_amounts") + @set:JvmName("providerData") var providerData: String? by optionalRequestParameter(customParameterName = "provider_data") + @set:JvmName("photoUrl") var photoUrl: String? by optionalRequestParameter(customParameterName = "photo_url") + @set:JvmName("photoSize") var photoSize: Int? by optionalRequestParameter(customParameterName = "photo_size") + @set:JvmName("photoWidth") var photoWidth: Int? by optionalRequestParameter(customParameterName = "photo_width") + @set:JvmName("photoHeight") var photoHeight: Int? by optionalRequestParameter(customParameterName = "photo_height") + @set:JvmName("needName") var needName: Boolean? by optionalRequestParameter(customParameterName = "need_name") + @set:JvmName("needPhoneNumber") var needPhoneNumber: Boolean? by optionalRequestParameter(customParameterName = "need_phone_number") + @set:JvmName("needEmail") var needEmail: Boolean? by optionalRequestParameter(customParameterName = "need_email") + @set:JvmName("needShippingAddress") var needShippingAddress: Boolean? by optionalRequestParameter(customParameterName = "need_shipping_address") + @set:JvmName("sendEmailToProvider") var sendEmailToProvider: Boolean? by optionalRequestParameter(customParameterName = "send_email_to_provider") + @set:JvmName("sendPhoneNumberToProvider") var sendPhoneNumberToProvider: Boolean? by optionalRequestParameter(customParameterName = "send_phone_number_to_provider") + @set:JvmName("isFlexible") var isFlexible: Boolean? by optionalRequestParameter(customParameterName = "is_flexible") + +} \ No newline at end of file diff --git a/library/src/main/java/com/pengrad/telegrambot/request/KBaseRequest.kt b/library/src/main/java/com/pengrad/telegrambot/request/KBaseRequest.kt new file mode 100644 index 00000000..c732d542 --- /dev/null +++ b/library/src/main/java/com/pengrad/telegrambot/request/KBaseRequest.kt @@ -0,0 +1,14 @@ +package com.pengrad.telegrambot.request + +import com.pengrad.telegrambot.response.BaseResponse +import kotlin.reflect.KClass + +abstract class KBaseRequest, R : BaseResponse>( + clazz: KClass +) : BaseRequest(clazz.java) { + + internal fun addParameter(name: String, value: Any?): T { + return add(name, value) + } + +} \ No newline at end of file diff --git a/library/src/main/java/com/pengrad/telegrambot/utility/kotlin/RequestParameterDelegate.kt b/library/src/main/java/com/pengrad/telegrambot/utility/kotlin/RequestParameterDelegate.kt new file mode 100644 index 00000000..32dfc303 --- /dev/null +++ b/library/src/main/java/com/pengrad/telegrambot/utility/kotlin/RequestParameterDelegate.kt @@ -0,0 +1,52 @@ +package com.pengrad.telegrambot.utility.kotlin + +import com.pengrad.telegrambot.request.KBaseRequest +import kotlin.properties.PropertyDelegateProvider +import kotlin.properties.ReadWriteProperty +import kotlin.reflect.KProperty + +fun , V : Any> requestParameter( + initialValue: V, + customParameterName: String? = null +) : RequestParameterDelegate = RequestParameterDelegate( + value = initialValue, + customParameterName = customParameterName +) + +fun , V : Any?> optionalRequestParameter( + initialValue: V? = null, + customParameterName: String? = null +) : RequestParameterDelegate = RequestParameterDelegate( + value = initialValue, + customParameterName = customParameterName +) + +class RequestParameterDelegate, V>( + private var value: V, + private val customParameterName: String? = null +) : ReadWriteProperty, PropertyDelegateProvider> { + + override operator fun provideDelegate(thisRef: T, property: KProperty<*>): RequestParameterDelegate { + if (value != null) { + updateRequestValue(thisRef, property, value) + } + return this + } + + override operator fun getValue(thisRef: T, property: KProperty<*>): V { + return value + } + + override operator fun setValue(thisRef: T, property: KProperty<*>, value: V) { + updateRequestValue(thisRef, property, value) + this.value = value + } + + private fun updateRequestValue(thisRef: T, property: KProperty<*>, value: V) { + thisRef.addParameter( + name = customParameterName ?: property.name, // todo: format field name - camelCase to snake_case + value = value + ) + } + +} \ No newline at end of file From ce459beebba0b0384a226020509de22ccf7ac82b Mon Sep 17 00:00:00 2001 From: Andrew Anfanik Date: Sun, 8 Dec 2024 02:18:21 +0200 Subject: [PATCH 02/16] Add subscription_period & business_connection_id to CreateInvoiceLink --- .../java/com/pengrad/telegrambot/request/CreateInvoiceLink.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/library/src/main/java/com/pengrad/telegrambot/request/CreateInvoiceLink.kt b/library/src/main/java/com/pengrad/telegrambot/request/CreateInvoiceLink.kt index 11a37149..3508dcc1 100644 --- a/library/src/main/java/com/pengrad/telegrambot/request/CreateInvoiceLink.kt +++ b/library/src/main/java/com/pengrad/telegrambot/request/CreateInvoiceLink.kt @@ -36,6 +36,8 @@ class CreateInvoiceLink( val prices: Array by requestParameter(arrayOf(*prices)) @set:JvmName("providerToken") var providerToken: String? by optionalRequestParameter(customParameterName = "provider_token") + @set:JvmName("subscriptionPeriod") var subscriptionPeriod: Int? by optionalRequestParameter(customParameterName = "subscription_period") + @set:JvmName("businessConnectionId") var businessConnectionId: String? by optionalRequestParameter(customParameterName = "business_connection_id") @set:JvmName("maxTipAmount") var maxTipAmount: Int? by optionalRequestParameter(customParameterName = "max_tip_amount") @set:JvmName("suggestedTipAmounts") var suggestedTipAmounts: Array? by optionalRequestParameter(customParameterName = "suggested_tip_amounts") @set:JvmName("providerData") var providerData: String? by optionalRequestParameter(customParameterName = "provider_data") From 4e09377ac52bc713cd54a19cce083b959c01dfe0 Mon Sep 17 00:00:00 2001 From: Andrew Anfanik Date: Sun, 8 Dec 2024 02:38:42 +0200 Subject: [PATCH 03/16] Rewrite SuccessfulPayment to Kotlin --- .../telegrambot/model/SuccessfulPayment.java | 92 ------------------- .../telegrambot/model/SuccessfulPayment.kt | 11 +++ 2 files changed, 11 insertions(+), 92 deletions(-) delete mode 100644 library/src/main/java/com/pengrad/telegrambot/model/SuccessfulPayment.java create mode 100644 library/src/main/java/com/pengrad/telegrambot/model/SuccessfulPayment.kt diff --git a/library/src/main/java/com/pengrad/telegrambot/model/SuccessfulPayment.java b/library/src/main/java/com/pengrad/telegrambot/model/SuccessfulPayment.java deleted file mode 100644 index 64e81c31..00000000 --- a/library/src/main/java/com/pengrad/telegrambot/model/SuccessfulPayment.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.pengrad.telegrambot.model; - -import java.io.Serializable; - -/** - * Stas Parshin - * 24 May 2017 - */ -public class SuccessfulPayment implements Serializable { - private final static long serialVersionUID = 0L; - - private String currency; - private Integer total_amount; - private String invoice_payload; - private String shipping_option_id; - private OrderInfo order_info; - private String telegram_payment_charge_id; - private String provider_payment_charge_id; - - public String currency() { - return currency; - } - - public Integer totalAmount() { - return total_amount; - } - - public String invoicePayload() { - return invoice_payload; - } - - public String shippingOptionId() { - return shipping_option_id; - } - - public OrderInfo orderInfo() { - return order_info; - } - - public String telegramPaymentChargeId() { - return telegram_payment_charge_id; - } - - public String providerPaymentChargeId() { - return provider_payment_charge_id; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - SuccessfulPayment that = (SuccessfulPayment) o; - - if (currency != null ? !currency.equals(that.currency) : that.currency != null) return false; - if (total_amount != null ? !total_amount.equals(that.total_amount) : that.total_amount != null) return false; - if (invoice_payload != null ? !invoice_payload.equals(that.invoice_payload) : that.invoice_payload != null) - return false; - if (shipping_option_id != null ? !shipping_option_id.equals(that.shipping_option_id) : that.shipping_option_id != null) - return false; - if (order_info != null ? !order_info.equals(that.order_info) : that.order_info != null) return false; - if (telegram_payment_charge_id != null ? !telegram_payment_charge_id.equals(that.telegram_payment_charge_id) : that.telegram_payment_charge_id != null) - return false; - return provider_payment_charge_id != null ? provider_payment_charge_id.equals(that.provider_payment_charge_id) : that.provider_payment_charge_id == null; - - } - - @Override - public int hashCode() { - int result = currency != null ? currency.hashCode() : 0; - result = 31 * result + (total_amount != null ? total_amount.hashCode() : 0); - result = 31 * result + (invoice_payload != null ? invoice_payload.hashCode() : 0); - result = 31 * result + (shipping_option_id != null ? shipping_option_id.hashCode() : 0); - result = 31 * result + (order_info != null ? order_info.hashCode() : 0); - result = 31 * result + (telegram_payment_charge_id != null ? telegram_payment_charge_id.hashCode() : 0); - result = 31 * result + (provider_payment_charge_id != null ? provider_payment_charge_id.hashCode() : 0); - return result; - } - - @Override - public String toString() { - return "SuccessfulPayment{" + - "currency='" + currency + '\'' + - ", total_amount=" + total_amount + - ", invoice_payload='" + invoice_payload + '\'' + - ", shipping_option_id='" + shipping_option_id + '\'' + - ", order_info=" + order_info + - ", telegram_payment_charge_id='" + telegram_payment_charge_id + '\'' + - ", provider_payment_charge_id='" + provider_payment_charge_id + '\'' + - '}'; - } -} diff --git a/library/src/main/java/com/pengrad/telegrambot/model/SuccessfulPayment.kt b/library/src/main/java/com/pengrad/telegrambot/model/SuccessfulPayment.kt new file mode 100644 index 00000000..789e425d --- /dev/null +++ b/library/src/main/java/com/pengrad/telegrambot/model/SuccessfulPayment.kt @@ -0,0 +1,11 @@ +package com.pengrad.telegrambot.model + +data class SuccessfulPayment( + @get:JvmName("currency") val currency: String, + @get:JvmName("totalAmount") val totalAmount: Int, + @get:JvmName("invoicePayload") val invoicePayload: String, + @get:JvmName("shippingOptionId") val shippingOptionId: String? = null, + @get:JvmName("orderInfo") val orderInfo: OrderInfo? = null, + @get:JvmName("telegramPaymentChargeId") val telegramPaymentChargeId: String, + @get:JvmName("providerPaymentChargeId") val providerPaymentChargeId: String +) From 9095f8c747dd5814c6725da24495f72142df376c Mon Sep 17 00:00:00 2001 From: Andrew Anfanik Date: Sun, 8 Dec 2024 03:06:42 +0200 Subject: [PATCH 04/16] Add subscriptionExpirationDate, isRecurring and isFirstRecurring fields to SuccessfulPayment --- .../java/com/pengrad/telegrambot/model/SuccessfulPayment.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/library/src/main/java/com/pengrad/telegrambot/model/SuccessfulPayment.kt b/library/src/main/java/com/pengrad/telegrambot/model/SuccessfulPayment.kt index 789e425d..a888f036 100644 --- a/library/src/main/java/com/pengrad/telegrambot/model/SuccessfulPayment.kt +++ b/library/src/main/java/com/pengrad/telegrambot/model/SuccessfulPayment.kt @@ -4,6 +4,9 @@ data class SuccessfulPayment( @get:JvmName("currency") val currency: String, @get:JvmName("totalAmount") val totalAmount: Int, @get:JvmName("invoicePayload") val invoicePayload: String, + @get:JvmName("subscriptionExpirationDate") val subscriptionExpirationDate: Int? = null, + @get:JvmName("isRecurring") val isRecurring: Boolean? = null, + @get:JvmName("isFirstRecurring") val isFirstRecurring: Boolean? = null, @get:JvmName("shippingOptionId") val shippingOptionId: String? = null, @get:JvmName("orderInfo") val orderInfo: OrderInfo? = null, @get:JvmName("telegramPaymentChargeId") val telegramPaymentChargeId: String, From 4615f50cd9a4f9754761859885242c2a36785d86 Mon Sep 17 00:00:00 2001 From: Andrew Anfanik Date: Sun, 8 Dec 2024 03:21:12 +0200 Subject: [PATCH 05/16] Create EditUserStarSubscription --- .../request/EditUserStarSubscription.kt | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 library/src/main/java/com/pengrad/telegrambot/request/EditUserStarSubscription.kt diff --git a/library/src/main/java/com/pengrad/telegrambot/request/EditUserStarSubscription.kt b/library/src/main/java/com/pengrad/telegrambot/request/EditUserStarSubscription.kt new file mode 100644 index 00000000..b5fe35de --- /dev/null +++ b/library/src/main/java/com/pengrad/telegrambot/request/EditUserStarSubscription.kt @@ -0,0 +1,16 @@ +package com.pengrad.telegrambot.request + +import com.pengrad.telegrambot.response.BaseResponse +import com.pengrad.telegrambot.utility.kotlin.requestParameter + +class EditUserStarSubscription( + userId: Long, + telegramPaymentChargeId: String, + isCanceled: Boolean +) : KBaseRequest(BaseResponse::class) { + + val userId: Long by requestParameter(userId) + val telegramPaymentChargeId: String by requestParameter(telegramPaymentChargeId, customParameterName = "telegram_payment_charge_id") + val isCanceled: Boolean by requestParameter(isCanceled, customParameterName = "is_canceled") + +} \ No newline at end of file From 3795fbd0a69bed22558f3a4960f44ddd15628e77 Mon Sep 17 00:00:00 2001 From: Andrew Anfanik Date: Sun, 8 Dec 2024 03:26:11 +0200 Subject: [PATCH 06/16] Add subscription_period to TransactionPartnerUser --- .../stars/partner/TransactionPartnerUser.java | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/library/src/main/java/com/pengrad/telegrambot/model/stars/partner/TransactionPartnerUser.java b/library/src/main/java/com/pengrad/telegrambot/model/stars/partner/TransactionPartnerUser.java index 20cb6a9a..dc960173 100644 --- a/library/src/main/java/com/pengrad/telegrambot/model/stars/partner/TransactionPartnerUser.java +++ b/library/src/main/java/com/pengrad/telegrambot/model/stars/partner/TransactionPartnerUser.java @@ -15,6 +15,7 @@ public class TransactionPartnerUser extends TransactionPartner { private String invoice_payload; private PaidMedia[] paid_media; private String paid_media_payload; + private Integer subscription_period; public TransactionPartnerUser() { super(TYPE); @@ -36,6 +37,10 @@ public String paidMediaPayload() { return paid_media_payload; } + public Integer subscriptionPeriod() { + return subscription_period; + } + @Override public boolean equals(Object o) { if (this == o) return true; @@ -45,12 +50,20 @@ public boolean equals(Object o) { return Objects.equals(user, that.user) && Objects.equals(invoice_payload, that.invoice_payload) && Objects.deepEquals(paid_media, that.paid_media) - && Objects.equals(paid_media_payload, that.paid_media_payload); + && Objects.equals(paid_media_payload, that.paid_media_payload) + && Objects.equals(subscription_period, that.subscription_period); } @Override public int hashCode() { - return Objects.hash(super.hashCode(), user, invoice_payload, Arrays.hashCode(paid_media)); + return Objects.hash( + super.hashCode(), + user, + invoice_payload, + Arrays.hashCode(paid_media), + paid_media_payload, + subscription_period + ); } @Override @@ -60,6 +73,7 @@ public String toString() { ", invoice_payload='" + invoice_payload + '\'' + ", paid_media=" + Arrays.toString(paid_media) + ", paid_media_payload='" + paid_media_payload + '\'' + + ", subscription_period='" + subscription_period + '\'' + '}'; } } From 6947080906adfa7bd26c97bae828448411579405 Mon Sep 17 00:00:00 2001 From: Andrew Anfanik Date: Sun, 8 Dec 2024 04:05:15 +0200 Subject: [PATCH 07/16] Create SetUserEmojiStatus --- .../telegrambot/request/SetUserEmojiStatus.kt | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 library/src/main/java/com/pengrad/telegrambot/request/SetUserEmojiStatus.kt diff --git a/library/src/main/java/com/pengrad/telegrambot/request/SetUserEmojiStatus.kt b/library/src/main/java/com/pengrad/telegrambot/request/SetUserEmojiStatus.kt new file mode 100644 index 00000000..517f2505 --- /dev/null +++ b/library/src/main/java/com/pengrad/telegrambot/request/SetUserEmojiStatus.kt @@ -0,0 +1,16 @@ +package com.pengrad.telegrambot.request + +import com.pengrad.telegrambot.response.BaseResponse +import com.pengrad.telegrambot.utility.kotlin.requestParameter + +class SetUserEmojiStatus( + userId: Long, + emojiStatusCustomEmojiId: String, + emojiStatusExpirationDate: Int +) : KBaseRequest(BaseResponse::class) { + + val userId: Long by requestParameter(userId) + val emojiStatusCustomEmojiId: String by requestParameter(emojiStatusCustomEmojiId, customParameterName = "emoji_status_custom_emoji_id") + val emojiStatusExpirationDate: Int by requestParameter(emojiStatusExpirationDate, customParameterName = "emoji_status_expiration_date") + +} \ No newline at end of file From 4bc46db8d2e4ac2c82d64539d8f634e8dcb63b56 Mon Sep 17 00:00:00 2001 From: Andrew Anfanik Date: Sun, 8 Dec 2024 04:13:36 +0200 Subject: [PATCH 08/16] Create SavePreparedInlineMessage & PreparedInlineMessage --- .../model/PreparedInlineMessage.kt | 6 +++++ .../request/SavePreparedInlineMessage.kt | 24 +++++++++++++++++++ .../SavePreparedInlineMessageResponse.kt | 7 ++++++ 3 files changed, 37 insertions(+) create mode 100644 library/src/main/java/com/pengrad/telegrambot/model/PreparedInlineMessage.kt create mode 100644 library/src/main/java/com/pengrad/telegrambot/request/SavePreparedInlineMessage.kt create mode 100644 library/src/main/java/com/pengrad/telegrambot/response/SavePreparedInlineMessageResponse.kt diff --git a/library/src/main/java/com/pengrad/telegrambot/model/PreparedInlineMessage.kt b/library/src/main/java/com/pengrad/telegrambot/model/PreparedInlineMessage.kt new file mode 100644 index 00000000..7c68320a --- /dev/null +++ b/library/src/main/java/com/pengrad/telegrambot/model/PreparedInlineMessage.kt @@ -0,0 +1,6 @@ +package com.pengrad.telegrambot.model + +data class PreparedInlineMessage( + @get:JvmName("id") val id: String, + @get:JvmName("expirationDate") val expirationDate: Int +) diff --git a/library/src/main/java/com/pengrad/telegrambot/request/SavePreparedInlineMessage.kt b/library/src/main/java/com/pengrad/telegrambot/request/SavePreparedInlineMessage.kt new file mode 100644 index 00000000..70f587d6 --- /dev/null +++ b/library/src/main/java/com/pengrad/telegrambot/request/SavePreparedInlineMessage.kt @@ -0,0 +1,24 @@ +package com.pengrad.telegrambot.request + +import com.pengrad.telegrambot.model.request.InlineQueryResult +import com.pengrad.telegrambot.response.BaseResponse +import com.pengrad.telegrambot.response.SavePreparedInlineMessageResponse +import com.pengrad.telegrambot.utility.kotlin.optionalRequestParameter +import com.pengrad.telegrambot.utility.kotlin.requestParameter + +class SavePreparedInlineMessage( + userId: Long, + result: InlineQueryResult<*> +) : KBaseRequest( + SavePreparedInlineMessageResponse::class +) { + + val userId: Long by requestParameter(userId) + val result: InlineQueryResult<*> by requestParameter(result) + + @set:JvmName("allowUserChats") var allowUserChats: Boolean? by optionalRequestParameter(customParameterName = "allow_user_chats") + @set:JvmName("allowBotChats") var allowBotChats: Boolean? by optionalRequestParameter(customParameterName = "allow_bot_chats") + @set:JvmName("allowGroupChats") var allowGroupChats: Boolean? by optionalRequestParameter(customParameterName = "allow_group_chats") + @set:JvmName("allowChannelChats") var allowChannelChats: Boolean? by optionalRequestParameter(customParameterName = "allow_channel_chats") + +} \ No newline at end of file diff --git a/library/src/main/java/com/pengrad/telegrambot/response/SavePreparedInlineMessageResponse.kt b/library/src/main/java/com/pengrad/telegrambot/response/SavePreparedInlineMessageResponse.kt new file mode 100644 index 00000000..1d50f83b --- /dev/null +++ b/library/src/main/java/com/pengrad/telegrambot/response/SavePreparedInlineMessageResponse.kt @@ -0,0 +1,7 @@ +package com.pengrad.telegrambot.response + +import com.pengrad.telegrambot.model.PreparedInlineMessage + +data class SavePreparedInlineMessageResponse( + val result: PreparedInlineMessage +) : BaseResponse() \ No newline at end of file From 72dfc25360706dc03157d8c350a7025e454e1ac3 Mon Sep 17 00:00:00 2001 From: Andrew Anfanik Date: Sun, 8 Dec 2024 04:20:31 +0200 Subject: [PATCH 09/16] Create GetAvailableGifts & Gift --- .../com/pengrad/telegrambot/model/gift/Gift.kt | 11 +++++++++++ .../pengrad/telegrambot/model/gift/Gifts.kt | 18 ++++++++++++++++++ .../telegrambot/request/GetAvailableGifts.kt | 7 +++++++ .../response/GetAvailableGiftsResponse.kt | 5 +++++ 4 files changed, 41 insertions(+) create mode 100644 library/src/main/java/com/pengrad/telegrambot/model/gift/Gift.kt create mode 100644 library/src/main/java/com/pengrad/telegrambot/model/gift/Gifts.kt create mode 100644 library/src/main/java/com/pengrad/telegrambot/request/GetAvailableGifts.kt create mode 100644 library/src/main/java/com/pengrad/telegrambot/response/GetAvailableGiftsResponse.kt diff --git a/library/src/main/java/com/pengrad/telegrambot/model/gift/Gift.kt b/library/src/main/java/com/pengrad/telegrambot/model/gift/Gift.kt new file mode 100644 index 00000000..eef53655 --- /dev/null +++ b/library/src/main/java/com/pengrad/telegrambot/model/gift/Gift.kt @@ -0,0 +1,11 @@ +package com.pengrad.telegrambot.model.gift + +import com.pengrad.telegrambot.model.Sticker + +data class Gift( + @get:JvmName("id") val id: String, + @get:JvmName("sticker") val sticker: Sticker, + @get:JvmName("starCount") val starCount: Int, + @get:JvmName("totalCount") val totalCount: Int, + @get:JvmName("remainingCount") val remainingCount: Int +) diff --git a/library/src/main/java/com/pengrad/telegrambot/model/gift/Gifts.kt b/library/src/main/java/com/pengrad/telegrambot/model/gift/Gifts.kt new file mode 100644 index 00000000..640c4b0d --- /dev/null +++ b/library/src/main/java/com/pengrad/telegrambot/model/gift/Gifts.kt @@ -0,0 +1,18 @@ +package com.pengrad.telegrambot.model.gift + +data class Gifts( + @get:JvmName("gifts") val gifts: Array +) { + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (other !is Gifts) return false + + if (!gifts.contentEquals(other.gifts)) return false + + return true + } + + override fun hashCode(): Int { + return gifts.contentHashCode() + } +} diff --git a/library/src/main/java/com/pengrad/telegrambot/request/GetAvailableGifts.kt b/library/src/main/java/com/pengrad/telegrambot/request/GetAvailableGifts.kt new file mode 100644 index 00000000..dc2868cd --- /dev/null +++ b/library/src/main/java/com/pengrad/telegrambot/request/GetAvailableGifts.kt @@ -0,0 +1,7 @@ +package com.pengrad.telegrambot.request + +import com.pengrad.telegrambot.response.GetAvailableGiftsResponse + +class GetAvailableGifts : KBaseRequest( + GetAvailableGiftsResponse::class +) \ No newline at end of file diff --git a/library/src/main/java/com/pengrad/telegrambot/response/GetAvailableGiftsResponse.kt b/library/src/main/java/com/pengrad/telegrambot/response/GetAvailableGiftsResponse.kt new file mode 100644 index 00000000..264273ee --- /dev/null +++ b/library/src/main/java/com/pengrad/telegrambot/response/GetAvailableGiftsResponse.kt @@ -0,0 +1,5 @@ +package com.pengrad.telegrambot.response + +import com.pengrad.telegrambot.model.gift.Gifts + +data class GetAvailableGiftsResponse(val result: Gifts) : BaseResponse() From e12500686e066f58fee268e25fb51716b5b9d881 Mon Sep 17 00:00:00 2001 From: Andrew Anfanik Date: Sun, 8 Dec 2024 04:29:28 +0200 Subject: [PATCH 10/16] Create SendGift --- .../pengrad/telegrambot/request/SendGift.kt | 24 +++++++++++++++++++ .../kotlin/RequestParameterDelegate.kt | 13 ++++++---- 2 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 library/src/main/java/com/pengrad/telegrambot/request/SendGift.kt diff --git a/library/src/main/java/com/pengrad/telegrambot/request/SendGift.kt b/library/src/main/java/com/pengrad/telegrambot/request/SendGift.kt new file mode 100644 index 00000000..2e230598 --- /dev/null +++ b/library/src/main/java/com/pengrad/telegrambot/request/SendGift.kt @@ -0,0 +1,24 @@ +package com.pengrad.telegrambot.request + +import com.pengrad.telegrambot.model.MessageEntity +import com.pengrad.telegrambot.model.request.ParseMode +import com.pengrad.telegrambot.response.BaseResponse +import com.pengrad.telegrambot.utility.kotlin.optionalRequestParameter +import com.pengrad.telegrambot.utility.kotlin.requestParameter + +class SendGift( + userId: Long, + giftId: String, +) : KBaseRequest(BaseResponse::class) { + + val userId: Long by requestParameter(userId) + val giftId: String by requestParameter(giftId, customParameterName = "gift_id") + + @set:JvmName("text") var text: String? by optionalRequestParameter() + @set:JvmName("textParseMode") var textParseMode: ParseMode? by optionalRequestParameter( + customParameterName = "text_parse_mode", + valueMapper = { it?.name } + ) + @set:JvmName("textEntities") var textEntities: Array? by optionalRequestParameter(customParameterName = "text_entities") + +} \ No newline at end of file diff --git a/library/src/main/java/com/pengrad/telegrambot/utility/kotlin/RequestParameterDelegate.kt b/library/src/main/java/com/pengrad/telegrambot/utility/kotlin/RequestParameterDelegate.kt index 32dfc303..2b163d7b 100644 --- a/library/src/main/java/com/pengrad/telegrambot/utility/kotlin/RequestParameterDelegate.kt +++ b/library/src/main/java/com/pengrad/telegrambot/utility/kotlin/RequestParameterDelegate.kt @@ -5,6 +5,8 @@ import kotlin.properties.PropertyDelegateProvider import kotlin.properties.ReadWriteProperty import kotlin.reflect.KProperty +typealias RequestParameterValueMapper = (I) -> O + fun , V : Any> requestParameter( initialValue: V, customParameterName: String? = null @@ -15,15 +17,18 @@ fun , V : Any> requestParameter( fun , V : Any?> optionalRequestParameter( initialValue: V? = null, - customParameterName: String? = null + customParameterName: String? = null, + valueMapper: RequestParameterValueMapper? = null ) : RequestParameterDelegate = RequestParameterDelegate( value = initialValue, - customParameterName = customParameterName + customParameterName = customParameterName, + valueMapper = valueMapper ) class RequestParameterDelegate, V>( private var value: V, - private val customParameterName: String? = null + private val customParameterName: String? = null, + private val valueMapper: RequestParameterValueMapper? = null ) : ReadWriteProperty, PropertyDelegateProvider> { override operator fun provideDelegate(thisRef: T, property: KProperty<*>): RequestParameterDelegate { @@ -45,7 +50,7 @@ class RequestParameterDelegate, V>( private fun updateRequestValue(thisRef: T, property: KProperty<*>, value: V) { thisRef.addParameter( name = customParameterName ?: property.name, // todo: format field name - camelCase to snake_case - value = value + value = valueMapper?.invoke(value) ?: value ) } From 71ae890bbc5e348ed780b0552fc53fc47476c4e4 Mon Sep 17 00:00:00 2001 From: Andrew Anfanik Date: Sun, 8 Dec 2024 04:30:36 +0200 Subject: [PATCH 11/16] Add gift field to TransactionPartnerUser --- .../model/stars/partner/TransactionPartnerUser.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/library/src/main/java/com/pengrad/telegrambot/model/stars/partner/TransactionPartnerUser.java b/library/src/main/java/com/pengrad/telegrambot/model/stars/partner/TransactionPartnerUser.java index dc960173..11e6097a 100644 --- a/library/src/main/java/com/pengrad/telegrambot/model/stars/partner/TransactionPartnerUser.java +++ b/library/src/main/java/com/pengrad/telegrambot/model/stars/partner/TransactionPartnerUser.java @@ -2,6 +2,7 @@ import com.pengrad.telegrambot.model.User; import com.pengrad.telegrambot.model.chatbackground.BackgroundFillFreeformGradient; +import com.pengrad.telegrambot.model.gift.Gift; import com.pengrad.telegrambot.model.paidmedia.PaidMedia; import java.util.Arrays; @@ -16,6 +17,7 @@ public class TransactionPartnerUser extends TransactionPartner { private PaidMedia[] paid_media; private String paid_media_payload; private Integer subscription_period; + private Gift gift; public TransactionPartnerUser() { super(TYPE); @@ -41,6 +43,10 @@ public Integer subscriptionPeriod() { return subscription_period; } + public Gift gift() { + return gift; + } + @Override public boolean equals(Object o) { if (this == o) return true; @@ -51,7 +57,8 @@ public boolean equals(Object o) { && Objects.equals(invoice_payload, that.invoice_payload) && Objects.deepEquals(paid_media, that.paid_media) && Objects.equals(paid_media_payload, that.paid_media_payload) - && Objects.equals(subscription_period, that.subscription_period); + && Objects.equals(subscription_period, that.subscription_period) + && Objects.equals(gift, that.gift); } @Override @@ -62,7 +69,8 @@ public int hashCode() { invoice_payload, Arrays.hashCode(paid_media), paid_media_payload, - subscription_period + subscription_period, + gift ); } @@ -74,6 +82,7 @@ public String toString() { ", paid_media=" + Arrays.toString(paid_media) + ", paid_media_payload='" + paid_media_payload + '\'' + ", subscription_period='" + subscription_period + '\'' + + ", gift=" + gift + '}'; } } From d1d11eb7e2fa9cddaaf360847a9519866c8b6506 Mon Sep 17 00:00:00 2001 From: Andrew Anfanik Date: Sun, 8 Dec 2024 04:45:26 +0200 Subject: [PATCH 12/16] Fix test & remove @JvmName annotations from CreateInvoiceLink fields --- .../telegrambot/request/CreateInvoiceLink.kt | 68 ++++++++++++++----- .../com/pengrad/telegrambot/PaymentsTest.java | 2 +- 2 files changed, 52 insertions(+), 18 deletions(-) diff --git a/library/src/main/java/com/pengrad/telegrambot/request/CreateInvoiceLink.kt b/library/src/main/java/com/pengrad/telegrambot/request/CreateInvoiceLink.kt index 3508dcc1..c9cbd68b 100644 --- a/library/src/main/java/com/pengrad/telegrambot/request/CreateInvoiceLink.kt +++ b/library/src/main/java/com/pengrad/telegrambot/request/CreateInvoiceLink.kt @@ -35,22 +35,56 @@ class CreateInvoiceLink( val currency: String by requestParameter(currency) val prices: Array by requestParameter(arrayOf(*prices)) - @set:JvmName("providerToken") var providerToken: String? by optionalRequestParameter(customParameterName = "provider_token") - @set:JvmName("subscriptionPeriod") var subscriptionPeriod: Int? by optionalRequestParameter(customParameterName = "subscription_period") - @set:JvmName("businessConnectionId") var businessConnectionId: String? by optionalRequestParameter(customParameterName = "business_connection_id") - @set:JvmName("maxTipAmount") var maxTipAmount: Int? by optionalRequestParameter(customParameterName = "max_tip_amount") - @set:JvmName("suggestedTipAmounts") var suggestedTipAmounts: Array? by optionalRequestParameter(customParameterName = "suggested_tip_amounts") - @set:JvmName("providerData") var providerData: String? by optionalRequestParameter(customParameterName = "provider_data") - @set:JvmName("photoUrl") var photoUrl: String? by optionalRequestParameter(customParameterName = "photo_url") - @set:JvmName("photoSize") var photoSize: Int? by optionalRequestParameter(customParameterName = "photo_size") - @set:JvmName("photoWidth") var photoWidth: Int? by optionalRequestParameter(customParameterName = "photo_width") - @set:JvmName("photoHeight") var photoHeight: Int? by optionalRequestParameter(customParameterName = "photo_height") - @set:JvmName("needName") var needName: Boolean? by optionalRequestParameter(customParameterName = "need_name") - @set:JvmName("needPhoneNumber") var needPhoneNumber: Boolean? by optionalRequestParameter(customParameterName = "need_phone_number") - @set:JvmName("needEmail") var needEmail: Boolean? by optionalRequestParameter(customParameterName = "need_email") - @set:JvmName("needShippingAddress") var needShippingAddress: Boolean? by optionalRequestParameter(customParameterName = "need_shipping_address") - @set:JvmName("sendEmailToProvider") var sendEmailToProvider: Boolean? by optionalRequestParameter(customParameterName = "send_email_to_provider") - @set:JvmName("sendPhoneNumberToProvider") var sendPhoneNumberToProvider: Boolean? by optionalRequestParameter(customParameterName = "send_phone_number_to_provider") - @set:JvmName("isFlexible") var isFlexible: Boolean? by optionalRequestParameter(customParameterName = "is_flexible") + var providerToken: String? by optionalRequestParameter(customParameterName = "provider_token") + var subscriptionPeriod: Int? by optionalRequestParameter(customParameterName = "subscription_period") + var businessConnectionId: String? by optionalRequestParameter(customParameterName = "business_connection_id") + var maxTipAmount: Int? by optionalRequestParameter(customParameterName = "max_tip_amount") + var suggestedTipAmounts: Array? by optionalRequestParameter(customParameterName = "suggested_tip_amounts") + var providerData: String? by optionalRequestParameter(customParameterName = "provider_data") + var photoUrl: String? by optionalRequestParameter(customParameterName = "photo_url") + var photoSize: Int? by optionalRequestParameter(customParameterName = "photo_size") + var photoWidth: Int? by optionalRequestParameter(customParameterName = "photo_width") + var photoHeight: Int? by optionalRequestParameter(customParameterName = "photo_height") + var needName: Boolean? by optionalRequestParameter(customParameterName = "need_name") + var needPhoneNumber: Boolean? by optionalRequestParameter(customParameterName = "need_phone_number") + var needEmail: Boolean? by optionalRequestParameter(customParameterName = "need_email") + var needShippingAddress: Boolean? by optionalRequestParameter(customParameterName = "need_shipping_address") + var sendEmailToProvider: Boolean? by optionalRequestParameter(customParameterName = "send_email_to_provider") + var sendPhoneNumberToProvider: Boolean? by optionalRequestParameter(customParameterName = "send_phone_number_to_provider") + var isFlexible: Boolean? by optionalRequestParameter(customParameterName = "is_flexible") + + fun providerToken(providerToken: String) = apply { this.providerToken = providerToken } + + fun subscriptionPeriod(subscriptionPeriod: Int) = apply { this.subscriptionPeriod = subscriptionPeriod } + + fun businessConnectionId(businessConnectionId: String) = apply { this.businessConnectionId = businessConnectionId } + + fun maxTipAmount(maxTipAmount: Int) = apply { this.maxTipAmount = maxTipAmount } + + fun suggestedTipAmounts(suggestedTipAmounts: Array) = apply { this.suggestedTipAmounts = suggestedTipAmounts } + + fun providerData(providerData: String) = apply { this.providerData = providerData } + + fun photoUrl(photoUrl: String) = apply { this.photoUrl = photoUrl } + + fun photoSize(photoSize: Int) = apply { this.photoSize = photoSize } + + fun photoWidth(photoWidth: Int) = apply { this.photoWidth = photoWidth } + + fun photoHeight(photoHeight: Int) = apply { this.photoHeight = photoHeight } + + fun needName(needName: Boolean) = apply { this.needName = needName } + + fun needPhoneNumber(needPhoneNumber: Boolean) = apply { this.needPhoneNumber = needPhoneNumber } + + fun needEmail(needEmail: Boolean) = apply { this.needEmail = needEmail } + + fun needShippingAddress(needShippingAddress: Boolean) = apply { this.needShippingAddress = needShippingAddress } + + fun sendEmailToProvider(sendEmailToProvider: Boolean) = apply { this.sendEmailToProvider = sendEmailToProvider } + + fun sendPhoneNumberToProvider(sendPhoneNumberToProvider: Boolean) = apply { this.sendPhoneNumberToProvider = sendPhoneNumberToProvider } + + fun isFlexible(isFlexible: Boolean) = apply { this.isFlexible = isFlexible } } \ No newline at end of file diff --git a/library/src/test/java/com/pengrad/telegrambot/PaymentsTest.java b/library/src/test/java/com/pengrad/telegrambot/PaymentsTest.java index e097e13d..a7b85314 100644 --- a/library/src/test/java/com/pengrad/telegrambot/PaymentsTest.java +++ b/library/src/test/java/com/pengrad/telegrambot/PaymentsTest.java @@ -169,7 +169,7 @@ public void testSuccessfulPayment() { assertNotNull(payment); assertEquals("USD", payment.currency()); - assertEquals(Integer.valueOf(200), payment.totalAmount()); + assertEquals(200, payment.totalAmount()); assertEquals("my_payload", payment.invoicePayload()); assertEquals("2", payment.shippingOptionId()); assertEquals("tcid", payment.telegramPaymentChargeId()); From 1ec5a87de7b9e9c0ded599ffc6bd7f2d9a12acbf Mon Sep 17 00:00:00 2001 From: Andrew Anfanik Date: Sun, 8 Dec 2024 05:00:58 +0200 Subject: [PATCH 13/16] Fix ResponseTest: disable default constructor & toString checks for Kotlin Data Classes --- library/build.gradle | 1 + .../test/java/com/pengrad/telegrambot/ResponseTest.java | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/library/build.gradle b/library/build.gradle index df95e5a2..4f1d20dc 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -16,6 +16,7 @@ dependencies { testImplementation 'junit:junit:4.13.1' testImplementation 'nl.jqno.equalsverifier:equalsverifier:3.1.13' testImplementation 'org.reflections:reflections:0.9.12' + testImplementation 'org.jetbrains.kotlin:kotlin-reflect' } jar { diff --git a/library/src/test/java/com/pengrad/telegrambot/ResponseTest.java b/library/src/test/java/com/pengrad/telegrambot/ResponseTest.java index 9813a84a..53069de1 100644 --- a/library/src/test/java/com/pengrad/telegrambot/ResponseTest.java +++ b/library/src/test/java/com/pengrad/telegrambot/ResponseTest.java @@ -1,6 +1,8 @@ package com.pengrad.telegrambot; import com.pengrad.telegrambot.response.BaseResponse; +import kotlin.jvm.JvmClassMappingKt; +import kotlin.reflect.KClass; import org.junit.Before; import org.junit.Test; import org.reflections.Reflections; @@ -33,6 +35,12 @@ public void setClasses() { @Test public void testToString() throws IllegalAccessException, InstantiationException, InvocationTargetException { for (Class c : classes) { + KClass kclass = JvmClassMappingKt.getKotlinClass(c); + + if (kclass.isData()) { + continue; + } + Optional> constructor = Arrays.stream(c.getDeclaredConstructors()).filter(dc -> dc.getParameterCount() == 0).findFirst(); assertTrue("No default constructor in " + c.getSimpleName(), constructor.isPresent()); constructor.get().setAccessible(true); From 0d098b5f0379c57714dd4b9eecd670f37e087532 Mon Sep 17 00:00:00 2001 From: Andrew Anfanik Date: Wed, 22 Jan 2025 11:43:02 +0300 Subject: [PATCH 14/16] Add Java-style builder methods for optional parameters in SavePreparedInlineMessage & SendGift --- .../request/SavePreparedInlineMessage.kt | 16 ++++++++++++---- .../com/pengrad/telegrambot/request/SendGift.kt | 14 ++++++++++---- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/library/src/main/java/com/pengrad/telegrambot/request/SavePreparedInlineMessage.kt b/library/src/main/java/com/pengrad/telegrambot/request/SavePreparedInlineMessage.kt index 70f587d6..fd989c45 100644 --- a/library/src/main/java/com/pengrad/telegrambot/request/SavePreparedInlineMessage.kt +++ b/library/src/main/java/com/pengrad/telegrambot/request/SavePreparedInlineMessage.kt @@ -16,9 +16,17 @@ class SavePreparedInlineMessage( val userId: Long by requestParameter(userId) val result: InlineQueryResult<*> by requestParameter(result) - @set:JvmName("allowUserChats") var allowUserChats: Boolean? by optionalRequestParameter(customParameterName = "allow_user_chats") - @set:JvmName("allowBotChats") var allowBotChats: Boolean? by optionalRequestParameter(customParameterName = "allow_bot_chats") - @set:JvmName("allowGroupChats") var allowGroupChats: Boolean? by optionalRequestParameter(customParameterName = "allow_group_chats") - @set:JvmName("allowChannelChats") var allowChannelChats: Boolean? by optionalRequestParameter(customParameterName = "allow_channel_chats") + var allowUserChats: Boolean? by optionalRequestParameter(customParameterName = "allow_user_chats") + var allowBotChats: Boolean? by optionalRequestParameter(customParameterName = "allow_bot_chats") + var allowGroupChats: Boolean? by optionalRequestParameter(customParameterName = "allow_group_chats") + var allowChannelChats: Boolean? by optionalRequestParameter(customParameterName = "allow_channel_chats") + + fun allowUserChats(allowUserChats: Boolean) = apply { this.allowUserChats = allowUserChats } + + fun allowBotChats(allowBotChats: Boolean) = apply { this.allowBotChats = allowBotChats } + + fun allowGroupChats(allowGroupChats: Boolean) = apply { this.allowGroupChats = allowGroupChats } + + fun allowChannelChats(allowChannelChats: Boolean) = apply { this.allowChannelChats = allowChannelChats } } \ No newline at end of file diff --git a/library/src/main/java/com/pengrad/telegrambot/request/SendGift.kt b/library/src/main/java/com/pengrad/telegrambot/request/SendGift.kt index 2e230598..97f40d42 100644 --- a/library/src/main/java/com/pengrad/telegrambot/request/SendGift.kt +++ b/library/src/main/java/com/pengrad/telegrambot/request/SendGift.kt @@ -11,14 +11,20 @@ class SendGift( giftId: String, ) : KBaseRequest(BaseResponse::class) { - val userId: Long by requestParameter(userId) + val userId: Long by requestParameter(userId, customParameterName = "user_id") val giftId: String by requestParameter(giftId, customParameterName = "gift_id") - @set:JvmName("text") var text: String? by optionalRequestParameter() - @set:JvmName("textParseMode") var textParseMode: ParseMode? by optionalRequestParameter( + var text: String? by optionalRequestParameter() + var textParseMode: ParseMode? by optionalRequestParameter( customParameterName = "text_parse_mode", valueMapper = { it?.name } ) - @set:JvmName("textEntities") var textEntities: Array? by optionalRequestParameter(customParameterName = "text_entities") + var textEntities: Array? by optionalRequestParameter(customParameterName = "text_entities") + + fun text(text: String) = apply { this.text = text } + + fun textParseMode(parseMode: ParseMode) = apply { this.textParseMode = textParseMode } + + fun textEntities(textEntities: Array) = apply { this.textEntities = textEntities } } \ No newline at end of file From 110dff346dcd386179a8e75adb1e3d5519c4eb29 Mon Sep 17 00:00:00 2001 From: Andrew Anfanik Date: Wed, 22 Jan 2025 11:54:09 +0300 Subject: [PATCH 15/16] Fix parameter names for EditUserStarSubscription, SavePreparedInlineMessage, SetUserEmojiStatus --- .../com/pengrad/telegrambot/request/EditUserStarSubscription.kt | 2 +- .../pengrad/telegrambot/request/SavePreparedInlineMessage.kt | 2 +- .../java/com/pengrad/telegrambot/request/SetUserEmojiStatus.kt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/library/src/main/java/com/pengrad/telegrambot/request/EditUserStarSubscription.kt b/library/src/main/java/com/pengrad/telegrambot/request/EditUserStarSubscription.kt index b5fe35de..02f95a95 100644 --- a/library/src/main/java/com/pengrad/telegrambot/request/EditUserStarSubscription.kt +++ b/library/src/main/java/com/pengrad/telegrambot/request/EditUserStarSubscription.kt @@ -9,7 +9,7 @@ class EditUserStarSubscription( isCanceled: Boolean ) : KBaseRequest(BaseResponse::class) { - val userId: Long by requestParameter(userId) + val userId: Long by requestParameter(userId, customParameterName = "user_id") val telegramPaymentChargeId: String by requestParameter(telegramPaymentChargeId, customParameterName = "telegram_payment_charge_id") val isCanceled: Boolean by requestParameter(isCanceled, customParameterName = "is_canceled") diff --git a/library/src/main/java/com/pengrad/telegrambot/request/SavePreparedInlineMessage.kt b/library/src/main/java/com/pengrad/telegrambot/request/SavePreparedInlineMessage.kt index fd989c45..ea10684e 100644 --- a/library/src/main/java/com/pengrad/telegrambot/request/SavePreparedInlineMessage.kt +++ b/library/src/main/java/com/pengrad/telegrambot/request/SavePreparedInlineMessage.kt @@ -13,7 +13,7 @@ class SavePreparedInlineMessage( SavePreparedInlineMessageResponse::class ) { - val userId: Long by requestParameter(userId) + val userId: Long by requestParameter(userId, customParameterName = "user_id") val result: InlineQueryResult<*> by requestParameter(result) var allowUserChats: Boolean? by optionalRequestParameter(customParameterName = "allow_user_chats") diff --git a/library/src/main/java/com/pengrad/telegrambot/request/SetUserEmojiStatus.kt b/library/src/main/java/com/pengrad/telegrambot/request/SetUserEmojiStatus.kt index 517f2505..b5ef1e9f 100644 --- a/library/src/main/java/com/pengrad/telegrambot/request/SetUserEmojiStatus.kt +++ b/library/src/main/java/com/pengrad/telegrambot/request/SetUserEmojiStatus.kt @@ -9,7 +9,7 @@ class SetUserEmojiStatus( emojiStatusExpirationDate: Int ) : KBaseRequest(BaseResponse::class) { - val userId: Long by requestParameter(userId) + val userId: Long by requestParameter(userId, customParameterName = "user_id") val emojiStatusCustomEmojiId: String by requestParameter(emojiStatusCustomEmojiId, customParameterName = "emoji_status_custom_emoji_id") val emojiStatusExpirationDate: Int by requestParameter(emojiStatusExpirationDate, customParameterName = "emoji_status_expiration_date") From 2b05eee5d9bf0d648b7a5fc12db3cb5591f16947 Mon Sep 17 00:00:00 2001 From: Andrew Anfanik Date: Wed, 22 Jan 2025 12:16:56 +0300 Subject: [PATCH 16/16] Convert field name to snake_case in RequestParameterDelegate & remove customParameterName parameter usage --- .../telegrambot/request/CreateInvoiceLink.kt | 34 +++++++++---------- .../request/EditUserStarSubscription.kt | 6 ++-- .../request/SavePreparedInlineMessage.kt | 10 +++--- .../pengrad/telegrambot/request/SendGift.kt | 11 +++--- .../telegrambot/request/SetUserEmojiStatus.kt | 6 ++-- .../kotlin/RequestParameterDelegate.kt | 8 ++++- 6 files changed, 39 insertions(+), 36 deletions(-) diff --git a/library/src/main/java/com/pengrad/telegrambot/request/CreateInvoiceLink.kt b/library/src/main/java/com/pengrad/telegrambot/request/CreateInvoiceLink.kt index c9cbd68b..4e96dd1c 100644 --- a/library/src/main/java/com/pengrad/telegrambot/request/CreateInvoiceLink.kt +++ b/library/src/main/java/com/pengrad/telegrambot/request/CreateInvoiceLink.kt @@ -35,23 +35,23 @@ class CreateInvoiceLink( val currency: String by requestParameter(currency) val prices: Array by requestParameter(arrayOf(*prices)) - var providerToken: String? by optionalRequestParameter(customParameterName = "provider_token") - var subscriptionPeriod: Int? by optionalRequestParameter(customParameterName = "subscription_period") - var businessConnectionId: String? by optionalRequestParameter(customParameterName = "business_connection_id") - var maxTipAmount: Int? by optionalRequestParameter(customParameterName = "max_tip_amount") - var suggestedTipAmounts: Array? by optionalRequestParameter(customParameterName = "suggested_tip_amounts") - var providerData: String? by optionalRequestParameter(customParameterName = "provider_data") - var photoUrl: String? by optionalRequestParameter(customParameterName = "photo_url") - var photoSize: Int? by optionalRequestParameter(customParameterName = "photo_size") - var photoWidth: Int? by optionalRequestParameter(customParameterName = "photo_width") - var photoHeight: Int? by optionalRequestParameter(customParameterName = "photo_height") - var needName: Boolean? by optionalRequestParameter(customParameterName = "need_name") - var needPhoneNumber: Boolean? by optionalRequestParameter(customParameterName = "need_phone_number") - var needEmail: Boolean? by optionalRequestParameter(customParameterName = "need_email") - var needShippingAddress: Boolean? by optionalRequestParameter(customParameterName = "need_shipping_address") - var sendEmailToProvider: Boolean? by optionalRequestParameter(customParameterName = "send_email_to_provider") - var sendPhoneNumberToProvider: Boolean? by optionalRequestParameter(customParameterName = "send_phone_number_to_provider") - var isFlexible: Boolean? by optionalRequestParameter(customParameterName = "is_flexible") + var providerToken: String? by optionalRequestParameter() + var subscriptionPeriod: Int? by optionalRequestParameter() + var businessConnectionId: String? by optionalRequestParameter() + var maxTipAmount: Int? by optionalRequestParameter() + var suggestedTipAmounts: Array? by optionalRequestParameter() + var providerData: String? by optionalRequestParameter() + var photoUrl: String? by optionalRequestParameter() + var photoSize: Int? by optionalRequestParameter() + var photoWidth: Int? by optionalRequestParameter() + var photoHeight: Int? by optionalRequestParameter() + var needName: Boolean? by optionalRequestParameter() + var needPhoneNumber: Boolean? by optionalRequestParameter() + var needEmail: Boolean? by optionalRequestParameter() + var needShippingAddress: Boolean? by optionalRequestParameter() + var sendEmailToProvider: Boolean? by optionalRequestParameter() + var sendPhoneNumberToProvider: Boolean? by optionalRequestParameter() + var isFlexible: Boolean? by optionalRequestParameter() fun providerToken(providerToken: String) = apply { this.providerToken = providerToken } diff --git a/library/src/main/java/com/pengrad/telegrambot/request/EditUserStarSubscription.kt b/library/src/main/java/com/pengrad/telegrambot/request/EditUserStarSubscription.kt index 02f95a95..23061060 100644 --- a/library/src/main/java/com/pengrad/telegrambot/request/EditUserStarSubscription.kt +++ b/library/src/main/java/com/pengrad/telegrambot/request/EditUserStarSubscription.kt @@ -9,8 +9,8 @@ class EditUserStarSubscription( isCanceled: Boolean ) : KBaseRequest(BaseResponse::class) { - val userId: Long by requestParameter(userId, customParameterName = "user_id") - val telegramPaymentChargeId: String by requestParameter(telegramPaymentChargeId, customParameterName = "telegram_payment_charge_id") - val isCanceled: Boolean by requestParameter(isCanceled, customParameterName = "is_canceled") + val userId: Long by requestParameter(userId) + val telegramPaymentChargeId: String by requestParameter(telegramPaymentChargeId) + val isCanceled: Boolean by requestParameter(isCanceled) } \ No newline at end of file diff --git a/library/src/main/java/com/pengrad/telegrambot/request/SavePreparedInlineMessage.kt b/library/src/main/java/com/pengrad/telegrambot/request/SavePreparedInlineMessage.kt index ea10684e..51561b39 100644 --- a/library/src/main/java/com/pengrad/telegrambot/request/SavePreparedInlineMessage.kt +++ b/library/src/main/java/com/pengrad/telegrambot/request/SavePreparedInlineMessage.kt @@ -13,13 +13,13 @@ class SavePreparedInlineMessage( SavePreparedInlineMessageResponse::class ) { - val userId: Long by requestParameter(userId, customParameterName = "user_id") + val userId: Long by requestParameter(userId) val result: InlineQueryResult<*> by requestParameter(result) - var allowUserChats: Boolean? by optionalRequestParameter(customParameterName = "allow_user_chats") - var allowBotChats: Boolean? by optionalRequestParameter(customParameterName = "allow_bot_chats") - var allowGroupChats: Boolean? by optionalRequestParameter(customParameterName = "allow_group_chats") - var allowChannelChats: Boolean? by optionalRequestParameter(customParameterName = "allow_channel_chats") + var allowUserChats: Boolean? by optionalRequestParameter() + var allowBotChats: Boolean? by optionalRequestParameter() + var allowGroupChats: Boolean? by optionalRequestParameter() + var allowChannelChats: Boolean? by optionalRequestParameter() fun allowUserChats(allowUserChats: Boolean) = apply { this.allowUserChats = allowUserChats } diff --git a/library/src/main/java/com/pengrad/telegrambot/request/SendGift.kt b/library/src/main/java/com/pengrad/telegrambot/request/SendGift.kt index 97f40d42..0abb5f2f 100644 --- a/library/src/main/java/com/pengrad/telegrambot/request/SendGift.kt +++ b/library/src/main/java/com/pengrad/telegrambot/request/SendGift.kt @@ -11,15 +11,12 @@ class SendGift( giftId: String, ) : KBaseRequest(BaseResponse::class) { - val userId: Long by requestParameter(userId, customParameterName = "user_id") - val giftId: String by requestParameter(giftId, customParameterName = "gift_id") + val userId: Long by requestParameter(userId) + val giftId: String by requestParameter(giftId) var text: String? by optionalRequestParameter() - var textParseMode: ParseMode? by optionalRequestParameter( - customParameterName = "text_parse_mode", - valueMapper = { it?.name } - ) - var textEntities: Array? by optionalRequestParameter(customParameterName = "text_entities") + var textParseMode: ParseMode? by optionalRequestParameter(valueMapper = { it?.name }) + var textEntities: Array? by optionalRequestParameter() fun text(text: String) = apply { this.text = text } diff --git a/library/src/main/java/com/pengrad/telegrambot/request/SetUserEmojiStatus.kt b/library/src/main/java/com/pengrad/telegrambot/request/SetUserEmojiStatus.kt index b5ef1e9f..9a790e59 100644 --- a/library/src/main/java/com/pengrad/telegrambot/request/SetUserEmojiStatus.kt +++ b/library/src/main/java/com/pengrad/telegrambot/request/SetUserEmojiStatus.kt @@ -9,8 +9,8 @@ class SetUserEmojiStatus( emojiStatusExpirationDate: Int ) : KBaseRequest(BaseResponse::class) { - val userId: Long by requestParameter(userId, customParameterName = "user_id") - val emojiStatusCustomEmojiId: String by requestParameter(emojiStatusCustomEmojiId, customParameterName = "emoji_status_custom_emoji_id") - val emojiStatusExpirationDate: Int by requestParameter(emojiStatusExpirationDate, customParameterName = "emoji_status_expiration_date") + val userId: Long by requestParameter(userId) + val emojiStatusCustomEmojiId: String by requestParameter(emojiStatusCustomEmojiId) + val emojiStatusExpirationDate: Int by requestParameter(emojiStatusExpirationDate) } \ No newline at end of file diff --git a/library/src/main/java/com/pengrad/telegrambot/utility/kotlin/RequestParameterDelegate.kt b/library/src/main/java/com/pengrad/telegrambot/utility/kotlin/RequestParameterDelegate.kt index 2b163d7b..74f50f77 100644 --- a/library/src/main/java/com/pengrad/telegrambot/utility/kotlin/RequestParameterDelegate.kt +++ b/library/src/main/java/com/pengrad/telegrambot/utility/kotlin/RequestParameterDelegate.kt @@ -49,9 +49,15 @@ class RequestParameterDelegate, V>( private fun updateRequestValue(thisRef: T, property: KProperty<*>, value: V) { thisRef.addParameter( - name = customParameterName ?: property.name, // todo: format field name - camelCase to snake_case + name = customParameterName ?: convertToSnakeCase(property.name), value = valueMapper?.invoke(value) ?: value ) } +} + +fun convertToSnakeCase(input: String): String { + return input.replace(Regex("([a-z])([A-Z])")) { + "${it.groupValues[1]}_${it.groupValues[2]}" + }.lowercase() } \ No newline at end of file