diff --git a/CHANGELOG.md b/CHANGELOG.md index f9c4d80f91..aa0123b088 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ * `Core`: * Add opportunity to create `IdChatIdentifier` with optional `threadId` + * New serializer `FullChatIdentifierSerializer` with serialization of `ChatIdWithThreadId` ## 4.1.0 diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/ChatIdentifier.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/ChatIdentifier.kt index 2b0ad1e6a5..0f81141a77 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/ChatIdentifier.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/ChatIdentifier.kt @@ -97,6 +97,7 @@ object ChatIdentifierSerializer : KSerializer { override val descriptor: SerialDescriptor = internalSerializer.descriptor override fun deserialize(decoder: Decoder): ChatIdentifier { val id = internalSerializer.deserialize(decoder) + return id.longOrNull ?.let { ChatId(it) } ?: id.content.let { @@ -115,3 +116,41 @@ object ChatIdentifierSerializer : KSerializer { } } } + +@RiskFeature +object FullChatIdentifierSerializer : KSerializer { + private val internalSerializer = JsonPrimitive.serializer() + override val descriptor: SerialDescriptor = internalSerializer.descriptor + override fun deserialize(decoder: Decoder): ChatIdentifier { + val id = internalSerializer.deserialize(decoder) + + return id.longOrNull ?.let { + ChatId(it) + } ?:let { + val splitted = id.content.split("/") + if (splitted.size == 2) { + val (chatId, threadId) = splitted + ChatIdWithThreadId( + chatId.toLongOrNull() ?: return@let null, + threadId.toLongOrNull() ?: return@let null + ) + } else { + null + } + } ?: id.content.let { + if (!it.startsWith("@")) { + Username("@$it") + } else { + Username(it) + } + } + } + + override fun serialize(encoder: Encoder, value: ChatIdentifier) { + when (value) { + is ChatId -> encoder.encodeLong(value.chatId) + is ChatIdWithThreadId -> encoder.encodeString("${value.chatId}/${value.threadId}") + is Username -> encoder.encodeString(value.username) + } + } +}