From f637b480b1562da1c9f8166d0d180c88a959ba26 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Sun, 7 Jan 2024 20:51:29 +0600 Subject: [PATCH] add TextQuote --- .../kotlin/dev/inmo/tgbotapi/types/Common.kt | 1 + .../dev/inmo/tgbotapi/types/TextQuote.kt | 38 +++++++++++++++++++ .../types/abstracts/WithOptionalQuoteInfo.kt | 7 ++++ .../inmo/tgbotapi/types/message/RawMessage.kt | 21 ++++++---- .../types/message/RawMessageEntity.kt | 3 ++ .../types/message/content/AbstractsMedia.kt | 3 +- .../types/message/content/AnimationContent.kt | 4 +- .../types/message/content/AudioContent.kt | 4 +- .../types/message/content/DocumentContent.kt | 8 +++- .../message/content/MediaGroupContent.kt | 12 +++--- .../types/message/content/PhotoContent.kt | 7 +++- .../types/message/content/TextContent.kt | 11 +++--- .../types/message/content/VideoContent.kt | 4 +- .../types/message/content/VoiceContent.kt | 9 ++--- 14 files changed, 100 insertions(+), 32 deletions(-) create mode 100644 tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/TextQuote.kt create mode 100644 tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/abstracts/WithOptionalQuoteInfo.kt diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/Common.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/Common.kt index cf884c0b4b..27231c67b9 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/Common.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/Common.kt @@ -665,3 +665,4 @@ const val winnersField = "winners" const val additionalChatCountField = "additional_chat_count" const val unclaimedPrizeCountField = "unclaimed_prize_count" const val wasRefundedField = "was_refunded" +const val isManualField = "is_manual" diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/TextQuote.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/TextQuote.kt new file mode 100644 index 0000000000..48745d5816 --- /dev/null +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/TextQuote.kt @@ -0,0 +1,38 @@ +package dev.inmo.tgbotapi.types + +import dev.inmo.tgbotapi.abstracts.TextedInput +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.toRawMessageEntities +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlin.jvm.JvmName + +@Serializable +data class TextQuote private constructor( + @SerialName(textField) + override val text: String, + @SerialName(positionField) + val position: Int, + @SerialName(entitiesField) + private val entities: RawMessageEntities? = null, + @SerialName(isManualField) + val isManual: Boolean = false +) : TextedInput { + override val textSources: List by lazy { + entities ?.asTextSources(text) ?: emptyList() + } + + companion object { + @JvmName("PublicConstructor") + operator fun invoke( + text: String, + position: Int, + textSources: List = emptyList(), + isManual: Boolean = false + ) = TextQuote( + text, position, textSources.toRawMessageEntities(position), isManual + ) + } +} \ No newline at end of file diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/abstracts/WithOptionalQuoteInfo.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/abstracts/WithOptionalQuoteInfo.kt new file mode 100644 index 0000000000..1ca3764b1e --- /dev/null +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/abstracts/WithOptionalQuoteInfo.kt @@ -0,0 +1,7 @@ +package dev.inmo.tgbotapi.types.abstracts + +import dev.inmo.tgbotapi.types.TextQuote + +interface WithOptionalQuoteInfo { + val quote: TextQuote? +} diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/RawMessage.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/RawMessage.kt index dd05df6535..97aab2991d 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/RawMessage.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/RawMessage.kt @@ -55,6 +55,7 @@ internal data class RawMessage( private val is_automatic_forward: Boolean? = null, private val reply_to_message: RawMessage? = null, private val external_reply: ReplyInfo.External? = null, + private val quote: TextQuote? = null, private val via_bot: CommonBot? = null, private val edit_date: TelegramDate? = null, private val has_protected_content: Boolean? = null, @@ -148,40 +149,46 @@ internal data class RawMessage( messageId, story ) - text != null -> TextContent(text, (entities ?: emptyList()).asTextSources(text), link_preview_options) + text != null -> TextContent(text, (entities ?: emptyList()).asTextSources(text), link_preview_options, quote) audio != null -> AudioContent( audio, caption, - adaptedCaptionEntities + adaptedCaptionEntities, + quote ) video != null -> VideoContent( video, caption, adaptedCaptionEntities, - has_media_spoiler ?: false + has_media_spoiler ?: false, + quote ) animation != null -> AnimationContent( animation, document, caption, adaptedCaptionEntities, - has_media_spoiler ?: false + has_media_spoiler ?: false, + quote ) document != null -> DocumentContent( document, caption, - adaptedCaptionEntities + adaptedCaptionEntities, + quote ) voice != null -> VoiceContent( voice, caption, - adaptedCaptionEntities + adaptedCaptionEntities, + quote ) photo != null -> PhotoContent( photo, caption, adaptedCaptionEntities, - has_media_spoiler ?: false + has_media_spoiler ?: false, + quote ) sticker != null -> StickerContent(sticker) dice != null -> DiceContent(dice) diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/RawMessageEntity.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/RawMessageEntity.kt index dde5a1fdb7..38058eb101 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/RawMessageEntity.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/RawMessageEntity.kt @@ -1,9 +1,12 @@ package dev.inmo.tgbotapi.types.message +import dev.inmo.micro_utils.serialization.mapper.MapperSerializer import dev.inmo.tgbotapi.types.CustomEmojiId import dev.inmo.tgbotapi.types.chat.User import dev.inmo.tgbotapi.types.message.textsources.* +import kotlinx.serialization.KSerializer import kotlinx.serialization.Serializable +import kotlinx.serialization.builtins.ListSerializer @Serializable internal data class RawMessageEntity( diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/AbstractsMedia.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/AbstractsMedia.kt index 2b7cd80eaf..6a1ec0c5a2 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/AbstractsMedia.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/AbstractsMedia.kt @@ -3,6 +3,7 @@ package dev.inmo.tgbotapi.types.message.content import dev.inmo.tgbotapi.abstracts.TextedInput import dev.inmo.tgbotapi.types.MediaGroupIdentifier import dev.inmo.tgbotapi.types.MessageId +import dev.inmo.tgbotapi.types.abstracts.WithOptionalQuoteInfo import dev.inmo.tgbotapi.types.files.AudioFile import dev.inmo.tgbotapi.types.files.DocumentFile import dev.inmo.tgbotapi.types.media.* @@ -22,7 +23,7 @@ sealed interface DocumentMediaGroupPartContent : MediaGroupPartContent { override fun toMediaGroupMemberTelegramMedia(): DocumentMediaGroupMemberTelegramMedia } -sealed interface TextedMediaContent : TextedContent, MediaContent +sealed interface TextedMediaContent : TextedContent, MediaContent, WithOptionalQuoteInfo sealed interface MediaGroupCollectionContent : TextedMediaContent { @Serializable diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/AnimationContent.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/AnimationContent.kt index 1552b97f54..5b77469bee 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/AnimationContent.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/AnimationContent.kt @@ -7,6 +7,7 @@ import dev.inmo.tgbotapi.types.media.TelegramMediaAnimation import dev.inmo.tgbotapi.types.message.textsources.TextSourcesList import dev.inmo.tgbotapi.types.MessageId import dev.inmo.tgbotapi.types.MessageThreadId +import dev.inmo.tgbotapi.types.TextQuote import dev.inmo.tgbotapi.types.buttons.KeyboardMarkup import dev.inmo.tgbotapi.types.files.AnimationFile import dev.inmo.tgbotapi.types.files.DocumentFile @@ -19,7 +20,8 @@ data class AnimationContent( val includedDocument: DocumentFile?, override val text: String?, override val textSources: TextSourcesList = emptyList(), - override val spoilered: Boolean = false + override val spoilered: Boolean = false, + override val quote: TextQuote? = null ) : TextedMediaContent, SpoilerableMediaContent { override fun createResend( chatId: ChatIdentifier, diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/AudioContent.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/AudioContent.kt index 0b56455154..5051492406 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/AudioContent.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/AudioContent.kt @@ -8,6 +8,7 @@ import dev.inmo.tgbotapi.types.media.toTelegramMediaAudio import dev.inmo.tgbotapi.types.message.textsources.TextSourcesList import dev.inmo.tgbotapi.types.MessageId import dev.inmo.tgbotapi.types.MessageThreadId +import dev.inmo.tgbotapi.types.TextQuote import dev.inmo.tgbotapi.types.buttons.KeyboardMarkup import dev.inmo.tgbotapi.types.files.AudioFile import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage @@ -17,7 +18,8 @@ import kotlinx.serialization.Serializable data class AudioContent( override val media: AudioFile, override val text: String? = null, - override val textSources: TextSourcesList = emptyList() + override val textSources: TextSourcesList = emptyList(), + override val quote: TextQuote? = null ) : AudioMediaGroupPartContent { override fun createResend( chatId: ChatIdentifier, diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/DocumentContent.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/DocumentContent.kt index 1b2720bcc8..7030286acb 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/DocumentContent.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/DocumentContent.kt @@ -9,6 +9,8 @@ import dev.inmo.tgbotapi.types.media.toTelegramMediaDocument import dev.inmo.tgbotapi.types.message.textsources.TextSourcesList import dev.inmo.tgbotapi.types.MessageId import dev.inmo.tgbotapi.types.MessageThreadId +import dev.inmo.tgbotapi.types.TextQuote +import dev.inmo.tgbotapi.types.abstracts.WithOptionalQuoteInfo import dev.inmo.tgbotapi.types.buttons.KeyboardMarkup import dev.inmo.tgbotapi.types.files.DocumentFile import dev.inmo.tgbotapi.types.files.asDocumentFile @@ -19,7 +21,8 @@ import kotlinx.serialization.Serializable data class DocumentContent( override val media: DocumentFile, override val text: String? = null, - override val textSources: TextSourcesList = emptyList() + override val textSources: TextSourcesList = emptyList(), + override val quote: TextQuote? = null ) : DocumentMediaGroupPartContent { override fun createResend( chatId: ChatIdentifier, @@ -52,7 +55,8 @@ inline fun MediaContent.asDocumentContent() = when (this) { is TextedInput -> DocumentContent( media.asDocumentFile(), text, - textSources + textSources, + (this as? WithOptionalQuoteInfo) ?.quote ) else -> DocumentContent( media.asDocumentFile() diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/MediaGroupContent.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/MediaGroupContent.kt index b582f493cd..d0c0f729b7 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/MediaGroupContent.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/MediaGroupContent.kt @@ -2,10 +2,8 @@ package dev.inmo.tgbotapi.types.message.content import dev.inmo.tgbotapi.requests.abstracts.Request import dev.inmo.tgbotapi.requests.send.media.SendMediaGroup -import dev.inmo.tgbotapi.types.ChatIdentifier -import dev.inmo.tgbotapi.types.MediaGroupIdentifier -import dev.inmo.tgbotapi.types.MessageId -import dev.inmo.tgbotapi.types.MessageThreadId +import dev.inmo.tgbotapi.types.* +import dev.inmo.tgbotapi.types.abstracts.WithOptionalQuoteInfo import dev.inmo.tgbotapi.types.buttons.KeyboardMarkup import dev.inmo.tgbotapi.types.files.TelegramMediaFile import dev.inmo.tgbotapi.types.media.TelegramMedia @@ -16,10 +14,12 @@ import kotlinx.serialization.Serializable @Serializable data class MediaGroupContent( override val group: List>, - override val mediaGroupId: MediaGroupIdentifier -) : MediaGroupCollectionContent { + override val mediaGroupId: MediaGroupIdentifier, +) : MediaGroupCollectionContent, WithOptionalQuoteInfo { val mainContent: MediaGroupPartContent get() = group.first().content + override val quote: TextQuote? + get() = mainContent.quote override val media: TelegramMediaFile get() = mainContent.media diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/PhotoContent.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/PhotoContent.kt index 8b3e98c1ee..bbcc0453fd 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/PhotoContent.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/PhotoContent.kt @@ -8,6 +8,8 @@ import dev.inmo.tgbotapi.types.media.toTelegramMediaPhoto import dev.inmo.tgbotapi.types.message.textsources.TextSourcesList import dev.inmo.tgbotapi.types.MessageId import dev.inmo.tgbotapi.types.MessageThreadId +import dev.inmo.tgbotapi.types.TextQuote +import dev.inmo.tgbotapi.types.abstracts.WithOptionalQuoteInfo import dev.inmo.tgbotapi.types.buttons.KeyboardMarkup import dev.inmo.tgbotapi.types.files.* import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage @@ -18,8 +20,9 @@ data class PhotoContent( override val mediaCollection: Photo, override val text: String? = null, override val textSources: TextSourcesList = emptyList(), - override val spoilered: Boolean = false -) : MediaCollectionContent, VisualMediaGroupPartContent { + override val spoilered: Boolean = false, + override val quote: TextQuote? = null +) : MediaCollectionContent, VisualMediaGroupPartContent, WithOptionalQuoteInfo { override val media: PhotoSize = mediaCollection.biggest() ?: throw IllegalStateException("Can't locate any photo size for this content") override fun createResend( diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/TextContent.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/TextContent.kt index 567841dd0c..26c4fd2f14 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/TextContent.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/TextContent.kt @@ -3,11 +3,9 @@ package dev.inmo.tgbotapi.types.message.content import dev.inmo.tgbotapi.abstracts.TextedInput import dev.inmo.tgbotapi.requests.abstracts.Request import dev.inmo.tgbotapi.requests.send.SendTextMessage -import dev.inmo.tgbotapi.types.ChatIdentifier -import dev.inmo.tgbotapi.types.LinkPreviewOptions +import dev.inmo.tgbotapi.types.* import dev.inmo.tgbotapi.types.message.textsources.TextSourcesList -import dev.inmo.tgbotapi.types.MessageId -import dev.inmo.tgbotapi.types.MessageThreadId +import dev.inmo.tgbotapi.types.abstracts.WithOptionalQuoteInfo import dev.inmo.tgbotapi.types.buttons.KeyboardMarkup import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage import kotlinx.serialization.Serializable @@ -16,8 +14,9 @@ import kotlinx.serialization.Serializable data class TextContent( override val text: String, override val textSources: TextSourcesList = emptyList(), - val linkPreviewOptions: LinkPreviewOptions? = null -) : TextedContent { + val linkPreviewOptions: LinkPreviewOptions? = null, + override val quote: TextQuote? = null +) : TextedContent, WithOptionalQuoteInfo { override fun createResend( chatId: ChatIdentifier, messageThreadId: MessageThreadId?, diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/VideoContent.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/VideoContent.kt index 7b8ed78713..96ebc2b2d3 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/VideoContent.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/VideoContent.kt @@ -7,6 +7,7 @@ import dev.inmo.tgbotapi.types.media.TelegramMediaVideo import dev.inmo.tgbotapi.types.message.textsources.TextSourcesList import dev.inmo.tgbotapi.types.MessageId import dev.inmo.tgbotapi.types.MessageThreadId +import dev.inmo.tgbotapi.types.TextQuote import dev.inmo.tgbotapi.types.buttons.KeyboardMarkup import dev.inmo.tgbotapi.types.files.VideoFile import dev.inmo.tgbotapi.types.files.toTelegramMediaVideo @@ -18,7 +19,8 @@ data class VideoContent( override val media: VideoFile, override val text: String? = null, override val textSources: TextSourcesList = emptyList(), - override val spoilered: Boolean = false + override val spoilered: Boolean = false, + override val quote: TextQuote? = null ) : VisualMediaGroupPartContent { override fun createResend( chatId: ChatIdentifier, diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/VoiceContent.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/VoiceContent.kt index 7e7deceea8..b2cc4fe154 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/VoiceContent.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/VoiceContent.kt @@ -2,22 +2,21 @@ package dev.inmo.tgbotapi.types.message.content import dev.inmo.tgbotapi.requests.abstracts.Request import dev.inmo.tgbotapi.requests.send.media.SendVoice -import dev.inmo.tgbotapi.types.ChatIdentifier +import dev.inmo.tgbotapi.types.* import dev.inmo.tgbotapi.types.media.TelegramMediaAudio import dev.inmo.tgbotapi.types.message.textsources.TextSourcesList -import dev.inmo.tgbotapi.types.MessageId -import dev.inmo.tgbotapi.types.MessageThreadId +import dev.inmo.tgbotapi.types.abstracts.WithOptionalQuoteInfo import dev.inmo.tgbotapi.types.buttons.KeyboardMarkup import dev.inmo.tgbotapi.types.files.VoiceFile import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage -import dev.inmo.tgbotapi.types.threadId import kotlinx.serialization.Serializable @Serializable data class VoiceContent( override val media: VoiceFile, override val text: String? = null, - override val textSources: TextSourcesList = emptyList() + override val textSources: TextSourcesList = emptyList(), + override val quote: TextQuote? = null ) : TextedMediaContent { override fun createResend( chatId: ChatIdentifier,