1
0
mirror of https://github.com/InsanusMokrassar/TelegramBotAPI.git synced 2026-03-03 17:32:23 +00:00

completed by chat and completed by user support

This commit is contained in:
2026-02-20 12:45:34 +06:00
parent e6aaa264f6
commit b9157b1924
3 changed files with 127 additions and 87 deletions

View File

@@ -4,6 +4,10 @@
* `Core`: * `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** 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 ## 30.0.2

View File

@@ -23,6 +23,10 @@ data class TelegramDate(
val asDate: DateTime = DateTime( val asDate: DateTime = DateTime(
date * 1000 date * 1000
) )
companion object {
val Start = TelegramDate(0)
}
} }
fun DateTime.toTelegramDate(): TelegramDate = TelegramDate(this) fun DateTime.toTelegramDate(): TelegramDate = TelegramDate(this)

View File

@@ -104,8 +104,8 @@ sealed interface ChecklistTask : TextedInput {
} }
@Suppress("SERIALIZER_TYPE_INCOMPATIBLE") @Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
@Serializable(Created.Serializer::class) @Serializable(Serializer::class)
data class Undone( data class Uncompleted(
@SerialName(idField) @SerialName(idField)
override val id: ChecklistTaskId, override val id: ChecklistTaskId,
@SerialName(textEntitiesField) @SerialName(textEntitiesField)
@@ -125,103 +125,135 @@ sealed interface ChecklistTask : TextedInput {
) )
} }
@Suppress("SERIALIZER_TYPE_INCOMPATIBLE") @Serializable(Serializer::class)
@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<TextSource> = 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)
sealed interface Created : ChecklistTask { sealed interface Created : ChecklistTask {
val completedByUser: PreviewUser? val completedByUser: PreviewUser?
get() = null get() = null
val completedByChat: PreviewChat?
get() = null
val completionDate: TelegramDate? val completionDate: TelegramDate?
get() = null get() = null
}
@RiskFeature @Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
object Serializer : KSerializer<Created> { @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<TextSource> = emptyList()
) : Completed {
@OptIn(ExperimentalSerializationApi::class)
@EncodeDefault
@Serializable @Serializable
private data class RawCreatedChecklistTask( @SerialName(textField)
@SerialName(idField) override val text: String = textSources.makeSourceString()
val id: ChecklistTaskId, }
@SerialName(textField) @Suppress("SERIALIZER_TYPE_INCOMPATIBLE")
val text: String, @Serializable(Serializer::class)
@SerialName(textEntitiesField) data class ByChat(
val textSources: List<RawMessageEntity> = emptyList(), @SerialName(idField)
@Suppress("SERIALIZER_TYPE_INCOMPATIBLE") override val id: ChecklistTaskId,
@SerialName(completedByUserField) @SerialName(completedByChatField)
val completedByUser: PreviewUser? = null, override val completedByChat: PreviewChat,
@SerialName(completedByChatField) @SerialName(completionDateField)
val completedByChat: PreviewChat? = null, override val completionDate: TelegramDate,
@SerialName(completionDateField) @SerialName(textEntitiesField)
val completionDate: TelegramDate = TelegramDate(0), // TelegramDate(0) is the default according to https://core.telegram.org/bots/api#checklisttask override val textSources: List<TextSource> = 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<TextSource> = emptyList()
) : Completed {
@OptIn(ExperimentalSerializationApi::class)
@EncodeDefault
@Serializable
@SerialName(textField)
override val text: String = textSources.makeSourceString()
}
}
@RiskFeature
object Serializer : KSerializer<Created> {
@Serializable
private data class RawCreatedChecklistTask(
@SerialName(idField)
val id: ChecklistTaskId,
@SerialName(textField)
val text: String,
@SerialName(textEntitiesField)
val textSources: List<RawMessageEntity> = 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 { return when {
val raw = RawCreatedChecklistTask.serializer().deserialize( raw.completionDate == TelegramDate.Start -> Uncompleted(
decoder id = raw.id,
textSources = raw.textSources.asTextSources(raw.text),
) )
raw.completedByChat != null -> Completed.ByChat(
return when { id = raw.id,
raw.completedByUser != null -> Done( completedByChat = raw.completedByChat,
id = raw.id, completionDate = raw.completionDate,
completedByUser = raw.completedByUser, textSources = raw.textSources.asTextSources(raw.text),
completedByChat = raw.completedByChat, )
completionDate = raw.completionDate, raw.completedByUser != null -> Completed.ByUser(
textSources = raw.textSources.asTextSources(raw.text), id = raw.id,
) completedByUser = raw.completedByUser,
else -> Undone( completionDate = raw.completionDate,
id = raw.id, textSources = raw.textSources.asTextSources(raw.text),
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 as? Done)?.completedByChat,
completionDate = value.completionDate ?: TelegramDate(0),
textSources = value.textSources.toRawMessageEntities()
)
) )
} }
} }
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()
)
)
}
} }
} }