1
0
mirror of https://github.com/InsanusMokrassar/TelegramBotAPI.git synced 2025-11-24 16:26:01 +00:00

fixes in support of text entities

This commit is contained in:
2024-05-10 16:31:56 +06:00
parent d56173eceb
commit b843fd9188
9 changed files with 50 additions and 34 deletions

View File

@@ -2,15 +2,13 @@ package dev.inmo.tgbotapi.types
import dev.inmo.micro_utils.colors.common.HEXAColor
import dev.inmo.tgbotapi.utils.IntRGB24HEXAColorSerializer
import dev.inmo.tgbotapi.utils.extractDataAndJson
import dev.inmo.tgbotapi.utils.decodeDataAndJson
import dev.inmo.tgbotapi.utils.internal.ClassCastsIncluded
import kotlinx.serialization.*
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import kotlinx.serialization.json.JsonDecoder
import kotlinx.serialization.json.JsonElement
import kotlinx.serialization.json.decodeFromJsonElement
@ClassCastsIncluded
@Serializable(BackgroundFill.Companion::class)
@@ -100,7 +98,7 @@ sealed interface BackgroundFill {
get() = serializer.descriptor
override fun deserialize(decoder: Decoder): BackgroundFill {
val (raw, json) = decoder.extractDataAndJson(serializer)
val (raw, json) = decoder.decodeDataAndJson(serializer)
return when (raw.type) {
Solid.type -> Solid(color = raw.color ?: return Unknown(raw.type, json))
Gradient.type -> Gradient(

View File

@@ -3,7 +3,7 @@ package dev.inmo.tgbotapi.types
import dev.inmo.micro_utils.common.Progress
import dev.inmo.tgbotapi.types.files.DocumentFile
import dev.inmo.tgbotapi.utils.IntProgress100Serializer
import dev.inmo.tgbotapi.utils.extractDataAndJson
import dev.inmo.tgbotapi.utils.decodeDataAndJson
import dev.inmo.tgbotapi.utils.internal.ClassCastsIncluded
import kotlinx.serialization.EncodeDefault
import kotlinx.serialization.KSerializer
@@ -138,7 +138,7 @@ sealed interface BackgroundType {
get() = RawBackgroundType.serializer().descriptor
override fun deserialize(decoder: Decoder): BackgroundType {
val (raw, json) = decoder.extractDataAndJson(RawBackgroundType.serializer())
val (raw, json) = decoder.decodeDataAndJson(RawBackgroundType.serializer())
val unknown by lazy { Unknown(raw.type, json) }
return when (raw.type) {
Fill.type -> Fill(

View File

@@ -163,6 +163,7 @@ const val canReplyField = "can_reply"
const val supportInlineQueriesField = "supports_inline_queries"
const val canConnectToBusinessField = "can_connect_to_business"
const val textEntitiesField = "text_entities"
const val textParseModeField = "text_parse_mode"
const val entitiesField = "entities"
const val stickerSetNameField = "set_name"
const val customEmojiIdField = "custom_emoji_id"

View File

@@ -7,10 +7,14 @@ import dev.inmo.tgbotapi.types.message.RawMessageEntity
import dev.inmo.tgbotapi.types.message.asTextSources
import dev.inmo.tgbotapi.types.message.textsources.TextSource
import dev.inmo.tgbotapi.types.message.toRawMessageEntities
import dev.inmo.tgbotapi.types.textEntitiesField
import dev.inmo.tgbotapi.types.textField
import dev.inmo.tgbotapi.types.textParseModeField
import dev.inmo.tgbotapi.utils.EntitiesBuilder
import dev.inmo.tgbotapi.utils.EntitiesBuilderBody
import dev.inmo.tgbotapi.utils.extensions.makeSourceString
import kotlinx.serialization.KSerializer
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
@@ -18,8 +22,11 @@ import kotlinx.serialization.encoding.Encoder
@Serializable(InputPollOption.Companion::class)
data class InputPollOption @Warning("This constructor is not recommended to use") constructor(
@SerialName(textField)
override val text: String,
@SerialName(textParseModeField)
val parseMode: ParseMode?,
@SerialName(textEntitiesField)
override val textSources: List<TextSource>,
) : TextedInput {
constructor(text: String, parseMode: ParseMode? = null) : this(text, parseMode, emptyList())
@@ -29,8 +36,11 @@ data class InputPollOption @Warning("This constructor is not recommended to use"
companion object : KSerializer<InputPollOption> {
@Serializable
private data class RawPollInputOption(
@SerialName(textField)
val text: String,
@SerialName(textParseModeField)
val parseMode: ParseMode? = null,
@SerialName(textEntitiesField)
val textSources: List<RawMessageEntity> = emptyList(),
)
override val descriptor: SerialDescriptor

View File

@@ -10,7 +10,7 @@ import dev.inmo.tgbotapi.types.message.RawMessageEntity
import dev.inmo.tgbotapi.types.message.textsources.TextSource
import dev.inmo.tgbotapi.types.message.toRawMessageEntities
import dev.inmo.tgbotapi.utils.RiskFeature
import dev.inmo.tgbotapi.utils.nonstrictJsonFormat
import dev.inmo.tgbotapi.utils.decodeDataAndJson
import korlibs.time.seconds
import kotlinx.serialization.*
import kotlinx.serialization.descriptors.SerialDescriptor
@@ -74,12 +74,12 @@ private class RawPoll(
val id: PollId,
@SerialName(questionField)
val question: String,
@SerialName(questionEntitiesField)
val questionEntities: List<RawMessageEntity>,
@SerialName(optionsField)
val options: List<PollOption>,
@SerialName(totalVoterCountField)
val votesCount: Int,
@SerialName(questionEntitiesField)
val questionEntities: List<RawMessageEntity> = emptyList(),
@SerialName(isClosedField)
val isClosed: Boolean = false,
@SerialName(isAnonymousField)
@@ -110,24 +110,26 @@ data class UnknownPollType internal constructor(
override val id: PollId,
@SerialName(questionField)
override val question: String,
@SerialName(questionEntitiesField)
override val textSources: List<TextSource> = emptyList(),
@SerialName(optionsField)
override val options: List<PollOption>,
@SerialName(totalVoterCountField)
override val votesCount: Int,
@SerialName(questionEntitiesField)
override val textSources: List<TextSource> = emptyList(),
@SerialName(isClosedField)
override val isClosed: Boolean = false,
@SerialName(isAnonymousField)
override val isAnonymous: Boolean = false,
@Serializable
val raw: JsonObject
val raw: JsonElement? = null
) : Poll {
@Transient
override val scheduledCloseInfo: ScheduledCloseInfo? = (raw[closeDateField] ?: raw[openPeriodField])
?.jsonPrimitive
?.longOrNull
?.asApproximateScheduledCloseInfo
override val scheduledCloseInfo: ScheduledCloseInfo? = raw ?.jsonObject ?.let {
(it[closeDateField] ?: it[openPeriodField])
?.jsonPrimitive
?.longOrNull
?.asApproximateScheduledCloseInfo
}
}
@Serializable(PollSerializer::class)
@@ -167,8 +169,7 @@ object PollSerializer : KSerializer<Poll> {
get() = RawPoll.serializer().descriptor
override fun deserialize(decoder: Decoder): Poll {
val asJson = JsonObject.serializer().deserialize(decoder)
val rawPoll = nonstrictJsonFormat.decodeFromJsonElement(RawPoll.serializer(), asJson)
val (rawPoll, asJson) = decoder.decodeDataAndJson(RawPoll.serializer())
return when (rawPoll.type) {
quizPollType -> QuizPoll(
@@ -198,9 +199,9 @@ object PollSerializer : KSerializer<Poll> {
else -> UnknownPollType(
rawPoll.id,
rawPoll.question,
rawPoll.questionEntities.asTextSources(rawPoll.question),
rawPoll.options,
rawPoll.votesCount,
rawPoll.questionEntities.asTextSources(rawPoll.question),
rawPoll.isClosed,
rawPoll.isAnonymous,
asJson
@@ -214,9 +215,9 @@ object PollSerializer : KSerializer<Poll> {
is RegularPoll -> RawPoll(
value.id,
value.question,
value.textSources.toRawMessageEntities(),
value.options,
value.votesCount,
value.textSources.toRawMessageEntities(),
value.isClosed,
value.isAnonymous,
regularPollType,
@@ -227,9 +228,9 @@ object PollSerializer : KSerializer<Poll> {
is QuizPoll -> RawPoll(
value.id,
value.question,
value.textSources.toRawMessageEntities(),
value.options,
value.votesCount,
value.textSources.toRawMessageEntities(),
value.isClosed,
value.isAnonymous,
regularPollType,
@@ -240,7 +241,11 @@ object PollSerializer : KSerializer<Poll> {
closeDate = (closeInfo as? ExactScheduledCloseInfo) ?.closeDateTime ?.unixMillisLong ?.div(1000L)
)
is UnknownPollType -> {
JsonObject.serializer().serialize(encoder, value.raw)
if (value.raw == null) {
UnknownPollType.serializer().serialize(encoder, value)
} else {
JsonElement.serializer().serialize(encoder, value.raw)
}
return
}
}

View File

@@ -48,7 +48,7 @@ data class SimplePollOption (
@SerialName(textField)
override val text: String,
@SerialName(textEntitiesField)
override val textSources: List<TextSource>,
override val textSources: List<TextSource> = emptyList(),
@SerialName(votesCountField)
override val votes: Int = 0
) : PollOption() {
@@ -62,7 +62,7 @@ object PollOptionSerializer : KSerializer<PollOption> {
@SerialName(textField)
val text: String,
@SerialName(textEntitiesField)
val textSources: List<RawMessageEntity>,
val textSources: List<RawMessageEntity> = emptyList(),
@SerialName(votesCountField)
val votes: Int = 0
)

View File

@@ -5,7 +5,7 @@ import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.json.JsonDecoder
import kotlinx.serialization.json.JsonElement
fun <T> Decoder.extractDataAndJson(serializer: DeserializationStrategy<T>): Pair<T, JsonElement?> {
fun <T> Decoder.decodeDataAndJson(serializer: DeserializationStrategy<T>): Pair<T, JsonElement?> {
return if (this is JsonDecoder) {
val raw = decodeJsonElement()
json.decodeFromJsonElement(serializer, raw) to raw