From c6fb50c4a65c41c9f041f8c78b5085c917c15cc7 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Fri, 24 Apr 2020 19:08:54 +0600 Subject: [PATCH] SendPoll#closeInfo functionality --- CHANGELOG.md | 1 + .../requests/send/polls/SendPoll.kt | 28 +++++++++++++ .../TelegramBotAPI/types/polls/Poll.kt | 40 +++++++++---------- 3 files changed, 48 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7773efdffa..901f5a5984 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ * `explanationEntitiesField` * `openPeriodField` * `closeDateField` + * Field `SendPoll#closeInfo` was added * `SendQuizPoll` now able to use fields `caption` and `parseMode` for `explanation` functionality * `quizPollExplanationLimit` was added for checking `QuizPoll` explanation size * Field `TextLinkTextSource#url` was added diff --git a/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/polls/SendPoll.kt b/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/polls/SendPoll.kt index 4b83c8a8c3..38a19c90d4 100644 --- a/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/polls/SendPoll.kt +++ b/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/polls/SendPoll.kt @@ -71,6 +71,7 @@ fun Poll.createRequest( isAnonymous, isClosed, allowMultipleAnswers, + scheduledCloseInfo, disableNotification, replyToMessageId, replyMarkup @@ -85,6 +86,7 @@ fun Poll.createRequest( isClosed, caption ?.fullListOfSubSource(captionEntities) ?.toMarkdownV2Captions() ?.firstOrNull(), MarkdownV2, + scheduledCloseInfo, disableNotification, replyToMessageId, replyMarkup @@ -96,6 +98,7 @@ fun Poll.createRequest( isAnonymous, isClosed, false, + scheduledCloseInfo, disableNotification, replyToMessageId, replyMarkup @@ -107,6 +110,7 @@ fun Poll.createRequest( isAnonymous, isClosed, false, + scheduledCloseInfo, disableNotification, replyToMessageId, replyMarkup @@ -119,8 +123,12 @@ sealed class SendPoll : SendMessageRequest>, abstract val options: List abstract val isAnonymous: Boolean abstract val isClosed: Boolean + abstract val closeInfo: ScheduledCloseInfo? abstract val type: String + internal abstract val openPeriod: LongSeconds? + internal abstract val closeDate: LongSeconds? + override fun method(): String = "sendPoll" override val resultDeserializer: DeserializationStrategy> get() = commonResultDeserializer @@ -140,6 +148,8 @@ data class SendRegularPoll( override val isClosed: Boolean = false, @SerialName(allowsMultipleAnswersField) val allowMultipleAnswers: Boolean = false, + @Transient + override val closeInfo: ScheduledCloseInfo? = null, @SerialName(disableNotificationField) override val disableNotification: Boolean = false, @SerialName(replyToMessageIdField) @@ -151,6 +161,14 @@ data class SendRegularPoll( override val requestSerializer: SerializationStrategy<*> get() = serializer() + @SerialName(openPeriodField) + override val openPeriod: LongSeconds? + = (closeInfo as? ApproximateScheduledCloseInfo) ?.openDuration ?.millisecondsLong ?.div(1000) + + @SerialName(closeDateField) + override val closeDate: LongSeconds? + = (closeInfo as? ExactScheduledCloseInfo) ?.closeDateTime ?.unixMillisLong ?.div(1000) + init { checkPollInfo(question, options) } @@ -174,6 +192,8 @@ data class SendQuizPoll( override val caption: String? = null, @SerialName(explanationParseModeField) override val parseMode: ParseMode? = null, + @Transient + override val closeInfo: ScheduledCloseInfo? = null, @SerialName(disableNotificationField) override val disableNotification: Boolean = false, @SerialName(replyToMessageIdField) @@ -185,6 +205,14 @@ data class SendQuizPoll( override val requestSerializer: SerializationStrategy<*> get() = serializer() + @SerialName(openPeriodField) + override val openPeriod: LongSeconds? + = (closeInfo as? ApproximateScheduledCloseInfo) ?.openDuration ?.millisecondsLong ?.div(1000) + + @SerialName(closeDateField) + override val closeDate: LongSeconds? + = (closeInfo as? ExactScheduledCloseInfo) ?.closeDateTime ?.unixMillisLong ?.div(1000) + init { checkPollInfo(question, options) val correctOptionIdRange = 0 .. options.size diff --git a/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/polls/Poll.kt b/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/polls/Poll.kt index 90cb875245..d90633ee48 100644 --- a/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/polls/Poll.kt +++ b/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/polls/Poll.kt @@ -21,13 +21,22 @@ data class ExactScheduledCloseInfo( ) : ScheduledCloseInfo() data class ApproximateScheduledCloseInfo( - val openDuration: TimeSpan -) : ScheduledCloseInfo() { + val openDuration: TimeSpan, @Suppress("MemberVisibilityCanBePrivate") - val startPoint = DateTime.now() + val startPoint: DateTime = DateTime.now() +) : ScheduledCloseInfo() { override val closeDateTime: DateTime = startPoint + openDuration } +val LongSeconds.asApproximateScheduledCloseInfo + get() = ApproximateScheduledCloseInfo( + TimeSpan(this * 1000.0) + ) +val LongSeconds.asExactScheduledCloseInfo + get() = ExactScheduledCloseInfo( + DateTime(unixMillis = this * 1000.0) + ) + @Serializable(PollSerializer::class) sealed class Poll { abstract val id: PollIdentifier @@ -72,15 +81,8 @@ private class RawPoll( val closeDate: LongSeconds? = null ) { @Transient - val scheduledCloseInfo: ScheduledCloseInfo? = closeDate ?.let { - ExactScheduledCloseInfo( - DateTime(unixMillis = it * 1000.0) - ) - } ?: openPeriod ?.let { - ApproximateScheduledCloseInfo( - TimeSpan(it * 1000.0) - ) - } + val scheduledCloseInfo: ScheduledCloseInfo? + = closeDate ?.asExactScheduledCloseInfo ?: openPeriod ?.asApproximateScheduledCloseInfo } @Serializable @@ -101,15 +103,11 @@ data class UnknownPollType internal constructor( val raw: JsonObject ) : Poll() { @Transient - override val scheduledCloseInfo: ScheduledCloseInfo? = raw.getPrimitiveOrNull(closeDateField) ?.longOrNull ?.let { - ExactScheduledCloseInfo( - DateTime(unixMillis = it * 1000.0) - ) - } ?: raw.getPrimitiveOrNull(durationField) ?.longOrNull ?.let { - ApproximateScheduledCloseInfo( - TimeSpan(it * 1000.0) - ) - } + override val scheduledCloseInfo: ScheduledCloseInfo? = raw.getPrimitiveOrNull( + closeDateField + ) ?.longOrNull ?.asExactScheduledCloseInfo ?: raw.getPrimitiveOrNull( + openPeriodField + ) ?.longOrNull ?.asApproximateScheduledCloseInfo } @Serializable(PollSerializer::class)