From ed077ae1bc783776c955af26fe01f78d21e33803 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Fri, 6 Aug 2021 10:32:31 +0600 Subject: [PATCH] filters in waiters --- CHANGELOG.md | 1 + .../expectations/WaitCallbackQuery.kt | 62 +++++--- .../expectations/WaitChatMemberUpdated.kt | 34 ++-- .../expectations/WaitContent.kt | 147 +++++++++++------- .../expectations/WaitEventAction.kt | 119 ++++++++------ .../expectations/WaitInlineQuery.kt | 30 ++-- .../expectations/WaitPassportData.kt | 24 ++- 7 files changed, 272 insertions(+), 145 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b9f80096ad..af914fe97c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ * New `TelegramBot#buildBehaviour` extension with `FlowUpdatesFilter` and `CoroutineScope` with default `CoroutineScope` * New typealias `SimpleFilter` for unifying triggers filter signatures + * All waiters got real filters (`SimpleFilter`) and rename old filters as mappers ## 0.35.2 diff --git a/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitCallbackQuery.kt b/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitCallbackQuery.kt index c279181bb9..efb5f7c33b 100644 --- a/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitCallbackQuery.kt +++ b/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitCallbackQuery.kt @@ -3,6 +3,7 @@ package dev.inmo.tgbotapi.extensions.behaviour_builder.expectations import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext +import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.SimpleFilter import dev.inmo.tgbotapi.extensions.utils.asCallbackQueryUpdate import dev.inmo.tgbotapi.requests.abstracts.Request import dev.inmo.tgbotapi.types.CallbackQuery.* @@ -14,13 +15,19 @@ private suspend fun BehaviourContext.waitCallbackQueries( count: Int = 1, initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, + filter: SimpleFilter? = null, mapper: suspend CallbackQuery.() -> O? ): List = expectFlow( initRequest, count, errorFactory ) { - it.asCallbackQueryUpdate() ?.data ?.mapper().let(::listOfNotNull) + val data = it.asCallbackQueryUpdate() ?.data + if (data != null && (filter == null || filter(data))) { + data.mapper().let(::listOfNotNull) + } else { + emptyList() + } }.toList().toList() @@ -28,11 +35,17 @@ private suspend inline fun BehaviourContext.waitCall count: Int = 1, initRequest: Request<*>? = null, noinline errorFactory: NullableRequestBuilder<*> = { null }, + filter: SimpleFilter? = null, noinline filter: CallbackQueryMapper? = null ) : List = waitCallbackQueries( count, initRequest, - errorFactory + errorFactory, + filter ?.let { + { + (it as? T) ?.let(::filter) + } + } ) { if (this is T) { if (filter == null) { @@ -50,53 +63,62 @@ suspend fun BehaviourContext.waitDataCallbackQuery( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: CallbackQueryMapper? = null -) = waitCallbacks(count, initRequest, errorFactory, filter) + filter: SimpleFilter? = null, + mapper: CallbackQueryMapper? = null +) = waitCallbacks(count, initRequest, errorFactory, filter, mapper) suspend fun BehaviourContext.waitGameShortNameCallbackQuery( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: CallbackQueryMapper? = null -) = waitCallbacks(count, initRequest, errorFactory, filter) + filter: SimpleFilter? = null, + mapper: CallbackQueryMapper? = null +) = waitCallbacks(count, initRequest, errorFactory, filter, mapper) suspend fun BehaviourContext.waitInlineMessageIdCallbackQuery( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: CallbackQueryMapper? = null -) = waitCallbacks(count, initRequest, errorFactory, filter) + filter: SimpleFilter? = null, + mapper: CallbackQueryMapper? = null +) = waitCallbacks(count, initRequest, errorFactory, filter, mapper) suspend fun BehaviourContext.waitInlineMessageIdDataCallbackQuery( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: CallbackQueryMapper? = null -) = waitCallbacks(count, initRequest, errorFactory, filter) + filter: SimpleFilter? = null, + mapper: CallbackQueryMapper? = null +) = waitCallbacks(count, initRequest, errorFactory, filter, mapper) suspend fun BehaviourContext.waitInlineMessageIdGameShortNameCallbackQuery( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: CallbackQueryMapper? = null -) = waitCallbacks(count, initRequest, errorFactory, filter) + filter: SimpleFilter? = null, + mapper: CallbackQueryMapper? = null +) = waitCallbacks(count, initRequest, errorFactory, filter, mapper) suspend fun BehaviourContext.waitMessageCallbackQuery( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: CallbackQueryMapper? = null -) = waitCallbacks(count, initRequest, errorFactory, filter) + filter: SimpleFilter? = null, + mapper: CallbackQueryMapper? = null +) = waitCallbacks(count, initRequest, errorFactory, filter, mapper) suspend fun BehaviourContext.waitMessageDataCallbackQuery( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: CallbackQueryMapper? = null -) = waitCallbacks(count, initRequest, errorFactory, filter) + filter: SimpleFilter? = null, + mapper: CallbackQueryMapper? = null +) = waitCallbacks(count, initRequest, errorFactory, filter, mapper) suspend fun BehaviourContext.waitMessageGameShortNameCallbackQuery( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: CallbackQueryMapper? = null -) = waitCallbacks(count, initRequest, errorFactory, filter) + filter: SimpleFilter? = null, + mapper: CallbackQueryMapper? = null +) = waitCallbacks(count, initRequest, errorFactory, filter, mapper) suspend fun BehaviourContext.waitUnknownCallbackQuery( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: CallbackQueryMapper? = null -) = waitCallbacks(count, initRequest, errorFactory, filter) + filter: SimpleFilter? = null, + mapper: CallbackQueryMapper? = null +) = waitCallbacks(count, initRequest, errorFactory, filter, mapper) diff --git a/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitChatMemberUpdated.kt b/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitChatMemberUpdated.kt index 6157825208..450fcbd96c 100644 --- a/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitChatMemberUpdated.kt +++ b/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitChatMemberUpdated.kt @@ -1,6 +1,7 @@ package dev.inmo.tgbotapi.extensions.behaviour_builder.expectations import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext +import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.SimpleFilter import dev.inmo.tgbotapi.requests.abstracts.Request import dev.inmo.tgbotapi.types.ChatMemberUpdated import dev.inmo.tgbotapi.types.update.CommonChatMemberUpdatedUpdate @@ -14,29 +15,37 @@ private suspend inline fun BehaviourContex count: Int = 1, initRequest: Request<*>? = null, noinline errorFactory: NullableRequestBuilder<*> = { null }, + filter: SimpleFilter? = null, noinline mapper: ChatMemberUpdatedMapper ): List = expectFlow( initRequest, count, errorFactory ) { - (it as? T) ?.data.let(::listOfNotNull) + val data = (it as? T) ?.data ?: return@expectFlow emptyList() + if (filter == null || filter(data)) { + data.mapper().let(::listOfNotNull) + } else { + emptyList() + } }.toList().toList() private suspend inline fun BehaviourContext.waitChatMemberUpdatedWithFilter( count: Int = 1, initRequest: Request<*>? = null, noinline errorFactory: NullableRequestBuilder<*> = { null }, - noinline filter: ChatMemberUpdatedMapper? = null + filter: SimpleFilter? = null, + noinline mapper: ChatMemberUpdatedMapper? = null ) : List = waitChatMemberUpdated( count, initRequest, - errorFactory + errorFactory, + filter, ) { - if (filter == null) { + if (mapper == null) { this } else { - filter(this) + mapper(this) } } @@ -44,19 +53,22 @@ suspend fun BehaviourContext.waitChatMemberUpdated( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: ChatMemberUpdatedMapper? = null -) = waitChatMemberUpdatedWithFilter(count, initRequest, errorFactory, filter) + filter: SimpleFilter? = null, + mapper: ChatMemberUpdatedMapper? = null +) = waitChatMemberUpdatedWithFilter(count, initRequest, errorFactory, filter, mapper) suspend fun BehaviourContext.waitCommonChatMemberUpdated( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: ChatMemberUpdatedMapper? = null -) = waitChatMemberUpdatedWithFilter(count, initRequest, errorFactory, filter) + filter: SimpleFilter? = null, + mapper: ChatMemberUpdatedMapper? = null +) = waitChatMemberUpdatedWithFilter(count, initRequest, errorFactory, filter, mapper) suspend fun BehaviourContext.waitMyChatMemberUpdated( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: ChatMemberUpdatedMapper? = null -) = waitChatMemberUpdatedWithFilter(count, initRequest, errorFactory, filter) + filter: SimpleFilter? = null, + mapper: ChatMemberUpdatedMapper? = null +) = waitChatMemberUpdatedWithFilter(count, initRequest, errorFactory, filter, mapper) diff --git a/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitContent.kt b/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitContent.kt index 67cbfec556..81a36a1282 100644 --- a/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitContent.kt +++ b/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitContent.kt @@ -4,6 +4,7 @@ package dev.inmo.tgbotapi.extensions.behaviour_builder.expectations import dev.inmo.micro_utils.coroutines.safelyWithoutExceptions import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext +import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.SimpleFilter import dev.inmo.tgbotapi.extensions.utils.* import dev.inmo.tgbotapi.requests.abstracts.Request import dev.inmo.tgbotapi.types.message.abstracts.CommonMessage @@ -11,6 +12,8 @@ import dev.inmo.tgbotapi.types.message.content.* import dev.inmo.tgbotapi.types.message.content.abstracts.* import dev.inmo.tgbotapi.types.message.content.media.* import dev.inmo.tgbotapi.types.message.payments.InvoiceContent +import dev.inmo.tgbotapi.types.update.MediaGroupUpdates.SentMediaGroupUpdate +import dev.inmo.tgbotapi.types.update.abstracts.BaseSentMessageUpdate import kotlinx.coroutines.flow.toList typealias CommonMessageToContentMapper = suspend CommonMessage.() -> T? @@ -20,18 +23,32 @@ private suspend fun BehaviourContext.waitCommonMessage( initRequest: Request<*>? = null, includeMediaGroups: Boolean = true, errorFactory: NullableRequestBuilder<*> = { null }, + filter: SimpleFilter>? = null, mapper: suspend CommonMessage.() -> O? ): List = expectFlow( initRequest, count, errorFactory ) { - if (includeMediaGroups) { - it.asSentMediaGroupUpdate() ?.data ?.mapNotNull { - (it as CommonMessage).mapper() - } ?.let { return@expectFlow it } + val messages = when (it) { + is SentMediaGroupUpdate -> { + if (includeMediaGroups) { + it.data.map { it as CommonMessage } + } else { + emptyList() + } + } + is BaseSentMessageUpdate -> listOf(it.data) + else -> return@expectFlow emptyList() + } + messages.mapNotNull { message -> + val asCommonMessage = message as CommonMessage + if (filter == null || filter(asCommonMessage)) { + asCommonMessage.mapper() + } else { + null + } } - it.asBaseSentMessageUpdate() ?.data ?.asCommonMessage() ?.mapper().let(::listOfNotNull) }.toList().toList() private suspend inline fun BehaviourContext.waitContent( @@ -39,20 +56,22 @@ private suspend inline fun BehaviourContext.waitCon initRequest: Request<*>? = null, includeMediaGroups: Boolean = true, noinline errorFactory: NullableRequestBuilder<*> = { null }, - noinline filter: CommonMessageToContentMapper? = null + filter: SimpleFilter>? = null, + noinline mapper: CommonMessageToContentMapper? = null ) : List = waitCommonMessage( count, initRequest, includeMediaGroups, - errorFactory + errorFactory, + filter ) { if (content is T) { @Suppress("UNCHECKED_CAST") val message = (this as CommonMessage) - if (filter == null) { + if (mapper == null) { message.content } else { - safelyWithoutExceptions { filter(message) } + safelyWithoutExceptions { mapper(message) } } } else { null @@ -64,140 +83,162 @@ suspend fun BehaviourContext.waitContentMessage( errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, includeMediaGroups: Boolean = true, - filter: CommonMessageToContentMapper? = null -) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter) + filter: SimpleFilter>? = null, + mapper: CommonMessageToContentMapper? = null +) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter, mapper) suspend fun BehaviourContext.waitContact( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: CommonMessageToContentMapper? = null -) = waitContent(count, initRequest, false, errorFactory, filter) + filter: SimpleFilter>? = null, + mapper: CommonMessageToContentMapper? = null +) = waitContent(count, initRequest, false, errorFactory, filter, mapper) suspend fun BehaviourContext.waitDice( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: CommonMessageToContentMapper? = null -) = waitContent(count, initRequest, false, errorFactory, filter) + filter: SimpleFilter>? = null, + mapper: CommonMessageToContentMapper? = null +) = waitContent(count, initRequest, false, errorFactory, filter, mapper) suspend fun BehaviourContext.waitGame( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: CommonMessageToContentMapper? = null -) = waitContent(count, initRequest, false, errorFactory, filter) + filter: SimpleFilter>? = null, + mapper: CommonMessageToContentMapper? = null +) = waitContent(count, initRequest, false, errorFactory, filter, mapper) suspend fun BehaviourContext.waitLocation( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: CommonMessageToContentMapper? = null -) = waitContent(count, initRequest, false, errorFactory, filter) + filter: SimpleFilter>? = null, + mapper: CommonMessageToContentMapper? = null +) = waitContent(count, initRequest, false, errorFactory, filter, mapper) suspend fun BehaviourContext.waitPoll( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: CommonMessageToContentMapper? = null -) = waitContent(count, initRequest, false, errorFactory, filter) + filter: SimpleFilter>? = null, + mapper: CommonMessageToContentMapper? = null +) = waitContent(count, initRequest, false, errorFactory, filter, mapper) suspend fun BehaviourContext.waitText( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: CommonMessageToContentMapper? = null -) = waitContent(count, initRequest, false, errorFactory, filter) + filter: SimpleFilter>? = null, + mapper: CommonMessageToContentMapper? = null +) = waitContent(count, initRequest, false, errorFactory, filter, mapper) suspend fun BehaviourContext.waitVenue( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: CommonMessageToContentMapper? = null -) = waitContent(count, initRequest, false, errorFactory, filter) + filter: SimpleFilter>? = null, + mapper: CommonMessageToContentMapper? = null +) = waitContent(count, initRequest, false, errorFactory, filter, mapper) suspend fun BehaviourContext.waitAudioMediaGroupContent( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, includeMediaGroups: Boolean = true, - filter: CommonMessageToContentMapper? = null -) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter) + filter: SimpleFilter>? = null, + mapper: CommonMessageToContentMapper? = null +) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter, mapper) suspend fun BehaviourContext.waitDocumentMediaGroupContent( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, includeMediaGroups: Boolean = true, - filter: CommonMessageToContentMapper? = null -) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter) + filter: SimpleFilter>? = null, + mapper: CommonMessageToContentMapper? = null +) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter, mapper) suspend fun BehaviourContext.waitMedia( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, includeMediaGroups: Boolean = false, - filter: CommonMessageToContentMapper? = null -) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter) + filter: SimpleFilter>? = null, + mapper: CommonMessageToContentMapper? = null +) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter, mapper) suspend fun BehaviourContext.waitAnyMediaGroupContent( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, includeMediaGroups: Boolean = true, - filter: CommonMessageToContentMapper? = null -) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter) + filter: SimpleFilter>? = null, + mapper: CommonMessageToContentMapper? = null +) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter, mapper) suspend fun BehaviourContext.waitVisualMediaGroupContent( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, includeMediaGroups: Boolean = true, - filter: CommonMessageToContentMapper? = null -) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter) + filter: SimpleFilter>? = null, + mapper: CommonMessageToContentMapper? = null +) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter, mapper) suspend fun BehaviourContext.waitAnimation( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: CommonMessageToContentMapper? = null -) = waitContent(count, initRequest, false, errorFactory, filter) + filter: SimpleFilter>? = null, + mapper: CommonMessageToContentMapper? = null +) = waitContent(count, initRequest, false, errorFactory, filter, mapper) suspend fun BehaviourContext.waitAudio( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, includeMediaGroups: Boolean = false, - filter: CommonMessageToContentMapper? = null -) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter) + filter: SimpleFilter>? = null, + mapper: CommonMessageToContentMapper? = null +) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter, mapper) suspend fun BehaviourContext.waitDocument( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, includeMediaGroups: Boolean = false, - filter: CommonMessageToContentMapper? = null -) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter) + filter: SimpleFilter>? = null, + mapper: CommonMessageToContentMapper? = null +) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter, mapper) suspend fun BehaviourContext.waitPhoto( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, includeMediaGroups: Boolean = false, - filter: CommonMessageToContentMapper? = null -) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter) + filter: SimpleFilter>? = null, + mapper: CommonMessageToContentMapper? = null +) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter, mapper) suspend fun BehaviourContext.waitSticker( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: CommonMessageToContentMapper? = null -) = waitContent(count, initRequest, false, errorFactory, filter) + filter: SimpleFilter>? = null, + mapper: CommonMessageToContentMapper? = null +) = waitContent(count, initRequest, false, errorFactory, filter, mapper) suspend fun BehaviourContext.waitVideo( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, includeMediaGroups: Boolean = false, - filter: CommonMessageToContentMapper? = null -) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter) + filter: SimpleFilter>? = null, + mapper: CommonMessageToContentMapper? = null +) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter, mapper) suspend fun BehaviourContext.waitVideoNote( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: CommonMessageToContentMapper? = null -) = waitContent(count, initRequest, false, errorFactory, filter) + filter: SimpleFilter>? = null, + mapper: CommonMessageToContentMapper? = null +) = waitContent(count, initRequest, false, errorFactory, filter, mapper) suspend fun BehaviourContext.waitVoice( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: CommonMessageToContentMapper? = null -) = waitContent(count, initRequest, false, errorFactory, filter) + filter: SimpleFilter>? = null, + mapper: CommonMessageToContentMapper? = null +) = waitContent(count, initRequest, false, errorFactory, filter, mapper) suspend fun BehaviourContext.waitInvoice( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: CommonMessageToContentMapper? = null -) = waitContent(count, initRequest, false, errorFactory, filter) + filter: SimpleFilter>? = null, + mapper: CommonMessageToContentMapper? = null +) = waitContent(count, initRequest, false, errorFactory, filter, mapper) diff --git a/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitEventAction.kt b/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitEventAction.kt index 53fee66475..abae5ddeb9 100644 --- a/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitEventAction.kt +++ b/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitEventAction.kt @@ -3,6 +3,7 @@ package dev.inmo.tgbotapi.extensions.behaviour_builder.expectations import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext +import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.SimpleFilter import dev.inmo.tgbotapi.extensions.utils.asBaseSentMessageUpdate import dev.inmo.tgbotapi.extensions.utils.asChatEventMessage import dev.inmo.tgbotapi.requests.abstracts.Request @@ -18,13 +19,19 @@ private suspend fun BehaviourContext.waitEventMessages( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, + filter: SimpleFilter>? = null, mapper: suspend ChatEventMessage.() -> O? ): List = expectFlow( initRequest, count, errorFactory ) { - it.asBaseSentMessageUpdate() ?.data ?.asChatEventMessage() ?.mapper().let(::listOfNotNull) + val data = it.asBaseSentMessageUpdate() ?.data ?.asChatEventMessage() + if (data != null && (filter == null || filter(data))) { + data.mapper().let(::listOfNotNull) + } else { + emptyList() + } }.toList().toList() @@ -32,19 +39,21 @@ private suspend inline fun BehaviourContext.waitEvents( count: Int = 1, initRequest: Request<*>? = null, noinline errorFactory: NullableRequestBuilder<*> = { null }, - noinline filter: EventMessageToEventMapper? = null + filter: SimpleFilter>? = null, + noinline mapper: EventMessageToEventMapper? = null ) : List = waitEventMessages( initRequest, errorFactory, - count + count, + filter ) { if (chatEvent is T) { @Suppress("UNCHECKED_CAST") val message = (this as ChatEventMessage) - if (filter == null) { + if (mapper == null) { message.chatEvent } else { - filter(message) + mapper(message) } } else { null @@ -55,124 +64,144 @@ suspend fun BehaviourContext.waitChannelEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: EventMessageToEventMapper? = null -) = waitEvents(count, initRequest, errorFactory, filter) + filter: SimpleFilter>? = null, + mapper: EventMessageToEventMapper? = null +) = waitEvents(count, initRequest, errorFactory, filter, mapper) suspend fun BehaviourContext.waitChatEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: EventMessageToEventMapper? = null -) = waitEvents(count, initRequest, errorFactory, filter) + filter: SimpleFilter>? = null, + mapper: EventMessageToEventMapper? = null +) = waitEvents(count, initRequest, errorFactory, filter, mapper) suspend fun BehaviourContext.waitVoiceChatEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: EventMessageToEventMapper? = null -) = waitEvents(count, initRequest, errorFactory, filter) + filter: SimpleFilter>? = null, + mapper: EventMessageToEventMapper? = null +) = waitEvents(count, initRequest, errorFactory, filter, mapper) suspend fun BehaviourContext.waitVoiceChatStartedEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: EventMessageToEventMapper? = null -) = waitEvents(count, initRequest, errorFactory, filter) + filter: SimpleFilter>? = null, + mapper: EventMessageToEventMapper? = null +) = waitEvents(count, initRequest, errorFactory, filter, mapper) suspend fun BehaviourContext.waitVoiceChatEndedEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: EventMessageToEventMapper? = null -) = waitEvents(count, initRequest, errorFactory, filter) + filter: SimpleFilter>? = null, + mapper: EventMessageToEventMapper? = null +) = waitEvents(count, initRequest, errorFactory, filter, mapper) suspend fun BehaviourContext.waitVoiceChatParticipantsInvitedEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: EventMessageToEventMapper? = null -) = waitEvents(count, initRequest, errorFactory, filter) + filter: SimpleFilter>? = null, + mapper: EventMessageToEventMapper? = null +) = waitEvents(count, initRequest, errorFactory, filter, mapper) suspend fun BehaviourContext.waitMessageAutoDeleteTimerChangedEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: EventMessageToEventMapper? = null -) = waitEvents(count, initRequest, errorFactory, filter) + filter: SimpleFilter>? = null, + mapper: EventMessageToEventMapper? = null +) = waitEvents(count, initRequest, errorFactory, filter, mapper) suspend fun BehaviourContext.waitCommonEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: EventMessageToEventMapper? = null -) = waitEvents(count, initRequest, errorFactory, filter) + filter: SimpleFilter>? = null, + mapper: EventMessageToEventMapper? = null +) = waitEvents(count, initRequest, errorFactory, filter, mapper) suspend fun BehaviourContext.waitGroupEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: EventMessageToEventMapper? = null -) = waitEvents(count, initRequest, errorFactory, filter) + filter: SimpleFilter>? = null, + mapper: EventMessageToEventMapper? = null +) = waitEvents(count, initRequest, errorFactory, filter, mapper) suspend fun BehaviourContext.waitSupergroupEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: EventMessageToEventMapper? = null -) = waitEvents(count, initRequest, errorFactory, filter) + filter: SimpleFilter>? = null, + mapper: EventMessageToEventMapper? = null +) = waitEvents(count, initRequest, errorFactory, filter, mapper) suspend fun BehaviourContext.waitChannelChatCreatedEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: EventMessageToEventMapper? = null -) = waitEvents(count, initRequest, errorFactory, filter) + filter: SimpleFilter>? = null, + mapper: EventMessageToEventMapper? = null +) = waitEvents(count, initRequest, errorFactory, filter, mapper) suspend fun BehaviourContext.waitDeleteChatPhotoEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: EventMessageToEventMapper? = null -) = waitEvents(count, initRequest, errorFactory, filter) + filter: SimpleFilter>? = null, + mapper: EventMessageToEventMapper? = null +) = waitEvents(count, initRequest, errorFactory, filter, mapper) suspend fun BehaviourContext.waitGroupChatCreatedEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: EventMessageToEventMapper? = null -) = waitEvents(count, initRequest, errorFactory, filter) + filter: SimpleFilter>? = null, + mapper: EventMessageToEventMapper? = null +) = waitEvents(count, initRequest, errorFactory, filter, mapper) suspend fun BehaviourContext.waitLeftChatMemberEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: EventMessageToEventMapper? = null -) = waitEvents(count, initRequest, errorFactory, filter) + filter: SimpleFilter>? = null, + mapper: EventMessageToEventMapper? = null +) = waitEvents(count, initRequest, errorFactory, filter, mapper) suspend fun BehaviourContext.waitNewChatPhotoEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: EventMessageToEventMapper? = null -) = waitEvents(count, initRequest, errorFactory, filter) + filter: SimpleFilter>? = null, + mapper: EventMessageToEventMapper? = null +) = waitEvents(count, initRequest, errorFactory, filter, mapper) suspend fun BehaviourContext.waitNewChatMembersEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: EventMessageToEventMapper? = null -) = waitEvents(count, initRequest, errorFactory, filter) + filter: SimpleFilter>? = null, + mapper: EventMessageToEventMapper? = null +) = waitEvents(count, initRequest, errorFactory, filter, mapper) suspend fun BehaviourContext.waitNewChatTitleEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: EventMessageToEventMapper? = null -) = waitEvents(count, initRequest, errorFactory, filter) + filter: SimpleFilter>? = null, + mapper: EventMessageToEventMapper? = null +) = waitEvents(count, initRequest, errorFactory, filter, mapper) suspend fun BehaviourContext.waitPinnedMessageEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: EventMessageToEventMapper? = null -) = waitEvents(count, initRequest, errorFactory, filter) + filter: SimpleFilter>? = null, + mapper: EventMessageToEventMapper? = null +) = waitEvents(count, initRequest, errorFactory, filter, mapper) suspend fun BehaviourContext.waitProximityAlertTriggeredEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: EventMessageToEventMapper? = null -) = waitEvents(count, initRequest, errorFactory, filter) + filter: SimpleFilter>? = null, + mapper: EventMessageToEventMapper? = null +) = waitEvents(count, initRequest, errorFactory, filter, mapper) suspend fun BehaviourContext.waitSupergroupChatCreatedEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: EventMessageToEventMapper? = null -) = waitEvents(count, initRequest, errorFactory, filter) + filter: SimpleFilter>? = null, + mapper: EventMessageToEventMapper? = null +) = waitEvents(count, initRequest, errorFactory, filter, mapper) diff --git a/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitInlineQuery.kt b/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitInlineQuery.kt index 3c6ecf4a6f..9c287a2d4a 100644 --- a/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitInlineQuery.kt +++ b/tgbotapi.extensions.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitInlineQuery.kt @@ -1,6 +1,7 @@ package dev.inmo.tgbotapi.extensions.behaviour_builder.expectations import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext +import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.SimpleFilter import dev.inmo.tgbotapi.extensions.utils.asInlineQueryUpdate import dev.inmo.tgbotapi.requests.abstracts.Request import dev.inmo.tgbotapi.types.InlineQueries.query.* @@ -12,13 +13,19 @@ private suspend fun BehaviourContext.waitInlineQueries( count: Int = 1, initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, + filter: SimpleFilter? = null, mapper: suspend InlineQuery.() -> O? ): List = expectFlow( initRequest, count, errorFactory ) { - it.asInlineQueryUpdate() ?.data ?.mapper().let(::listOfNotNull) + val data = it.asInlineQueryUpdate() ?.data + if (data != null && (filter == null || filter(data))) { + data.mapper().let(::listOfNotNull) + } else { + emptyList() + } }.toList().toList() @@ -26,11 +33,13 @@ private suspend inline fun BehaviourContext.waitInline count: Int = 1, initRequest: Request<*>? = null, noinline errorFactory: NullableRequestBuilder<*> = { null }, - noinline filter: InlineQueryMapper? = null + filter: SimpleFilter? = null, + noinline mapper: InlineQueryMapper? = null ) : List = waitInlineQueries( count, initRequest, - errorFactory + errorFactory, + filter ) { if (this is T) { if (filter == null) { @@ -47,18 +56,21 @@ suspend fun BehaviourContext.waitAnyInlineQuery( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: InlineQueryMapper? = null -) = waitInlines(count, initRequest, errorFactory, filter) + filter: SimpleFilter? = null, + mapper: InlineQueryMapper? = null +) = waitInlines(count, initRequest, errorFactory, filter, mapper) suspend fun BehaviourContext.waitBaseInlineQuery( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: InlineQueryMapper? = null -) = waitInlines(count, initRequest, errorFactory, filter) + filter: SimpleFilter? = null, + mapper: InlineQueryMapper? = null +) = waitInlines(count, initRequest, errorFactory, filter, mapper) suspend fun BehaviourContext.waitLocationInlineQuery( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: InlineQueryMapper? = null -) = waitInlines(count, initRequest, errorFactory, filter) + filter: SimpleFilter? = null, + mapper: InlineQueryMapper? = null +) = waitInlines(count, initRequest, errorFactory, filter, mapper) 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 index c77cd0381b..6a858c5aea 100644 --- 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 @@ -1,6 +1,7 @@ package dev.inmo.tgbotapi.extensions.behaviour_builder.expectations import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext +import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.SimpleFilter import dev.inmo.tgbotapi.extensions.utils.asMessageUpdate import dev.inmo.tgbotapi.extensions.utils.asPassportMessage import dev.inmo.tgbotapi.requests.abstracts.Request @@ -17,30 +18,38 @@ suspend fun BehaviourContext.waitPassportMessages( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, + filter: SimpleFilter? = null, mapper: suspend PassportMessage.() -> O? ): List = expectFlow( initRequest, count, errorFactory ) { - it.asMessageUpdate() ?.data ?.asPassportMessage() ?.mapper().let(::listOfNotNull) + val data = it.asMessageUpdate() ?.data ?.asPassportMessage() ?: return@expectFlow emptyList() + if (filter == null || filter(data)) { + data.mapper().let(::listOfNotNull) + } else { + emptyList() + } }.toList().toList() suspend inline fun BehaviourContext.waitPassportMessagesWith( count: Int = 1, initRequest: Request<*>? = null, noinline errorFactory: NullableRequestBuilder<*> = { null }, - noinline filter: PassportMessageMapper? = null + filter: SimpleFilter? = null, + noinline mapper: PassportMessageMapper? = null ) : List = waitPassportMessages( initRequest, errorFactory, - count + count, + filter ) { if (passportData.data.any { it is T }) { - if (filter == null) { + if (mapper == null) { passportData } else { - filter(this) + mapper(this) } } else { null @@ -51,5 +60,6 @@ suspend fun BehaviourContext.waitAnyPassportMessages( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: PassportMessageMapper? = null -) = waitPassportMessagesWith(count, initRequest, errorFactory, filter) + filter: SimpleFilter? = null, + mapper: PassportMessageMapper? = null +) = waitPassportMessagesWith(count, initRequest, errorFactory, filter, mapper)