From 0c711339699c2d25c70899f4d11d2909b9104599 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Mon, 25 Jan 2021 10:29:11 +0600 Subject: [PATCH] add expectations and triggers for passport --- .../expectations/WaitPassportData.kt | 54 +++++++++++++++++++ .../triggers_handling/PassportTriggers.kt | 42 +++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitPassportData.kt create mode 100644 tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/PassportTriggers.kt diff --git a/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitPassportData.kt b/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitPassportData.kt new file mode 100644 index 0000000000..1e043d5901 --- /dev/null +++ b/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitPassportData.kt @@ -0,0 +1,54 @@ +package dev.inmo.tgbotapi.extensions.behaviour_builder.expectations + +import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext +import dev.inmo.tgbotapi.extensions.utils.* +import dev.inmo.tgbotapi.requests.abstracts.Request +import dev.inmo.tgbotapi.types.message.PassportMessage +import dev.inmo.tgbotapi.types.passport.PassportData +import dev.inmo.tgbotapi.types.passport.encrypted_data.abstracts.EncryptedPassportElement +import dev.inmo.tgbotapi.utils.RiskFeature +import kotlinx.coroutines.flow.toList + +typealias PassportMessageMapper = suspend PassportMessage.() -> PassportData + +@RiskFeature("Do not use this message directly, use waitPassportMessagesWith or waitAnyPassportMessages instead") +suspend fun BehaviourContext.waitPassportMessages( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null }, + count: Int = 1, + mapper: suspend PassportMessage.() -> O? +): List = expectFlow( + initRequest, + count, + errorFactory +) { + it.asMessageUpdate() ?.data ?.asPassportMessage() ?.mapper().let(::listOfNotNull) +}.toList().toList() + +suspend inline fun BehaviourContext.waitPassportMessagesWith( + count: Int = 1, + initRequest: Request<*>? = null, + noinline errorFactory: NullableRequestBuilder<*> = { null }, + noinline filter: PassportMessageMapper? = null +) : List = waitPassportMessages( + initRequest, + errorFactory, + count +) { + if (passportData.data.any { it is T }) { + if (filter == null) { + passportData + } else { + filter(this) + } + } else { + null + } +} + +suspend fun BehaviourContext.waitAnyPassportMessages( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null }, + count: Int = 1, + filter: PassportMessageMapper? = null +) = waitPassportMessagesWith(count, initRequest, errorFactory, filter) diff --git a/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/PassportTriggers.kt b/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/PassportTriggers.kt new file mode 100644 index 0000000000..5b2520fc11 --- /dev/null +++ b/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/PassportTriggers.kt @@ -0,0 +1,42 @@ +package dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling + +import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions +import dev.inmo.tgbotapi.extensions.behaviour_builder.* +import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.expectFlow +import dev.inmo.tgbotapi.extensions.utils.* +import dev.inmo.tgbotapi.extensions.utils.extensions.sourceChat +import dev.inmo.tgbotapi.types.message.PassportMessage +import dev.inmo.tgbotapi.types.passport.encrypted_data.abstracts.EncryptedPassportElement + +suspend inline fun BehaviourContext.onPassportMessageWith( + includeFilterByChatInBehaviourSubContext: Boolean = true, + noinline additionalFilter: (suspend (PassportMessage) -> Boolean)? = null, + noinline scenarioReceiver: BehaviourContextAndTypeReceiver +) = flowsUpdatesFilter.expectFlow(bot) { + it.asMessageUpdate() ?.data ?.asPassportMessage() ?.let { message -> + if (message.passportData.data.any { it is T }) { + if (additionalFilter == null || additionalFilter(message)) message else null + } else { + null + } + }.let(::listOfNotNull) +}.subscribeSafelyWithoutExceptions(scope) { triggerMessage -> + doInSubContextWithUpdatesFilter( + updatesFilter = if (includeFilterByChatInBehaviourSubContext) { + { it.sourceChat() ?.id ?.chatId == triggerMessage.chat.id.chatId } + } else null + ) { + scenarioReceiver(triggerMessage) + } +} + +suspend fun BehaviourContext.onPassportMessage( + includeFilterByChatInBehaviourSubContext: Boolean = true, + additionalFilter: (suspend (PassportMessage) -> Boolean)? = null, + scenarioReceiver: BehaviourContextAndTypeReceiver +) = onPassportMessageWith( + includeFilterByChatInBehaviourSubContext, + additionalFilter, + scenarioReceiver +) +