1
0
mirror of https://github.com/InsanusMokrassar/TelegramBotAPI.git synced 2025-09-03 23:29:33 +00:00

Merge pull request #967 from bpavuk/api-v9.0-premium

API v9.0 - Telegram Premium
This commit is contained in:
2025-04-30 08:22:07 +06:00
committed by GitHub
5 changed files with 167 additions and 3 deletions

View File

@@ -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
)
)

View File

@@ -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<Boolean>, 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<Boolean>
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()
)
}

View File

@@ -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"

View File

@@ -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<PaidMedia>? = 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<PaidMedia>? = 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(

View File

@@ -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<TransactionType> {
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)
}
}