1
0
mirror of https://github.com/InsanusMokrassar/TelegramBotAPI.git synced 2025-09-04 15:49:41 +00:00

Merge branch '25.0.0' into api-v9.0-premium

This commit is contained in:
Bodya
2025-04-22 22:48:26 +03:00
committed by GitHub
73 changed files with 3863 additions and 571 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -78,6 +78,6 @@ dependencies {
ksp {
arg("cctargetPackage", "dev.inmo.tgbotapi.extensions.utils")
arg("ccoutputFileName", "ClassCastsNew")
arg("ccoutputFolder", project(":tgbotapi.utils").file("src/commonMain/kotlin").absolutePath)
arg("ccoutputFileName", "ClassCastsNew.kt")
arg("ccoutputFolder", project(":tgbotapi.utils").file("src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils").absolutePath)
}

View File

@@ -0,0 +1,13 @@
package dev.inmo.tgbotapi.requests.abstracts
import dev.inmo.tgbotapi.abstracts.types.WithBusinessConnectionId
import dev.inmo.tgbotapi.types.business_connection.BusinessConnectionId
import kotlinx.serialization.json.JsonObject
interface BusinessRequest<T: Any> : Request<T>, WithBusinessConnectionId {
interface Simple<T : Any> : BusinessRequest<T>, SimpleRequest<T>
interface Multipart<T : Any> : BusinessRequest<T>, MultipartRequest.Common<T>, SimpleRequest<T> {
override val data: SimpleRequest<T>
get() = this
}
}

View File

@@ -0,0 +1,27 @@
package dev.inmo.tgbotapi.requests.business_connection
import dev.inmo.tgbotapi.requests.abstracts.BusinessRequest
import dev.inmo.tgbotapi.types.MessageId
import dev.inmo.tgbotapi.types.businessConnectionIdField
import dev.inmo.tgbotapi.types.business_connection.BusinessConnectionId
import dev.inmo.tgbotapi.types.messageIdsField
import kotlinx.serialization.DeserializationStrategy
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.SerializationStrategy
import kotlinx.serialization.builtins.serializer
@Serializable
data class DeleteBusinessMessages(
@SerialName(businessConnectionIdField)
override val businessConnectionId: BusinessConnectionId,
@SerialName(messageIdsField)
val messagesIds: List<MessageId>
) : BusinessRequest.Simple<Boolean> {
override fun method(): String = "deleteBusinessMessages"
override val resultDeserializer: DeserializationStrategy<Boolean>
get() = Boolean.serializer()
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
}

View File

@@ -0,0 +1,36 @@
package dev.inmo.tgbotapi.requests.business_connection
import dev.inmo.tgbotapi.requests.abstracts.BusinessRequest
import dev.inmo.tgbotapi.requests.abstracts.SimpleRequest
import dev.inmo.tgbotapi.types.ChatId
import dev.inmo.tgbotapi.types.MessageId
import dev.inmo.tgbotapi.types.Username
import dev.inmo.tgbotapi.types.bioField
import dev.inmo.tgbotapi.types.businessConnectionIdField
import dev.inmo.tgbotapi.types.business_connection.BusinessConnectionId
import dev.inmo.tgbotapi.types.chatIdField
import dev.inmo.tgbotapi.types.firstNameField
import dev.inmo.tgbotapi.types.lastNameField
import dev.inmo.tgbotapi.types.message.RawMessage
import dev.inmo.tgbotapi.types.messageIdField
import dev.inmo.tgbotapi.types.messageIdsField
import dev.inmo.tgbotapi.types.payments.stars.StarAmount
import dev.inmo.tgbotapi.types.usernameField
import kotlinx.serialization.DeserializationStrategy
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.SerializationStrategy
import kotlinx.serialization.builtins.serializer
@Serializable
data class GetBusinessAccountStarBalance(
@SerialName(businessConnectionIdField)
override val businessConnectionId: BusinessConnectionId,
) : BusinessRequest.Simple<StarAmount> {
override fun method(): String = "getBusinessAccountStarBalance"
override val resultDeserializer: DeserializationStrategy<StarAmount>
get() = StarAmount.serializer()
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
}

View File

@@ -0,0 +1,62 @@
package dev.inmo.tgbotapi.requests.business_connection
import dev.inmo.tgbotapi.requests.abstracts.MultipartFile
import dev.inmo.tgbotapi.types.DoubleSeconds
import dev.inmo.tgbotapi.types.Seconds
import dev.inmo.tgbotapi.types.StickerFormat
import dev.inmo.tgbotapi.types.animationField
import dev.inmo.tgbotapi.types.mainFrameTimestampField
import dev.inmo.tgbotapi.types.photoField
import dev.inmo.tgbotapi.utils.deserializeWithRaw
import kotlinx.serialization.EncodeDefault
import kotlinx.serialization.KSerializer
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import kotlinx.serialization.json.JsonObject
@Serializable
sealed interface InputProfilePhoto {
val type: String
val mediaPair: Pair<String, MultipartFile>
@Serializable
data class Static(
@SerialName(photoField)
val photo: MultipartFile
) : InputProfilePhoto {
override val mediaPair: Pair<String, MultipartFile>
get() = photoField to photo
@EncodeDefault
override val type: String = "static"
}
@Serializable
data class Animated(
@SerialName(animationField)
val animation: MultipartFile,
@SerialName(mainFrameTimestampField)
val mainFrameTimestamp: DoubleSeconds? = null
) : InputProfilePhoto {
override val mediaPair: Pair<String, MultipartFile>
get() = animationField to animation
@EncodeDefault
override val type: String = "animated"
}
companion object : KSerializer<InputProfilePhoto> {
override val descriptor: SerialDescriptor
get() = JsonObject.serializer().descriptor
override fun deserialize(decoder: Decoder): InputProfilePhoto {
error("Deserialization is not supported yet")
}
override fun serialize(encoder: Encoder, value: InputProfilePhoto) {
when (value) {
is Animated -> Animated.serializer().serialize(encoder, value)
is Static -> Static.serializer().serialize(encoder, value)
}
}
}
}

View File

@@ -0,0 +1,33 @@
package dev.inmo.tgbotapi.requests.business_connection
import dev.inmo.tgbotapi.requests.abstracts.BusinessRequest
import dev.inmo.tgbotapi.requests.abstracts.SimpleRequest
import dev.inmo.tgbotapi.types.ChatId
import dev.inmo.tgbotapi.types.MessageId
import dev.inmo.tgbotapi.types.businessConnectionIdField
import dev.inmo.tgbotapi.types.business_connection.BusinessConnectionId
import dev.inmo.tgbotapi.types.chatIdField
import dev.inmo.tgbotapi.types.message.RawMessage
import dev.inmo.tgbotapi.types.messageIdField
import kotlinx.serialization.DeserializationStrategy
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.SerializationStrategy
import kotlinx.serialization.builtins.serializer
@Serializable
data class ReadBusinessMessage(
@SerialName(businessConnectionIdField)
override val businessConnectionId: BusinessConnectionId,
@SerialName(chatIdField)
val chatId: ChatId,
@SerialName(messageIdField)
val messageId: MessageId
) : BusinessRequest.Simple<Boolean> {
override fun method(): String = "readBusinessMessage"
override val resultDeserializer: DeserializationStrategy<Boolean>
get() = Boolean.serializer()
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
}

View File

@@ -0,0 +1,39 @@
package dev.inmo.tgbotapi.requests.business_connection
import dev.inmo.tgbotapi.requests.abstracts.BusinessRequest
import dev.inmo.tgbotapi.requests.abstracts.MultipartFile
import dev.inmo.tgbotapi.requests.abstracts.SimpleRequest
import dev.inmo.tgbotapi.types.ChatId
import dev.inmo.tgbotapi.types.MessageId
import dev.inmo.tgbotapi.types.Username
import dev.inmo.tgbotapi.types.businessConnectionIdField
import dev.inmo.tgbotapi.types.business_connection.BusinessConnectionId
import dev.inmo.tgbotapi.types.chatIdField
import dev.inmo.tgbotapi.types.firstNameField
import dev.inmo.tgbotapi.types.isPublicField
import dev.inmo.tgbotapi.types.lastNameField
import dev.inmo.tgbotapi.types.message.RawMessage
import dev.inmo.tgbotapi.types.messageIdField
import dev.inmo.tgbotapi.types.messageIdsField
import dev.inmo.tgbotapi.types.photoField
import dev.inmo.tgbotapi.types.usernameField
import kotlinx.serialization.DeserializationStrategy
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.SerializationStrategy
import kotlinx.serialization.builtins.serializer
@Serializable
data class RemoveBusinessAccountProfilePhoto(
@SerialName(businessConnectionIdField)
override val businessConnectionId: BusinessConnectionId,
@SerialName(isPublicField)
val isPublic: Boolean = false
) : BusinessRequest.Simple<Boolean> {
override fun method(): String = "removeBusinessAccountProfilePhoto"
override val resultDeserializer: DeserializationStrategy<Boolean>
get() = Boolean.serializer()
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
}

View File

@@ -0,0 +1,37 @@
package dev.inmo.tgbotapi.requests.business_connection
import dev.inmo.tgbotapi.requests.abstracts.BusinessRequest
import dev.inmo.tgbotapi.requests.abstracts.SimpleRequest
import dev.inmo.tgbotapi.types.ChatId
import dev.inmo.tgbotapi.types.MessageId
import dev.inmo.tgbotapi.types.Username
import dev.inmo.tgbotapi.types.bioField
import dev.inmo.tgbotapi.types.businessConnectionIdField
import dev.inmo.tgbotapi.types.business_connection.BusinessConnectionId
import dev.inmo.tgbotapi.types.chatIdField
import dev.inmo.tgbotapi.types.firstNameField
import dev.inmo.tgbotapi.types.lastNameField
import dev.inmo.tgbotapi.types.message.RawMessage
import dev.inmo.tgbotapi.types.messageIdField
import dev.inmo.tgbotapi.types.messageIdsField
import dev.inmo.tgbotapi.types.usernameField
import kotlinx.serialization.DeserializationStrategy
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.SerializationStrategy
import kotlinx.serialization.builtins.serializer
@Serializable
data class SetBusinessAccountBio(
@SerialName(businessConnectionIdField)
override val businessConnectionId: BusinessConnectionId,
@SerialName(bioField)
val bio: String
) : BusinessRequest.Simple<Boolean> {
override fun method(): String = "setBusinessAccountBio"
override val resultDeserializer: DeserializationStrategy<Boolean>
get() = Boolean.serializer()
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
}

View File

@@ -0,0 +1,36 @@
package dev.inmo.tgbotapi.requests.business_connection
import dev.inmo.tgbotapi.requests.abstracts.BusinessRequest
import dev.inmo.tgbotapi.requests.abstracts.SimpleRequest
import dev.inmo.tgbotapi.types.ChatId
import dev.inmo.tgbotapi.types.MessageId
import dev.inmo.tgbotapi.types.businessConnectionIdField
import dev.inmo.tgbotapi.types.business_connection.BusinessConnectionId
import dev.inmo.tgbotapi.types.chatIdField
import dev.inmo.tgbotapi.types.firstNameField
import dev.inmo.tgbotapi.types.lastNameField
import dev.inmo.tgbotapi.types.message.RawMessage
import dev.inmo.tgbotapi.types.messageIdField
import dev.inmo.tgbotapi.types.messageIdsField
import kotlinx.serialization.DeserializationStrategy
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.SerializationStrategy
import kotlinx.serialization.builtins.serializer
@Serializable
data class SetBusinessAccountName(
@SerialName(businessConnectionIdField)
override val businessConnectionId: BusinessConnectionId,
@SerialName(firstNameField)
val firstName: String,
@SerialName(lastNameField)
val lastName: String? = null
) : BusinessRequest.Simple<Boolean> {
override fun method(): String = "setBusinessAccountName"
override val resultDeserializer: DeserializationStrategy<Boolean>
get() = Boolean.serializer()
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
}

View File

@@ -0,0 +1,45 @@
package dev.inmo.tgbotapi.requests.business_connection
import dev.inmo.tgbotapi.requests.abstracts.BusinessRequest
import dev.inmo.tgbotapi.requests.abstracts.MultipartFile
import dev.inmo.tgbotapi.requests.abstracts.SimpleRequest
import dev.inmo.tgbotapi.types.ChatId
import dev.inmo.tgbotapi.types.MessageId
import dev.inmo.tgbotapi.types.Username
import dev.inmo.tgbotapi.types.businessConnectionIdField
import dev.inmo.tgbotapi.types.business_connection.BusinessConnectionId
import dev.inmo.tgbotapi.types.chatIdField
import dev.inmo.tgbotapi.types.firstNameField
import dev.inmo.tgbotapi.types.isPublicField
import dev.inmo.tgbotapi.types.lastNameField
import dev.inmo.tgbotapi.types.message.RawMessage
import dev.inmo.tgbotapi.types.messageIdField
import dev.inmo.tgbotapi.types.messageIdsField
import dev.inmo.tgbotapi.types.photoField
import dev.inmo.tgbotapi.types.usernameField
import kotlinx.serialization.DeserializationStrategy
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.SerializationStrategy
import kotlinx.serialization.builtins.serializer
@Serializable
data class SetBusinessAccountProfilePhoto(
@SerialName(businessConnectionIdField)
override val businessConnectionId: BusinessConnectionId,
@SerialName(photoField)
val photo: InputProfilePhoto,
@SerialName(isPublicField)
val isPublic: Boolean = false
) : BusinessRequest.Multipart<Boolean> {
override fun method(): String = "setBusinessAccountProfilePhoto"
override val resultDeserializer: DeserializationStrategy<Boolean>
get() = Boolean.serializer()
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
override val mediaMap: Map<String, MultipartFile> = mapOf(
photo.mediaPair
)
}

View File

@@ -0,0 +1,36 @@
package dev.inmo.tgbotapi.requests.business_connection
import dev.inmo.tgbotapi.requests.abstracts.BusinessRequest
import dev.inmo.tgbotapi.requests.abstracts.SimpleRequest
import dev.inmo.tgbotapi.types.ChatId
import dev.inmo.tgbotapi.types.MessageId
import dev.inmo.tgbotapi.types.Username
import dev.inmo.tgbotapi.types.businessConnectionIdField
import dev.inmo.tgbotapi.types.business_connection.BusinessConnectionId
import dev.inmo.tgbotapi.types.chatIdField
import dev.inmo.tgbotapi.types.firstNameField
import dev.inmo.tgbotapi.types.lastNameField
import dev.inmo.tgbotapi.types.message.RawMessage
import dev.inmo.tgbotapi.types.messageIdField
import dev.inmo.tgbotapi.types.messageIdsField
import dev.inmo.tgbotapi.types.usernameField
import kotlinx.serialization.DeserializationStrategy
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.SerializationStrategy
import kotlinx.serialization.builtins.serializer
@Serializable
data class SetBusinessAccountUsername(
@SerialName(businessConnectionIdField)
override val businessConnectionId: BusinessConnectionId,
@SerialName(usernameField)
val username: Username
) : BusinessRequest.Simple<Boolean> {
override fun method(): String = "setBusinessAccountUsername"
override val resultDeserializer: DeserializationStrategy<Boolean>
get() = Boolean.serializer()
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
}

View File

@@ -0,0 +1,39 @@
package dev.inmo.tgbotapi.requests.business_connection
import dev.inmo.tgbotapi.requests.abstracts.BusinessRequest
import dev.inmo.tgbotapi.requests.abstracts.SimpleRequest
import dev.inmo.tgbotapi.types.ChatId
import dev.inmo.tgbotapi.types.MessageId
import dev.inmo.tgbotapi.types.Username
import dev.inmo.tgbotapi.types.bioField
import dev.inmo.tgbotapi.types.businessConnectionIdField
import dev.inmo.tgbotapi.types.business_connection.BusinessConnectionId
import dev.inmo.tgbotapi.types.chatIdField
import dev.inmo.tgbotapi.types.firstNameField
import dev.inmo.tgbotapi.types.lastNameField
import dev.inmo.tgbotapi.types.message.RawMessage
import dev.inmo.tgbotapi.types.messageIdField
import dev.inmo.tgbotapi.types.messageIdsField
import dev.inmo.tgbotapi.types.payments.stars.StarAmount
import dev.inmo.tgbotapi.types.starCountField
import dev.inmo.tgbotapi.types.usernameField
import kotlinx.serialization.DeserializationStrategy
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.SerializationStrategy
import kotlinx.serialization.builtins.serializer
@Serializable
data class TransferBusinessAccountStarBalance(
@SerialName(businessConnectionIdField)
override val businessConnectionId: BusinessConnectionId,
@SerialName(starCountField)
val starCount: Int
) : BusinessRequest.Simple<Boolean> {
override fun method(): String = "transferBusinessAccountStars"
override val resultDeserializer: DeserializationStrategy<Boolean>
get() = Boolean.serializer()
override val requestSerializer: SerializationStrategy<*>
get() = serializer()
}

View File

@@ -5,6 +5,7 @@ import dev.inmo.tgbotapi.utils.BuiltinMimeTypes
import kotlinx.serialization.Serializable
import kotlin.jvm.JvmInline
typealias ForwardSignature = String
typealias ForwardSenderName = String
typealias AuthorSignature = ForwardSignature
@@ -19,6 +20,7 @@ typealias GooglePlaceType = String
typealias MembersLimit = Int
typealias Seconds = Int
typealias DoubleSeconds = Double
typealias MilliSeconds = Long
typealias LongSeconds = Long
typealias UnixTimeStamp = LongSeconds
@@ -186,6 +188,19 @@ const val hasMainWebAppField = "has_main_web_app"
const val canJoinGroupsField = "can_join_groups"
const val canReadAllGroupMessagesField = "can_read_all_group_messages"
const val canReplyField = "can_reply"
const val canReadMessagesField = "can_read_messages"
const val canDeleteOutgoingMessagesField = "can_delete_outgoing_messages"
const val canDeleteAllMessagesField = "can_delete_all_messages"
const val canEditNameField = "can_edit_name"
const val canEditBioField = "can_edit_bio"
const val canEditProfilePhotoField = "can_edit_profile_photo"
const val canEditUsernameField = "can_edit_username"
const val canChangeGiftSettingsField = "can_change_gift_settings"
const val canViewGiftsAndStarsField = "can_view_gifts_and_stars"
const val canConvertGiftsToStarsField = "can_convert_gifts_to_stars"
const val canTransferAndUpgradeGiftsField = "can_transfer_and_upgrade_gifts"
const val canTransferStarsField = "can_transfer_stars"
const val canManageStoriesField = "can_manage_stories"
const val supportInlineQueriesField = "supports_inline_queries"
const val canConnectToBusinessField = "can_connect_to_business"
const val textEntitiesField = "text_entities"
@@ -494,8 +509,19 @@ const val creatorField = "creator"
const val subscriptionPeriodField = "subscription_period"
const val subscriptionPriceField = "subscription_price"
const val copyTextField = "copy_text"
const val isPublicField = "is_public"
const val giftField = "gift"
const val giftsField = "gifts"
const val rarityPerMilleField = "rarity_per_mille"
const val acceptedGiftTypesField = "accepted_gift_types"
const val ownedGiftIdField = "owned_gift_id"
const val convertStarCountField = "convert_star_count"
const val prepaidUpgradeStarCountField = "prepaid_upgrade_star_count"
const val canBeUpgradedField = "can_be_upgraded"
const val isPrivateField = "is_private"
const val transferStarCountField = "transfer_star_count"
const val pointField = "point"
const val xShiftField = "x_shift"
@@ -589,6 +615,11 @@ const val voiceField = "voice"
const val videoNoteField = "video_note"
const val mediaField = "media"
const val mainFrameTimestampField = "main_frame_timestamp"
const val paidMessageStarCountField = "paid_message_star_count"
const val paidStarCountField = "paid_star_count"
const val disableEditMessageField = "disable_edit_message"
const val scoreField = "score"
const val forceField = "force"
@@ -667,6 +698,22 @@ const val upgradeStarCountField = "upgrade_star_count"
const val payToUpgradeField = "pay_for_upgrade"
const val paidMediaField = "paid_media"
const val centerColorField = "center_color"
const val edgeColorField = "edge_color"
const val symbolColorField = "symbol_color"
const val textColorField = "text_color"
const val baseNameField = "base_name"
const val numberField = "number"
const val modelField = "model"
const val symbolField = "symbol"
const val backdropField = "backdrop"
const val unlimitedGiftsField = "unlimited_gifts"
const val limitedGiftsField = "limited_gifts"
const val uniqueGiftsField = "unique_gifts"
const val premiumSubscriptionField = "premium_subscription"
const val businessConnectionIdField = "business_connection_id"
const val businessIntroField = "business_intro"
const val businessLocationField = "business_location"

View File

@@ -0,0 +1,11 @@
package dev.inmo.tgbotapi.types
import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.CommonEvent
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class PaidMessagePriceChanged(
@SerialName(paidMessageStarCountField)
val cost: Int
) : CommonEvent

View File

@@ -0,0 +1,50 @@
package dev.inmo.tgbotapi.types.business_connection
import dev.inmo.tgbotapi.types.canChangeGiftSettingsField
import dev.inmo.tgbotapi.types.canConvertGiftsToStarsField
import dev.inmo.tgbotapi.types.canDeleteAllMessagesField
import dev.inmo.tgbotapi.types.canDeleteOutgoingMessagesField
import dev.inmo.tgbotapi.types.canEditBioField
import dev.inmo.tgbotapi.types.canEditNameField
import dev.inmo.tgbotapi.types.canEditProfilePhotoField
import dev.inmo.tgbotapi.types.canEditUsernameField
import dev.inmo.tgbotapi.types.canManageStoriesField
import dev.inmo.tgbotapi.types.canReadMessagesField
import dev.inmo.tgbotapi.types.canReplyField
import dev.inmo.tgbotapi.types.canTransferAndUpgradeGiftsField
import dev.inmo.tgbotapi.types.canTransferStarsField
import dev.inmo.tgbotapi.types.canViewGiftsAndStarsField
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class BusinessBotRights(
@SerialName(canReplyField)
val canReply: Boolean = false,
@SerialName(canReadMessagesField)
val canMarkMessagesAsRead: Boolean = false,
@SerialName(canDeleteOutgoingMessagesField)
val canDeleteOutgoingMessages: Boolean = false,
@SerialName(canDeleteAllMessagesField)
val canDeleteAllMessages: Boolean = false,
@SerialName(canEditNameField)
val canEditName: Boolean = false,
@SerialName(canEditBioField)
val canEditBio: Boolean = false,
@SerialName(canEditProfilePhotoField)
val canEditProfilePhoto: Boolean = false,
@SerialName(canEditUsernameField)
val canEditUsername: Boolean = false,
@SerialName(canChangeGiftSettingsField)
val canChangeGiftSettings: Boolean = false,
@SerialName(canViewGiftsAndStarsField)
val canViewGiftsAndStars: Boolean = false,
@SerialName(canConvertGiftsToStarsField)
val canConvertGiftsToStars: Boolean = false,
@SerialName(canTransferAndUpgradeGiftsField)
val canTransferAndUpgradeGifts: Boolean = false,
@SerialName(canTransferStarsField)
val canTransferStars: Boolean = false,
@SerialName(canManageStoriesField)
val canManageStories: Boolean = false,
)

View File

@@ -16,7 +16,9 @@ sealed interface BusinessConnection : WithBusinessConnectionId {
val user: PreviewUser
val userChatId: ChatId
val date: TelegramDate
val rights: BusinessBotRights
val canReply: Boolean
get() = rights.canReply
val isEnabled: Boolean
override val businessConnectionId: BusinessConnectionId
@@ -32,8 +34,8 @@ sealed interface BusinessConnection : WithBusinessConnectionId {
override val userChatId: ChatId,
@SerialName(dateField)
override val date: TelegramDate,
@SerialName(canReplyField)
override val canReply: Boolean,
@SerialName(rightsField)
override val rights: BusinessBotRights = BusinessBotRights(),
) : BusinessConnection {
@EncodeDefault
override val isEnabled: Boolean = true
@@ -49,8 +51,8 @@ sealed interface BusinessConnection : WithBusinessConnectionId {
override val userChatId: ChatId,
@SerialName(dateField)
override val date: TelegramDate,
@SerialName(canReplyField)
override val canReply: Boolean,
@SerialName(rightsField)
override val rights: BusinessBotRights = BusinessBotRights(),
) : BusinessConnection {
@EncodeDefault
override val isEnabled: Boolean = false

View File

@@ -15,8 +15,8 @@ internal data class RawBusinessConnection(
val userChatId: ChatId,
@SerialName(dateField)
val date: TelegramDate,
@SerialName(canReplyField)
val canReply: Boolean,
@SerialName(rightsField)
val rights: BusinessBotRights = BusinessBotRights(),
@SerialName(isEnabledField)
val isEnabled: Boolean
) {
@@ -27,14 +27,14 @@ internal data class RawBusinessConnection(
user = user,
userChatId = userChatId,
date = date,
canReply = canReply
rights = rights
)
false -> BusinessConnection.Disabled(
id = id,
user = user,
userChatId = userChatId,
date = date,
canReply = canReply
rights = rights
)
}
@@ -43,7 +43,7 @@ internal data class RawBusinessConnection(
user = businessConnection.user,
userChatId = businessConnection.userChatId,
date = businessConnection.date,
canReply = businessConnection.canReply,
rights = businessConnection.rights,
isEnabled = businessConnection.isEnabled,
)
}

View File

@@ -5,11 +5,11 @@ import dev.inmo.tgbotapi.types.business_connection.BusinessIntro
import dev.inmo.tgbotapi.types.business_connection.BusinessLocation
import dev.inmo.tgbotapi.types.business_connection.BusinessOpeningHours
import dev.inmo.tgbotapi.types.colors.ColorId
import dev.inmo.tgbotapi.types.gifts.AcceptedGiftTypes
import dev.inmo.tgbotapi.types.message.abstracts.Message
import dev.inmo.tgbotapi.types.message.abstracts.TelegramBotAPIMessageDeserializeOnlySerializer
import dev.inmo.tgbotapi.types.reactions.Reaction
import dev.inmo.tgbotapi.utils.RiskFeature
import korlibs.time.DateTime
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.JsonObject
@@ -21,6 +21,8 @@ data class ExtendedChannelChatImpl(
override val id: ChatId,
@SerialName(titleField)
override val title: String,
@SerialName(acceptedGiftTypesField)
override val acceptedGiftTypes: AcceptedGiftTypes,
@SerialName(usernameField)
override val username: Username? = null,
@SerialName(activeUsernamesField)
@@ -57,9 +59,7 @@ data class ExtendedChannelChatImpl(
@SerialName(hasVisibleHistoryField)
override val newMembersSeeHistory: Boolean = false,
@SerialName(maxReactionCountField)
override val maxReactionsCount: Int = 3,
@SerialName(canSendGiftsField)
override val canReceiveGifts: Boolean = false,
override val maxReactionsCount: Int = 3
) : ExtendedChannelChat
@Serializable
@@ -100,8 +100,8 @@ data class ExtendedGroupChatImpl(
override val newMembersSeeHistory: Boolean = false,
@SerialName(maxReactionCountField)
override val maxReactionsCount: Int = 3,
@SerialName(canSendGiftsField)
override val canReceiveGifts: Boolean = false,
@SerialName(acceptedGiftTypesField)
override val acceptedGiftTypes: AcceptedGiftTypes = AcceptedGiftTypes(),
) : ExtendedGroupChat
@Serializable
@@ -150,8 +150,8 @@ data class ExtendedPrivateChatImpl(
override val personalChat: PreviewChannelChat? = null,
@SerialName(maxReactionCountField)
override val maxReactionsCount: Int = 3,
@SerialName(canSendGiftsField)
override val canReceiveGifts: Boolean = false,
@SerialName(acceptedGiftTypesField)
override val acceptedGiftTypes: AcceptedGiftTypes = AcceptedGiftTypes(),
) : ExtendedPrivateChat
typealias ExtendedUser = ExtendedPrivateChatImpl
@@ -218,8 +218,8 @@ data class ExtendedSupergroupChatImpl(
override val customEmojiStickerSetName: StickerSetName? = null,
@SerialName(maxReactionCountField)
override val maxReactionsCount: Int = 3,
@SerialName(canSendGiftsField)
override val canReceiveGifts: Boolean = false,
@SerialName(acceptedGiftTypesField)
override val acceptedGiftTypes: AcceptedGiftTypes = AcceptedGiftTypes(),
) : ExtendedSupergroupChat
@Serializable
@@ -284,8 +284,8 @@ data class ExtendedForumChatImpl(
override val customEmojiStickerSetName: StickerSetName? = null,
@SerialName(maxReactionCountField)
override val maxReactionsCount: Int = 3,
@SerialName(canSendGiftsField)
override val canReceiveGifts: Boolean = false,
@SerialName(acceptedGiftTypesField)
override val acceptedGiftTypes: AcceptedGiftTypes = AcceptedGiftTypes(),
) : ExtendedForumChat
@Serializable
@@ -320,8 +320,8 @@ data class ExtendedBot(
override val maxReactionsCount: Int = 3,
@SerialName(hasMainWebAppField)
val hasMainWebApp: Boolean = false,
@SerialName(canSendGiftsField)
override val canReceiveGifts: Boolean = false,
@SerialName(acceptedGiftTypesField)
override val acceptedGiftTypes: AcceptedGiftTypes = AcceptedGiftTypes(),
) : Bot(), ExtendedChat {
@SerialName(isBotField)
private val isBot = true
@@ -351,6 +351,6 @@ data class UnknownExtendedChat(
override val profileBackgroundCustomEmojiId: CustomEmojiId? = null
@SerialName(maxReactionCountField)
override val maxReactionsCount: Int = 3
@SerialName(canSendGiftsField)
override val canReceiveGifts: Boolean = false
@SerialName(acceptedGiftTypesField)
override val acceptedGiftTypes: AcceptedGiftTypes = AcceptedGiftTypes()
}

View File

@@ -5,7 +5,7 @@ import dev.inmo.tgbotapi.types.business_connection.BusinessIntro
import dev.inmo.tgbotapi.types.business_connection.BusinessLocation
import dev.inmo.tgbotapi.types.business_connection.BusinessOpeningHours
import dev.inmo.tgbotapi.types.colors.ColorId
import dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage
import dev.inmo.tgbotapi.types.gifts.AcceptedGiftTypes
import dev.inmo.tgbotapi.types.message.abstracts.Message
import dev.inmo.tgbotapi.types.message.abstracts.TelegramBotAPIMessageDeserializeOnlySerializer
import dev.inmo.tgbotapi.types.reactions.Reaction
@@ -20,10 +20,18 @@ sealed interface ExtendedChat : Chat {
val profileBackgroundCustomEmojiId: CustomEmojiId?
val maxReactionsCount: Int
/**
* Represent `can_send_gifts` field
*/
val acceptedGiftTypes: AcceptedGiftTypes
@Deprecated(
message = "Telegram Bot API v9.0 introduced the new field, `acceptedGiftTypes`, to allow granular" +
" control over which types of gifts user, bot, or chat can accept.",
replaceWith = ReplaceWith("acceptedGiftTypes.uniqueGifts || acceptedGiftTypes.unlimitedGifts || acceptedGiftTypes.limitedGifts || acceptedGiftTypes.premiumSubscription")
)
val canReceiveGifts: Boolean
get() = acceptedGiftTypes.uniqueGifts ||
acceptedGiftTypes.unlimitedGifts ||
acceptedGiftTypes.limitedGifts ||
acceptedGiftTypes.premiumSubscription
}
@Serializable(ExtendedChatSerializer.Companion::class)
@@ -63,6 +71,7 @@ sealed interface ExtendedPrivateChat : PrivateChat, ExtendedChatWithUsername, Ex
sealed interface ExtendedPublicChat : ExtendedChat, PublicChat, ExtendedNonBotChat {
val description: String
val inviteLink: String?
@Serializable(TelegramBotAPIMessageDeserializeOnlySerializer::class)
val pinnedMessage: Message?
val membersHidden: Boolean

View File

@@ -0,0 +1,21 @@
package dev.inmo.tgbotapi.types.gifts
import dev.inmo.tgbotapi.types.limitedGiftsField
import dev.inmo.tgbotapi.types.premiumSubscriptionField
import dev.inmo.tgbotapi.types.uniqueGiftsField
import dev.inmo.tgbotapi.types.unlimitedGiftsField
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class AcceptedGiftTypes(
@SerialName(unlimitedGiftsField)
val unlimitedGifts: Boolean = false,
@SerialName(limitedGiftsField)
val limitedGifts: Boolean = false,
@SerialName(uniqueGiftsField)
val uniqueGifts: Boolean = false,
@SerialName(premiumSubscriptionField)
val premiumSubscription: Boolean = false
)

View File

@@ -2,6 +2,9 @@ package dev.inmo.tgbotapi.types.gifts
import dev.inmo.tgbotapi.types.*
import dev.inmo.tgbotapi.types.files.Sticker
import dev.inmo.tgbotapi.types.gifts.unique.UniqueGiftBackdrop
import dev.inmo.tgbotapi.types.gifts.unique.UniqueGiftModel
import dev.inmo.tgbotapi.types.gifts.unique.UniqueGiftSymbol
import kotlinx.serialization.KSerializer
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@@ -11,55 +14,133 @@ import kotlinx.serialization.encoding.Encoder
@Serializable(Gift.Companion::class)
sealed interface Gift {
val id: GiftId
val sticker: Sticker
val starCount: Int
val totalCount: Int?
val upgradeStarCount: Int?
val remainingCount: Int?
@Serializable(Regular.Companion::class)
sealed interface Regular : Gift {
val id: GiftId
val sticker: Sticker
val starCount: Int
val totalCount: Int?
val upgradeStarCount: Int?
val remainingCount: Int?
@Serializable
data class Unlimited(
@SerialName(idField)
override val id: GiftId,
@SerialName(stickerField)
override val sticker: Sticker,
@SerialName(starCountField)
override val starCount: Int,
@SerialName(upgradeStarCountField)
override val upgradeStarCount: Int? = null
) : Gift {
override val totalCount: Int?
get() = null
override val remainingCount: Int?
get() = null
@Serializable
data class Unlimited(
@SerialName(idField)
override val id: GiftId,
@SerialName(stickerField)
override val sticker: Sticker,
@SerialName(starCountField)
override val starCount: Int,
@SerialName(upgradeStarCountField)
override val upgradeStarCount: Int? = null
) : Regular {
override val totalCount: Int?
get() = null
override val remainingCount: Int?
get() = null
}
@Serializable
data class Limited(
@SerialName(idField)
override val id: GiftId,
@SerialName(stickerField)
override val sticker: Sticker,
@SerialName(starCountField)
override val starCount: Int,
@SerialName(totalCountField)
override val totalCount: Int,
@SerialName(remainingCountField)
override val remainingCount: Int,
@SerialName(upgradeStarCountField)
override val upgradeStarCount: Int? = null,
) : Regular
companion object : KSerializer<Regular> {
@Serializable
@Suppress("propertyName")
private data class RegularGiftSurrogate(
val id: GiftId,
val sticker: Sticker,
val star_count: Int,
val total_count: Int? = null,
val remaining_count: Int? = null,
val upgrade_star_count: Int? = null,
)
override val descriptor: SerialDescriptor
get() = RegularGiftSurrogate.serializer().descriptor
override fun deserialize(decoder: Decoder): Regular {
val surrogate = RegularGiftSurrogate.serializer().deserialize(decoder)
return if (surrogate.total_count != null && surrogate.remaining_count != null) {
Limited(
id = surrogate.id,
sticker = surrogate.sticker,
starCount = surrogate.star_count,
totalCount = surrogate.total_count,
remainingCount = surrogate.remaining_count,
upgradeStarCount = surrogate.upgrade_star_count,
)
} else {
Unlimited(
id = surrogate.id,
sticker = surrogate.sticker,
starCount = surrogate.star_count,
upgradeStarCount = surrogate.upgrade_star_count,
)
}
}
override fun serialize(encoder: Encoder, value: Regular) {
val surrogate = RegularGiftSurrogate(
id = value.id,
sticker = value.sticker,
star_count = value.starCount,
total_count = value.totalCount,
remaining_count = value.remainingCount,
upgrade_star_count = value.upgradeStarCount
)
RegularGiftSurrogate.serializer().serialize(encoder, surrogate)
}
}
}
@Serializable
data class Limited(
@SerialName(idField)
override val id: GiftId,
@SerialName(stickerField)
override val sticker: Sticker,
@SerialName(starCountField)
override val starCount: Int,
@SerialName(totalCountField)
override val totalCount: Int,
@SerialName(remainingCountField)
override val remainingCount: Int,
@SerialName(upgradeStarCountField)
override val upgradeStarCount: Int? = null,
data class Unique(
@SerialName(baseNameField)
val baseName: String,
@SerialName(nameField)
val name: String,
@SerialName(numberField)
val number: Int,
@SerialName(modelField)
val model: UniqueGiftModel,
@SerialName(symbolField)
val symbol: UniqueGiftSymbol,
@SerialName(backdropField)
val backdrop: UniqueGiftBackdrop
) : Gift
companion object : KSerializer<Gift> {
@Serializable
private data class GiftSurrogate(
val id: GiftId,
val sticker: Sticker,
val star_count: Int,
@Suppress("unused", "propertyName")
private class GiftSurrogate(
// regular gift fields
val id: GiftId?,
val sticker: Sticker?,
val star_count: Int?,
val total_count: Int? = null,
val remaining_count: Int? = null,
val upgrade_star_count: Int? = null,
// unique gift fields
val base_name: String? = null,
val name: String? = null,
val number: Int? = null,
val model: UniqueGiftModel? = null,
val symbol: UniqueGiftSymbol? = null,
val backdrop: UniqueGiftBackdrop? = null,
)
override val descriptor: SerialDescriptor
@@ -68,33 +149,37 @@ sealed interface Gift {
override fun deserialize(decoder: Decoder): Gift {
val surrogate = GiftSurrogate.serializer().deserialize(decoder)
return if (surrogate.total_count != null && surrogate.remaining_count != null) {
Limited(
id = surrogate.id,
sticker = surrogate.sticker,
starCount = surrogate.star_count,
totalCount = surrogate.total_count,
remainingCount = surrogate.remaining_count,
upgradeStarCount = surrogate.upgrade_star_count,
return if (surrogate.base_name != null && surrogate.name != null && surrogate.number != null && surrogate.model != null && surrogate.symbol != null && surrogate.backdrop != null) {
Unique(
baseName = surrogate.base_name,
name = surrogate.name,
number = surrogate.number,
model = surrogate.model,
symbol = surrogate.symbol,
backdrop = surrogate.backdrop,
)
} else {
Unlimited(
id = surrogate.id,
sticker = surrogate.sticker,
starCount = surrogate.star_count,
upgradeStarCount = surrogate.upgrade_star_count,
)
decoder.decodeSerializableValue(Regular.serializer())
}
}
override fun serialize(encoder: Encoder, value: Gift) {
override fun serialize(
encoder: Encoder,
value: Gift
) {
val surrogate = GiftSurrogate(
id = value.id,
sticker = value.sticker,
star_count = value.starCount,
total_count = value.totalCount,
remaining_count = value.remainingCount,
upgrade_star_count = value.upgradeStarCount
id = (value as? Regular)?.id,
sticker = (value as? Regular)?.sticker,
star_count = (value as? Regular)?.starCount,
total_count = (value as? Regular.Limited)?.totalCount,
remaining_count = (value as? Regular.Limited)?.remainingCount,
upgrade_star_count = (value as? Regular)?.upgradeStarCount,
base_name = (value as? Unique)?.baseName,
name = (value as? Unique)?.name,
number = (value as? Unique)?.number,
model = (value as? Unique)?.model,
symbol = (value as? Unique)?.symbol,
backdrop = (value as? Unique)?.backdrop,
)
GiftSurrogate.serializer().serialize(encoder, surrogate)
}

View File

@@ -0,0 +1,286 @@
package dev.inmo.tgbotapi.types.gifts
import dev.inmo.tgbotapi.abstracts.TextedInput
import dev.inmo.tgbotapi.types.*
import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.CommonEvent
import dev.inmo.tgbotapi.types.message.RawMessageEntities
import dev.inmo.tgbotapi.types.message.asTextSources
import dev.inmo.tgbotapi.types.message.textsources.TextSource
import dev.inmo.tgbotapi.types.message.textsources.TextSourcesList
import dev.inmo.tgbotapi.types.message.toRawMessageEntities
import dev.inmo.tgbotapi.utils.internal.ClassCastsIncluded
import kotlinx.serialization.KSerializer
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import kotlin.jvm.JvmName
/**
* Represent Telegram Bots API abstraction [GiftInfo](https://core.telegram.org/bots/api#giftinfo) and
* [UniqueGiftInfo](https://core.telegram.org/bots/api#uniquegiftinfo)
*
* @see ReceivedInBusinessAccount
* @see Regular.Common
* @see Regular.ReceivedInBusinessAccount
* @see Unique.Common
* @see Unique.ReceivedInBusinessAccount
*/
@Serializable
sealed interface GiftSentOrReceived : CommonEvent {
val ownedGiftId: GiftId?
val gift: Gift
@Serializable
sealed interface ReceivedInBusinessAccount : GiftSentOrReceived {
override val ownedGiftId: GiftId
}
@Serializable(Regular.Companion::class)
sealed interface Regular : GiftSentOrReceived, TextedInput {
override val gift: Gift.Regular
val convertStarCount: Int?
val prepaidUpgradeStarCount: Int?
val canBeUpgraded: Boolean
val isPrivate: Boolean
@Serializable
data class Common(
@SerialName(giftField)
override val gift: Gift.Regular,
@SerialName(convertStarCountField)
override val convertStarCount: Int? = null,
@SerialName(prepaidUpgradeStarCountField)
override val prepaidUpgradeStarCount: Int? = null,
@SerialName(canBeUpgradedField)
override val canBeUpgraded: Boolean = false,
@SerialName(textField)
override val text: String? = null,
@SerialName(entitiesField)
private val entities: RawMessageEntities? = null,
@SerialName(isPrivateField)
override val isPrivate: Boolean = false
) : Regular {
override val textSources: List<TextSource> by lazy {
entities ?.asTextSources(text ?: return@lazy emptyList()) ?: emptyList()
}
override val ownedGiftId: GiftId?
get() = null
}
@Serializable
data class ReceivedInBusinessAccount(
@SerialName(giftField)
override val gift: Gift.Regular,
@SerialName(ownedGiftIdField)
override val ownedGiftId: GiftId,
@SerialName(convertStarCountField)
override val convertStarCount: Int? = null,
@SerialName(prepaidUpgradeStarCountField)
override val prepaidUpgradeStarCount: Int? = null,
@SerialName(canBeUpgradedField)
override val canBeUpgraded: Boolean = false,
@SerialName(textField)
override val text: String? = null,
@SerialName(entitiesField)
private val entities: RawMessageEntities? = null,
@SerialName(isPrivateField)
override val isPrivate: Boolean = false
) : Regular, GiftSentOrReceived.ReceivedInBusinessAccount {
override val textSources: List<TextSource> by lazy {
entities ?.asTextSources(text ?: return@lazy emptyList()) ?: emptyList()
}
}
companion object : KSerializer<GiftSentOrReceived.Regular> {
@Serializable
private data class Surrogate(
@SerialName(giftField)
val gift: Gift.Regular,
@SerialName(ownedGiftIdField)
val ownedGiftId: GiftId? = null,
@SerialName(convertStarCountField)
val convertStarCount: Int? = null,
@SerialName(prepaidUpgradeStarCountField)
val prepaidUpgradeStarCount: Int? = null,
@SerialName(canBeUpgradedField)
val canBeUpgraded: Boolean = false,
@SerialName(textField)
val text: String? = null,
@SerialName(entitiesField)
val entities: RawMessageEntities? = null,
@SerialName(isPrivateField)
val isPrivate: Boolean = false
)
override val descriptor: SerialDescriptor
get() = Surrogate.serializer().descriptor
override fun serialize(encoder: Encoder, value: Regular) {
when (value) {
is Common -> Common.serializer().serialize(encoder, value)
is ReceivedInBusinessAccount -> ReceivedInBusinessAccount.serializer().serialize(encoder, value)
}
}
override fun deserialize(decoder: Decoder): Regular {
val surrogate = Surrogate.serializer().deserialize(decoder)
return when {
surrogate.ownedGiftId == null -> {
Common(
gift = surrogate.gift,
convertStarCount = surrogate.convertStarCount,
prepaidUpgradeStarCount = surrogate.prepaidUpgradeStarCount,
canBeUpgraded = surrogate.canBeUpgraded,
text = surrogate.text,
entities = surrogate.entities,
isPrivate = surrogate.isPrivate
)
}
else -> {
ReceivedInBusinessAccount(
gift = surrogate.gift,
ownedGiftId = surrogate.ownedGiftId,
convertStarCount = surrogate.convertStarCount,
prepaidUpgradeStarCount = surrogate.prepaidUpgradeStarCount,
canBeUpgraded = surrogate.canBeUpgraded,
text = surrogate.text,
entities = surrogate.entities,
isPrivate = surrogate.isPrivate
)
}
}
}
@JvmName("PublicConstructor")
operator fun invoke(
gift: Gift.Regular,
ownedGiftId: GiftId? = null,
convertStarCount: Int? = null,
prepaidUpgradeStarCount: Int? = null,
canBeUpgraded: Boolean = false,
text: String? = null,
textSources: TextSourcesList = emptyList(),
position: Int,
isPrivate: Boolean = false
) = ownedGiftId ?.let {
ReceivedInBusinessAccount(
gift,
ownedGiftId,
convertStarCount,
prepaidUpgradeStarCount,
canBeUpgraded,
text,
textSources.toRawMessageEntities(position),
isPrivate
)
} ?: Common(
gift,
convertStarCount,
prepaidUpgradeStarCount,
canBeUpgraded,
text,
textSources.toRawMessageEntities(position),
isPrivate
)
}
}
@Serializable(Unique.Companion::class)
sealed interface Unique : GiftSentOrReceived {
override val gift: Gift.Unique
val origin: String?
val transferStarCount: Int?
@Serializable
data class Common(
@SerialName(giftField)
override val gift: Gift.Unique,
@SerialName(originField)
override val origin: String? = null,
@SerialName(transferStarCountField)
override val transferStarCount: Int? = null
) : Unique {
override val ownedGiftId: GiftId?
get() = null
}
@Serializable
data class ReceivedInBusinessAccount(
@SerialName(giftField)
override val gift: Gift.Unique,
@SerialName(ownedGiftIdField)
override val ownedGiftId: GiftId,
@SerialName(originField)
override val origin: String? = null,
@SerialName(transferStarCountField)
override val transferStarCount: Int? = null
) : Unique, GiftSentOrReceived.ReceivedInBusinessAccount
companion object : KSerializer<GiftSentOrReceived.Unique> {
@Serializable
private data class Surrogate(
@SerialName(giftField)
val gift: Gift.Unique,
@SerialName(ownedGiftIdField)
val ownedGiftId: GiftId? = null,
@SerialName(originField)
val origin: String? = null,
@SerialName(transferStarCountField)
val transferStarCount: Int? = null
)
override val descriptor: SerialDescriptor
get() = Surrogate.serializer().descriptor
override fun serialize(encoder: Encoder, value: Unique) {
when (value) {
is Common -> Common.serializer().serialize(encoder, value)
is ReceivedInBusinessAccount -> ReceivedInBusinessAccount.serializer().serialize(encoder, value)
}
}
override fun deserialize(decoder: Decoder): Unique {
val surrogate = Surrogate.serializer().deserialize(decoder)
return when {
surrogate.ownedGiftId == null -> {
Common(
gift = surrogate.gift,
origin = surrogate.origin,
transferStarCount = surrogate.transferStarCount
)
}
else -> {
ReceivedInBusinessAccount(
gift = surrogate.gift,
ownedGiftId = surrogate.ownedGiftId,
origin = surrogate.origin,
transferStarCount = surrogate.transferStarCount
)
}
}
}
@JvmName("PublicConstructor")
operator fun invoke(
gift: Gift.Unique,
origin: String? = null,
ownedGiftId: GiftId? = null,
transferStarCount: Int? = null
) = ownedGiftId ?.let {
ReceivedInBusinessAccount(
gift,
ownedGiftId,
origin,
transferStarCount,
)
} ?: Common(
gift,
origin,
transferStarCount,
)
}
}
}

View File

@@ -7,5 +7,5 @@ import kotlinx.serialization.Serializable
@Serializable
data class Gifts(
@SerialName(giftsField)
val gifts: List<Gift>
val gifts: List<Gift.Regular>
)

View File

@@ -0,0 +1,18 @@
package dev.inmo.tgbotapi.types.gifts.unique
import dev.inmo.tgbotapi.types.colorsField
import dev.inmo.tgbotapi.types.nameField
import dev.inmo.tgbotapi.types.rarityPerMilleField
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class UniqueGiftBackdrop(
@SerialName(nameField)
val name: String,
@SerialName(colorsField)
val colors: UniqueGiftBackdropColors,
@SerialName(rarityPerMilleField)
val rarityPerMille: Int
)

View File

@@ -0,0 +1,22 @@
package dev.inmo.tgbotapi.types.gifts.unique
import dev.inmo.tgbotapi.types.centerColorField
import dev.inmo.tgbotapi.types.edgeColorField
import dev.inmo.tgbotapi.types.symbolColorField
import dev.inmo.tgbotapi.types.textColorField
import dev.inmo.tgbotapi.utils.RGBColor
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class UniqueGiftBackdropColors(
@SerialName(centerColorField)
val centerColor: RGBColor,
@SerialName(edgeColorField)
val edgeColor: RGBColor,
@SerialName(symbolColorField)
val symbolColor: RGBColor,
@SerialName(textColorField)
val textColor: RGBColor
)

View File

@@ -0,0 +1,19 @@
package dev.inmo.tgbotapi.types.gifts.unique
import dev.inmo.tgbotapi.types.files.Sticker
import dev.inmo.tgbotapi.types.nameField
import dev.inmo.tgbotapi.types.rarityPerMilleField
import dev.inmo.tgbotapi.types.stickerField
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class UniqueGiftModel(
@SerialName(nameField)
val name: String,
@SerialName(stickerField)
val sticker: Sticker,
@SerialName(rarityPerMilleField)
val rarityPerMille: Int
)

View File

@@ -0,0 +1,19 @@
package dev.inmo.tgbotapi.types.gifts.unique
import dev.inmo.tgbotapi.types.files.Sticker
import dev.inmo.tgbotapi.types.nameField
import dev.inmo.tgbotapi.types.rarityPerMilleField
import dev.inmo.tgbotapi.types.stickerField
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class UniqueGiftSymbol(
@SerialName(nameField)
val name: String,
@SerialName(stickerField)
val sticker: Sticker,
@SerialName(rarityPerMilleField)
val rarityPerMille: Int
)

View File

@@ -11,6 +11,7 @@ import dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage
import dev.inmo.tgbotapi.types.message.abstracts.BusinessContentMessage
import dev.inmo.tgbotapi.types.message.abstracts.PrivateContentMessage
import dev.inmo.tgbotapi.types.message.content.MessageContent
import kotlinx.serialization.SerialName
data class BusinessContentMessageImpl<T: MessageContent>(
override val messageId: MessageId,
@@ -28,6 +29,8 @@ data class BusinessContentMessageImpl<T: MessageContent>(
override val mediaGroupId: MediaGroupId?,
override val senderBusinessBot: PreviewBot?,
override val fromOffline: Boolean,
@SerialName(paidMessageStarCountField)
override val cost: Int? = null,
) : BusinessContentMessage<T> {
constructor(
messageId: MessageId,

View File

@@ -9,6 +9,7 @@ import dev.inmo.tgbotapi.types.chat.PreviewChat
import dev.inmo.tgbotapi.types.chat.User
import dev.inmo.tgbotapi.types.message.abstracts.*
import dev.inmo.tgbotapi.types.message.content.MessageContent
import kotlinx.serialization.SerialName
data class ChannelContentMessageImpl<T: MessageContent>(
override val messageId: MessageId,
@@ -25,6 +26,8 @@ data class ChannelContentMessageImpl<T: MessageContent>(
override val authorSignature: AuthorSignature?,
override val mediaGroupId: MediaGroupId?,
override val fromOffline: Boolean,
@SerialName(paidMessageStarCountField)
override val cost: Int? = null,
) : ChannelContentMessage<T> {
constructor(
messageId: MessageId,

View File

@@ -20,6 +20,7 @@ sealed interface ForwardInfo {
override val from: User
) : ForwardInfo, FromUser
@ClassCastsIncluded.ExcludeSubName
sealed interface PublicChat : ForwardInfo {
val chat: dev.inmo.tgbotapi.types.chat.PublicChat

View File

@@ -8,6 +8,7 @@ import dev.inmo.tgbotapi.types.chat.CommonBot
import dev.inmo.tgbotapi.types.chat.User
import dev.inmo.tgbotapi.types.message.abstracts.*
import dev.inmo.tgbotapi.types.message.content.MessageContent
import kotlinx.serialization.SerialName
data class ConnectedFromChannelGroupContentMessageImpl<T : MessageContent>(
override val chat: PreviewGroupChat,
@@ -24,6 +25,8 @@ data class ConnectedFromChannelGroupContentMessageImpl<T : MessageContent>(
override val authorSignature: AuthorSignature?,
override val mediaGroupId: MediaGroupId?,
override val fromOffline: Boolean,
@SerialName(paidMessageStarCountField)
override val cost: Int? = null,
) : ConnectedFromChannelGroupContentMessage<T> {
constructor(
@@ -41,8 +44,23 @@ data class ConnectedFromChannelGroupContentMessageImpl<T : MessageContent>(
authorSignature: AuthorSignature?,
mediaGroupId: MediaGroupId?,
fromOffline: Boolean,
cost: Int? = null,
) : this(
chat, channel, messageId, date, forwardInfo.messageOrigin(), editDate, hasProtectedContent, replyTo ?.let { ReplyInfo.Internal(it) }, replyMarkup, content, senderBot, authorSignature, mediaGroupId, fromOffline
chat = chat,
channel = channel,
messageId = messageId,
date = date,
forwardOrigin = forwardInfo.messageOrigin(),
editDate = editDate,
hasProtectedContent = hasProtectedContent,
replyInfo = replyTo ?.let { ReplyInfo.Internal(it) },
replyMarkup = replyMarkup,
content = content,
senderBot = senderBot,
authorSignature = authorSignature,
mediaGroupId = mediaGroupId,
fromOffline = fromOffline,
cost = cost,
)
}
@@ -61,6 +79,8 @@ data class UnconnectedFromChannelGroupContentMessageImpl<T: MessageContent>(
override val authorSignature: AuthorSignature?,
override val mediaGroupId: MediaGroupId?,
override val fromOffline: Boolean,
@SerialName(paidMessageStarCountField)
override val cost: Int? = null,
) : UnconnectedFromChannelGroupContentMessage<T> {
constructor(
chat: PreviewGroupChat,
@@ -77,8 +97,23 @@ data class UnconnectedFromChannelGroupContentMessageImpl<T: MessageContent>(
authorSignature: AuthorSignature?,
mediaGroupId: MediaGroupId?,
fromOffline: Boolean,
cost: Int? = null,
) : this(
chat, channel, messageId, date, forwardInfo.messageOrigin(), editDate, hasProtectedContent, replyTo ?.let { ReplyInfo.Internal(it) }, replyMarkup, content, senderBot, authorSignature, mediaGroupId, fromOffline
chat = chat,
channel = channel,
messageId = messageId,
date = date,
forwardOrigin = forwardInfo.messageOrigin(),
editDate = editDate,
hasProtectedContent = hasProtectedContent,
replyInfo = replyTo ?.let { ReplyInfo.Internal(it) },
replyMarkup = replyMarkup,
content = content,
senderBot = senderBot,
authorSignature = authorSignature,
mediaGroupId = mediaGroupId,
fromOffline = fromOffline,
cost = cost,
)
}
@@ -96,6 +131,8 @@ data class AnonymousGroupContentMessageImpl<T : MessageContent>(
override val authorSignature: AuthorSignature?,
override val mediaGroupId: MediaGroupId?,
override val fromOffline: Boolean,
@SerialName(paidMessageStarCountField)
override val cost: Int? = null,
) : AnonymousGroupContentMessage<T> {
constructor(
chat: PreviewGroupChat,
@@ -111,8 +148,22 @@ data class AnonymousGroupContentMessageImpl<T : MessageContent>(
authorSignature: AuthorSignature?,
mediaGroupId: MediaGroupId?,
fromOffline: Boolean,
cost: Int? = null,
) : this(
chat, messageId, date, forwardInfo.messageOrigin(), editDate, hasProtectedContent, replyTo ?.let { ReplyInfo.Internal(it) }, replyMarkup, content, senderBot, authorSignature, mediaGroupId, fromOffline
chat = chat,
messageId = messageId,
date = date,
forwardOrigin = forwardInfo.messageOrigin(),
editDate = editDate,
hasProtectedContent = hasProtectedContent,
replyInfo = replyTo ?.let { ReplyInfo.Internal(it) },
replyMarkup = replyMarkup,
content = content,
senderBot = senderBot,
authorSignature = authorSignature,
mediaGroupId = mediaGroupId,
fromOffline = fromOffline,
cost = cost,
)
}
@@ -131,6 +182,8 @@ data class CommonGroupContentMessageImpl<T : MessageContent>(
override val mediaGroupId: MediaGroupId?,
override val senderBoostsCount: Int?,
override val fromOffline: Boolean,
@SerialName(paidMessageStarCountField)
override val cost: Int? = null,
) : CommonGroupContentMessage<T> {
constructor(
chat: PreviewGroupChat,
@@ -147,8 +200,23 @@ data class CommonGroupContentMessageImpl<T : MessageContent>(
mediaGroupId: MediaGroupId?,
senderBoostsCount: Int?,
fromOffline: Boolean,
cost: Int? = null,
) : this(
chat, messageId, from, date, forwardInfo.messageOrigin(), editDate, hasProtectedContent, replyTo ?.let { ReplyInfo.Internal(it) }, replyMarkup, content, senderBot, mediaGroupId, senderBoostsCount, fromOffline
chat = chat,
messageId = messageId,
from = from,
date = date,
forwardOrigin = forwardInfo.messageOrigin(),
editDate = editDate,
hasProtectedContent = hasProtectedContent,
replyInfo = replyTo ?.let { ReplyInfo.Internal(it) },
replyMarkup = replyMarkup,
content = content,
senderBot = senderBot,
mediaGroupId = mediaGroupId,
senderBoostsCount = senderBoostsCount,
fromOffline = fromOffline,
cost = cost,
)
}
@@ -168,6 +236,8 @@ data class FromChannelForumContentMessageImpl<T: MessageContent>(
override val authorSignature: AuthorSignature?,
override val mediaGroupId: MediaGroupId?,
override val fromOffline: Boolean,
@SerialName(paidMessageStarCountField)
override val cost: Int? = null,
) : FromChannelForumContentMessage<T> {
constructor(
chat: PreviewForumChat,
@@ -185,8 +255,24 @@ data class FromChannelForumContentMessageImpl<T: MessageContent>(
authorSignature: AuthorSignature?,
mediaGroupId: MediaGroupId?,
fromOffline: Boolean,
cost: Int? = null,
) : this(
chat, channel, messageId, threadId, date, forwardInfo.messageOrigin(), editDate, hasProtectedContent, replyTo ?.let { ReplyInfo.Internal(it) }, replyMarkup, content, senderBot, authorSignature, mediaGroupId, fromOffline
chat = chat,
channel = channel,
messageId = messageId,
threadId = threadId,
date = date,
forwardOrigin = forwardInfo.messageOrigin(),
editDate = editDate,
hasProtectedContent = hasProtectedContent,
replyInfo = replyTo ?.let { ReplyInfo.Internal(it) },
replyMarkup = replyMarkup,
content = content,
senderBot = senderBot,
authorSignature = authorSignature,
mediaGroupId = mediaGroupId,
fromOffline = fromOffline,
cost = cost,
)
}
@@ -205,6 +291,8 @@ data class AnonymousForumContentMessageImpl<T : MessageContent>(
override val authorSignature: AuthorSignature?,
override val mediaGroupId: MediaGroupId?,
override val fromOffline: Boolean,
@SerialName(paidMessageStarCountField)
override val cost: Int? = null,
) : AnonymousForumContentMessage<T> {
constructor(
chat: PreviewForumChat,
@@ -221,8 +309,23 @@ data class AnonymousForumContentMessageImpl<T : MessageContent>(
authorSignature: AuthorSignature?,
mediaGroupId: MediaGroupId?,
fromOffline: Boolean,
cost: Int? = null,
) : this(
chat, messageId, threadId, date, forwardInfo.messageOrigin(), editDate, hasProtectedContent, replyTo ?.let { ReplyInfo.Internal(it) }, replyMarkup, content, senderBot, authorSignature, mediaGroupId, fromOffline
chat = chat,
messageId = messageId,
threadId = threadId,
date = date,
forwardOrigin = forwardInfo.messageOrigin(),
editDate = editDate,
hasProtectedContent = hasProtectedContent,
replyInfo = replyTo ?.let { ReplyInfo.Internal(it) },
replyMarkup = replyMarkup,
content = content,
senderBot = senderBot,
authorSignature = authorSignature,
mediaGroupId = mediaGroupId,
fromOffline = fromOffline,
cost = cost,
)
}
@@ -242,6 +345,8 @@ data class CommonForumContentMessageImpl<T : MessageContent>(
override val mediaGroupId: MediaGroupId?,
override val senderBoostsCount: Int?,
override val fromOffline: Boolean,
@SerialName(paidMessageStarCountField)
override val cost: Int? = null,
) : CommonForumContentMessage<T> {
constructor(
chat: PreviewForumChat,
@@ -259,7 +364,23 @@ data class CommonForumContentMessageImpl<T : MessageContent>(
mediaGroupId: MediaGroupId?,
senderBoostsCount: Int?,
fromOffline: Boolean,
cost: Int? = null,
) : this(
chat, messageId, threadId, from, date, forwardInfo.messageOrigin(), editDate, hasProtectedContent, replyTo ?.let { ReplyInfo.Internal(it) }, replyMarkup, content, senderBot, mediaGroupId, senderBoostsCount, fromOffline
chat = chat,
messageId = messageId,
threadId = threadId,
from = from,
date = date,
forwardOrigin = forwardInfo.messageOrigin(),
editDate = editDate,
hasProtectedContent = hasProtectedContent,
replyInfo = replyTo ?.let { ReplyInfo.Internal(it) },
replyMarkup = replyMarkup,
content = content,
senderBot = senderBot,
mediaGroupId = mediaGroupId,
senderBoostsCount = senderBoostsCount,
fromOffline = fromOffline,
cost = cost,
)
}

View File

@@ -9,6 +9,7 @@ import dev.inmo.tgbotapi.types.chat.User
import dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage
import dev.inmo.tgbotapi.types.message.abstracts.PrivateContentMessage
import dev.inmo.tgbotapi.types.message.content.MessageContent
import kotlinx.serialization.SerialName
data class PrivateContentMessageImpl<T: MessageContent>(
override val messageId: MessageId,
@@ -24,7 +25,9 @@ data class PrivateContentMessageImpl<T: MessageContent>(
override val senderBot: CommonBot?,
override val mediaGroupId: MediaGroupId?,
override val fromOffline: Boolean,
override val effectId: EffectId?
override val effectId: EffectId?,
@SerialName(paidStarCountField)
override val cost: Int? = null
) : PrivateContentMessage<T> {
constructor(
messageId: MessageId,

View File

@@ -10,6 +10,7 @@ import dev.inmo.tgbotapi.types.dice.Dice
import dev.inmo.tgbotapi.types.files.*
import dev.inmo.tgbotapi.types.files.Sticker
import dev.inmo.tgbotapi.types.games.RawGame
import dev.inmo.tgbotapi.types.gifts.GiftSentOrReceived
import dev.inmo.tgbotapi.types.giveaway.*
import dev.inmo.tgbotapi.types.message.content.GiveawayContent
import dev.inmo.tgbotapi.types.location.Location
@@ -109,6 +110,9 @@ internal data class RawMessage(
private val is_from_offline: Boolean = false,
private val paid_star_count: Int? = null,
private val paid_message_price_changed: PaidMessagePriceChanged? = null,
// Voice Chat Service Messages
private val video_chat_scheduled: VideoChatScheduled? = null,
private val video_chat_started: VideoChatStarted? = null,
@@ -160,6 +164,10 @@ internal data class RawMessage(
private val giveaway: Giveaway? = null,
private val giveaway_winners: GiveawayPublicResults? = null,
private val giveaway_completed: GiveawayPrivateResults? = null,
// Gifts
private val gift: GiftSentOrReceived.Regular? = null,
private val unique_gift: GiftSentOrReceived.Unique? = null,
) {
private val checkedFrom = from ?.takeIf { !it.isFakeTelegramUser() }
private val content: MessageContent? by lazy {
@@ -282,6 +290,9 @@ internal data class RawMessage(
giveaway_completed != null -> giveaway_completed
boost_added != null -> boost_added
chat_background_set != null -> chat_background_set
paid_message_price_changed != null -> paid_message_price_changed
gift != null -> gift
unique_gift != null -> unique_gift
else -> null
}
}
@@ -295,7 +306,7 @@ internal data class RawMessage(
}
try {
chatEvent?.let { chatEvent ->
chatEvent ?.let { chatEvent ->
when (chat) {
is PreviewSupergroupChat -> CommonSupergroupEventMessage(
messageId,
@@ -350,7 +361,8 @@ internal data class RawMessage(
senderBot = via_bot,
authorSignature = author_signature,
mediaGroupId = media_group_id,
fromOffline = is_from_offline
fromOffline = is_from_offline,
cost = paid_star_count,
)
is PreviewForumChat -> if (messageThreadId != null) {
val chatId = ChatIdWithThreadId(
@@ -376,7 +388,8 @@ internal data class RawMessage(
senderBot = via_bot,
authorSignature = author_signature,
mediaGroupId = media_group_id,
fromOffline = is_from_offline
fromOffline = is_from_offline,
cost = paid_star_count,
)
is PreviewGroupChat -> AnonymousForumContentMessageImpl(
chat = actualForumChat,
@@ -392,7 +405,8 @@ internal data class RawMessage(
senderBot = via_bot,
authorSignature = author_signature,
mediaGroupId = media_group_id,
fromOffline = is_from_offline
fromOffline = is_from_offline,
cost = paid_star_count,
)
null -> CommonForumContentMessageImpl(
chat = actualForumChat,
@@ -409,7 +423,8 @@ internal data class RawMessage(
senderBot = via_bot,
mediaGroupId = media_group_id,
senderBoostsCount = sender_boost_count,
fromOffline = is_from_offline
fromOffline = is_from_offline,
cost = paid_star_count,
)
}
} else {
@@ -429,7 +444,8 @@ internal data class RawMessage(
senderBot = via_bot,
authorSignature = author_signature,
mediaGroupId = media_group_id,
fromOffline = is_from_offline
fromOffline = is_from_offline,
cost = paid_star_count,
)
} else {
UnconnectedFromChannelGroupContentMessageImpl(
@@ -446,7 +462,8 @@ internal data class RawMessage(
senderBot = via_bot,
authorSignature = author_signature,
mediaGroupId = media_group_id,
fromOffline = is_from_offline
fromOffline = is_from_offline,
cost = paid_star_count,
)
}
is GroupChat -> AnonymousGroupContentMessageImpl(
@@ -462,7 +479,8 @@ internal data class RawMessage(
senderBot = via_bot,
authorSignature = author_signature,
mediaGroupId = media_group_id,
fromOffline = is_from_offline
fromOffline = is_from_offline,
cost = paid_star_count,
)
null -> CommonGroupContentMessageImpl(
chat = chat,
@@ -478,7 +496,8 @@ internal data class RawMessage(
senderBot = via_bot,
mediaGroupId = media_group_id,
senderBoostsCount = sender_boost_count,
fromOffline = is_from_offline
fromOffline = is_from_offline,
cost = paid_star_count,
)
}
}
@@ -498,7 +517,8 @@ internal data class RawMessage(
senderBot = via_bot,
authorSignature = author_signature,
mediaGroupId = media_group_id,
fromOffline = is_from_offline
fromOffline = is_from_offline,
cost = paid_star_count,
)
} else {
UnconnectedFromChannelGroupContentMessageImpl(
@@ -515,7 +535,8 @@ internal data class RawMessage(
senderBot = via_bot,
authorSignature = author_signature,
mediaGroupId = media_group_id,
fromOffline = is_from_offline
fromOffline = is_from_offline,
cost = paid_star_count,
)
}
is PreviewGroupChat -> AnonymousGroupContentMessageImpl(
@@ -531,7 +552,8 @@ internal data class RawMessage(
senderBot = via_bot,
authorSignature = author_signature,
mediaGroupId = media_group_id,
fromOffline = is_from_offline
fromOffline = is_from_offline,
cost = paid_star_count,
)
null -> CommonGroupContentMessageImpl(
chat = chat,
@@ -547,7 +569,8 @@ internal data class RawMessage(
senderBot = via_bot,
mediaGroupId = media_group_id,
senderBoostsCount = sender_boost_count,
fromOffline = is_from_offline
fromOffline = is_from_offline,
cost = paid_star_count,
)
}
}
@@ -566,7 +589,8 @@ internal data class RawMessage(
senderBot = via_bot,
mediaGroupId = media_group_id,
fromOffline = is_from_offline,
effectId = effect_id
effectId = effect_id,
cost = paid_star_count,
)
} else {
BusinessContentMessageImpl(
@@ -587,18 +611,19 @@ internal data class RawMessage(
senderBot = via_bot,
mediaGroupId = media_group_id,
senderBusinessBot = sender_business_bot,
fromOffline = is_from_offline
fromOffline = is_from_offline,
cost = paid_star_count,
)
}
else -> error("Unknown type of chat: $chat")
}
} ?: passport_data ?.let{
PassportMessage(
messageId,
chat,
checkedFrom ?: from ?: error("For passport must be provided user, but got null"),
date.asDate,
passport_data
messageId = messageId,
chat = chat,
from = checkedFrom ?: from ?: error("For passport must be provided user, but got null"),
date = date.asDate,
passportData = passport_data,
)
} ?: error("Was not found supported type of data")
} catch (e: Exception) {

View File

@@ -10,4 +10,5 @@ sealed interface CommonMessage<out T: MessageContent> : AccessibleMessage,
PossiblyBusinessMessage,
PossiblyOfflineMessage,
PossiblyMediaGroupMessage<T>,
PossiblyPaidMessage,
ContentMessage<T>

View File

@@ -0,0 +1,5 @@
package dev.inmo.tgbotapi.types.message.abstracts
interface PossiblyPaidMessage : Message {
val cost: Int?
}

View File

@@ -0,0 +1,14 @@
package dev.inmo.tgbotapi.types.payments.stars
import dev.inmo.tgbotapi.types.amountField
import dev.inmo.tgbotapi.types.nanostarAmountField
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class StarAmount(
@SerialName(amountField)
val amount: Long,
@SerialName(nanostarAmountField)
val nanostarAmount: Long = 0,
)

View File

@@ -61,10 +61,10 @@ sealed interface TransactionPartner {
val paidMedia: List<PaidMedia>? = null,
@SerialName(paidMediaPayloadField)
val paidMediaPayload: PaidMediaPayload? = null,
@SerialName(giftField)
val gift: Gift? = null,
@SerialName(premiumSubscriptionDurationField)
val premiumSubscriptionDuration: Int? = null,
@SerialName(giftField)
val gift: Gift.Regular? = null,
) : TransactionPartner, SubscriptionPeriodInfo {
@EncodeDefault
override val type: String = Companion.type
@@ -79,7 +79,7 @@ sealed interface TransactionPartner {
@SerialName(chatField)
val chat: PreviewChat,
@SerialName(giftField)
val gift: Gift? = null
val gift: Gift.Regular? = null
) : TransactionPartner {
@EncodeDefault
override val type: String = Companion.type
@@ -154,9 +154,9 @@ sealed interface TransactionPartner {
val subscription_period: TimeSpan? = null,
val paid_media: List<PaidMedia>? = null,
val paid_media_payload: PaidMediaPayload? = null,
val gift: Gift? = 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,
val commission_per_mille: Int? = null,

View File

@@ -0,0 +1,33 @@
package dev.inmo.tgbotapi.utils
import dev.inmo.micro_utils.common.Either
import dev.inmo.micro_utils.common.EitherFirst
import dev.inmo.micro_utils.common.EitherSecond
import kotlinx.serialization.KSerializer
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.json.JsonDecoder
import kotlinx.serialization.json.JsonElement
fun <T> Decoder.deserializeWithRaw(serializer: KSerializer<T>): Pair<T, JsonElement?> {
return if (this is JsonDecoder) {
val json = decodeJsonElement()
this.json.decodeFromJsonElement(serializer, json) to json
} else {
serializer.deserialize(this) to null
}
}
fun <T> Decoder.deserializeEitherWithRaw(serializer: KSerializer<T>): Either<Pair<T?, JsonElement>, Pair<T, JsonElement?>> {
return if (this is JsonDecoder) {
val json = decodeJsonElement()
EitherFirst(
runCatching {
this.json.decodeFromJsonElement(serializer, json)
}.getOrNull() to json
)
} else {
EitherSecond(
serializer.deserialize(this) to null
)
}
}

View File

@@ -29,7 +29,8 @@ fun <T : MediaGroupPartContent> List<PossiblySentViaBotCommonMessage<T>>.asMedia
senderBot = sourceMessage.senderBot,
authorSignature = sourceMessage.authorSignature,
mediaGroupId = sourceMessage.mediaGroupId,
fromOffline = sourceMessage.fromOffline
fromOffline = sourceMessage.fromOffline,
cost = sourceMessage.cost,
)
is BusinessContentMessage -> BusinessContentMessageImpl(
messageId = sourceMessage.messageId,
@@ -46,7 +47,8 @@ fun <T : MediaGroupPartContent> List<PossiblySentViaBotCommonMessage<T>>.asMedia
senderBot = sourceMessage.senderBot,
mediaGroupId = sourceMessage.mediaGroupId,
senderBusinessBot = sourceMessage.senderBusinessBot,
fromOffline = sourceMessage.fromOffline
fromOffline = sourceMessage.fromOffline,
cost = sourceMessage.cost,
)
is PrivateContentMessage -> PrivateContentMessageImpl(
messageId = sourceMessage.messageId,
@@ -62,7 +64,8 @@ fun <T : MediaGroupPartContent> List<PossiblySentViaBotCommonMessage<T>>.asMedia
senderBot = sourceMessage.senderBot,
mediaGroupId = sourceMessage.mediaGroupId,
fromOffline = sourceMessage.fromOffline,
effectId = sourceMessage.effectId
effectId = sourceMessage.effectId,
cost = sourceMessage.cost,
)
is AnonymousGroupContentMessage -> AnonymousGroupContentMessageImpl(
chat = sourceMessage.chat,
@@ -77,7 +80,8 @@ fun <T : MediaGroupPartContent> List<PossiblySentViaBotCommonMessage<T>>.asMedia
senderBot = sourceMessage.senderBot,
authorSignature = sourceMessage.authorSignature,
mediaGroupId = sourceMessage.mediaGroupId,
fromOffline = sourceMessage.fromOffline
fromOffline = sourceMessage.fromOffline,
cost = sourceMessage.cost,
)
is CommonGroupContentMessage -> CommonGroupContentMessageImpl(
chat = sourceMessage.chat,
@@ -93,7 +97,8 @@ fun <T : MediaGroupPartContent> List<PossiblySentViaBotCommonMessage<T>>.asMedia
senderBot = sourceMessage.senderBot,
mediaGroupId = sourceMessage.mediaGroupId,
senderBoostsCount = sourceMessage.senderBoostsCount,
fromOffline = sourceMessage.fromOffline
fromOffline = sourceMessage.fromOffline,
cost = sourceMessage.cost,
)
is ConnectedFromChannelGroupContentMessage -> ConnectedFromChannelGroupContentMessageImpl(
chat = sourceMessage.chat,
@@ -109,7 +114,8 @@ fun <T : MediaGroupPartContent> List<PossiblySentViaBotCommonMessage<T>>.asMedia
senderBot = sourceMessage.senderBot,
authorSignature = sourceMessage.authorSignature,
mediaGroupId = sourceMessage.mediaGroupId,
fromOffline = sourceMessage.fromOffline
fromOffline = sourceMessage.fromOffline,
cost = sourceMessage.cost,
)
is UnconnectedFromChannelGroupContentMessage -> UnconnectedFromChannelGroupContentMessageImpl(
chat = sourceMessage.chat,
@@ -125,7 +131,8 @@ fun <T : MediaGroupPartContent> List<PossiblySentViaBotCommonMessage<T>>.asMedia
senderBot = sourceMessage.senderBot,
authorSignature = sourceMessage.authorSignature,
mediaGroupId = sourceMessage.mediaGroupId,
fromOffline = sourceMessage.fromOffline
fromOffline = sourceMessage.fromOffline,
cost = sourceMessage.cost,
)
is AnonymousForumContentMessage -> AnonymousForumContentMessageImpl(
chat = sourceMessage.chat,
@@ -141,7 +148,8 @@ fun <T : MediaGroupPartContent> List<PossiblySentViaBotCommonMessage<T>>.asMedia
senderBot = sourceMessage.senderBot,
authorSignature = sourceMessage.authorSignature,
mediaGroupId = sourceMessage.mediaGroupId,
fromOffline = sourceMessage.fromOffline
fromOffline = sourceMessage.fromOffline,
cost = sourceMessage.cost,
)
is CommonForumContentMessage -> CommonForumContentMessageImpl(
chat = sourceMessage.chat,
@@ -158,7 +166,8 @@ fun <T : MediaGroupPartContent> List<PossiblySentViaBotCommonMessage<T>>.asMedia
senderBot = sourceMessage.senderBot,
mediaGroupId = sourceMessage.mediaGroupId,
senderBoostsCount = sourceMessage.senderBoostsCount,
fromOffline = sourceMessage.fromOffline
fromOffline = sourceMessage.fromOffline,
cost = sourceMessage.cost,
)
is FromChannelForumContentMessage -> FromChannelForumContentMessageImpl(
chat = sourceMessage.chat,
@@ -175,7 +184,8 @@ fun <T : MediaGroupPartContent> List<PossiblySentViaBotCommonMessage<T>>.asMedia
senderBot = sourceMessage.senderBot,
authorSignature = sourceMessage.authorSignature,
mediaGroupId = sourceMessage.mediaGroupId,
fromOffline = sourceMessage.fromOffline
fromOffline = sourceMessage.fromOffline,
cost = sourceMessage.cost,
)
}
}

View File

@@ -5,7 +5,12 @@ import dev.inmo.tgbotapi.utils.RiskFeature
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.SOURCE)
@RiskFeature("It is internal API in tgbotapi.core and should not be used outside")
annotation class ClassCastsIncluded(val typesRegex: String = "", val excludeRegex: String = "")
annotation class ClassCastsIncluded(val typesRegex: String = "", val excludeRegex: String = "") {
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.SOURCE)
@RiskFeature("It is internal API in tgbotapi.core and should not be used outside")
annotation class ExcludeSubName
}
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.SOURCE)