diff --git a/CHANGELOG.md b/CHANGELOG.md index 374ed8be37..30300a093f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ * `Core`: * **THIS IS BREAKING CHANGE** All media files with sizes changed type of `fileSize` field from `Long` to `FileSize` (value class) + * **THIS IS BREAKING CHANGE** For `CheclistTask` have been made several changes: + * `ChecklistTask.Done` -> `ChecklistTask.Completed` + * `ChecklistTask.Undone` -> `ChecklistTask.Uncompleted` + * Added several inheritors of `ChecklistTask.Completed` - for completed by chat, by user or just completed tasks ## 30.0.2 diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/TelegramDate.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/TelegramDate.kt index e3f8455399..b2981fa92b 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/TelegramDate.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/TelegramDate.kt @@ -23,6 +23,10 @@ data class TelegramDate( val asDate: DateTime = DateTime( date * 1000 ) + + companion object { + val Start = TelegramDate(0) + } } fun DateTime.toTelegramDate(): TelegramDate = TelegramDate(this) diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/checklists/ChecklistTask.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/checklists/ChecklistTask.kt index ef9be422ce..4442dec753 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/checklists/ChecklistTask.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/checklists/ChecklistTask.kt @@ -104,8 +104,8 @@ sealed interface ChecklistTask : TextedInput { } @Suppress("SERIALIZER_TYPE_INCOMPATIBLE") - @Serializable(Created.Serializer::class) - data class Undone( + @Serializable(Serializer::class) + data class Uncompleted( @SerialName(idField) override val id: ChecklistTaskId, @SerialName(textEntitiesField) @@ -125,103 +125,135 @@ sealed interface ChecklistTask : TextedInput { ) } - @Suppress("SERIALIZER_TYPE_INCOMPATIBLE") - @Serializable(Created.Serializer::class) - data class Done( - @SerialName(idField) - override val id: ChecklistTaskId, - @SerialName(completedByUserField) - override val completedByUser: PreviewUser, - @SerialName(completedByChatField) - val completedByChat: PreviewChat? = null, - @SerialName(completionDateField) - override val completionDate: TelegramDate, - @SerialName(textEntitiesField) - override val textSources: List = emptyList() - ) : ChecklistTask.Created { - @OptIn(ExperimentalSerializationApi::class) - @EncodeDefault - @Serializable - @SerialName(textField) - override val text: String = textSources.makeSourceString() - - constructor( - id: ChecklistTaskId, - text: String, - completedByUser: PreviewUser, - completedByChat: PreviewChat? = null, - completionDate: TelegramDate, - ): this( - id, - completedByUser, - completedByChat, - completionDate, - listOf( - RegularTextSource(text) - ) - ) - } - - @Serializable(Created.Serializer::class) + @Serializable(Serializer::class) sealed interface Created : ChecklistTask { val completedByUser: PreviewUser? get() = null + val completedByChat: PreviewChat? + get() = null val completionDate: TelegramDate? get() = null + } - @RiskFeature - object Serializer : KSerializer { + @Suppress("SERIALIZER_TYPE_INCOMPATIBLE") + @Serializable(Serializer::class) + sealed interface Completed : Created { + @Suppress("SERIALIZER_TYPE_INCOMPATIBLE") + @Serializable(Serializer::class) + data class ByUser( + @SerialName(idField) + override val id: ChecklistTaskId, + @SerialName(completedByUserField) + override val completedByUser: PreviewUser, + @SerialName(completionDateField) + override val completionDate: TelegramDate, + @SerialName(textEntitiesField) + override val textSources: List = emptyList() + ) : Completed { + @OptIn(ExperimentalSerializationApi::class) + @EncodeDefault @Serializable - private data class RawCreatedChecklistTask( - @SerialName(idField) - val id: ChecklistTaskId, - @SerialName(textField) - val text: String, - @SerialName(textEntitiesField) - val textSources: List = emptyList(), - @Suppress("SERIALIZER_TYPE_INCOMPATIBLE") - @SerialName(completedByUserField) - val completedByUser: PreviewUser? = null, - @SerialName(completedByChatField) - val completedByChat: PreviewChat? = null, - @SerialName(completionDateField) - val completionDate: TelegramDate = TelegramDate(0), // TelegramDate(0) is the default according to https://core.telegram.org/bots/api#checklisttask + @SerialName(textField) + override val text: String = textSources.makeSourceString() + } + @Suppress("SERIALIZER_TYPE_INCOMPATIBLE") + @Serializable(Serializer::class) + data class ByChat( + @SerialName(idField) + override val id: ChecklistTaskId, + @SerialName(completedByChatField) + override val completedByChat: PreviewChat, + @SerialName(completionDateField) + override val completionDate: TelegramDate, + @SerialName(textEntitiesField) + override val textSources: List = emptyList() + ) : Completed { + @OptIn(ExperimentalSerializationApi::class) + @EncodeDefault + @Serializable + @SerialName(textField) + override val text: String = textSources.makeSourceString() + } + @Suppress("SERIALIZER_TYPE_INCOMPATIBLE") + @Serializable(Serializer::class) + data class Common( + @SerialName(idField) + override val id: ChecklistTaskId, + @SerialName(completionDateField) + override val completionDate: TelegramDate, + @SerialName(textEntitiesField) + override val textSources: List = emptyList() + ) : Completed { + @OptIn(ExperimentalSerializationApi::class) + @EncodeDefault + @Serializable + @SerialName(textField) + override val text: String = textSources.makeSourceString() + } + } + + @RiskFeature + object Serializer : KSerializer { + @Serializable + private data class RawCreatedChecklistTask( + @SerialName(idField) + val id: ChecklistTaskId, + @SerialName(textField) + val text: String, + @SerialName(textEntitiesField) + val textSources: List = emptyList(), + @Suppress("SERIALIZER_TYPE_INCOMPATIBLE") + @SerialName(completedByUserField) + val completedByUser: PreviewUser? = null, + @SerialName(completedByChatField) + val completedByChat: PreviewChat? = null, + @SerialName(completionDateField) + val completionDate: TelegramDate = TelegramDate.Start, // TelegramDate(0) is the default according to https://core.telegram.org/bots/api#checklisttask + ) + override val descriptor: SerialDescriptor = RawCreatedChecklistTask.serializer().descriptor + + override fun deserialize(decoder: Decoder): Created { + val raw = RawCreatedChecklistTask.serializer().deserialize( + decoder ) - override val descriptor: SerialDescriptor = RawCreatedChecklistTask.serializer().descriptor - override fun deserialize(decoder: Decoder): Created { - val raw = RawCreatedChecklistTask.serializer().deserialize( - decoder + return when { + raw.completionDate == TelegramDate.Start -> Uncompleted( + id = raw.id, + textSources = raw.textSources.asTextSources(raw.text), ) - - return when { - raw.completedByUser != null -> Done( - id = raw.id, - completedByUser = raw.completedByUser, - completedByChat = raw.completedByChat, - completionDate = raw.completionDate, - textSources = raw.textSources.asTextSources(raw.text), - ) - else -> Undone( - id = raw.id, - textSources = raw.textSources.asTextSources(raw.text), - ) - } - } - - override fun serialize(encoder: Encoder, value: Created) { - RawCreatedChecklistTask.serializer().serialize( - encoder, - RawCreatedChecklistTask( - id = value.id, - text = value.text, - completedByUser = value.completedByUser, - completedByChat = (value as? Done)?.completedByChat, - completionDate = value.completionDate ?: TelegramDate(0), - textSources = value.textSources.toRawMessageEntities() - ) + raw.completedByChat != null -> Completed.ByChat( + id = raw.id, + completedByChat = raw.completedByChat, + completionDate = raw.completionDate, + textSources = raw.textSources.asTextSources(raw.text), + ) + raw.completedByUser != null -> Completed.ByUser( + id = raw.id, + completedByUser = raw.completedByUser, + completionDate = raw.completionDate, + textSources = raw.textSources.asTextSources(raw.text), + ) + else -> Completed.Common( + id = raw.id, + completionDate = raw.completionDate, + textSources = raw.textSources.asTextSources(raw.text), ) } } + + override fun serialize(encoder: Encoder, value: Created) { + RawCreatedChecklistTask.serializer().serialize( + encoder, + RawCreatedChecklistTask( + id = value.id, + text = value.text, + completedByUser = value.completedByUser, + completedByChat = value.completedByChat, + completionDate = value.completionDate ?: TelegramDate.Start, + textSources = value.textSources.toRawMessageEntities() + ) + ) + } } } \ No newline at end of file