From 507cb2af2699c9ee99c166a2c9196d8284b09a52 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Sat, 21 May 2022 23:38:42 +0600 Subject: [PATCH] cleanup waiters in behaviour builder and add withEvent --- CHANGELOG.md | 5 +- .../expectations/WaitCallbackQuery.kt | 84 +++----- .../expectations/WaitChatJoinRequest.kt | 26 +-- .../expectations/WaitChatMemberUpdated.kt | 41 +--- .../expectations/WaitChosenInlineResult.kt | 56 ++--- .../expectations/WaitContent.kt | 174 +++++----------- .../expectations/WaitContentMessage.kt | 157 +++++--------- .../expectations/WaitEditedContent.kt | 153 +++++--------- .../expectations/WaitEventAction.kt | 191 ++++++------------ .../expectations/WaitInlineQuery.kt | 56 ++--- .../expectations/WaitMediaGroup.kt | 22 +- .../expectations/WaitPassportData.kt | 39 +--- .../expectations/WaitPollAnswers.kt | 42 +--- .../expectations/WaitPollUpdates.kt | 56 ++--- .../expectations/WaitPreCheckoutQuery.kt | 24 +-- .../expectations/WaitShippingQuery.kt | 24 +-- .../EditedContentTriggers.kt | 1 - .../tgbotapi/extensions/utils/WithEvent.kt | 31 +++ 18 files changed, 385 insertions(+), 797 deletions(-) create mode 100644 tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/WithEvent.kt diff --git a/CHANGELOG.md b/CHANGELOG.md index 20aa61ce9b..cf50b52fb2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,10 @@ ## 1.2.0 * `Behaviour Builder`: - * Improvements in updates passing inside of subcontexts + * Mappers have been removed from waiters extensions + * Triggers extensions now will use filtering inside of context receiver instead of passing the filters into `BehaviourContext`. That means that in the subcontext will not be used preinstalled filters for their `BehaviourContext` and filter of trigger will not be used in subcontext +* `Utils`: + * Add opportunity to get event messages with specific `ChatEvent` type using `withEvent`/`requireWithEvent` (by analog with `withEvent` and `requireWithEvent`) ## 1.1.3 diff --git a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitCallbackQuery.kt b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitCallbackQuery.kt index eaa15da352..10f0b3888b 100644 --- a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitCallbackQuery.kt +++ b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitCallbackQuery.kt @@ -11,114 +11,76 @@ import kotlinx.coroutines.flow.toList typealias CallbackQueryMapper = suspend T.() -> T? -private suspend fun BehaviourContext.waitCallbackQueries( +private suspend inline fun BehaviourContext.waitCallbackQueries( count: Int = 1, initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - filter: SimpleFilter? = null, - mapper: suspend CallbackQuery.() -> O? + noinline errorFactory: NullableRequestBuilder<*> = { null }, + filter: SimpleFilter? = null ): List = expectFlow( initRequest, count, errorFactory ) { val data = it.asCallbackQueryUpdate() ?.data ?: return@expectFlow emptyList() - if (filter == null || filter(data)) { - data.mapper().let(::listOfNotNull) + if (data is O && (filter == null || filter(data))) { + listOf(data) } else { emptyList() } }.toList().toList() -private suspend inline fun BehaviourContext.waitCallbacks( - count: Int = 1, - initRequest: Request<*>? = null, - noinline errorFactory: NullableRequestBuilder<*> = { null }, - filter: SimpleFilter? = null, - noinline mapper: CallbackQueryMapper? = null -) : List = waitCallbackQueries( - count, - initRequest, - errorFactory, - filter ?.let { - { - (it as? T) ?.let { filter(it) } == true - } - } -) { - if (this is T) { - if (mapper == null) { - this - } else { - mapper(this) - } - } else { - null - } -} - - suspend fun BehaviourContext.waitDataCallbackQuery( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter? = null, - mapper: CallbackQueryMapper? = null -) = waitCallbacks(count, initRequest, errorFactory, filter, mapper) + filter: SimpleFilter? = null +) = waitCallbackQueries(count, initRequest, errorFactory, filter) suspend fun BehaviourContext.waitGameShortNameCallbackQuery( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter? = null, - mapper: CallbackQueryMapper? = null -) = waitCallbacks(count, initRequest, errorFactory, filter, mapper) + filter: SimpleFilter? = null +) = waitCallbackQueries(count, initRequest, errorFactory, filter) suspend fun BehaviourContext.waitInlineMessageIdCallbackQuery( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter? = null, - mapper: CallbackQueryMapper? = null -) = waitCallbacks(count, initRequest, errorFactory, filter, mapper) + filter: SimpleFilter? = null +) = waitCallbackQueries(count, initRequest, errorFactory, filter) suspend fun BehaviourContext.waitInlineMessageIdDataCallbackQuery( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter? = null, - mapper: CallbackQueryMapper? = null -) = waitCallbacks(count, initRequest, errorFactory, filter, mapper) + filter: SimpleFilter? = null +) = waitCallbackQueries(count, initRequest, errorFactory, filter) suspend fun BehaviourContext.waitInlineMessageIdGameShortNameCallbackQuery( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter? = null, - mapper: CallbackQueryMapper? = null -) = waitCallbacks(count, initRequest, errorFactory, filter, mapper) + filter: SimpleFilter? = null +) = waitCallbackQueries(count, initRequest, errorFactory, filter) suspend fun BehaviourContext.waitMessageCallbackQuery( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter? = null, - mapper: CallbackQueryMapper? = null -) = waitCallbacks(count, initRequest, errorFactory, filter, mapper) + filter: SimpleFilter? = null +) = waitCallbackQueries(count, initRequest, errorFactory, filter) suspend fun BehaviourContext.waitMessageDataCallbackQuery( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter? = null, - mapper: CallbackQueryMapper? = null -) = waitCallbacks(count, initRequest, errorFactory, filter, mapper) + filter: SimpleFilter? = null +) = waitCallbackQueries(count, initRequest, errorFactory, filter) suspend fun BehaviourContext.waitMessageGameShortNameCallbackQuery( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter? = null, - mapper: CallbackQueryMapper? = null -) = waitCallbacks(count, initRequest, errorFactory, filter, mapper) + filter: SimpleFilter? = null +) = waitCallbackQueries(count, initRequest, errorFactory, filter) suspend fun BehaviourContext.waitUnknownCallbackQuery( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter? = null, - mapper: CallbackQueryMapper? = null -) = waitCallbacks(count, initRequest, errorFactory, filter, mapper) + filter: SimpleFilter? = null +) = waitCallbackQueries(count, initRequest, errorFactory, filter) diff --git a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitChatJoinRequest.kt b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitChatJoinRequest.kt index 9481c118c5..2c81debe2c 100644 --- a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitChatJoinRequest.kt +++ b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitChatJoinRequest.kt @@ -9,20 +9,19 @@ import kotlinx.coroutines.flow.toList typealias ChatJoinRequestsMapper = suspend ChatJoinRequest.() -> ChatJoinRequest? -private suspend fun BehaviourContext.waitChatJoinRequests( +private suspend inline fun BehaviourContext.internalWaitChatJoinRequests( count: Int = 1, initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - filter: SimpleFilter? = null, - mapper: suspend ChatJoinRequest.() -> O? + noinline errorFactory: NullableRequestBuilder<*> = { null }, + filter: SimpleFilter? = null ): List = expectFlow( initRequest, count, errorFactory ) { - val data = it.asChatJoinRequestUpdate() ?.data - if (data != null && (filter == null || filter(data))) { - data.mapper().let(::listOfNotNull) + val data = it.asChatJoinRequestUpdate() ?.data as? O ?: return@expectFlow emptyList() + if (filter == null || filter(data)) { + listOf(data) } else { emptyList() } @@ -33,17 +32,10 @@ suspend fun BehaviourContext.waitChatJoinRequests( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter? = null, - mapper: ChatJoinRequestsMapper? = null -) : List = waitChatJoinRequests( + filter: SimpleFilter? = null +) : List = internalWaitChatJoinRequests( count, initRequest, errorFactory, filter -) { - if (mapper == null) { - this - } else { - mapper(this) - } -} +) diff --git a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitChatMemberUpdated.kt b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitChatMemberUpdated.kt index fe6ef75b2f..67ab6a2615 100644 --- a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitChatMemberUpdated.kt +++ b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitChatMemberUpdated.kt @@ -11,12 +11,11 @@ import kotlinx.coroutines.flow.toList typealias ChatMemberUpdatedMapper = suspend T.() -> T? -private suspend inline fun BehaviourContext.waitChatMemberUpdated( +private suspend inline fun BehaviourContext.waitChatMemberUpdatedWithFilter( count: Int = 1, initRequest: Request<*>? = null, noinline errorFactory: NullableRequestBuilder<*> = { null }, - filter: SimpleFilter? = null, - noinline mapper: ChatMemberUpdatedMapper + filter: SimpleFilter? = null ): List = expectFlow( initRequest, count, @@ -24,51 +23,29 @@ private suspend inline fun BehaviourContex ) { val casted = (it as? T) ?: return@expectFlow emptyList() if (filter == null || filter(casted)) { - casted.data.mapper().let(::listOfNotNull) + listOf(casted.data) } else { emptyList() } }.toList().toList() -private suspend inline fun BehaviourContext.waitChatMemberUpdatedWithFilter( - count: Int = 1, - initRequest: Request<*>? = null, - noinline errorFactory: NullableRequestBuilder<*> = { null }, - filter: SimpleFilter? = null, - noinline mapper: ChatMemberUpdatedMapper? = null -) : List = waitChatMemberUpdated( - count, - initRequest, - errorFactory, - filter, -) { - if (mapper == null) { - this - } else { - mapper(this) - } -} - suspend fun BehaviourContext.waitChatMemberUpdated( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter? = null, - mapper: ChatMemberUpdatedMapper? = null -) = waitChatMemberUpdatedWithFilter(count, initRequest, errorFactory, filter, mapper) + filter: SimpleFilter? = null +) = waitChatMemberUpdatedWithFilter(count, initRequest, errorFactory, filter) suspend fun BehaviourContext.waitCommonChatMemberUpdated( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter? = null, - mapper: ChatMemberUpdatedMapper? = null -) = waitChatMemberUpdatedWithFilter(count, initRequest, errorFactory, filter, mapper) + filter: SimpleFilter? = null +) = waitChatMemberUpdatedWithFilter(count, initRequest, errorFactory, filter) suspend fun BehaviourContext.waitMyChatMemberUpdated( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter? = null, - mapper: ChatMemberUpdatedMapper? = null -) = waitChatMemberUpdatedWithFilter(count, initRequest, errorFactory, filter, mapper) + filter: SimpleFilter? = null +) = waitChatMemberUpdatedWithFilter(count, initRequest, errorFactory, filter) diff --git a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitChosenInlineResult.kt b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitChosenInlineResult.kt index a21fe35eb8..ea08427204 100644 --- a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitChosenInlineResult.kt +++ b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitChosenInlineResult.kt @@ -9,73 +9,41 @@ import kotlinx.coroutines.flow.toList typealias ChosenInlineResultMapper = suspend T.() -> T? -private suspend fun BehaviourContext.waitChosenInlineResultsUpdates( +private suspend inline fun BehaviourContext.waitChosenInlineResults( count: Int = 1, initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - filter: SimpleFilter? = null, - mapper: suspend ChosenInlineResult.() -> O? + noinline errorFactory: NullableRequestBuilder<*> = { null }, + filter: SimpleFilter? = null ): List = expectFlow( initRequest, count, errorFactory ) { - val data = it.asChosenInlineResultUpdate() ?.data - if (data != null && (filter == null || filter(data))) { - data.mapper().let(::listOfNotNull) + val data = it.asChosenInlineResultUpdate() ?.data as? O ?: return@expectFlow emptyList() + if (filter == null || filter(data)) { + listOf(data) } else { emptyList() } }.toList().toList() - -private suspend inline fun BehaviourContext.waitChosenInlineResults( - count: Int = 1, - initRequest: Request<*>? = null, - noinline errorFactory: NullableRequestBuilder<*> = { null }, - filter: SimpleFilter? = null, - noinline mapper: ChosenInlineResultMapper? = null -) : List = this@waitChosenInlineResults.waitChosenInlineResultsUpdates( - count, - initRequest, - errorFactory, - filter ?.let { - { - (it as? T) ?.let { filter(it) } == true - } - } -) { - if (this is T) { - if (mapper == null) { - this - } else { - mapper(this) - } - } else { - null - } -} - suspend fun BehaviourContext.waitChosenInlineResult( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter? = null, - mapper: ChosenInlineResultMapper? = null -) = waitChosenInlineResults(count, initRequest, errorFactory, filter, mapper) + filter: SimpleFilter? = null +) = waitChosenInlineResults(count, initRequest, errorFactory, filter) suspend fun BehaviourContext.waitLocationChosenInlineResult( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter? = null, - mapper: PollMapper? = null -) = waitChosenInlineResults(count, initRequest, errorFactory, filter, mapper) + filter: SimpleFilter? = null +) = waitChosenInlineResults(count, initRequest, errorFactory, filter) suspend fun BehaviourContext.waitBaseChosenInlineResult( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter? = null, - mapper: PollMapper? = null -) = waitChosenInlineResults(count, initRequest, errorFactory, filter, mapper) + filter: SimpleFilter? = null +) = waitChosenInlineResults(count, initRequest, errorFactory, filter) diff --git a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitContent.kt b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitContent.kt index 61038ec5b7..8698cdecbf 100644 --- a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitContent.kt +++ b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitContent.kt @@ -2,7 +2,6 @@ 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.withContent @@ -17,17 +16,15 @@ import dev.inmo.tgbotapi.types.message.content.InvoiceContent import dev.inmo.tgbotapi.types.update.media_group.SentMediaGroupUpdate import dev.inmo.tgbotapi.types.update.abstracts.BaseSentMessageUpdate import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.toList typealias CommonMessageToContentMapper = suspend CommonMessage.() -> T? -private suspend fun BehaviourContext.waitCommonContent( +private suspend inline fun BehaviourContext.waitContent( count: Int = 1, initRequest: Request<*>? = null, includeMediaGroups: Boolean = true, - errorFactory: NullableRequestBuilder<*> = { null }, - filter: SimpleFilter>? = null, - mapper: suspend CommonMessage.() -> O? + noinline errorFactory: NullableRequestBuilder<*> = { null }, + filter: SimpleFilter>? = null ): Flow = expectFlow( initRequest, count, @@ -36,7 +33,7 @@ private suspend fun BehaviourContext.waitCommonContent( val messages = when (it) { is SentMediaGroupUpdate -> { if (includeMediaGroups) { - it.data.map { it as CommonMessage } + it.data } else { emptyList() } @@ -45,233 +42,174 @@ private suspend fun BehaviourContext.waitCommonContent( else -> return@expectFlow emptyList() } messages.mapNotNull { message -> - val asCommonMessage = message as CommonMessage + val asCommonMessage = (message as CommonMessage<*>).withContent() ?: return@mapNotNull null if (filter == null || filter(asCommonMessage)) { - asCommonMessage.mapper() + asCommonMessage.content } else { null } } } -internal inline fun contentConverter( - noinline mapper: CommonMessageToContentMapper? = null -): suspend CommonMessage.() -> T? = mapper ?.let { - { - if (content is T) { - @Suppress("UNCHECKED_CAST") - val message = (this as CommonMessage) - safelyWithoutExceptions { mapper(message) } - } else { - null - } - } -} ?: { content as? T } - -private suspend inline fun BehaviourContext.waitContent( - count: Int = 1, - initRequest: Request<*>? = null, - includeMediaGroups: Boolean = true, - noinline errorFactory: NullableRequestBuilder<*> = { null }, - filter: SimpleFilter>? = null, - noinline mapper: CommonMessageToContentMapper? = null -) : List = waitCommonContent( - count, - initRequest, - includeMediaGroups, - errorFactory, - filter ?.let { - { - it.withContent() ?.let { filter(it) } == true - } - }, - contentConverter(mapper) -).toList() - suspend fun BehaviourContext.waitContent( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, includeMediaGroups: Boolean = true, - filter: SimpleFilter>? = null, - mapper: CommonMessageToContentMapper? = null -) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter) suspend fun BehaviourContext.waitContact( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: CommonMessageToContentMapper? = null -) = waitContent(count, initRequest, false, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitContent(count, initRequest, false, errorFactory, filter) suspend fun BehaviourContext.waitDice( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: CommonMessageToContentMapper? = null -) = waitContent(count, initRequest, false, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitContent(count, initRequest, false, errorFactory, filter) suspend fun BehaviourContext.waitGame( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: CommonMessageToContentMapper? = null -) = waitContent(count, initRequest, false, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitContent(count, initRequest, false, errorFactory, filter) suspend fun BehaviourContext.waitLocation( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: CommonMessageToContentMapper? = null -) = waitContent(count, initRequest, false, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitContent(count, initRequest, false, errorFactory, filter) suspend fun BehaviourContext.waitLiveLocation( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: CommonMessageToContentMapper? = null -) = waitContent(count, initRequest, false, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitContent(count, initRequest, false, errorFactory, filter) suspend fun BehaviourContext.waitStaticLocation( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: CommonMessageToContentMapper? = null -) = waitContent(count, initRequest, false, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitContent(count, initRequest, false, errorFactory, filter) suspend fun BehaviourContext.waitPoll( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: CommonMessageToContentMapper? = null -) = waitContent(count, initRequest, false, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitContent(count, initRequest, false, errorFactory, filter) suspend fun BehaviourContext.waitText( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: CommonMessageToContentMapper? = null -) = waitContent(count, initRequest, false, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitContent(count, initRequest, false, errorFactory, filter) suspend fun BehaviourContext.waitVenue( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: CommonMessageToContentMapper? = null -) = waitContent(count, initRequest, false, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitContent(count, initRequest, false, errorFactory, filter) suspend fun BehaviourContext.waitAudioMediaGroupContent( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, includeMediaGroups: Boolean = true, - filter: SimpleFilter>? = null, - mapper: CommonMessageToContentMapper? = null -) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter) suspend fun BehaviourContext.waitDocumentMediaGroupContent( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, includeMediaGroups: Boolean = true, - filter: SimpleFilter>? = null, - mapper: CommonMessageToContentMapper? = null -) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter) suspend fun BehaviourContext.waitMedia( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, includeMediaGroups: Boolean = false, - filter: SimpleFilter>? = null, - mapper: CommonMessageToContentMapper? = null -) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter) suspend fun BehaviourContext.waitAnyMediaGroupContent( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, includeMediaGroups: Boolean = true, - filter: SimpleFilter>? = null, - mapper: CommonMessageToContentMapper? = null -) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter) suspend fun BehaviourContext.waitVisualMediaGroupContent( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, includeMediaGroups: Boolean = true, - filter: SimpleFilter>? = null, - mapper: CommonMessageToContentMapper? = null -) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter) suspend fun BehaviourContext.waitTextedMediaContent( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, includeMediaGroups: Boolean = true, - filter: SimpleFilter>? = null, - mapper: CommonMessageToContentMapper? = null -) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter) suspend fun BehaviourContext.waitAnimation( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: CommonMessageToContentMapper? = null -) = waitContent(count, initRequest, false, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitContent(count, initRequest, false, errorFactory, filter) suspend fun BehaviourContext.waitAudio( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, includeMediaGroups: Boolean = false, - filter: SimpleFilter>? = null, - mapper: CommonMessageToContentMapper? = null -) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter) suspend fun BehaviourContext.waitDocument( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, includeMediaGroups: Boolean = false, - filter: SimpleFilter>? = null, - mapper: CommonMessageToContentMapper? = null -) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter) suspend fun BehaviourContext.waitPhoto( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, includeMediaGroups: Boolean = false, - filter: SimpleFilter>? = null, - mapper: CommonMessageToContentMapper? = null -) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter) suspend fun BehaviourContext.waitSticker( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: CommonMessageToContentMapper? = null -) = waitContent(count, initRequest, false, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitContent(count, initRequest, false, errorFactory, filter) suspend fun BehaviourContext.waitVideo( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, includeMediaGroups: Boolean = false, - filter: SimpleFilter>? = null, - mapper: CommonMessageToContentMapper? = null -) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter) suspend fun BehaviourContext.waitVideoNote( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: CommonMessageToContentMapper? = null -) = waitContent(count, initRequest, false, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitContent(count, initRequest, false, errorFactory, filter) suspend fun BehaviourContext.waitVoice( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: CommonMessageToContentMapper? = null -) = waitContent(count, initRequest, false, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitContent(count, initRequest, false, errorFactory, filter) suspend fun BehaviourContext.waitInvoice( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: CommonMessageToContentMapper? = null -) = waitContent(count, initRequest, false, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitContent(count, initRequest, false, errorFactory, filter) diff --git a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitContentMessage.kt b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitContentMessage.kt index 0c51884379..e4e18a9eb6 100644 --- a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitContentMessage.kt +++ b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitContentMessage.kt @@ -17,17 +17,15 @@ import dev.inmo.tgbotapi.types.message.content.InvoiceContent import dev.inmo.tgbotapi.types.update.media_group.SentMediaGroupUpdate import dev.inmo.tgbotapi.types.update.abstracts.BaseSentMessageUpdate import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.toList typealias CommonMessageToCommonMessageMapper = suspend CommonMessage.() -> CommonMessage? -internal suspend fun BehaviourContext.waitCommonMessage( +internal suspend inline fun BehaviourContext.waitContentMessage( count: Int = 1, initRequest: Request<*>? = null, includeMediaGroups: Boolean = true, - errorFactory: NullableRequestBuilder<*> = { null }, - filter: SimpleFilter>? = null, - mapper: suspend CommonMessage.() -> CommonMessage? + noinline errorFactory: NullableRequestBuilder<*> = { null }, + filter: SimpleFilter>? = null ): Flow> = expectFlow( initRequest, count, @@ -46,9 +44,9 @@ internal suspend fun BehaviourContext.waitCommonMessage( } messages.mapNotNull { message -> @Suppress("UNCHECKED_CAST") - val asCommonMessage = message as? CommonMessage ?: return@mapNotNull null + val asCommonMessage = (message as? CommonMessage<*>) ?.withContent() ?: return@mapNotNull null if (filter == null || filter(asCommonMessage)) { - asCommonMessage.mapper() + asCommonMessage } else { null } @@ -72,209 +70,164 @@ internal inline fun contentMessageConverter( if (content is T) this as CommonMessage else null } -private suspend inline fun BehaviourContext.waitContentMessage( - count: Int = 1, - initRequest: Request<*>? = null, - includeMediaGroups: Boolean = true, - noinline errorFactory: NullableRequestBuilder<*> = { null }, - filter: SimpleFilter>? = null, - noinline mapper: CommonMessageToCommonMessageMapper? = null -) : List> = waitCommonMessage( - count, - initRequest, - includeMediaGroups, - errorFactory, - filter ?.let { - { - it.withContent() ?.let { filter(it) } == true - } - }, - contentMessageConverter(mapper) -).toList() - suspend fun BehaviourContext.waitContentMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, includeMediaGroups: Boolean = true, - filter: SimpleFilter>? = null, - mapper: CommonMessageToCommonMessageMapper? = null -) = waitContentMessage(count, initRequest, includeMediaGroups, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitContentMessage(count, initRequest, includeMediaGroups, errorFactory, filter) suspend fun BehaviourContext.waitContactMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: CommonMessageToCommonMessageMapper? = null -) = waitContentMessage(count, initRequest, false, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitContentMessage(count, initRequest, false, errorFactory, filter) suspend fun BehaviourContext.waitDiceMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: CommonMessageToCommonMessageMapper? = null -) = waitContentMessage(count, initRequest, false, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitContentMessage(count, initRequest, false, errorFactory, filter) suspend fun BehaviourContext.waitGameMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: CommonMessageToCommonMessageMapper? = null -) = waitContentMessage(count, initRequest, false, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitContentMessage(count, initRequest, false, errorFactory, filter) suspend fun BehaviourContext.waitLocationMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: CommonMessageToCommonMessageMapper? = null -) = waitContentMessage(count, initRequest, false, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitContentMessage(count, initRequest, false, errorFactory, filter) suspend fun BehaviourContext.waitLiveLocationMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: CommonMessageToCommonMessageMapper? = null -) = waitContentMessage(count, initRequest, false, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitContentMessage(count, initRequest, false, errorFactory, filter) suspend fun BehaviourContext.waitStaticLocationMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: CommonMessageToCommonMessageMapper? = null -) = waitContentMessage(count, initRequest, false, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitContentMessage(count, initRequest, false, errorFactory, filter) suspend fun BehaviourContext.waitPollMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: CommonMessageToCommonMessageMapper? = null -) = waitContentMessage(count, initRequest, false, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitContentMessage(count, initRequest, false, errorFactory, filter) suspend fun BehaviourContext.waitTextMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: CommonMessageToCommonMessageMapper? = null -) = waitContentMessage(count, initRequest, false, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitContentMessage(count, initRequest, false, errorFactory, filter) suspend fun BehaviourContext.waitVenueMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: CommonMessageToCommonMessageMapper? = null -) = waitContentMessage(count, initRequest, false, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitContentMessage(count, initRequest, false, errorFactory, filter) suspend fun BehaviourContext.waitAudioMediaGroupContentMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, includeMediaGroups: Boolean = true, - filter: SimpleFilter>? = null, - mapper: CommonMessageToCommonMessageMapper? = null -) = waitContentMessage(count, initRequest, includeMediaGroups, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitContentMessage(count, initRequest, includeMediaGroups, errorFactory, filter) suspend fun BehaviourContext.waitDocumentMediaGroupContentMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, includeMediaGroups: Boolean = true, - filter: SimpleFilter>? = null, - mapper: CommonMessageToCommonMessageMapper? = null -) = waitContentMessage(count, initRequest, includeMediaGroups, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitContentMessage(count, initRequest, includeMediaGroups, errorFactory, filter) suspend fun BehaviourContext.waitMediaMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, includeMediaGroups: Boolean = false, - filter: SimpleFilter>? = null, - mapper: CommonMessageToCommonMessageMapper? = null -) = waitContentMessage(count, initRequest, includeMediaGroups, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitContentMessage(count, initRequest, includeMediaGroups, errorFactory, filter) suspend fun BehaviourContext.waitAnyMediaGroupContentMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, includeMediaGroups: Boolean = true, - filter: SimpleFilter>? = null, - mapper: CommonMessageToCommonMessageMapper? = null -) = waitContentMessage(count, initRequest, includeMediaGroups, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitContentMessage(count, initRequest, includeMediaGroups, errorFactory, filter) suspend fun BehaviourContext.waitVisualMediaGroupContentMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, includeMediaGroups: Boolean = true, - filter: SimpleFilter>? = null, - mapper: CommonMessageToCommonMessageMapper? = null -) = waitContentMessage(count, initRequest, includeMediaGroups, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitContentMessage(count, initRequest, includeMediaGroups, errorFactory, filter) suspend fun BehaviourContext.waitTextedMediaContentMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, includeMediaGroups: Boolean = true, - filter: SimpleFilter>? = null, - mapper: CommonMessageToCommonMessageMapper? = null -) = waitContentMessage(count, initRequest, includeMediaGroups, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitContentMessage(count, initRequest, includeMediaGroups, errorFactory, filter) suspend fun BehaviourContext.waitAnimationMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: CommonMessageToCommonMessageMapper? = null -) = waitContentMessage(count, initRequest, false, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitContentMessage(count, initRequest, false, errorFactory, filter) suspend fun BehaviourContext.waitAudioMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, includeMediaGroups: Boolean = false, - filter: SimpleFilter>? = null, - mapper: CommonMessageToCommonMessageMapper? = null -) = waitContentMessage(count, initRequest, includeMediaGroups, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitContentMessage(count, initRequest, includeMediaGroups, errorFactory, filter) suspend fun BehaviourContext.waitDocumentMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, includeMediaGroups: Boolean = false, - filter: SimpleFilter>? = null, - mapper: CommonMessageToCommonMessageMapper? = null -) = waitContentMessage(count, initRequest, includeMediaGroups, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitContentMessage(count, initRequest, includeMediaGroups, errorFactory, filter) suspend fun BehaviourContext.waitPhotoMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, includeMediaGroups: Boolean = false, - filter: SimpleFilter>? = null, - mapper: CommonMessageToCommonMessageMapper? = null -) = waitContentMessage(count, initRequest, includeMediaGroups, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitContentMessage(count, initRequest, includeMediaGroups, errorFactory, filter) suspend fun BehaviourContext.waitStickerMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: CommonMessageToCommonMessageMapper? = null -) = waitContentMessage(count, initRequest, false, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitContentMessage(count, initRequest, false, errorFactory, filter) suspend fun BehaviourContext.waitVideoMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, includeMediaGroups: Boolean = false, - filter: SimpleFilter>? = null, - mapper: CommonMessageToCommonMessageMapper? = null -) = waitContentMessage(count, initRequest, includeMediaGroups, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitContentMessage(count, initRequest, includeMediaGroups, errorFactory, filter) suspend fun BehaviourContext.waitVideoNoteMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: CommonMessageToCommonMessageMapper? = null -) = waitContentMessage(count, initRequest, false, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitContentMessage(count, initRequest, false, errorFactory, filter) suspend fun BehaviourContext.waitVoiceMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: CommonMessageToCommonMessageMapper? = null -) = waitContentMessage(count, initRequest, false, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitContentMessage(count, initRequest, false, errorFactory, filter) suspend fun BehaviourContext.waitInvoiceMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: CommonMessageToCommonMessageMapper? = null -) = waitContentMessage(count, initRequest, false, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitContentMessage(count, initRequest, false, errorFactory, filter) diff --git a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitEditedContent.kt b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitEditedContent.kt index f3ae19daaf..ca7bebab37 100644 --- a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitEditedContent.kt +++ b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitEditedContent.kt @@ -18,13 +18,12 @@ import dev.inmo.tgbotapi.types.message.content.InvoiceContent import dev.inmo.tgbotapi.types.update.abstracts.BaseEditMessageUpdate import kotlinx.coroutines.flow.toList -private suspend fun BehaviourContext.waitEditedCommonMessage( +private suspend inline fun BehaviourContext.waitEditedContent( count: Int = 1, initRequest: Request<*>? = null, includeMediaGroups: Boolean = true, - errorFactory: NullableRequestBuilder<*> = { null }, - filter: SimpleFilter>? = null, - mapper: suspend CommonMessage.() -> O? + noinline errorFactory: NullableRequestBuilder<*> = { null }, + filter: SimpleFilter>? = null ): List = expectFlow( initRequest, count, @@ -32,7 +31,7 @@ private suspend fun BehaviourContext.waitEditedCommonMessage( ) { val messages = when (it) { is BaseEditMessageUpdate -> { - val commonMessage = it.data.asCommonMessage() + val commonMessage = it.data.asCommonMessage() ?: return@expectFlow emptyList() if (commonMessage !is MediaGroupMessage<*> || includeMediaGroups) { listOf(commonMessage) } else { @@ -42,211 +41,167 @@ private suspend fun BehaviourContext.waitEditedCommonMessage( else -> return@expectFlow emptyList() } messages.mapNotNull { message -> - val asCommonMessage = message as CommonMessage + val asCommonMessage = (message as CommonMessage<*>).withContent() ?: return@mapNotNull null if (filter == null || filter(asCommonMessage)) { - asCommonMessage.mapper() + asCommonMessage.content } else { null } } }.toList().toList() -private suspend inline fun BehaviourContext.waitEditedContent( - count: Int = 1, - initRequest: Request<*>? = null, - includeMediaGroups: Boolean = true, - noinline errorFactory: NullableRequestBuilder<*> = { null }, - filter: SimpleFilter>? = null, - noinline mapper: CommonMessageToContentMapper? = null -) : List = waitEditedCommonMessage( - count, - initRequest, - includeMediaGroups, - errorFactory, - filter ?.let { - { - it.withContent() ?.let { filter(it) } == true - } - }, - contentConverter(mapper) -) - suspend fun BehaviourContext.waitEditedContentMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, includeMediaGroups: Boolean = true, - filter: SimpleFilter>? = null, - mapper: CommonMessageToContentMapper? = null -) = waitEditedContent(count, initRequest, includeMediaGroups, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEditedContent(count, initRequest, includeMediaGroups, errorFactory, filter) suspend fun BehaviourContext.waitEditedContact( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: CommonMessageToContentMapper? = null -) = waitEditedContent(count, initRequest, false, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEditedContent(count, initRequest, false, errorFactory, filter) suspend fun BehaviourContext.waitEditedDice( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: CommonMessageToContentMapper? = null -) = waitEditedContent(count, initRequest, false, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEditedContent(count, initRequest, false, errorFactory, filter) suspend fun BehaviourContext.waitEditedGame( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: CommonMessageToContentMapper? = null -) = waitEditedContent(count, initRequest, false, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEditedContent(count, initRequest, false, errorFactory, filter) suspend fun BehaviourContext.waitEditedLocation( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: CommonMessageToContentMapper? = null -) = waitEditedContent(count, initRequest, false, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEditedContent(count, initRequest, false, errorFactory, filter) suspend fun BehaviourContext.waitEditedLiveLocation( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: CommonMessageToContentMapper? = null -) = waitEditedContent(count, initRequest, false, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEditedContent(count, initRequest, false, errorFactory, filter) suspend fun BehaviourContext.waitEditedStaticLocation( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: CommonMessageToContentMapper? = null -) = waitEditedContent(count, initRequest, false, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEditedContent(count, initRequest, false, errorFactory, filter) suspend fun BehaviourContext.waitEditedText( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: CommonMessageToContentMapper? = null -) = waitEditedContent(count, initRequest, false, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEditedContent(count, initRequest, false, errorFactory, filter) suspend fun BehaviourContext.waitEditedVenue( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: CommonMessageToContentMapper? = null -) = waitEditedContent(count, initRequest, false, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEditedContent(count, initRequest, false, errorFactory, filter) suspend fun BehaviourContext.waitEditedAudioMediaGroupContent( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, includeMediaGroups: Boolean = true, - filter: SimpleFilter>? = null, - mapper: CommonMessageToContentMapper? = null -) = waitEditedContent(count, initRequest, includeMediaGroups, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEditedContent(count, initRequest, includeMediaGroups, errorFactory, filter) suspend fun BehaviourContext.waitEditedDocumentMediaGroupContent( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, includeMediaGroups: Boolean = true, - filter: SimpleFilter>? = null, - mapper: CommonMessageToContentMapper? = null -) = waitEditedContent(count, initRequest, includeMediaGroups, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEditedContent(count, initRequest, includeMediaGroups, errorFactory, filter) suspend fun BehaviourContext.waitEditedMedia( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, includeMediaGroups: Boolean = false, - filter: SimpleFilter>? = null, - mapper: CommonMessageToContentMapper? = null -) = waitEditedContent(count, initRequest, includeMediaGroups, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEditedContent(count, initRequest, includeMediaGroups, errorFactory, filter) suspend fun BehaviourContext.waitEditedAnyMediaGroupContent( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, includeMediaGroups: Boolean = true, - filter: SimpleFilter>? = null, - mapper: CommonMessageToContentMapper? = null -) = waitEditedContent(count, initRequest, includeMediaGroups, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEditedContent(count, initRequest, includeMediaGroups, errorFactory, filter) suspend fun BehaviourContext.waitEditedVisualMediaGroupContent( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, includeMediaGroups: Boolean = true, - filter: SimpleFilter>? = null, - mapper: CommonMessageToContentMapper? = null -) = waitEditedContent(count, initRequest, includeMediaGroups, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEditedContent(count, initRequest, includeMediaGroups, errorFactory, filter) suspend fun BehaviourContext.waitEditedTextedMediaContent( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, includeMediaGroups: Boolean = true, - filter: SimpleFilter>? = null, - mapper: CommonMessageToContentMapper? = null -) = waitEditedContent(count, initRequest, includeMediaGroups, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEditedContent(count, initRequest, includeMediaGroups, errorFactory, filter) suspend fun BehaviourContext.waitEditedAnimation( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: CommonMessageToContentMapper? = null -) = waitEditedContent(count, initRequest, false, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEditedContent(count, initRequest, false, errorFactory, filter) suspend fun BehaviourContext.waitEditedAudio( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, includeMediaGroups: Boolean = false, - filter: SimpleFilter>? = null, - mapper: CommonMessageToContentMapper? = null -) = waitEditedContent(count, initRequest, includeMediaGroups, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEditedContent(count, initRequest, includeMediaGroups, errorFactory, filter) suspend fun BehaviourContext.waitEditedDocument( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, includeMediaGroups: Boolean = false, - filter: SimpleFilter>? = null, - mapper: CommonMessageToContentMapper? = null -) = waitEditedContent(count, initRequest, includeMediaGroups, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEditedContent(count, initRequest, includeMediaGroups, errorFactory, filter) suspend fun BehaviourContext.waitEditedPhoto( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, includeMediaGroups: Boolean = false, - filter: SimpleFilter>? = null, - mapper: CommonMessageToContentMapper? = null -) = waitEditedContent(count, initRequest, includeMediaGroups, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEditedContent(count, initRequest, includeMediaGroups, errorFactory, filter) suspend fun BehaviourContext.waitEditedSticker( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: CommonMessageToContentMapper? = null -) = waitEditedContent(count, initRequest, false, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEditedContent(count, initRequest, false, errorFactory, filter) suspend fun BehaviourContext.waitEditedVideo( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, includeMediaGroups: Boolean = false, - filter: SimpleFilter>? = null, - mapper: CommonMessageToContentMapper? = null -) = waitEditedContent(count, initRequest, includeMediaGroups, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEditedContent(count, initRequest, includeMediaGroups, errorFactory, filter) suspend fun BehaviourContext.waitEditedVideoNote( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: CommonMessageToContentMapper? = null -) = waitEditedContent(count, initRequest, false, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEditedContent(count, initRequest, false, errorFactory, filter) suspend fun BehaviourContext.waitEditedVoice( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: CommonMessageToContentMapper? = null -) = waitEditedContent(count, initRequest, false, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEditedContent(count, initRequest, false, errorFactory, filter) suspend fun BehaviourContext.waitEditedInvoice( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: CommonMessageToContentMapper? = null -) = waitEditedContent(count, initRequest, false, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEditedContent(count, initRequest, false, errorFactory, filter) diff --git a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitEventAction.kt b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitEventAction.kt index 717b4b876e..dea7200e22 100644 --- a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitEventAction.kt +++ b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitEventAction.kt @@ -4,8 +4,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.extensions.utils.* import dev.inmo.tgbotapi.requests.abstracts.Request import dev.inmo.tgbotapi.types.message.ChatEvents.* import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.* @@ -17,268 +16,208 @@ import kotlinx.coroutines.flow.toList typealias EventMessageToEventMapper = suspend ChatEventMessage.() -> T? -private suspend fun BehaviourContext.waitEventMessages( +private suspend inline fun BehaviourContext.waitEvents( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, + noinline errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: suspend ChatEventMessage.() -> O? + filter: SimpleFilter>? = null ): List = expectFlow( initRequest, count, errorFactory ) { - val data = it.asBaseSentMessageUpdate() ?.data ?.asChatEventMessage() - if (data != null && (filter == null || filter(data))) { - data.mapper().let(::listOfNotNull) + val data = it.asBaseSentMessageUpdate() ?.data ?.asChatEventMessage() ?.withEvent() ?: return@expectFlow emptyList() + if (filter == null || filter(data)) { + listOf(data.chatEvent) } else { emptyList() } }.toList().toList() - -private suspend inline fun BehaviourContext.waitEvents( - count: Int = 1, - initRequest: Request<*>? = null, - noinline errorFactory: NullableRequestBuilder<*> = { null }, - filter: SimpleFilter>? = null, - noinline mapper: EventMessageToEventMapper? = null -) : List = waitEventMessages( - initRequest, - errorFactory, - count, - filter ?.let { - { - (it.chatEvent as? T) ?.let { filter(it as ChatEventMessage) } == true - } - } -) { - if (chatEvent is T) { - @Suppress("UNCHECKED_CAST") - val message = (this as ChatEventMessage) - if (mapper == null) { - message.chatEvent - } else { - mapper(message) - } - } else { - null - } -} - suspend fun BehaviourContext.waitChannelEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: EventMessageToEventMapper? = null -) = waitEvents(count, initRequest, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEvents(initRequest, errorFactory, count, filter) suspend fun BehaviourContext.waitPrivateEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: EventMessageToEventMapper? = null -) = waitEvents(count, initRequest, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEvents(initRequest, errorFactory, count, filter) suspend fun BehaviourContext.waitChatEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: EventMessageToEventMapper? = null -) = waitEvents(count, initRequest, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEvents(initRequest, errorFactory, count, filter) @Deprecated("Renamed as Video instead of Voice") suspend fun BehaviourContext.waitVoiceChatEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: EventMessageToEventMapper? = null -) = waitEvents(count, initRequest, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEvents(initRequest, errorFactory, count, filter) @Deprecated("Renamed as Video instead of Voice") suspend fun BehaviourContext.waitVoiceChatStartedEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: EventMessageToEventMapper? = null -) = waitEvents(count, initRequest, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEvents(initRequest, errorFactory, count, filter) @Deprecated("Renamed as Video instead of Voice") suspend fun BehaviourContext.waitVoiceChatEndedEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: EventMessageToEventMapper? = null -) = waitEvents(count, initRequest, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEvents(initRequest, errorFactory, count, filter) @Deprecated("Renamed as Video instead of Voice") suspend fun BehaviourContext.waitVoiceChatParticipantsInvitedEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: EventMessageToEventMapper? = null -) = waitEvents(count, initRequest, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEvents(initRequest, errorFactory, count, filter) suspend fun BehaviourContext.waitVideoChatEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: EventMessageToEventMapper? = null -) = waitEvents(count, initRequest, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEvents(initRequest, errorFactory, count, filter) suspend fun BehaviourContext.waitVideoChatStartedEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: EventMessageToEventMapper? = null -) = waitEvents(count, initRequest, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEvents(initRequest, errorFactory, count, filter) suspend fun BehaviourContext.waitVideoChatEndedEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: EventMessageToEventMapper? = null -) = waitEvents(count, initRequest, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEvents(initRequest, errorFactory, count, filter) suspend fun BehaviourContext.waitVideoChatParticipantsInvitedEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: EventMessageToEventMapper? = null -) = waitEvents(count, initRequest, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEvents(initRequest, errorFactory, count, filter) suspend fun BehaviourContext.waitMessageAutoDeleteTimerChangedEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: EventMessageToEventMapper? = null -) = waitEvents(count, initRequest, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEvents(initRequest, errorFactory, count, filter) suspend fun BehaviourContext.waitPublicChatEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: EventMessageToEventMapper? = null -) = waitEvents(count, initRequest, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEvents(initRequest, errorFactory, count, filter) suspend fun BehaviourContext.waitCommonEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: EventMessageToEventMapper? = null -) = waitEvents(count, initRequest, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEvents(initRequest, errorFactory, count, filter) suspend fun BehaviourContext.waitGroupEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: EventMessageToEventMapper? = null -) = waitEvents(count, initRequest, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEvents(initRequest, errorFactory, count, filter) suspend fun BehaviourContext.waitSupergroupEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: EventMessageToEventMapper? = null -) = waitEvents(count, initRequest, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEvents(initRequest, errorFactory, count, filter) suspend fun BehaviourContext.waitChannelChatCreatedEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: EventMessageToEventMapper? = null -) = waitEvents(count, initRequest, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEvents(initRequest, errorFactory, count, filter) suspend fun BehaviourContext.waitDeleteChatPhotoEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: EventMessageToEventMapper? = null -) = waitEvents(count, initRequest, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEvents(initRequest, errorFactory, count, filter) suspend fun BehaviourContext.waitGroupChatCreatedEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: EventMessageToEventMapper? = null -) = waitEvents(count, initRequest, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEvents(initRequest, errorFactory, count, filter) suspend fun BehaviourContext.waitLeftChatMemberEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: EventMessageToEventMapper? = null -) = waitEvents(count, initRequest, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEvents(initRequest, errorFactory, count, filter) suspend fun BehaviourContext.waitNewChatPhotoEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: EventMessageToEventMapper? = null -) = waitEvents(count, initRequest, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEvents(initRequest, errorFactory, count, filter) suspend fun BehaviourContext.waitNewChatMembersEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: EventMessageToEventMapper? = null -) = waitEvents(count, initRequest, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEvents(initRequest, errorFactory, count, filter) suspend fun BehaviourContext.waitNewChatTitleEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: EventMessageToEventMapper? = null -) = waitEvents(count, initRequest, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEvents(initRequest, errorFactory, count, filter) suspend fun BehaviourContext.waitPinnedMessageEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: EventMessageToEventMapper? = null -) = waitEvents(count, initRequest, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEvents(initRequest, errorFactory, count, filter) suspend fun BehaviourContext.waitProximityAlertTriggeredEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: EventMessageToEventMapper? = null -) = waitEvents(count, initRequest, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEvents(initRequest, errorFactory, count, filter) suspend fun BehaviourContext.waitSupergroupChatCreatedEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: EventMessageToEventMapper? = null -) = waitEvents(count, initRequest, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEvents(initRequest, errorFactory, count, filter) suspend fun BehaviourContext.waitSuccessfulPaymentEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: EventMessageToEventMapper? = null -) = waitEvents(count, initRequest, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEvents(initRequest, errorFactory, count, filter) suspend fun BehaviourContext.waitUserLoggedInEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: EventMessageToEventMapper? = null -) = waitEvents(count, initRequest, errorFactory, filter, mapper) + filter: SimpleFilter>? = null +) = waitEvents(initRequest, errorFactory, count, filter) suspend fun BehaviourContext.waitWebAppDataEvents( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter>? = null, - mapper: EventMessageToEventMapper? = null -) = waitEvents(count, initRequest, errorFactory, filter ?.let { { it is PrivateEventMessage && filter(it) } }, mapper) + filter: SimpleFilter>? = null +) = waitEvents(initRequest, errorFactory, count, filter ?.let { SimpleFilter> { it is PrivateEventMessage && filter(it) } }) diff --git a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitInlineQuery.kt b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitInlineQuery.kt index 6523f126e0..b99bc9b76d 100644 --- a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitInlineQuery.kt +++ b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitInlineQuery.kt @@ -9,72 +9,40 @@ import kotlinx.coroutines.flow.toList typealias InlineQueryMapper = suspend T.() -> T? -private suspend fun BehaviourContext.waitInlineQueries( +private suspend inline fun BehaviourContext.waitInlineQueries( count: Int = 1, initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - filter: SimpleFilter? = null, - mapper: suspend InlineQuery.() -> O? + noinline errorFactory: NullableRequestBuilder<*> = { null }, + filter: SimpleFilter? = null ): List = expectFlow( initRequest, count, errorFactory ) { - val data = it.asInlineQueryUpdate() ?.data - if (data != null && (filter == null || filter(data))) { - data.mapper().let(::listOfNotNull) + val data = (it.asInlineQueryUpdate() ?.data as? O) ?: return@expectFlow emptyList() + if (filter == null || filter(data)) { + listOf(data) } else { emptyList() } }.toList().toList() - -private suspend inline fun BehaviourContext.waitInlines( - count: Int = 1, - initRequest: Request<*>? = null, - noinline errorFactory: NullableRequestBuilder<*> = { null }, - filter: SimpleFilter? = null, - noinline mapper: InlineQueryMapper? = null -) : List = waitInlineQueries( - count, - initRequest, - errorFactory, - filter ?.let { - { - (it as? T) ?.let { casted -> filter(casted) } == true - } - } -) { - if (this is T) { - if (mapper == null) { - this - } else { - mapper(this) - } - } else { - null - } -} - suspend fun BehaviourContext.waitAnyInlineQuery( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter? = null, - mapper: InlineQueryMapper? = null -) = waitInlines(count, initRequest, errorFactory, filter, mapper) + filter: SimpleFilter? = null +) = waitInlineQueries(count, initRequest, errorFactory, filter) suspend fun BehaviourContext.waitBaseInlineQuery( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter? = null, - mapper: InlineQueryMapper? = null -) = waitInlines(count, initRequest, errorFactory, filter, mapper) + filter: SimpleFilter? = null +) = waitInlineQueries(count, initRequest, errorFactory, filter) suspend fun BehaviourContext.waitLocationInlineQuery( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter? = null, - mapper: InlineQueryMapper? = null -) = waitInlines(count, initRequest, errorFactory, filter, mapper) + filter: SimpleFilter? = null +) = waitInlineQueries(count, initRequest, errorFactory, filter) diff --git a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitMediaGroup.kt b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitMediaGroup.kt index 5f8852fdbc..444c6f0ce8 100644 --- a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitMediaGroup.kt +++ b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitMediaGroup.kt @@ -1,7 +1,9 @@ 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.asSentMediaGroupUpdate +import dev.inmo.tgbotapi.extensions.utils.withContent import dev.inmo.tgbotapi.requests.abstracts.Request import dev.inmo.tgbotapi.types.message.abstracts.MediaGroupMessage import dev.inmo.tgbotapi.types.message.content.* @@ -9,20 +11,20 @@ import dev.inmo.tgbotapi.types.message.content.AudioMediaGroupContent import dev.inmo.tgbotapi.types.message.content.DocumentMediaGroupContent import dev.inmo.tgbotapi.types.message.content.MediaGroupContent import dev.inmo.tgbotapi.types.message.content.VisualMediaGroupContent -import dev.inmo.tgbotapi.utils.PreviewFeature import kotlinx.coroutines.flow.take import kotlinx.coroutines.flow.toList -typealias MediaGroupFilter = suspend List>.() -> Boolean +typealias MediaGroupFilter = SimpleFilter>> internal suspend inline fun BehaviourContext.buildMediaGroupWaiter( count: Int = 1, initRequest: Request<*>? = null, noinline errorFactory: NullableRequestBuilder<*> = { null }, - noinline filter: MediaGroupFilter? = null + filter: SimpleFilter>>? = null ) = flowsUpdatesFilter.expectFlow(bot, initRequest, count, errorFactory) { update -> update.asSentMediaGroupUpdate() ?.data ?.let { mediaGroup -> - if (mediaGroup.all { message -> message.content is T } && (filter == null || filter(mediaGroup as List>))) { + val mapped = mediaGroup.mapNotNull { it.withContent() } + if (mediaGroup.all { message -> message.content is T } && (filter == null || filter(mapped))) { listOf( mediaGroup.map { it.content as T } ) @@ -36,35 +38,35 @@ suspend fun BehaviourContext.waitMediaGroup( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: MediaGroupFilter? = null + filter: SimpleFilter>>? = null ) = buildMediaGroupWaiter(count, initRequest, errorFactory, filter) suspend fun BehaviourContext.waitPlaylist( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: MediaGroupFilter? = null + filter: SimpleFilter>>? = null ) = buildMediaGroupWaiter(count, initRequest, errorFactory, filter) suspend fun BehaviourContext.waitDocumentsGroup( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: MediaGroupFilter? = null + filter: SimpleFilter>>? = null ) = buildMediaGroupWaiter(count, initRequest, errorFactory, filter) suspend fun BehaviourContext.waitVisualGallery( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: MediaGroupFilter? = null + filter: SimpleFilter>>? = null ) = buildMediaGroupWaiter(count, initRequest, errorFactory, filter) suspend fun BehaviourContext.waitPhotoGallery( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: MediaGroupFilter? = null + filter: SimpleFilter>>? = null ) = buildMediaGroupWaiter(count, initRequest, errorFactory, filter) suspend fun BehaviourContext.waitVideoGallery( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: MediaGroupFilter? = null + filter: SimpleFilter>>? = null ) = buildMediaGroupWaiter(count, initRequest, errorFactory, filter) diff --git a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitPassportData.kt b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitPassportData.kt index 6a858c5aea..4529b0a2b7 100644 --- a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitPassportData.kt +++ b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitPassportData.kt @@ -14,12 +14,11 @@ 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 }, +suspend inline fun BehaviourContext.waitPassportMessagesWith( count: Int = 1, - filter: SimpleFilter? = null, - mapper: suspend PassportMessage.() -> O? + initRequest: Request<*>? = null, + noinline errorFactory: NullableRequestBuilder<*> = { null }, + filter: SimpleFilter? = null ): List = expectFlow( initRequest, count, @@ -27,39 +26,15 @@ suspend fun BehaviourContext.waitPassportMessages( ) { val data = it.asMessageUpdate() ?.data ?.asPassportMessage() ?: return@expectFlow emptyList() if (filter == null || filter(data)) { - data.mapper().let(::listOfNotNull) + data.passportData.data.filterIsInstance() } else { emptyList() } }.toList().toList() -suspend inline fun BehaviourContext.waitPassportMessagesWith( - count: Int = 1, - initRequest: Request<*>? = null, - noinline errorFactory: NullableRequestBuilder<*> = { null }, - filter: SimpleFilter? = null, - noinline mapper: PassportMessageMapper? = null -) : List = waitPassportMessages( - initRequest, - errorFactory, - count, - filter -) { - if (passportData.data.any { it is T }) { - if (mapper == null) { - passportData - } else { - mapper(this) - } - } else { - null - } -} - suspend fun BehaviourContext.waitAnyPassportMessages( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter? = null, - mapper: PassportMessageMapper? = null -) = waitPassportMessagesWith(count, initRequest, errorFactory, filter, mapper) + filter: SimpleFilter? = null +) = waitPassportMessagesWith(count, initRequest, errorFactory, filter) diff --git a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitPollAnswers.kt b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitPollAnswers.kt index 6ef6baf180..ec50dba0cd 100644 --- a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitPollAnswers.kt +++ b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitPollAnswers.kt @@ -9,49 +9,24 @@ import kotlinx.coroutines.flow.toList typealias PollAnswerMapper = suspend PollAnswer.() -> PollAnswer? -private suspend fun BehaviourContext.waitPollsAnswers( +private suspend inline fun BehaviourContext.waitPollAnswers( count: Int = 1, initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - filter: SimpleFilter? = null, - mapper: suspend PollAnswer.() -> O? + noinline errorFactory: NullableRequestBuilder<*> = { null }, + filter: SimpleFilter? = null ): List = expectFlow( initRequest, count, errorFactory ) { - val data = it.asPollAnswerUpdate() ?.data - if (data != null && (filter == null || filter(data))) { - data.mapper().let(::listOfNotNull) + val data = it.asPollAnswerUpdate() ?.data as? O ?: return@expectFlow emptyList() + if (filter == null || filter(data)) { + listOf(data) } else { emptyList() } }.toList().toList() - -private suspend inline fun BehaviourContext.waitPollAnswers( - count: Int = 1, - initRequest: Request<*>? = null, - noinline errorFactory: NullableRequestBuilder<*> = { null }, - filter: SimpleFilter? = null, - noinline mapper: PollAnswerMapper? = null -) : List = this@waitPollAnswers.waitPollsAnswers( - count, - initRequest, - errorFactory, - filter ?.let { - { - (it as? PollAnswer) ?.let { filter(it) } == true - } - } -) { - if (mapper == null) { - this - } else { - mapper(this) - } -} - /** * This wait will be triggered only for stopped polls and polls, which are sent by the bot */ @@ -59,6 +34,5 @@ suspend fun BehaviourContext.waitPollAnswers( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter? = null, - mapper: PollAnswerMapper? = null -) = waitPollAnswers(count, initRequest, errorFactory, filter, mapper) + filter: SimpleFilter? = null +) = waitPollAnswers(count, initRequest, errorFactory, filter) diff --git a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitPollUpdates.kt b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitPollUpdates.kt index 6e9ad291b0..f5f4c2e700 100644 --- a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitPollUpdates.kt +++ b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitPollUpdates.kt @@ -9,53 +9,24 @@ import kotlinx.coroutines.flow.toList typealias PollMapper = suspend T.() -> T? -private suspend fun BehaviourContext.waitPollsUpdates( +private suspend inline fun BehaviourContext.waitPolls( count: Int = 1, initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - filter: SimpleFilter? = null, - mapper: suspend Poll.() -> O? + noinline errorFactory: NullableRequestBuilder<*> = { null }, + filter: SimpleFilter? = null ): List = expectFlow( initRequest, count, errorFactory ) { - val data = it.asPollUpdate() ?.data - if (data != null && (filter == null || filter(data))) { - data.mapper().let(::listOfNotNull) + val data = it.asPollUpdate() ?.data as? O ?: return@expectFlow emptyList() + if (filter == null || filter(data)) { + listOf(data) } else { emptyList() } }.toList().toList() - -private suspend inline fun BehaviourContext.waitPolls( - count: Int = 1, - initRequest: Request<*>? = null, - noinline errorFactory: NullableRequestBuilder<*> = { null }, - filter: SimpleFilter? = null, - noinline mapper: PollMapper? = null -) : List = this@waitPolls.waitPollsUpdates( - count, - initRequest, - errorFactory, - filter ?.let { - { - (it as? T) ?.let { filter(it) } == true - } - } -) { - if (this is T) { - if (mapper == null) { - this - } else { - mapper(this) - } - } else { - null - } -} - /** * This wait will be triggered only for stopped polls and polls, which are sent by the bot */ @@ -63,9 +34,8 @@ suspend fun BehaviourContext.waitPollUpdates( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter? = null, - mapper: PollMapper? = null -) = waitPolls(count, initRequest, errorFactory, filter, mapper) + filter: SimpleFilter? = null +) = waitPolls(count, initRequest, errorFactory, filter) /** * This wait will be triggered only for stopped polls and polls, which are sent by the bot @@ -74,9 +44,8 @@ suspend fun BehaviourContext.waitQuizPollUpdates( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter? = null, - mapper: PollMapper? = null -) = waitPolls(count, initRequest, errorFactory, filter, mapper) + filter: SimpleFilter? = null +) = waitPolls(count, initRequest, errorFactory, filter) /** * This wait will be triggered only for stopped polls and polls, which are sent by the bot @@ -85,6 +54,5 @@ suspend fun BehaviourContext.waitRegularPollUpdates( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter? = null, - mapper: PollMapper? = null -) = waitPolls(count, initRequest, errorFactory, filter, mapper) + filter: SimpleFilter? = null +) = waitPolls(count, initRequest, errorFactory, filter) diff --git a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitPreCheckoutQuery.kt b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitPreCheckoutQuery.kt index 81ea5b23a2..5a072a1653 100644 --- a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitPreCheckoutQuery.kt +++ b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitPreCheckoutQuery.kt @@ -9,20 +9,19 @@ import kotlinx.coroutines.flow.toList typealias PreCheckoutQueryMapper = suspend PreCheckoutQuery.() -> PreCheckoutQuery? -private suspend fun BehaviourContext.waitPreCheckoutQueries( +private suspend inline fun BehaviourContext.waitPreCheckoutQueries( count: Int = 1, initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - filter: SimpleFilter? = null, - mapper: suspend PreCheckoutQuery.() -> O? + noinline errorFactory: NullableRequestBuilder<*> = { null }, + filter: SimpleFilter? = null ): List = expectFlow( initRequest, count, errorFactory ) { - val data = it.asPreCheckoutQueryUpdate() ?.data - if (data != null && (filter == null || filter(data))) { - data.mapper().let(::listOfNotNull) + val data = it.asPreCheckoutQueryUpdate() ?.data as? O ?: return@expectFlow emptyList() + if (filter == null || filter(data)) { + listOf(data) } else { emptyList() } @@ -33,17 +32,10 @@ suspend fun BehaviourContext.waitPreCheckoutQueries( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter? = null, - mapper: PreCheckoutQueryMapper? = null + filter: SimpleFilter? = null ) : List = waitPreCheckoutQueries( count, initRequest, errorFactory, filter -) { - if (mapper == null) { - this - } else { - mapper(this) - } -} +) diff --git a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitShippingQuery.kt b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitShippingQuery.kt index 3ec4382a00..0788867926 100644 --- a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitShippingQuery.kt +++ b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitShippingQuery.kt @@ -9,20 +9,19 @@ import kotlinx.coroutines.flow.toList typealias ShippingQueryMapper = suspend ShippingQuery.() -> ShippingQuery? -private suspend fun BehaviourContext.waitShippingQueries( +private suspend inline fun BehaviourContext.waitShippingQueries( count: Int = 1, initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - filter: SimpleFilter? = null, - mapper: suspend ShippingQuery.() -> O? + noinline errorFactory: NullableRequestBuilder<*> = { null }, + filter: SimpleFilter? = null ): List = expectFlow( initRequest, count, errorFactory ) { - val data = it.asShippingQueryUpdate() ?.data - if (data != null && (filter == null || filter(data))) { - data.mapper().let(::listOfNotNull) + val data = it.asShippingQueryUpdate() ?.data as? O ?: return@expectFlow emptyList() + if (filter == null || filter(data)) { + listOf(data) } else { emptyList() } @@ -33,17 +32,10 @@ suspend fun BehaviourContext.waitShippingQueries( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, count: Int = 1, - filter: SimpleFilter? = null, - mapper: ShippingQueryMapper? = null + filter: SimpleFilter? = null ) : List = waitShippingQueries( count, initRequest, errorFactory, filter -) { - if (mapper == null) { - this - } else { - mapper(this) - } -} +) diff --git a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/EditedContentTriggers.kt b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/EditedContentTriggers.kt index 3dc45ebdca..34b7b5c27d 100644 --- a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/EditedContentTriggers.kt +++ b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/EditedContentTriggers.kt @@ -34,7 +34,6 @@ import dev.inmo.tgbotapi.types.message.content.MediaContent import dev.inmo.tgbotapi.types.message.content.MessageContent import dev.inmo.tgbotapi.types.update.abstracts.BaseEditMessageUpdate import dev.inmo.tgbotapi.types.update.abstracts.Update -import dev.inmo.tgbotapi.utils.PreviewFeature internal suspend inline fun BC.onEditedContent( initialFilter: CommonMessageFilter? = null, diff --git a/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/WithEvent.kt b/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/WithEvent.kt new file mode 100644 index 0000000000..d9221c82a4 --- /dev/null +++ b/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/WithEvent.kt @@ -0,0 +1,31 @@ +@file:Suppress("UNCHECKED_CAST") + +package dev.inmo.tgbotapi.extensions.utils + +import dev.inmo.tgbotapi.types.message.* +import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.* +import dev.inmo.tgbotapi.types.message.abstracts.* +import dev.inmo.tgbotapi.types.message.content.MessageContent +import dev.inmo.tgbotapi.types.message.abstracts.PossiblySentViaBotCommonMessage +import dev.inmo.tgbotapi.types.message.content.MediaGroupContent + +inline fun ChatEventMessage<*>.withEvent() = if (chatEvent is T) { this as ChatEventMessage } else { null } +inline fun ChatEventMessage<*>.requireWithEvent() = withEvent()!! + +inline fun GroupEventMessage<*>.withEvent() = if (chatEvent is T) { this as GroupEventMessage } else { null } +inline fun GroupEventMessage<*>.requireWithEvent() = withEvent()!! + +inline fun SupergroupEventMessage<*>.withEvent() = if (chatEvent is T) { this as SupergroupEventMessage } else { null } +inline fun SupergroupEventMessage<*>.requireWithEvent() = withEvent()!! + +inline fun PrivateEventMessage<*>.withEvent() = if (chatEvent is T) { this as PrivateEventMessage } else { null } +inline fun PrivateEventMessage<*>.requireWithEvent() = withEvent()!! + +inline fun ChannelEventMessage<*>.withEvent() = if (chatEvent is T) { this as ChannelEventMessage } else { null } +inline fun ChannelEventMessage<*>.requireWithEvent() = withEvent()!! + +inline fun CommonGroupEventMessage<*>.withEvent() = if (chatEvent is T) { this as CommonGroupEventMessage } else { null } +inline fun CommonGroupEventMessage<*>.requireWithEvent() = withEvent()!! + +inline fun CommonSupergroupEventMessage<*>.withEvent() = if (chatEvent is T) { this as CommonSupergroupEventMessage } else { null } +inline fun CommonSupergroupEventMessage<*>.requireWithEvent() = withEvent()!!