1
0
mirror of https://github.com/InsanusMokrassar/TelegramBotAPI.git synced 2025-09-05 08:09:21 +00:00

progress on addinf of paid media

This commit is contained in:
2024-07-08 02:51:09 +06:00
parent 1eef5bb239
commit 00aefefc31
22 changed files with 89 additions and 56 deletions

View File

@@ -606,6 +606,8 @@ const val additionalChatCountField = "additional_chat_count"
const val unclaimedPrizeCountField = "unclaimed_prize_count"
const val wasRefundedField = "was_refunded"
const val isManualField = "is_manual"
const val starCountField = "star_count"
const val paidMediaField = "paid_media"
const val businessConnectionIdField = "business_connection_id"
const val businessIntroField = "business_intro"

View File

@@ -92,7 +92,7 @@ sealed interface ReplyInfo {
private val animation: AnimationFile? = null,
private val game: RawGame? = null,
@Serializable(PhotoSerializer::class)
private val photo: Photo? = null,
private val photo: PhotoFile? = null,
private val sticker: Sticker? = null,
private val video: VideoFile? = null,
private val voice: VoiceFile? = null,

View File

@@ -1,6 +1,6 @@
package dev.inmo.tgbotapi.types
import dev.inmo.tgbotapi.types.files.Photo
import dev.inmo.tgbotapi.types.files.PhotoFile
import dev.inmo.tgbotapi.types.files.PhotoSerializer
import dev.inmo.tgbotapi.utils.RiskFeature
import kotlinx.serialization.*
@@ -11,10 +11,10 @@ data class UserProfilePhotos (
@SerialName("total_count")
val count: Int,
@Serializable(UserProfilePhotosPhotosSerializer::class)
val photos: List<Photo>
val photos: List<PhotoFile>
)
@RiskFeature
object UserProfilePhotosPhotosSerializer : KSerializer<List<Photo>> by ListSerializer(
object UserProfilePhotosPhotosSerializer : KSerializer<List<PhotoFile>> by ListSerializer(
PhotoSerializer
)

View File

@@ -0,0 +1,15 @@
package dev.inmo.tgbotapi.types.files
import dev.inmo.tgbotapi.types.message.payments.PaidMedia
import dev.inmo.tgbotapi.types.paidMediaField
import dev.inmo.tgbotapi.types.starCountField
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class PaidMediaInfo(
@SerialName(starCountField)
val stars: Int,
@SerialName(paidMediaField)
val media: List<PaidMedia>
)

View File

@@ -8,7 +8,7 @@ import kotlin.jvm.JvmInline
@Serializable
@JvmInline
value class Photo(
value class PhotoFile(
val photos: List<PhotoSize>
) : List<PhotoSize> by photos, MediaContentVariant, UsefulAsPaidMediaFile {
val biggest: PhotoSize
@@ -27,12 +27,14 @@ value class Photo(
}
}
fun Photo.biggest(): PhotoSize? = maxByOrNull {
typealias Photo = PhotoFile
fun PhotoFile.biggest(): PhotoSize? = maxByOrNull {
it.resolution
}
@RiskFeature
object PhotoSerializer : KSerializer<Photo> by Photo.serializer()
object PhotoSerializer : KSerializer<PhotoFile> by PhotoFile.serializer()
@Serializable
data class PhotoSize(

View File

@@ -5,14 +5,14 @@ import dev.inmo.tgbotapi.abstracts.Titled
import dev.inmo.tgbotapi.types.ReplyInfo
import dev.inmo.tgbotapi.types.message.textsources.TextSourcesList
import dev.inmo.tgbotapi.types.files.AnimationFile
import dev.inmo.tgbotapi.types.files.Photo
import dev.inmo.tgbotapi.types.files.PhotoFile
import kotlinx.serialization.Serializable
@Serializable
data class Game(
override val title: String,
val description: String,
val photo: Photo,
val photo: PhotoFile,
override val text: String? = null,
override val textSources: TextSourcesList = emptyList(),
val animation: AnimationFile? = null

View File

@@ -14,7 +14,7 @@ internal data class RawGame(
private val description: String,
@Serializable(PhotoSerializer::class)
@SerialName(photoField)
private val photo: Photo,
private val photo: PhotoFile,
@SerialName(textField)
private val text: String? = null,
@SerialName(textEntitiesField)

View File

@@ -4,6 +4,7 @@ import dev.inmo.tgbotapi.requests.abstracts.InputFile
import dev.inmo.tgbotapi.requests.abstracts.fileIdToSend
import dev.inmo.tgbotapi.types.*
import dev.inmo.tgbotapi.types.files.VideoFile
import dev.inmo.tgbotapi.types.message.payments.PaidMedia
import kotlinx.serialization.*
internal const val videoTelegramPaidMediaType = "video"

View File

@@ -1,8 +1,8 @@
package dev.inmo.tgbotapi.types.message.ChatEvents
import dev.inmo.tgbotapi.types.files.Photo
import dev.inmo.tgbotapi.types.files.PhotoFile
import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.PublicChatEvent
data class NewChatPhoto(
val photo: Photo
val photo: PhotoFile
): PublicChatEvent

View File

@@ -71,10 +71,11 @@ internal data class RawMessage(
private val story: Story? = null,
private val audio: AudioFile? = null,
private val document: DocumentFile? = null,
private val paid_media: PaidMediaInfoContent? = null,
private val animation: AnimationFile? = null,
private val game: RawGame? = null,
@Serializable(PhotoSerializer::class)
private val photo: Photo? = null,
private val photo: PhotoFile? = null,
private val sticker: Sticker? = null,
private val video: VideoFile? = null,
private val voice: VoiceFile? = null,
@@ -87,7 +88,7 @@ internal data class RawMessage(
private val left_chat_member: User? = null,
private val new_chat_title: String? = null,
@Serializable(PhotoSerializer::class)
private val new_chat_photo: Photo? = null,
private val new_chat_photo: PhotoFile? = null,
private val delete_chat_photo: Boolean = false,
private val group_chat_created: Boolean = false,
private val supergroup_chat_created: Boolean = false,
@@ -198,6 +199,12 @@ internal data class RawMessage(
adaptedCaptionEntities,
quote
)
paid_media != null -> PaidMediaInfoContent(
document,
caption,
adaptedCaptionEntities,
quote
)
voice != null -> VoiceContent(
voice,
caption,

View File

@@ -6,25 +6,27 @@ import dev.inmo.tgbotapi.types.business_connection.BusinessConnectionId
import dev.inmo.tgbotapi.types.message.textsources.TextSourcesList
import dev.inmo.tgbotapi.types.buttons.KeyboardMarkup
import dev.inmo.tgbotapi.types.files.*
import dev.inmo.tgbotapi.types.media.PaidMedia
import dev.inmo.tgbotapi.types.media.TelegramPaidMedia
import dev.inmo.tgbotapi.types.media.toTelegramMediaPhoto
import dev.inmo.tgbotapi.types.files.toTelegramPaidMediaVideo
import dev.inmo.tgbotapi.types.media.*
import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage
import dev.inmo.tgbotapi.types.message.payments.PaidMedia
import kotlinx.serialization.Serializable
@Serializable
data class PaidMediaInfoContent(
override val mediaCollection: List<PaidMedia>,
val paidMediaInfo: PaidMediaInfo,
override val text: String? = null,
override val textSources: TextSourcesList = emptyList(),
override val quote: TextQuote? = null,
override val showCaptionAboveMedia: Boolean = false
) : MediaCollectionContent<UsefulAsPaidMediaFile>, TextedMediaContent, WithCustomizedCaptionMediaContent {
override val media: UsefulAsPaidMediaFile
get() = mediaCollection.first()
override fun asTelegramMedia(): TelegramPaidMedia = when (val media = media) {
is VideoFile -> media.toTelegramPaidMediaVideo()
is Photo -> media.biggest.toTelegramMediaPhoto()
) : TextedMediaContent, WithCustomizedCaptionMediaContent {
override val media: TelegramMediaFile
get() = paidMediaInfo.media.fir
override fun asTelegramMedia(): TelegramMediaFile = when (val media = media) {
is PaidMedia.Photo -> media.photo.biggest.toTelegramPaidMediaPhoto()
is PaidMedia.Preview,
is PaidMedia.Unknown -> error("Unable to create telegram media out of $media")
is PaidMedia.Video -> media.video.toTelegramPaidMediaVideo()
}
override fun createResend(

View File

@@ -15,7 +15,7 @@ import kotlinx.serialization.Serializable
@Serializable
data class PhotoContent(
override val mediaCollection: Photo,
override val mediaCollection: PhotoFile,
override val text: String? = null,
override val textSources: TextSourcesList = emptyList(),
override val spoilered: Boolean = false,

View File

@@ -1,6 +1,8 @@
package dev.inmo.tgbotapi.types.media
package dev.inmo.tgbotapi.types.message.payments
import dev.inmo.tgbotapi.types.*
import dev.inmo.tgbotapi.types.files.PhotoFile
import dev.inmo.tgbotapi.types.files.TelegramMediaFile
import dev.inmo.tgbotapi.types.files.VideoFile
import dev.inmo.tgbotapi.utils.decodeDataAndJson
import kotlinx.serialization.EncodeDefault
@@ -13,7 +15,9 @@ import kotlinx.serialization.encoding.Encoder
import kotlinx.serialization.json.JsonElement
@Serializable(PaidMedia.Companion::class)
sealed interface PaidMedia : TelegramMedia {
sealed interface PaidMedia {
val type: String
@Serializable
data class Preview(
@SerialName(widthField)
@@ -35,7 +39,7 @@ sealed interface PaidMedia : TelegramMedia {
@Serializable
data class Photo(
@SerialName(photoField)
val photo: Photo
val photo: PhotoFile
) : PaidMedia {
@EncodeDefault
@SerialName(typeField)
@@ -79,9 +83,9 @@ sealed interface PaidMedia : TelegramMedia {
@SerialName(durationField)
val duration: Int? = null,
@SerialName(photoField)
val photo: Photo? = null,
val photo: PhotoFile? = null,
@SerialName(videoField)
val video: Video? = null
val video: VideoFile? = null
)
override val descriptor: SerialDescriptor

View File

@@ -1,7 +1,7 @@
package dev.inmo.tgbotapi.types.request
import dev.inmo.tgbotapi.types.*
import dev.inmo.tgbotapi.types.files.Photo
import dev.inmo.tgbotapi.types.files.PhotoFile
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@@ -16,5 +16,5 @@ data class ChatShared(
@SerialName(usernameField)
val username: Username? = null,
@SerialName(photoField)
val photo: Photo? = null
val photo: PhotoFile? = null
) : ChatSharedRequest

View File

@@ -1,7 +1,7 @@
package dev.inmo.tgbotapi.types.request
import dev.inmo.tgbotapi.types.*
import dev.inmo.tgbotapi.types.files.Photo
import dev.inmo.tgbotapi.types.files.PhotoFile
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@@ -16,5 +16,5 @@ data class SharedUser(
@SerialName(usernameField)
val username: Username? = null,
@SerialName(photoField)
val photo: Photo? = null,
val photo: PhotoFile? = null,
)

View File

@@ -2,7 +2,7 @@ package dev.inmo.tgbotapi
import dev.inmo.tgbotapi.requests.abstracts.toInputFile
import dev.inmo.tgbotapi.types.TgFileUniqueId
import dev.inmo.tgbotapi.types.files.Photo
import dev.inmo.tgbotapi.types.files.PhotoFile
import dev.inmo.tgbotapi.types.media.MediaGroupMemberTelegramFreeMediaSerializer
import dev.inmo.tgbotapi.types.files.PhotoSize
import dev.inmo.tgbotapi.types.message.content.PhotoContent
@@ -22,7 +22,7 @@ class SimpleInputFilesTest {
@Test
fun test_that_creating_of_photo_and_converting_to_input_media_working_correctly() {
val photoContent = PhotoContent(
Photo(
PhotoFile(
listOf(
PhotoSize("example_file_id".toInputFile(), TgFileUniqueId("example_unique_file_id"), 100, 100, 100)
)