From a8ae0a296a5ea2bc4814bbb5b35e025d98a021c5 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Thu, 23 Jan 2020 19:08:02 +0600 Subject: [PATCH] separated User object and additional fields for Bot representation --- CHANGELOG.md | 4 ++ .../TelegramBotAPI/requests/GetMe.kt | 7 ++- .../TelegramBotAPI/types/Common.kt | 3 + .../TelegramBotAPI/types/User.kt | 59 +++++++++++++++++-- 4 files changed, 64 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 36c621dfe1..42a75cc135 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,10 @@ * `UnknownKeyboardButtonPollType` * `RegularKeyboardButtonPollType` * `QuizKeyboardButtonPollType` +* `User` now is sealed class + * `CommonUser` was added as representation of default `User` + * `Bot` was added as representation of bot user + * `GetMe` now return `Bot` object ## 0.22.0 diff --git a/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/GetMe.kt b/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/GetMe.kt index 143b9b4bd0..cdd3848747 100644 --- a/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/GetMe.kt +++ b/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/GetMe.kt @@ -1,14 +1,15 @@ package com.github.insanusmokrassar.TelegramBotAPI.requests import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.Bot import com.github.insanusmokrassar.TelegramBotAPI.types.User import kotlinx.serialization.* @Serializable -class GetMe : SimpleRequest { +class GetMe : SimpleRequest { override fun method(): String = "getMe" - override val resultDeserializer: DeserializationStrategy - get() = User.serializer() + override val resultDeserializer: DeserializationStrategy + get() = Bot.serializer() override val requestSerializer: SerializationStrategy<*> get() = serializer() } \ No newline at end of file diff --git a/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/Common.kt b/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/Common.kt index 8d57258013..a2d146825b 100644 --- a/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/Common.kt +++ b/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/Common.kt @@ -57,6 +57,9 @@ const val isBotField = "is_bot" const val firstNameField = "first_name" const val lastNameField = "last_name" const val languageCodeField = "language_code" +const val canJoinGroupsField = "can_join_groups" +const val canReadAllGroupMessagesField = "can_read_all_group_messages" +const val supportInlineQueriesField = "supports_inline_queries" const val textEntitiesField = "text_entities" const val stickerSetNameField = "set_name" const val stickerSetNameFullField = "sticker_set_name" diff --git a/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/User.kt b/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/User.kt index 7e2e291df5..4cd395f902 100644 --- a/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/User.kt +++ b/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/User.kt @@ -1,14 +1,16 @@ package com.github.insanusmokrassar.TelegramBotAPI.types import com.github.insanusmokrassar.TelegramBotAPI.types.chat.abstracts.PrivateChat -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable +import kotlinx.serialization.* +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.JsonObjectSerializer @Serializable -data class User( +sealed class User : PrivateChat + +@Serializable +data class CommonUser( override val id: ChatId, - @SerialName(isBotField) - val isBot: Boolean = false, @SerialName(firstNameField) override val firstName: String, @SerialName(lastNameField) @@ -17,4 +19,49 @@ data class User( override val username: Username? = null, @SerialName(languageCodeField) val languageCode: String? = null -) : PrivateChat +) : User() + +@Serializable +data class Bot( + override val id: ChatId, + @SerialName(firstNameField) + override val firstName: String, + @SerialName(lastNameField) + override val lastName: String = "", + @SerialName(usernameField) + override val username: Username? = null, + @SerialName(canJoinGroupsField) + val canJoinGroups: Boolean = false, + @SerialName(canReadAllGroupMessagesField) + val canReadAllGroupMessages: Boolean = false, + @SerialName(supportInlineQueriesField) + val supportsInlineQueries: Boolean = false +) : User() { + @SerialName(isBotField) + private val isBot = true +} + +@Serializer(User::class) +internal object UserSerializer : KSerializer { + override fun deserialize(decoder: Decoder): User { + val asJson = JsonObjectSerializer.deserialize(decoder) + + return when { + asJson.getPrimitiveOrNull(isBotField) ?.booleanOrNull != true -> Json.nonstrict.fromJson( + CommonUser.serializer(), + asJson + ) + else -> Json.nonstrict.fromJson( + Bot.serializer(), + asJson + ) + } + } + + override fun serialize(encoder: Encoder, obj: User) { + when (obj) { + is CommonUser -> CommonUser.serializer().serialize(encoder, obj) + is Bot -> Bot.serializer().serialize(encoder, obj) + } + } +}