mirror of
https://github.com/InsanusMokrassar/TelegramBotAPI.git
synced 2024-12-22 16:47:13 +00:00
progress on addinf of paid media
This commit is contained in:
parent
1eef5bb239
commit
00aefefc31
@ -855,7 +855,7 @@ suspend inline fun TelegramBot.replyWithPhoto(
|
||||
|
||||
suspend inline fun TelegramBot.reply(
|
||||
to: AccessibleMessage,
|
||||
photo: Photo,
|
||||
photo: PhotoFile,
|
||||
text: String? = null,
|
||||
parseMode: ParseMode? = null,
|
||||
showCaptionAboveMedia: Boolean = false,
|
||||
@ -947,7 +947,7 @@ suspend inline fun TelegramBot.replyWithPhoto(
|
||||
|
||||
suspend inline fun TelegramBot.reply(
|
||||
to: AccessibleMessage,
|
||||
photo: Photo,
|
||||
photo: PhotoFile,
|
||||
entities: TextSourcesList,
|
||||
showCaptionAboveMedia: Boolean = false,
|
||||
spoilered: Boolean = false,
|
||||
|
@ -806,7 +806,7 @@ suspend inline fun TelegramBot.replyWithPhoto(
|
||||
suspend inline fun TelegramBot.reply(
|
||||
toChatId: IdChatIdentifier,
|
||||
toMessageId: MessageId,
|
||||
photo: Photo,
|
||||
photo: PhotoFile,
|
||||
text: String? = null,
|
||||
parseMode: ParseMode? = null,
|
||||
showCaptionAboveMedia: Boolean = false,
|
||||
@ -860,7 +860,7 @@ suspend inline fun TelegramBot.replyWithPhoto(
|
||||
suspend inline fun TelegramBot.reply(
|
||||
toChatId: IdChatIdentifier,
|
||||
toMessageId: MessageId,
|
||||
photo: Photo,
|
||||
photo: PhotoFile,
|
||||
entities: TextSourcesList,
|
||||
showCaptionAboveMedia: Boolean = false,
|
||||
spoilered: Boolean = false,
|
||||
|
@ -726,7 +726,7 @@ suspend fun TelegramBot.send(
|
||||
*/
|
||||
suspend fun TelegramBot.send(
|
||||
chatId: ChatIdentifier,
|
||||
photo: Photo,
|
||||
photo: PhotoFile,
|
||||
text: String? = null,
|
||||
parseMode: ParseMode? = null,
|
||||
showCaptionAboveMedia: Boolean = false,
|
||||
@ -747,7 +747,7 @@ suspend fun TelegramBot.send(
|
||||
*/
|
||||
suspend fun TelegramBot.send(
|
||||
chat: Chat,
|
||||
photo: Photo,
|
||||
photo: PhotoFile,
|
||||
text: String? = null,
|
||||
parseMode: ParseMode? = null,
|
||||
showCaptionAboveMedia: Boolean = false,
|
||||
@ -810,7 +810,7 @@ suspend fun TelegramBot.send(
|
||||
*/
|
||||
suspend inline fun TelegramBot.send(
|
||||
chatId: ChatIdentifier,
|
||||
photo: Photo,
|
||||
photo: PhotoFile,
|
||||
entities: TextSourcesList,
|
||||
showCaptionAboveMedia: Boolean = false,
|
||||
spoilered: Boolean = false,
|
||||
@ -830,7 +830,7 @@ suspend inline fun TelegramBot.send(
|
||||
*/
|
||||
suspend inline fun TelegramBot.send(
|
||||
chat: Chat,
|
||||
photo: Photo,
|
||||
photo: PhotoFile,
|
||||
entities: TextSourcesList,
|
||||
showCaptionAboveMedia: Boolean = false,
|
||||
spoilered: Boolean = false,
|
||||
|
@ -87,7 +87,7 @@ suspend fun TelegramBot.sendPhoto(
|
||||
*/
|
||||
suspend fun TelegramBot.sendPhoto(
|
||||
chatId: ChatIdentifier,
|
||||
photo: Photo,
|
||||
photo: PhotoFile,
|
||||
text: String? = null,
|
||||
parseMode: ParseMode? = null,
|
||||
showCaptionAboveMedia: Boolean = false,
|
||||
@ -121,7 +121,7 @@ suspend fun TelegramBot.sendPhoto(
|
||||
*/
|
||||
suspend fun TelegramBot.sendPhoto(
|
||||
chat: Chat,
|
||||
photo: Photo,
|
||||
photo: PhotoFile,
|
||||
text: String? = null,
|
||||
parseMode: ParseMode? = null,
|
||||
showCaptionAboveMedia: Boolean = false,
|
||||
@ -290,7 +290,7 @@ suspend inline fun TelegramBot.sendPhoto(
|
||||
*/
|
||||
suspend inline fun TelegramBot.sendPhoto(
|
||||
chatId: ChatIdentifier,
|
||||
photo: Photo,
|
||||
photo: PhotoFile,
|
||||
entities: TextSourcesList,
|
||||
showCaptionAboveMedia: Boolean = false,
|
||||
spoilered: Boolean = false,
|
||||
@ -322,7 +322,7 @@ suspend inline fun TelegramBot.sendPhoto(
|
||||
*/
|
||||
suspend inline fun TelegramBot.sendPhoto(
|
||||
chat: Chat,
|
||||
photo: Photo,
|
||||
photo: PhotoFile,
|
||||
entities: TextSourcesList,
|
||||
showCaptionAboveMedia: Boolean = false,
|
||||
spoilered: Boolean = false,
|
||||
|
@ -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"
|
||||
|
@ -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,
|
||||
|
@ -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
|
||||
)
|
||||
|
@ -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>
|
||||
)
|
@ -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(
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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"
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
@ -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(
|
||||
|
@ -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,
|
||||
|
@ -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
|
@ -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
|
||||
|
@ -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,
|
||||
)
|
||||
|
@ -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)
|
||||
)
|
||||
|
@ -193,7 +193,7 @@ import dev.inmo.tgbotapi.types.files.MediaContentVariant
|
||||
import dev.inmo.tgbotapi.types.files.MimedMediaFile
|
||||
import dev.inmo.tgbotapi.types.files.PassportFile
|
||||
import dev.inmo.tgbotapi.types.files.PathedFile
|
||||
import dev.inmo.tgbotapi.types.files.Photo
|
||||
import dev.inmo.tgbotapi.types.files.PhotoFile
|
||||
import dev.inmo.tgbotapi.types.files.PhotoSize
|
||||
import dev.inmo.tgbotapi.types.files.PlayableMediaFile
|
||||
import dev.inmo.tgbotapi.types.files.RegularAnimatedSticker
|
||||
@ -2707,13 +2707,13 @@ public inline fun TelegramMediaFile.pathedFileOrThrow(): PathedFile = this as
|
||||
public inline fun <T> TelegramMediaFile.ifPathedFile(block: (PathedFile) -> T): T? =
|
||||
pathedFileOrNull() ?.let(block)
|
||||
|
||||
public inline fun TelegramMediaFile.photoOrNull(): Photo? = this as?
|
||||
dev.inmo.tgbotapi.types.files.Photo
|
||||
public inline fun TelegramMediaFile.photoOrNull(): PhotoFile? = this as?
|
||||
dev.inmo.tgbotapi.types.files.PhotoFile
|
||||
|
||||
public inline fun TelegramMediaFile.photoOrThrow(): Photo = this as
|
||||
dev.inmo.tgbotapi.types.files.Photo
|
||||
public inline fun TelegramMediaFile.photoOrThrow(): PhotoFile = this as
|
||||
dev.inmo.tgbotapi.types.files.PhotoFile
|
||||
|
||||
public inline fun <T> TelegramMediaFile.ifPhoto(block: (Photo) -> T): T? = photoOrNull()
|
||||
public inline fun <T> TelegramMediaFile.ifPhoto(block: (PhotoFile) -> T): T? = photoOrNull()
|
||||
?.let(block)
|
||||
|
||||
public inline fun TelegramMediaFile.photoSizeOrNull(): PhotoSize? = this as?
|
||||
|
@ -103,7 +103,7 @@ inline val Message.animation: AnimationFile?
|
||||
inline val Message.game: Game?
|
||||
get() = asContentMessage() ?.content ?.asGameContent() ?.game
|
||||
@RiskFeature(RawFieldsUsageWarning)
|
||||
inline val Message.photo: Photo?
|
||||
inline val Message.photo: PhotoFile?
|
||||
get() = asContentMessage() ?.content ?.asPhotoContent() ?.mediaCollection
|
||||
@RiskFeature(RawFieldsUsageWarning)
|
||||
inline val Message.sticker: Sticker?
|
||||
@ -145,7 +145,7 @@ inline val Message.left_chat_member: User?
|
||||
inline val Message.new_chat_title: String?
|
||||
get() = asChatEventMessage() ?.chatEvent ?.asNewChatTitle() ?.title
|
||||
@RiskFeature(RawFieldsUsageWarning)
|
||||
inline val Message.new_chat_photo: Photo?
|
||||
inline val Message.new_chat_photo: PhotoFile?
|
||||
get() = asChatEventMessage() ?.chatEvent ?.asNewChatPhoto() ?.photo
|
||||
@RiskFeature(RawFieldsUsageWarning)
|
||||
inline val Message.delete_chat_photo: Boolean
|
||||
|
Loading…
Reference in New Issue
Block a user