diff --git a/CHANGELOG.md b/CHANGELOG.md index 23c6e41153..aa0123b088 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # TelegramBotAPI changelog +## 4.1.1 + +* `Core`: + * Add opportunity to create `IdChatIdentifier` with optional `threadId` + * New serializer `FullChatIdentifierSerializer` with serialization of `ChatIdWithThreadId` + ## 4.1.0 * `Versions`: diff --git a/gradle.properties b/gradle.properties index 12f8e88ed4..8c6bfddbee 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,4 +6,4 @@ kotlin.incremental=true kotlin.incremental.js=true library_group=dev.inmo -library_version=4.1.0 +library_version=4.1.1 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 42805b6d75..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 @@ -30,6 +30,9 @@ sealed interface IdChatIdentifier : ChatIdentifier { companion object { operator fun invoke(chatId: Identifier) = ChatId(chatId) + operator fun invoke(chatId: Identifier, threadId: MessageThreadId?) = threadId ?.let { + ChatIdWithThreadId(chatId, threadId) + } ?: ChatId(chatId) } } @@ -94,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 { @@ -112,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) + } + } +}