diff --git a/tgbotapi.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/gifts/GiftPremiumSubscription.kt b/tgbotapi.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/gifts/GiftPremiumSubscription.kt new file mode 100644 index 0000000000..4fdacd6412 --- /dev/null +++ b/tgbotapi.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/gifts/GiftPremiumSubscription.kt @@ -0,0 +1,30 @@ +package dev.inmo.tgbotapi.extensions.api.gifts + +import dev.inmo.tgbotapi.bot.TelegramBot +import dev.inmo.tgbotapi.requests.gifts.GiftPremiumSubscription +import dev.inmo.tgbotapi.types.UserId +import dev.inmo.tgbotapi.types.message.ParseMode +import dev.inmo.tgbotapi.types.message.textsources.TextSourcesList + +public suspend fun TelegramBot.giftPremiumSubscription( + userId: UserId, + monthCount: Int, + starCount: Int, + text: String, + parseMode: ParseMode? = null +): Boolean = execute( + GiftPremiumSubscription( + userId, monthCount, starCount, text, parseMode + ) +) + +public suspend fun TelegramBot.giftPremiumSubscription( + userId: UserId, + monthCount: Int, + starCount: Int, + textSources: TextSourcesList? = null, +): Boolean = execute( + GiftPremiumSubscription( + userId, monthCount, starCount, textSources + ) +) diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/gifts/GiftPremiumSubscription.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/gifts/GiftPremiumSubscription.kt new file mode 100644 index 0000000000..a83f1b88f7 --- /dev/null +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/requests/gifts/GiftPremiumSubscription.kt @@ -0,0 +1,83 @@ +package dev.inmo.tgbotapi.requests.gifts + +import dev.inmo.tgbotapi.abstracts.TextedOutput +import dev.inmo.tgbotapi.requests.abstracts.SimpleRequest +import dev.inmo.tgbotapi.types.UserId +import dev.inmo.tgbotapi.types.message.ParseMode +import dev.inmo.tgbotapi.types.message.RawMessageEntities +import dev.inmo.tgbotapi.types.message.asTextSources +import dev.inmo.tgbotapi.types.message.textsources.TextSourcesList +import dev.inmo.tgbotapi.types.message.toRawMessageEntities +import dev.inmo.tgbotapi.types.monthCountField +import dev.inmo.tgbotapi.types.starCountField +import dev.inmo.tgbotapi.types.textEntitiesField +import dev.inmo.tgbotapi.types.textField +import dev.inmo.tgbotapi.types.textParseModeField +import dev.inmo.tgbotapi.types.userIdField +import dev.inmo.tgbotapi.utils.extensions.makeSourceString +import kotlinx.serialization.DeserializationStrategy +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.SerializationStrategy +import kotlinx.serialization.builtins.serializer + +@Serializable +data class GiftPremiumSubscription internal constructor( + @SerialName(userIdField) + val userId: UserId, + @SerialName(monthCountField) + val monthCount: Int, + @SerialName(starCountField) + val starCount: Int, + @SerialName(textField) + override val text: String? = null, + @SerialName(textParseModeField) + override val parseMode: ParseMode? = null, + @SerialName(textEntitiesField) + private val rawEntities: RawMessageEntities? = null, +) : SimpleRequest, TextedOutput { + override val textSources: TextSourcesList? by lazy { + rawEntities?.let { + text?.let { _ -> + it.asTextSources(text) + } + } + } + + override fun method(): String = "giftPremiumSubscription" + + override val requestSerializer: SerializationStrategy<*> + get() = serializer() + + override val resultDeserializer: DeserializationStrategy + get() = Boolean.serializer() + + constructor( + userId: UserId, + monthCount: Int, + starCount: Int, + text: String, + parseMode: ParseMode? + ) : this( + userId = userId, + monthCount = monthCount, + starCount = starCount, + text = text, + parseMode = parseMode, + rawEntities = null, + ) + + constructor( + userId: UserId, + monthCount: Int, + starCount: Int, + textSources: TextSourcesList? = null + ) : this( + userId = userId, + monthCount = monthCount, + starCount = starCount, + text = textSources?.makeSourceString(), + parseMode = null, + rawEntities = textSources?.toRawMessageEntities() + ) +} \ No newline at end of file diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/Common.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/Common.kt index bfb847d309..c5b676da79 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/Common.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/Common.kt @@ -501,6 +501,8 @@ const val questionParseModeField = "question_parse_mode" const val optionsField = "options" const val payField = "pay" const val permissionsField = "permissions" +const val premiumSubscriptionDurationField = "premium_subscription_duration" +const val transactionTypeField = "transaction_type" const val typeField = "type" const val valueField = "value" const val creatorField = "creator" @@ -683,6 +685,7 @@ const val onlyNewMembersField = "only_new_members" const val hasPublicWinnersField = "has_public_winners" const val prizeDescriptionField = "prize_description" const val premiumSubscriptionMonthCountField = "premium_subscription_month_count" +const val monthCountField = "month_count" const val winnersField = "winners" const val additionalChatCountField = "additional_chat_count" const val unclaimedPrizeCountField = "unclaimed_prize_count" diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/payments/stars/TransactionPartner.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/payments/stars/TransactionPartner.kt index ea7263dae4..cbe6513725 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/payments/stars/TransactionPartner.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/payments/stars/TransactionPartner.kt @@ -48,6 +48,8 @@ sealed interface TransactionPartner { data class User( @SerialName(userField) val user: PreviewUser, + @SerialName(transactionTypeField) + val transactionType: TransactionType, @SerialName(affiliateField) val affiliate: AffiliateInfo? = null, @SerialName(invoicePayloadField) @@ -59,8 +61,10 @@ sealed interface TransactionPartner { val paidMedia: List? = null, @SerialName(paidMediaPayloadField) val paidMediaPayload: PaidMediaPayload? = null, + @SerialName(premiumSubscriptionDurationField) + val premiumSubscriptionDuration: Int? = null, @SerialName(giftField) - val gift: Gift.Regular? = null + val gift: Gift.Regular? = null, ) : TransactionPartner, SubscriptionPeriodInfo { @EncodeDefault override val type: String = Companion.type @@ -150,6 +154,8 @@ sealed interface TransactionPartner { val subscription_period: TimeSpan? = null, val paid_media: List? = null, val paid_media_payload: PaidMediaPayload? = null, + val premium_subscription_duration: Int? = null, + val transaction_type: TransactionType? = null, val gift: Gift.Regular? = null, val request_count: Int? = null, val sponsor_user: PreviewBot? = null, @@ -180,7 +186,9 @@ sealed interface TransactionPartner { subscriptionPeriod = subscription_period, paidMedia = paid_media, paidMediaPayload = paid_media_payload, - gift = gift + gift = gift, + premiumSubscriptionDuration = premium_subscription_duration, + transactionType = transaction_type ?: return unknown, ) TelegramAPI.type -> TelegramAPI( data.request_count ?: return unknown, @@ -216,7 +224,9 @@ sealed interface TransactionPartner { subscription_period = subscriptionPeriod, paid_media = paidMedia, paid_media_payload = paidMediaPayload, - gift = gift + gift = gift, + premium_subscription_duration = premiumSubscriptionDuration, + transaction_type = transactionType ) is TelegramAPI -> Surrogate(type = value.type, request_count = requestCount) is Fragment -> Surrogate( diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/payments/stars/TransactionType.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/payments/stars/TransactionType.kt new file mode 100644 index 0000000000..97df20f684 --- /dev/null +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/payments/stars/TransactionType.kt @@ -0,0 +1,38 @@ +package dev.inmo.tgbotapi.types.payments.stars + +import kotlinx.serialization.KSerializer +import kotlinx.serialization.Serializable +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder + +@Serializable(with = TransactionTypeSerializer::class) +enum class TransactionType { + INVOICE_PAYMENT, + PAID_MEDIA_PAYMENT, + GIFT_PURCHASE, + PREMIUM_PURCHASE, + BUSINESS_ACCOUNT_TRANSFER, + UNKNOWN +} + +private object TransactionTypeSerializer : KSerializer { + override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor( + serialName = "dev.inmo.tgbotapi.types.payments.stars.TransactionType", + kind = PrimitiveKind.STRING + ) + + override fun deserialize(decoder: Decoder): TransactionType { + return try { + TransactionType.valueOf(decoder.decodeString()) + } catch (e: IllegalArgumentException) { + TransactionType.UNKNOWN + } + } + + override fun serialize(encoder: Encoder, value: TransactionType) { + encoder.encodeString(value.name) + } +}