From e7aec75acafa1a3500c901c037af5411b8c9bcb0 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Sun, 22 May 2022 01:27:52 +0600 Subject: [PATCH] removing of filters for the wait triggers --- CHANGELOG.md | 2 + .../BehaviourContextWithFSM.kt | 32 ++- .../behaviour_builder/expectations/Base.kt | 21 +- .../expectations/WaitCallbackQuery.kt | 76 +++---- .../expectations/WaitChatJoinRequest.kt | 32 ++- .../expectations/WaitChatMemberUpdated.kt | 36 ++-- .../expectations/WaitChosenInlineResult.kt | 40 ++-- .../expectations/WaitContent.kt | 186 +++++------------ .../expectations/WaitContentMessage.kt | 168 +++++---------- .../expectations/WaitEditedContent.kt | 187 ++++++----------- .../expectations/WaitEditedContentMessage.kt | 156 ++++++++++++++ .../expectations/WaitEventAction.kt | 196 ++++++------------ .../expectations/WaitEventActionMessages.kt | 159 ++++++++++++++ .../expectations/WaitInlineQuery.kt | 40 ++-- .../expectations/WaitMediaGroup.kt | 63 ++---- .../expectations/WaitMediaGroupMessages.kt | 54 +++++ .../expectations/WaitPassportData.kt | 26 +-- .../expectations/WaitPollAnswers.kt | 35 +--- .../expectations/WaitPollUpdates.kt | 40 ++-- .../expectations/WaitPreCheckoutQuery.kt | 36 +--- .../expectations/WaitShippingQuery.kt | 34 +-- .../behaviour_builder/utils/LiveLocation.kt | 9 +- .../extensions/utils/FlowsAggregation.kt | 5 +- .../utils/shortcuts/FlowsUpdatesFilter.kt | 9 +- 24 files changed, 808 insertions(+), 834 deletions(-) create mode 100644 tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitEditedContentMessage.kt create mode 100644 tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitEventActionMessages.kt create mode 100644 tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitMediaGroupMessages.kt diff --git a/CHANGELOG.md b/CHANGELOG.md index 5579dd09c4..2ebb719f54 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ * `Behaviour Builder`: * 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 + * Waiters do not take count parameter anymore + * Waiters do not take filter parameter anymore. Use flows filters * `Utils`: * Add opportunity to get event messages with specific `ChatEvent` type using `withEvent`/`requireWithEvent` (by analog with `withEvent` and `requireWithEvent`) diff --git a/tgbotapi.behaviour_builder.fsm/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/BehaviourContextWithFSM.kt b/tgbotapi.behaviour_builder.fsm/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/BehaviourContextWithFSM.kt index 92810ef175..a96676a42f 100644 --- a/tgbotapi.behaviour_builder.fsm/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/BehaviourContextWithFSM.kt +++ b/tgbotapi.behaviour_builder.fsm/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/BehaviourContextWithFSM.kt @@ -47,10 +47,26 @@ interface BehaviourContextWithFSM : BehaviourContext, StatesMachine?, - triggersHolder: TriggersHolder, - updatesFilter: BehaviourContextAndTypeReceiver? + triggersHolder: TriggersHolder ): BehaviourContextWithFSM + fun copy( + bot: TelegramBot = this.bot, + scope: CoroutineScope = this.scope, + broadcastChannelsSize: Int = 100, + onBufferOverflow: BufferOverflow = BufferOverflow.SUSPEND, + upstreamUpdatesFlow: Flow? = null, + triggersHolder: TriggersHolder = this.triggersHolder, + onStateHandlingErrorHandler: StateHandlingErrorHandler = defaultStateHandlingErrorHandler() + ): BehaviourContextWithFSM = copy( + bot, + scope, + broadcastChannelsSize, + onBufferOverflow, + upstreamUpdatesFlow, + triggersHolder + ) + fun copy( bot: TelegramBot = this.bot, scope: CoroutineScope = this.scope, @@ -67,7 +83,7 @@ interface BehaviourContextWithFSM : BehaviourContext, StatesMachine( broadcastChannelsSize: Int, onBufferOverflow: BufferOverflow, upstreamUpdatesFlow: Flow?, - triggersHolder: TriggersHolder, - updatesFilter: BehaviourContextAndTypeReceiver? + triggersHolder: TriggersHolder ): DefaultBehaviourContextWithFSM = BehaviourContextWithFSM( - behaviourContext.copy(bot, scope, broadcastChannelsSize, onBufferOverflow, upstreamUpdatesFlow, triggersHolder, updatesFilter), + behaviourContext.copy(bot, scope, broadcastChannelsSize, onBufferOverflow, upstreamUpdatesFlow, triggersHolder), handlers, statesManager, onStateHandlingErrorHandler @@ -212,10 +227,9 @@ class DefaultBehaviourContextWithFSM( onBufferOverflow: BufferOverflow, upstreamUpdatesFlow: Flow?, triggersHolder: TriggersHolder, - onStateHandlingErrorHandler: StateHandlingErrorHandler, - updatesFilter: BehaviourContextAndTypeReceiver? + onStateHandlingErrorHandler: StateHandlingErrorHandler ): DefaultBehaviourContextWithFSM = BehaviourContextWithFSM( - behaviourContext.copy(bot, scope, broadcastChannelsSize, onBufferOverflow, upstreamUpdatesFlow, triggersHolder, updatesFilter), + behaviourContext.copy(bot, scope, broadcastChannelsSize, onBufferOverflow, upstreamUpdatesFlow, triggersHolder), handlers, statesManager, onStateHandlingErrorHandler diff --git a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/Base.kt b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/Base.kt index c5f1364cbf..0b0eb2c008 100644 --- a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/Base.kt +++ b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/Base.kt @@ -4,7 +4,7 @@ import dev.inmo.micro_utils.coroutines.safelyWithResult import dev.inmo.micro_utils.coroutines.safelyWithoutExceptions import dev.inmo.tgbotapi.bot.TelegramBot import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext -import dev.inmo.tgbotapi.extensions.utils.flatMap +import dev.inmo.tgbotapi.extensions.utils.flatten import dev.inmo.tgbotapi.requests.abstracts.Request import dev.inmo.tgbotapi.types.update.abstracts.Update import dev.inmo.tgbotapi.updateshandlers.FlowsUpdatesFilter @@ -20,7 +20,6 @@ typealias NullableRequestBuilder = suspend (Update) -> Request? /** * @param initRequest If not null, this request will be sent by [bot] before returning value - * @param count If set, result [Flow] will return [count] elements on each [Flow.collect] * @param errorFactory If set, this factory will be used to produce requests in case when user have sent incorrect data * @param cancelRequestFactory If set, this factory will be used to produce requests in case when it is required to say * user that chain of scenario has been cancelled @@ -33,7 +32,6 @@ typealias NullableRequestBuilder = suspend (Update) -> Request? suspend fun FlowsUpdatesFilter.expectFlow( bot: TelegramBot, initRequest: Request<*>? = null, - count: Int? = null, errorFactory: NullableRequestBuilder<*> = { null }, cancelRequestFactory: NullableRequestBuilder<*> = { null }, cancelTrigger: suspend (Update) -> Boolean = { cancelRequestFactory(it) != null }, @@ -55,19 +53,13 @@ suspend fun FlowsUpdatesFilter.expectFlow( } else { result.getOrThrow() } - }.flatMap() - val result = if (count == null) { - flow - } else { - flow.take(count) - } + }.flatten() initRequest ?.also { safelyWithoutExceptions { bot.execute(initRequest) } } - return result + return flow } /** * @param initRequest If not null, this request will be sent by [bot] before returning value - * @param count If set, result [Flow] will return [count] elements on each [Flow.collect] * @param errorFactory If set, this factory will be used to produce requests in case when user have sent incorrect data * @param cancelRequestFactory If set, this factory will be used to produce requests in case when it is required to say * user that chain of scenario has been cancelled @@ -76,14 +68,14 @@ suspend fun FlowsUpdatesFilter.expectFlow( * as is, but when it returns null, then will be called [cancelTrigger] (if it will return true - [cancelRequestFactory] * will be called too), [errorFactory] and then will be returned null */ +@RiskFeature(lowLevelRiskFeatureMessage) suspend fun BehaviourContext.expectFlow( initRequest: Request<*>? = null, - count: Int? = null, errorFactory: NullableRequestBuilder<*> = { null }, cancelRequestFactory: NullableRequestBuilder<*> = { null }, cancelTrigger: suspend (Update) -> Boolean = { cancelRequestFactory(it) != null }, filter: suspend (Update) -> List -) = flowsUpdatesFilter.expectFlow(bot, initRequest, count, errorFactory, cancelRequestFactory, cancelTrigger, filter) +) = flowsUpdatesFilter.expectFlow(bot, initRequest, errorFactory, cancelRequestFactory, cancelTrigger, filter) /** * @param initRequest If not null, this request will be sent by [bot] before returning value @@ -103,7 +95,7 @@ suspend fun FlowsUpdatesFilter.expectOne( cancelRequestFactory: NullableRequestBuilder<*> = { null }, cancelTrigger: suspend (Update) -> Boolean = { cancelRequestFactory(it) != null }, filter: suspend (Update) -> T? -): T = expectFlow(bot, initRequest, 1, errorFactory, cancelRequestFactory, cancelTrigger) { +): T = expectFlow(bot, initRequest, errorFactory, cancelRequestFactory, cancelTrigger) { listOfNotNull(filter.invoke(it)) }.first() @@ -117,6 +109,7 @@ suspend fun FlowsUpdatesFilter.expectOne( * as is, but when it returns null, then will be called [cancelTrigger] (if it will return true - [cancelRequestFactory] * will be called too), [errorFactory] and then will be returned null */ +@RiskFeature(lowLevelRiskFeatureMessage) suspend fun BehaviourContext.expectOne( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, 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 10f0b3888b..9266cab99a 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 @@ -7,80 +7,58 @@ import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.SimpleFilter import dev.inmo.tgbotapi.extensions.utils.asCallbackQueryUpdate import dev.inmo.tgbotapi.requests.abstracts.Request import dev.inmo.tgbotapi.types.queries.callback.* +import dev.inmo.tgbotapi.utils.RiskFeature +import dev.inmo.tgbotapi.utils.lowLevelRiskFeatureMessage +import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.toList typealias CallbackQueryMapper = suspend T.() -> T? -private suspend inline fun BehaviourContext.waitCallbackQueries( - count: Int = 1, +@RiskFeature(lowLevelRiskFeatureMessage) +suspend inline fun BehaviourContext.waitCallbackQueries( initRequest: Request<*>? = null, - noinline errorFactory: NullableRequestBuilder<*> = { null }, - filter: SimpleFilter? = null -): List = expectFlow( + noinline errorFactory: NullableRequestBuilder<*> = { null } +): Flow = expectFlow( initRequest, - count, errorFactory ) { - val data = it.asCallbackQueryUpdate() ?.data ?: return@expectFlow emptyList() - if (data is O && (filter == null || filter(data))) { - listOf(data) - } else { - emptyList() - } -}.toList().toList() + (it.asCallbackQueryUpdate() ?.data as O).let(::listOfNotNull) +} suspend fun BehaviourContext.waitDataCallbackQuery( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter? = null -) = waitCallbackQueries(count, initRequest, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitCallbackQueries(initRequest, errorFactory) suspend fun BehaviourContext.waitGameShortNameCallbackQuery( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter? = null -) = waitCallbackQueries(count, initRequest, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitCallbackQueries(initRequest, errorFactory) suspend fun BehaviourContext.waitInlineMessageIdCallbackQuery( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter? = null -) = waitCallbackQueries(count, initRequest, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitCallbackQueries(initRequest, errorFactory) suspend fun BehaviourContext.waitInlineMessageIdDataCallbackQuery( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter? = null -) = waitCallbackQueries(count, initRequest, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitCallbackQueries(initRequest, errorFactory) suspend fun BehaviourContext.waitInlineMessageIdGameShortNameCallbackQuery( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter? = null -) = waitCallbackQueries(count, initRequest, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitCallbackQueries(initRequest, errorFactory) suspend fun BehaviourContext.waitMessageCallbackQuery( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter? = null -) = waitCallbackQueries(count, initRequest, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitCallbackQueries(initRequest, errorFactory) suspend fun BehaviourContext.waitMessageDataCallbackQuery( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter? = null -) = waitCallbackQueries(count, initRequest, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitCallbackQueries(initRequest, errorFactory) suspend fun BehaviourContext.waitMessageGameShortNameCallbackQuery( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter? = null -) = waitCallbackQueries(count, initRequest, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitCallbackQueries(initRequest, errorFactory) suspend fun BehaviourContext.waitUnknownCallbackQuery( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter? = null -) = waitCallbackQueries(count, initRequest, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitCallbackQueries(initRequest, errorFactory) 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 2c81debe2c..ef253dd339 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 @@ -5,37 +5,29 @@ import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.SimpleFilter import dev.inmo.tgbotapi.extensions.utils.asChatJoinRequestUpdate import dev.inmo.tgbotapi.requests.abstracts.Request import dev.inmo.tgbotapi.types.chat.ChatJoinRequest +import dev.inmo.tgbotapi.utils.RiskFeature +import dev.inmo.tgbotapi.utils.lowLevelRiskFeatureMessage +import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.toList typealias ChatJoinRequestsMapper = suspend ChatJoinRequest.() -> ChatJoinRequest? -private suspend inline fun BehaviourContext.internalWaitChatJoinRequests( - count: Int = 1, +@RiskFeature(lowLevelRiskFeatureMessage) +suspend inline fun BehaviourContext.internalWaitChatJoinRequests( initRequest: Request<*>? = null, - noinline errorFactory: NullableRequestBuilder<*> = { null }, - filter: SimpleFilter? = null -): List = expectFlow( + noinline errorFactory: NullableRequestBuilder<*> = { null } +): Flow = expectFlow( initRequest, - count, errorFactory ) { - val data = it.asChatJoinRequestUpdate() ?.data as? O ?: return@expectFlow emptyList() - if (filter == null || filter(data)) { - listOf(data) - } else { - emptyList() - } -}.toList().toList() + (it.asChatJoinRequestUpdate() ?.data as? O).let(::listOfNotNull) +} suspend fun BehaviourContext.waitChatJoinRequests( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter? = null -) : List = internalWaitChatJoinRequests( - count, + errorFactory: NullableRequestBuilder<*> = { null } +) : Flow = internalWaitChatJoinRequests( initRequest, - errorFactory, - filter + errorFactory ) 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 67ab6a2615..4f75e36f59 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 @@ -7,45 +7,35 @@ import dev.inmo.tgbotapi.types.chat.member.ChatMemberUpdated import dev.inmo.tgbotapi.types.update.CommonChatMemberUpdatedUpdate import dev.inmo.tgbotapi.types.update.MyChatMemberUpdatedUpdate import dev.inmo.tgbotapi.types.update.abstracts.ChatMemberUpdatedUpdate +import dev.inmo.tgbotapi.utils.RiskFeature +import dev.inmo.tgbotapi.utils.lowLevelRiskFeatureMessage +import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.toList typealias ChatMemberUpdatedMapper = suspend T.() -> T? -private suspend inline fun BehaviourContext.waitChatMemberUpdatedWithFilter( - count: Int = 1, +@RiskFeature(lowLevelRiskFeatureMessage) +suspend inline fun BehaviourContext.waitChatMemberUpdatedWithFilter( initRequest: Request<*>? = null, - noinline errorFactory: NullableRequestBuilder<*> = { null }, - filter: SimpleFilter? = null -): List = expectFlow( + noinline errorFactory: NullableRequestBuilder<*> = { null } +): Flow = expectFlow( initRequest, - count, errorFactory ) { - val casted = (it as? T) ?: return@expectFlow emptyList() - if (filter == null || filter(casted)) { - listOf(casted.data) - } else { - emptyList() - } -}.toList().toList() + (it as? O) ?.data.let(::listOfNotNull) +} suspend fun BehaviourContext.waitChatMemberUpdated( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter? = null -) = waitChatMemberUpdatedWithFilter(count, initRequest, errorFactory, filter) +) = waitChatMemberUpdatedWithFilter(initRequest, errorFactory) suspend fun BehaviourContext.waitCommonChatMemberUpdated( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter? = null -) = waitChatMemberUpdatedWithFilter(count, initRequest, errorFactory, filter) +) = waitChatMemberUpdatedWithFilter(initRequest, errorFactory) suspend fun BehaviourContext.waitMyChatMemberUpdated( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter? = null -) = waitChatMemberUpdatedWithFilter(count, initRequest, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitChatMemberUpdatedWithFilter(initRequest, errorFactory) 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 ea08427204..2b5744c174 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 @@ -5,45 +5,35 @@ import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.SimpleFilter import dev.inmo.tgbotapi.extensions.utils.asChosenInlineResultUpdate import dev.inmo.tgbotapi.requests.abstracts.Request import dev.inmo.tgbotapi.types.InlineQueries.ChosenInlineResult.* +import dev.inmo.tgbotapi.utils.RiskFeature +import dev.inmo.tgbotapi.utils.lowLevelRiskFeatureMessage +import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.toList typealias ChosenInlineResultMapper = suspend T.() -> T? -private suspend inline fun BehaviourContext.waitChosenInlineResults( - count: Int = 1, +@RiskFeature(lowLevelRiskFeatureMessage) +suspend inline fun BehaviourContext.waitChosenInlineResults( initRequest: Request<*>? = null, - noinline errorFactory: NullableRequestBuilder<*> = { null }, - filter: SimpleFilter? = null -): List = expectFlow( + noinline errorFactory: NullableRequestBuilder<*> = { null } +): Flow = expectFlow( initRequest, - count, errorFactory ) { - val data = it.asChosenInlineResultUpdate() ?.data as? O ?: return@expectFlow emptyList() - if (filter == null || filter(data)) { - listOf(data) - } else { - emptyList() - } -}.toList().toList() + (it.asChosenInlineResultUpdate() ?.data as? O).let(::listOfNotNull) +} suspend fun BehaviourContext.waitChosenInlineResult( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter? = null -) = waitChosenInlineResults(count, initRequest, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitChosenInlineResults(initRequest, errorFactory) suspend fun BehaviourContext.waitLocationChosenInlineResult( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter? = null -) = waitChosenInlineResults(count, initRequest, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitChosenInlineResults(initRequest, errorFactory) suspend fun BehaviourContext.waitBaseChosenInlineResult( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter? = null -) = waitChosenInlineResults(count, initRequest, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitChosenInlineResults(initRequest, errorFactory) 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 8698cdecbf..01f9ce1acd 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 @@ -15,201 +15,129 @@ import dev.inmo.tgbotapi.types.message.content.VisualMediaGroupContent 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 dev.inmo.tgbotapi.utils.RiskFeature +import dev.inmo.tgbotapi.utils.lowLevelRiskFeatureMessage import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.map typealias CommonMessageToContentMapper = suspend CommonMessage.() -> T? -private suspend inline fun BehaviourContext.waitContent( - count: Int = 1, +@RiskFeature(lowLevelRiskFeatureMessage) +suspend inline fun BehaviourContext.waitContent( initRequest: Request<*>? = null, includeMediaGroups: Boolean = true, - noinline errorFactory: NullableRequestBuilder<*> = { null }, - filter: SimpleFilter>? = null -): Flow = expectFlow( - initRequest, - count, - errorFactory -) { - val messages = when (it) { - is SentMediaGroupUpdate -> { - if (includeMediaGroups) { - it.data - } else { - emptyList() - } - } - is BaseSentMessageUpdate -> listOf(it.data) - else -> return@expectFlow emptyList() - } - messages.mapNotNull { message -> - val asCommonMessage = (message as CommonMessage<*>).withContent() ?: return@mapNotNull null - if (filter == null || filter(asCommonMessage)) { - asCommonMessage.content - } else { - null - } - } -} + noinline errorFactory: NullableRequestBuilder<*> = { null } +): Flow = waitContentMessage(initRequest, includeMediaGroups, errorFactory).map { it.content } suspend fun BehaviourContext.waitContent( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - includeMediaGroups: Boolean = true, - filter: SimpleFilter>? = null -) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter) + includeMediaGroups: Boolean = true +) = waitContent(initRequest, includeMediaGroups, errorFactory) suspend fun BehaviourContext.waitContact( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitContent(count, initRequest, false, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitContent(initRequest, false, errorFactory) suspend fun BehaviourContext.waitDice( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitContent(count, initRequest, false, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitContent(initRequest, false, errorFactory) suspend fun BehaviourContext.waitGame( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitContent(count, initRequest, false, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitContent(initRequest, false, errorFactory) suspend fun BehaviourContext.waitLocation( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitContent(count, initRequest, false, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitContent(initRequest, false, errorFactory) suspend fun BehaviourContext.waitLiveLocation( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitContent(count, initRequest, false, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitContent(initRequest, false, errorFactory) suspend fun BehaviourContext.waitStaticLocation( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitContent(count, initRequest, false, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitContent(initRequest, false, errorFactory) suspend fun BehaviourContext.waitPoll( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitContent(count, initRequest, false, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitContent(initRequest, false, errorFactory) suspend fun BehaviourContext.waitText( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitContent(count, initRequest, false, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitContent(initRequest, false, errorFactory) suspend fun BehaviourContext.waitVenue( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitContent(count, initRequest, false, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitContent(initRequest, false, errorFactory) suspend fun BehaviourContext.waitAudioMediaGroupContent( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - includeMediaGroups: Boolean = true, - filter: SimpleFilter>? = null -) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter) + includeMediaGroups: Boolean = true +) = waitContent(initRequest, includeMediaGroups, errorFactory) suspend fun BehaviourContext.waitDocumentMediaGroupContent( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - includeMediaGroups: Boolean = true, - filter: SimpleFilter>? = null -) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter) + includeMediaGroups: Boolean = true +) = waitContent(initRequest, includeMediaGroups, errorFactory) suspend fun BehaviourContext.waitMedia( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - includeMediaGroups: Boolean = false, - filter: SimpleFilter>? = null -) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter) + includeMediaGroups: Boolean = false +) = waitContent(initRequest, includeMediaGroups, errorFactory) suspend fun BehaviourContext.waitAnyMediaGroupContent( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - includeMediaGroups: Boolean = true, - filter: SimpleFilter>? = null -) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter) + includeMediaGroups: Boolean = true +) = waitContent(initRequest, includeMediaGroups, errorFactory) suspend fun BehaviourContext.waitVisualMediaGroupContent( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - includeMediaGroups: Boolean = true, - filter: SimpleFilter>? = null -) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter) + includeMediaGroups: Boolean = true +) = waitContent(initRequest, includeMediaGroups, errorFactory) suspend fun BehaviourContext.waitTextedMediaContent( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - includeMediaGroups: Boolean = true, - filter: SimpleFilter>? = null -) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter) + includeMediaGroups: Boolean = true +) = waitContent(initRequest, includeMediaGroups, errorFactory) suspend fun BehaviourContext.waitAnimation( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitContent(count, initRequest, false, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitContent(initRequest, false, errorFactory) suspend fun BehaviourContext.waitAudio( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - includeMediaGroups: Boolean = false, - filter: SimpleFilter>? = null -) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter) + includeMediaGroups: Boolean = false +) = waitContent(initRequest, includeMediaGroups, errorFactory) suspend fun BehaviourContext.waitDocument( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - includeMediaGroups: Boolean = false, - filter: SimpleFilter>? = null -) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter) + includeMediaGroups: Boolean = false +) = waitContent(initRequest, includeMediaGroups, errorFactory) suspend fun BehaviourContext.waitPhoto( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - includeMediaGroups: Boolean = false, - filter: SimpleFilter>? = null -) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter) + includeMediaGroups: Boolean = false +) = waitContent(initRequest, includeMediaGroups, errorFactory) suspend fun BehaviourContext.waitSticker( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitContent(count, initRequest, false, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitContent(initRequest, false, errorFactory) suspend fun BehaviourContext.waitVideo( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - includeMediaGroups: Boolean = false, - filter: SimpleFilter>? = null -) = waitContent(count, initRequest, includeMediaGroups, errorFactory, filter) + includeMediaGroups: Boolean = false +) = waitContent(initRequest, includeMediaGroups, errorFactory) suspend fun BehaviourContext.waitVideoNote( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitContent(count, initRequest, false, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitContent(initRequest, false, errorFactory) suspend fun BehaviourContext.waitVoice( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitContent(count, initRequest, false, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitContent(initRequest, false, errorFactory) suspend fun BehaviourContext.waitInvoice( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitContent(count, initRequest, false, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitContent(initRequest, false, errorFactory) 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 e4e18a9eb6..2f67610c3f 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 @@ -16,19 +16,19 @@ import dev.inmo.tgbotapi.types.message.content.VisualMediaGroupContent 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 dev.inmo.tgbotapi.utils.RiskFeature +import dev.inmo.tgbotapi.utils.lowLevelRiskFeatureMessage import kotlinx.coroutines.flow.Flow typealias CommonMessageToCommonMessageMapper = suspend CommonMessage.() -> CommonMessage? -internal suspend inline fun BehaviourContext.waitContentMessage( - count: Int = 1, +@RiskFeature(lowLevelRiskFeatureMessage) +suspend inline fun BehaviourContext.waitContentMessage( initRequest: Request<*>? = null, includeMediaGroups: Boolean = true, - noinline errorFactory: NullableRequestBuilder<*> = { null }, - filter: SimpleFilter>? = null + noinline errorFactory: NullableRequestBuilder<*> = { null } ): Flow> = expectFlow( initRequest, - count, errorFactory ) { val messages = when (it) { @@ -43,13 +43,7 @@ internal suspend inline fun BehaviourContext.waitCo else -> return@expectFlow emptyList() } messages.mapNotNull { message -> - @Suppress("UNCHECKED_CAST") - val asCommonMessage = (message as? CommonMessage<*>) ?.withContent() ?: return@mapNotNull null - if (filter == null || filter(asCommonMessage)) { - asCommonMessage - } else { - null - } + (message as? CommonMessage<*>) ?.withContent() } } @@ -73,161 +67,111 @@ internal inline fun contentMessageConverter( suspend fun BehaviourContext.waitContentMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - includeMediaGroups: Boolean = true, - filter: SimpleFilter>? = null -) = waitContentMessage(count, initRequest, includeMediaGroups, errorFactory, filter) + includeMediaGroups: Boolean = true +) = waitContentMessage(initRequest, includeMediaGroups, errorFactory) suspend fun BehaviourContext.waitContactMessage( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitContentMessage(count, initRequest, false, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitContentMessage(initRequest, false, errorFactory) suspend fun BehaviourContext.waitDiceMessage( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitContentMessage(count, initRequest, false, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitContentMessage(initRequest, false, errorFactory) suspend fun BehaviourContext.waitGameMessage( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitContentMessage(count, initRequest, false, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitContentMessage(initRequest, false, errorFactory) suspend fun BehaviourContext.waitLocationMessage( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitContentMessage(count, initRequest, false, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitContentMessage(initRequest, false, errorFactory) suspend fun BehaviourContext.waitLiveLocationMessage( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitContentMessage(count, initRequest, false, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitContentMessage(initRequest, false, errorFactory) suspend fun BehaviourContext.waitStaticLocationMessage( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitContentMessage(count, initRequest, false, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitContentMessage(initRequest, false, errorFactory) suspend fun BehaviourContext.waitPollMessage( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitContentMessage(count, initRequest, false, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitContentMessage(initRequest, false, errorFactory) suspend fun BehaviourContext.waitTextMessage( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitContentMessage(count, initRequest, false, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitContentMessage(initRequest, false, errorFactory) suspend fun BehaviourContext.waitVenueMessage( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitContentMessage(count, initRequest, false, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitContentMessage(initRequest, false, errorFactory) suspend fun BehaviourContext.waitAudioMediaGroupContentMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - includeMediaGroups: Boolean = true, - filter: SimpleFilter>? = null -) = waitContentMessage(count, initRequest, includeMediaGroups, errorFactory, filter) + includeMediaGroups: Boolean = true +) = waitContentMessage(initRequest, includeMediaGroups, errorFactory) suspend fun BehaviourContext.waitDocumentMediaGroupContentMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - includeMediaGroups: Boolean = true, - filter: SimpleFilter>? = null -) = waitContentMessage(count, initRequest, includeMediaGroups, errorFactory, filter) + includeMediaGroups: Boolean = true +) = waitContentMessage(initRequest, includeMediaGroups, errorFactory) suspend fun BehaviourContext.waitMediaMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - includeMediaGroups: Boolean = false, - filter: SimpleFilter>? = null -) = waitContentMessage(count, initRequest, includeMediaGroups, errorFactory, filter) + includeMediaGroups: Boolean = false +) = waitContentMessage(initRequest, includeMediaGroups, errorFactory) suspend fun BehaviourContext.waitAnyMediaGroupContentMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - includeMediaGroups: Boolean = true, - filter: SimpleFilter>? = null -) = waitContentMessage(count, initRequest, includeMediaGroups, errorFactory, filter) + includeMediaGroups: Boolean = true +) = waitContentMessage(initRequest, includeMediaGroups, errorFactory) suspend fun BehaviourContext.waitVisualMediaGroupContentMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - includeMediaGroups: Boolean = true, - filter: SimpleFilter>? = null -) = waitContentMessage(count, initRequest, includeMediaGroups, errorFactory, filter) + includeMediaGroups: Boolean = true +) = waitContentMessage(initRequest, includeMediaGroups, errorFactory) suspend fun BehaviourContext.waitTextedMediaContentMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - includeMediaGroups: Boolean = true, - filter: SimpleFilter>? = null -) = waitContentMessage(count, initRequest, includeMediaGroups, errorFactory, filter) + includeMediaGroups: Boolean = true +) = waitContentMessage(initRequest, includeMediaGroups, errorFactory) suspend fun BehaviourContext.waitAnimationMessage( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitContentMessage(count, initRequest, false, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitContentMessage(initRequest, false, errorFactory) suspend fun BehaviourContext.waitAudioMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - includeMediaGroups: Boolean = false, - filter: SimpleFilter>? = null -) = waitContentMessage(count, initRequest, includeMediaGroups, errorFactory, filter) + includeMediaGroups: Boolean = false +) = waitContentMessage(initRequest, includeMediaGroups, errorFactory) suspend fun BehaviourContext.waitDocumentMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - includeMediaGroups: Boolean = false, - filter: SimpleFilter>? = null -) = waitContentMessage(count, initRequest, includeMediaGroups, errorFactory, filter) + includeMediaGroups: Boolean = false +) = waitContentMessage(initRequest, includeMediaGroups, errorFactory) suspend fun BehaviourContext.waitPhotoMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - includeMediaGroups: Boolean = false, - filter: SimpleFilter>? = null -) = waitContentMessage(count, initRequest, includeMediaGroups, errorFactory, filter) + includeMediaGroups: Boolean = false +) = waitContentMessage(initRequest, includeMediaGroups, errorFactory) suspend fun BehaviourContext.waitStickerMessage( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitContentMessage(count, initRequest, false, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitContentMessage(initRequest, false, errorFactory) suspend fun BehaviourContext.waitVideoMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - includeMediaGroups: Boolean = false, - filter: SimpleFilter>? = null -) = waitContentMessage(count, initRequest, includeMediaGroups, errorFactory, filter) + includeMediaGroups: Boolean = false +) = waitContentMessage(initRequest, includeMediaGroups, errorFactory) suspend fun BehaviourContext.waitVideoNoteMessage( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitContentMessage(count, initRequest, false, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitContentMessage(initRequest, false, errorFactory) suspend fun BehaviourContext.waitVoiceMessage( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitContentMessage(count, initRequest, false, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitContentMessage(initRequest, false, errorFactory) suspend fun BehaviourContext.waitInvoiceMessage( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitContentMessage(count, initRequest, false, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitContentMessage(initRequest, false, errorFactory) 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 ca7bebab37..2ca4af7fbb 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 @@ -16,192 +16,127 @@ import dev.inmo.tgbotapi.types.message.content.MediaGroupContent import dev.inmo.tgbotapi.types.message.content.VisualMediaGroupContent import dev.inmo.tgbotapi.types.message.content.InvoiceContent import dev.inmo.tgbotapi.types.update.abstracts.BaseEditMessageUpdate -import kotlinx.coroutines.flow.toList +import dev.inmo.tgbotapi.utils.RiskFeature +import dev.inmo.tgbotapi.utils.lowLevelRiskFeatureMessage +import kotlinx.coroutines.flow.* -private suspend inline fun BehaviourContext.waitEditedContent( - count: Int = 1, +@RiskFeature(lowLevelRiskFeatureMessage) +suspend inline fun BehaviourContext.waitEditedContent( initRequest: Request<*>? = null, includeMediaGroups: Boolean = true, - noinline errorFactory: NullableRequestBuilder<*> = { null }, - filter: SimpleFilter>? = null -): List = expectFlow( - initRequest, - count, - errorFactory -) { - val messages = when (it) { - is BaseEditMessageUpdate -> { - val commonMessage = it.data.asCommonMessage() ?: return@expectFlow emptyList() - if (commonMessage !is MediaGroupMessage<*> || includeMediaGroups) { - listOf(commonMessage) - } else { - emptyList() - } - } - else -> return@expectFlow emptyList() - } - messages.mapNotNull { message -> - val asCommonMessage = (message as CommonMessage<*>).withContent() ?: return@mapNotNull null - if (filter == null || filter(asCommonMessage)) { - asCommonMessage.content - } else { - null - } - } -}.toList().toList() + noinline errorFactory: NullableRequestBuilder<*> = { null } +): Flow = waitEditedContentMessage(initRequest, includeMediaGroups, errorFactory).map { it.content } + +suspend fun BehaviourContext.waitEditedMessageContent( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null }, + includeMediaGroups: Boolean = true +) = waitEditedContent(initRequest, includeMediaGroups, errorFactory) suspend fun BehaviourContext.waitEditedContentMessage( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - includeMediaGroups: Boolean = true, - filter: SimpleFilter>? = null -) = waitEditedContent(count, initRequest, includeMediaGroups, errorFactory, filter) + includeMediaGroups: Boolean = true +) = waitEditedContent(initRequest, includeMediaGroups, errorFactory) suspend fun BehaviourContext.waitEditedContact( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitEditedContent(count, initRequest, false, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEditedContent(initRequest, false, errorFactory) suspend fun BehaviourContext.waitEditedDice( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitEditedContent(count, initRequest, false, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEditedContent(initRequest, false, errorFactory) suspend fun BehaviourContext.waitEditedGame( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitEditedContent(count, initRequest, false, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEditedContent(initRequest, false, errorFactory) suspend fun BehaviourContext.waitEditedLocation( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitEditedContent(count, initRequest, false, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEditedContent(initRequest, false, errorFactory) suspend fun BehaviourContext.waitEditedLiveLocation( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitEditedContent(count, initRequest, false, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEditedContent(initRequest, false, errorFactory) suspend fun BehaviourContext.waitEditedStaticLocation( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitEditedContent(count, initRequest, false, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEditedContent(initRequest, false, errorFactory) suspend fun BehaviourContext.waitEditedText( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitEditedContent(count, initRequest, false, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEditedContent(initRequest, false, errorFactory) suspend fun BehaviourContext.waitEditedVenue( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitEditedContent(count, initRequest, false, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEditedContent(initRequest, false, errorFactory) suspend fun BehaviourContext.waitEditedAudioMediaGroupContent( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - includeMediaGroups: Boolean = true, - filter: SimpleFilter>? = null -) = waitEditedContent(count, initRequest, includeMediaGroups, errorFactory, filter) + includeMediaGroups: Boolean = true +) = waitEditedContent(initRequest, includeMediaGroups, errorFactory) suspend fun BehaviourContext.waitEditedDocumentMediaGroupContent( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - includeMediaGroups: Boolean = true, - filter: SimpleFilter>? = null -) = waitEditedContent(count, initRequest, includeMediaGroups, errorFactory, filter) + includeMediaGroups: Boolean = true +) = waitEditedContent(initRequest, includeMediaGroups, errorFactory) suspend fun BehaviourContext.waitEditedMedia( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - includeMediaGroups: Boolean = false, - filter: SimpleFilter>? = null -) = waitEditedContent(count, initRequest, includeMediaGroups, errorFactory, filter) + includeMediaGroups: Boolean = false +) = waitEditedContent(initRequest, includeMediaGroups, errorFactory) suspend fun BehaviourContext.waitEditedAnyMediaGroupContent( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - includeMediaGroups: Boolean = true, - filter: SimpleFilter>? = null -) = waitEditedContent(count, initRequest, includeMediaGroups, errorFactory, filter) + includeMediaGroups: Boolean = true +) = waitEditedContent(initRequest, includeMediaGroups, errorFactory) suspend fun BehaviourContext.waitEditedVisualMediaGroupContent( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - includeMediaGroups: Boolean = true, - filter: SimpleFilter>? = null -) = waitEditedContent(count, initRequest, includeMediaGroups, errorFactory, filter) + includeMediaGroups: Boolean = true +) = waitEditedContent(initRequest, includeMediaGroups, errorFactory) suspend fun BehaviourContext.waitEditedTextedMediaContent( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - includeMediaGroups: Boolean = true, - filter: SimpleFilter>? = null -) = waitEditedContent(count, initRequest, includeMediaGroups, errorFactory, filter) + includeMediaGroups: Boolean = true +) = waitEditedContent(initRequest, includeMediaGroups, errorFactory) suspend fun BehaviourContext.waitEditedAnimation( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitEditedContent(count, initRequest, false, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEditedContent(initRequest, false, errorFactory) suspend fun BehaviourContext.waitEditedAudio( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - includeMediaGroups: Boolean = false, - filter: SimpleFilter>? = null -) = waitEditedContent(count, initRequest, includeMediaGroups, errorFactory, filter) + includeMediaGroups: Boolean = false +) = waitEditedContent(initRequest, includeMediaGroups, errorFactory) suspend fun BehaviourContext.waitEditedDocument( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - includeMediaGroups: Boolean = false, - filter: SimpleFilter>? = null -) = waitEditedContent(count, initRequest, includeMediaGroups, errorFactory, filter) + includeMediaGroups: Boolean = false +) = waitEditedContent(initRequest, includeMediaGroups, errorFactory) suspend fun BehaviourContext.waitEditedPhoto( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - includeMediaGroups: Boolean = false, - filter: SimpleFilter>? = null -) = waitEditedContent(count, initRequest, includeMediaGroups, errorFactory, filter) + includeMediaGroups: Boolean = false +) = waitEditedContent(initRequest, includeMediaGroups, errorFactory) suspend fun BehaviourContext.waitEditedSticker( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitEditedContent(count, initRequest, false, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEditedContent(initRequest, false, errorFactory) suspend fun BehaviourContext.waitEditedVideo( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - includeMediaGroups: Boolean = false, - filter: SimpleFilter>? = null -) = waitEditedContent(count, initRequest, includeMediaGroups, errorFactory, filter) + includeMediaGroups: Boolean = false +) = waitEditedContent(initRequest, includeMediaGroups, errorFactory) suspend fun BehaviourContext.waitEditedVideoNote( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitEditedContent(count, initRequest, false, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEditedContent(initRequest, false, errorFactory) suspend fun BehaviourContext.waitEditedVoice( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitEditedContent(count, initRequest, false, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEditedContent(initRequest, false, errorFactory) suspend fun BehaviourContext.waitEditedInvoice( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitEditedContent(count, initRequest, false, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEditedContent(initRequest, false, errorFactory) diff --git a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitEditedContentMessage.kt b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitEditedContentMessage.kt new file mode 100644 index 0000000000..69d9b1b16f --- /dev/null +++ b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitEditedContentMessage.kt @@ -0,0 +1,156 @@ +@file:Suppress("unused") + +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.asCommonMessage +import dev.inmo.tgbotapi.extensions.utils.withContent +import dev.inmo.tgbotapi.requests.abstracts.Request +import dev.inmo.tgbotapi.types.message.abstracts.CommonMessage +import dev.inmo.tgbotapi.types.message.abstracts.MediaGroupMessage +import dev.inmo.tgbotapi.types.message.content.* +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.types.message.content.InvoiceContent +import dev.inmo.tgbotapi.types.update.abstracts.BaseEditMessageUpdate +import dev.inmo.tgbotapi.utils.RiskFeature +import dev.inmo.tgbotapi.utils.lowLevelRiskFeatureMessage +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.toList + +@RiskFeature(lowLevelRiskFeatureMessage) +suspend inline fun BehaviourContext.waitEditedContentMessage( + initRequest: Request<*>? = null, + includeMediaGroups: Boolean = true, + noinline errorFactory: NullableRequestBuilder<*> = { null } +): Flow> = expectFlow( + initRequest, + errorFactory +) { + val messages = when (it) { + is BaseEditMessageUpdate -> { + val commonMessage = it.data.asCommonMessage() ?: return@expectFlow emptyList() + if (commonMessage !is MediaGroupMessage<*> || includeMediaGroups) { + listOf(commonMessage) + } else { + emptyList() + } + } + else -> return@expectFlow emptyList() + } + messages.mapNotNull { message -> + (message as CommonMessage<*>).withContent() + } +} + +suspend fun BehaviourContext.waitEditedMessageContentMessage( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null }, + includeMediaGroups: Boolean = true +) = waitEditedContentMessage(initRequest, includeMediaGroups, errorFactory) + +suspend fun BehaviourContext.waitEditedContactMessage( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEditedContentMessage(initRequest, false, errorFactory) +suspend fun BehaviourContext.waitEditedDiceMessage( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEditedContentMessage(initRequest, false, errorFactory) +suspend fun BehaviourContext.waitEditedGameMessage( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEditedContentMessage(initRequest, false, errorFactory) +suspend fun BehaviourContext.waitEditedLocationMessage( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEditedContentMessage(initRequest, false, errorFactory) +suspend fun BehaviourContext.waitEditedLiveLocationMessage( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEditedContentMessage(initRequest, false, errorFactory) +suspend fun BehaviourContext.waitEditedStaticLocationMessage( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEditedContentMessage(initRequest, false, errorFactory) +suspend fun BehaviourContext.waitEditedTextMessage( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEditedContentMessage(initRequest, false, errorFactory) +suspend fun BehaviourContext.waitEditedVenueMessage( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEditedContentMessage(initRequest, false, errorFactory) +suspend fun BehaviourContext.waitEditedAudioMediaGroupContentMessage( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null }, + includeMediaGroups: Boolean = true +) = waitEditedContentMessage(initRequest, includeMediaGroups, errorFactory) +suspend fun BehaviourContext.waitEditedDocumentMediaGroupContentMessage( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null }, + includeMediaGroups: Boolean = true +) = waitEditedContentMessage(initRequest, includeMediaGroups, errorFactory) +suspend fun BehaviourContext.waitEditedMediaMessage( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null }, + includeMediaGroups: Boolean = false +) = waitEditedContentMessage(initRequest, includeMediaGroups, errorFactory) +suspend fun BehaviourContext.waitEditedAnyMediaGroupContentMessage( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null }, + includeMediaGroups: Boolean = true +) = waitEditedContentMessage(initRequest, includeMediaGroups, errorFactory) +suspend fun BehaviourContext.waitEditedVisualMediaGroupContentMessage( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null }, + includeMediaGroups: Boolean = true +) = waitEditedContentMessage(initRequest, includeMediaGroups, errorFactory) +suspend fun BehaviourContext.waitEditedTextedMediaContentMessage( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null }, + includeMediaGroups: Boolean = true +) = waitEditedContentMessage(initRequest, includeMediaGroups, errorFactory) +suspend fun BehaviourContext.waitEditedAnimationMessage( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEditedContentMessage(initRequest, false, errorFactory) +suspend fun BehaviourContext.waitEditedAudioMessage( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null }, + includeMediaGroups: Boolean = false +) = waitEditedContentMessage(initRequest, includeMediaGroups, errorFactory) +suspend fun BehaviourContext.waitEditedDocumentMessage( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null }, + includeMediaGroups: Boolean = false +) = waitEditedContentMessage(initRequest, includeMediaGroups, errorFactory) +suspend fun BehaviourContext.waitEditedPhotoMessage( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null }, + includeMediaGroups: Boolean = false +) = waitEditedContentMessage(initRequest, includeMediaGroups, errorFactory) +suspend fun BehaviourContext.waitEditedStickerMessage( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEditedContentMessage(initRequest, false, errorFactory) +suspend fun BehaviourContext.waitEditedVideoMessage( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null }, + includeMediaGroups: Boolean = false +) = waitEditedContentMessage(initRequest, includeMediaGroups, errorFactory) +suspend fun BehaviourContext.waitEditedVideoNoteMessage( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEditedContentMessage(initRequest, false, errorFactory) +suspend fun BehaviourContext.waitEditedVoiceMessage( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEditedContentMessage(initRequest, false, errorFactory) +suspend fun BehaviourContext.waitEditedInvoiceMessage( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEditedContentMessage(initRequest, false, errorFactory) 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 dea7200e22..6a23a0952a 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 @@ -12,212 +12,150 @@ import dev.inmo.tgbotapi.types.message.ChatEvents.voice.* import dev.inmo.tgbotapi.types.message.PrivateEventMessage import dev.inmo.tgbotapi.types.message.abstracts.ChatEventMessage import dev.inmo.tgbotapi.types.message.payments.SuccessfulPaymentEvent +import dev.inmo.tgbotapi.utils.RiskFeature +import dev.inmo.tgbotapi.utils.lowLevelRiskFeatureMessage +import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.toList typealias EventMessageToEventMapper = suspend ChatEventMessage.() -> T? -private suspend inline fun BehaviourContext.waitEvents( +@RiskFeature(lowLevelRiskFeatureMessage) +suspend inline fun BehaviourContext.waitEvents( initRequest: Request<*>? = null, - noinline errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -): List = expectFlow( + noinline errorFactory: NullableRequestBuilder<*> = { null } +): Flow = expectFlow( initRequest, - count, errorFactory ) { - val data = it.asBaseSentMessageUpdate() ?.data ?.asChatEventMessage() ?.withEvent() ?: return@expectFlow emptyList() - if (filter == null || filter(data)) { - listOf(data.chatEvent) - } else { - emptyList() - } -}.toList().toList() + it.asBaseSentMessageUpdate() ?.data ?.asChatEventMessage() ?.withEvent() ?.chatEvent.let(::listOfNotNull) +} suspend fun BehaviourContext.waitChannelEvents( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitEvents(initRequest, errorFactory, count, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEvents(initRequest, errorFactory) suspend fun BehaviourContext.waitPrivateEvents( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitEvents(initRequest, errorFactory, count, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEvents(initRequest, errorFactory) suspend fun BehaviourContext.waitChatEvents( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitEvents(initRequest, errorFactory, count, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEvents(initRequest, errorFactory) @Deprecated("Renamed as Video instead of Voice") suspend fun BehaviourContext.waitVoiceChatEvents( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitEvents(initRequest, errorFactory, count, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEvents(initRequest, errorFactory) @Deprecated("Renamed as Video instead of Voice") suspend fun BehaviourContext.waitVoiceChatStartedEvents( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitEvents(initRequest, errorFactory, count, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEvents(initRequest, errorFactory) @Deprecated("Renamed as Video instead of Voice") suspend fun BehaviourContext.waitVoiceChatEndedEvents( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitEvents(initRequest, errorFactory, count, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEvents(initRequest, errorFactory) @Deprecated("Renamed as Video instead of Voice") suspend fun BehaviourContext.waitVoiceChatParticipantsInvitedEvents( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitEvents(initRequest, errorFactory, count, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEvents(initRequest, errorFactory) suspend fun BehaviourContext.waitVideoChatEvents( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitEvents(initRequest, errorFactory, count, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEvents(initRequest, errorFactory) suspend fun BehaviourContext.waitVideoChatStartedEvents( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitEvents(initRequest, errorFactory, count, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEvents(initRequest, errorFactory) suspend fun BehaviourContext.waitVideoChatEndedEvents( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitEvents(initRequest, errorFactory, count, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEvents(initRequest, errorFactory) suspend fun BehaviourContext.waitVideoChatParticipantsInvitedEvents( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitEvents(initRequest, errorFactory, count, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEvents(initRequest, errorFactory) suspend fun BehaviourContext.waitMessageAutoDeleteTimerChangedEvents( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitEvents(initRequest, errorFactory, count, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEvents(initRequest, errorFactory) suspend fun BehaviourContext.waitPublicChatEvents( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitEvents(initRequest, errorFactory, count, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEvents(initRequest, errorFactory) suspend fun BehaviourContext.waitCommonEvents( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitEvents(initRequest, errorFactory, count, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEvents(initRequest, errorFactory) suspend fun BehaviourContext.waitGroupEvents( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitEvents(initRequest, errorFactory, count, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEvents(initRequest, errorFactory) suspend fun BehaviourContext.waitSupergroupEvents( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitEvents(initRequest, errorFactory, count, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEvents(initRequest, errorFactory) suspend fun BehaviourContext.waitChannelChatCreatedEvents( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitEvents(initRequest, errorFactory, count, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEvents(initRequest, errorFactory) suspend fun BehaviourContext.waitDeleteChatPhotoEvents( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitEvents(initRequest, errorFactory, count, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEvents(initRequest, errorFactory) suspend fun BehaviourContext.waitGroupChatCreatedEvents( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitEvents(initRequest, errorFactory, count, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEvents(initRequest, errorFactory) suspend fun BehaviourContext.waitLeftChatMemberEvents( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitEvents(initRequest, errorFactory, count, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEvents(initRequest, errorFactory) suspend fun BehaviourContext.waitNewChatPhotoEvents( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitEvents(initRequest, errorFactory, count, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEvents(initRequest, errorFactory) suspend fun BehaviourContext.waitNewChatMembersEvents( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitEvents(initRequest, errorFactory, count, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEvents(initRequest, errorFactory) suspend fun BehaviourContext.waitNewChatTitleEvents( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitEvents(initRequest, errorFactory, count, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEvents(initRequest, errorFactory) suspend fun BehaviourContext.waitPinnedMessageEvents( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitEvents(initRequest, errorFactory, count, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEvents(initRequest, errorFactory) suspend fun BehaviourContext.waitProximityAlertTriggeredEvents( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitEvents(initRequest, errorFactory, count, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEvents(initRequest, errorFactory) suspend fun BehaviourContext.waitSupergroupChatCreatedEvents( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitEvents(initRequest, errorFactory, count, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEvents(initRequest, errorFactory) suspend fun BehaviourContext.waitSuccessfulPaymentEvents( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitEvents(initRequest, errorFactory, count, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEvents(initRequest, errorFactory) suspend fun BehaviourContext.waitUserLoggedInEvents( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitEvents(initRequest, errorFactory, count, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEvents(initRequest, errorFactory) suspend fun BehaviourContext.waitWebAppDataEvents( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>? = null -) = waitEvents(initRequest, errorFactory, count, filter ?.let { SimpleFilter> { it is PrivateEventMessage && filter(it) } }) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEvents(initRequest, errorFactory) diff --git a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitEventActionMessages.kt b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitEventActionMessages.kt new file mode 100644 index 0000000000..2df1b701d9 --- /dev/null +++ b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitEventActionMessages.kt @@ -0,0 +1,159 @@ +@file:Suppress("unused") + +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.* +import dev.inmo.tgbotapi.requests.abstracts.Request +import dev.inmo.tgbotapi.types.message.ChannelEventMessage +import dev.inmo.tgbotapi.types.message.ChatEvents.* +import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.* +import dev.inmo.tgbotapi.types.message.ChatEvents.voice.* +import dev.inmo.tgbotapi.types.message.PrivateEventMessage +import dev.inmo.tgbotapi.types.message.abstracts.ChatEventMessage +import dev.inmo.tgbotapi.types.message.payments.SuccessfulPaymentEvent +import dev.inmo.tgbotapi.utils.RiskFeature +import dev.inmo.tgbotapi.utils.lowLevelRiskFeatureMessage +import kotlinx.coroutines.flow.* + +@RiskFeature(lowLevelRiskFeatureMessage) +suspend inline fun BehaviourContext.waitEventsMessages( + initRequest: Request<*>? = null, + noinline errorFactory: NullableRequestBuilder<*> = { null } +): Flow> = expectFlow( + initRequest, + errorFactory +) { + it.asBaseSentMessageUpdate() ?.data ?.asChatEventMessage() ?.withEvent().let(::listOfNotNull) +} + +suspend fun BehaviourContext.waitChannelEventsMessages( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEventsMessages(initRequest, errorFactory) + +suspend fun BehaviourContext.waitPrivateEventsMessages( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEventsMessages(initRequest, errorFactory) + +suspend fun BehaviourContext.waitChatEventsMessages( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEventsMessages(initRequest, errorFactory) + +@Deprecated("Renamed as Video instead of Voice") +suspend fun BehaviourContext.waitVoiceChatEventsMessages( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEventsMessages(initRequest, errorFactory) +@Deprecated("Renamed as Video instead of Voice") +suspend fun BehaviourContext.waitVoiceChatStartedEventsMessages( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEventsMessages(initRequest, errorFactory) +@Deprecated("Renamed as Video instead of Voice") +suspend fun BehaviourContext.waitVoiceChatEndedEventsMessages( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEventsMessages(initRequest, errorFactory) +@Deprecated("Renamed as Video instead of Voice") +suspend fun BehaviourContext.waitVoiceChatParticipantsInvitedEventsMessages( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEventsMessages(initRequest, errorFactory) + +suspend fun BehaviourContext.waitVideoChatEventsMessages( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEventsMessages(initRequest, errorFactory) +suspend fun BehaviourContext.waitVideoChatStartedEventsMessages( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEventsMessages(initRequest, errorFactory) +suspend fun BehaviourContext.waitVideoChatEndedEventsMessages( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEventsMessages(initRequest, errorFactory) +suspend fun BehaviourContext.waitVideoChatParticipantsInvitedEventsMessages( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEventsMessages(initRequest, errorFactory) + +suspend fun BehaviourContext.waitMessageAutoDeleteTimerChangedEventsMessages( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEventsMessages(initRequest, errorFactory) + + +suspend fun BehaviourContext.waitPublicChatEventsMessages( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEventsMessages(initRequest, errorFactory) +suspend fun BehaviourContext.waitCommonEventsMessages( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEventsMessages(initRequest, errorFactory) + +suspend fun BehaviourContext.waitGroupEventsMessages( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEventsMessages(initRequest, errorFactory) +suspend fun BehaviourContext.waitSupergroupEventsMessages( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEventsMessages(initRequest, errorFactory) + +suspend fun BehaviourContext.waitChannelChatCreatedEventsMessages( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEventsMessages(initRequest, errorFactory) +suspend fun BehaviourContext.waitDeleteChatPhotoEventsMessages( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEventsMessages(initRequest, errorFactory) +suspend fun BehaviourContext.waitGroupChatCreatedEventsMessages( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEventsMessages(initRequest, errorFactory) +suspend fun BehaviourContext.waitLeftChatMemberEventsMessages( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEventsMessages(initRequest, errorFactory) +suspend fun BehaviourContext.waitNewChatPhotoEventsMessages( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEventsMessages(initRequest, errorFactory) +suspend fun BehaviourContext.waitNewChatMembersEventsMessages( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEventsMessages(initRequest, errorFactory) +suspend fun BehaviourContext.waitNewChatTitleEventsMessages( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEventsMessages(initRequest, errorFactory) +suspend fun BehaviourContext.waitPinnedMessageEventsMessages( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEventsMessages(initRequest, errorFactory) +suspend fun BehaviourContext.waitProximityAlertTriggeredEventsMessages( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEventsMessages(initRequest, errorFactory) +suspend fun BehaviourContext.waitSupergroupChatCreatedEventsMessages( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEventsMessages(initRequest, errorFactory) +suspend fun BehaviourContext.waitSuccessfulPaymentEventsMessages( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEventsMessages(initRequest, errorFactory) +suspend fun BehaviourContext.waitUserLoggedInEventsMessages( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEventsMessages(initRequest, errorFactory) +suspend fun BehaviourContext.waitWebAppDataEventsMessages( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = waitEventsMessages(initRequest, errorFactory) 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 b99bc9b76d..8c6c5bc393 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 @@ -5,44 +5,34 @@ import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.SimpleFilter import dev.inmo.tgbotapi.extensions.utils.asInlineQueryUpdate import dev.inmo.tgbotapi.requests.abstracts.Request import dev.inmo.tgbotapi.types.InlineQueries.query.* +import dev.inmo.tgbotapi.utils.RiskFeature +import dev.inmo.tgbotapi.utils.lowLevelRiskFeatureMessage +import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.toList typealias InlineQueryMapper = suspend T.() -> T? -private suspend inline fun BehaviourContext.waitInlineQueries( - count: Int = 1, +@RiskFeature(lowLevelRiskFeatureMessage) +suspend inline fun BehaviourContext.waitInlineQueries( initRequest: Request<*>? = null, - noinline errorFactory: NullableRequestBuilder<*> = { null }, - filter: SimpleFilter? = null -): List = expectFlow( + noinline errorFactory: NullableRequestBuilder<*> = { null } +): Flow = expectFlow( initRequest, - count, errorFactory ) { - val data = (it.asInlineQueryUpdate() ?.data as? O) ?: return@expectFlow emptyList() - if (filter == null || filter(data)) { - listOf(data) - } else { - emptyList() - } -}.toList().toList() + (it.asInlineQueryUpdate() ?.data as? O).let(::listOfNotNull) +} suspend fun BehaviourContext.waitAnyInlineQuery( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter? = null -) = waitInlineQueries(count, initRequest, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitInlineQueries(initRequest, errorFactory) suspend fun BehaviourContext.waitBaseInlineQuery( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter? = null -) = waitInlineQueries(count, initRequest, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitInlineQueries(initRequest, errorFactory) suspend fun BehaviourContext.waitLocationInlineQuery( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter? = null -) = waitInlineQueries(count, initRequest, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitInlineQueries(initRequest, errorFactory) 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 444c6f0ce8..542f7a7d46 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 @@ -11,62 +11,41 @@ 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 kotlinx.coroutines.flow.take -import kotlinx.coroutines.flow.toList +import dev.inmo.tgbotapi.utils.RiskFeature +import dev.inmo.tgbotapi.utils.lowLevelRiskFeatureMessage +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.map typealias MediaGroupFilter = SimpleFilter>> -internal suspend inline fun BehaviourContext.buildMediaGroupWaiter( - count: Int = 1, + +@RiskFeature(lowLevelRiskFeatureMessage) +suspend inline fun BehaviourContext.buildMediaGroupWaiter( initRequest: Request<*>? = null, - noinline errorFactory: NullableRequestBuilder<*> = { null }, - filter: SimpleFilter>>? = null -) = flowsUpdatesFilter.expectFlow(bot, initRequest, count, errorFactory) { update -> - update.asSentMediaGroupUpdate() ?.data ?.let { mediaGroup -> - 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 } - ) - } else { - null - } - } ?: emptyList() -}.take(count).toList() + noinline errorFactory: NullableRequestBuilder<*> = { null } +): Flow> = buildMediaGroupMessagesWaiter(initRequest, errorFactory).map { it.map { it.content } } suspend fun BehaviourContext.waitMediaGroup( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>>? = null -) = buildMediaGroupWaiter(count, initRequest, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = buildMediaGroupWaiter(initRequest, errorFactory) suspend fun BehaviourContext.waitPlaylist( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>>? = null -) = buildMediaGroupWaiter(count, initRequest, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = buildMediaGroupWaiter(initRequest, errorFactory) suspend fun BehaviourContext.waitDocumentsGroup( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>>? = null -) = buildMediaGroupWaiter(count, initRequest, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = buildMediaGroupWaiter(initRequest, errorFactory) suspend fun BehaviourContext.waitVisualGallery( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>>? = null -) = buildMediaGroupWaiter(count, initRequest, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = buildMediaGroupWaiter(initRequest, errorFactory) suspend fun BehaviourContext.waitPhotoGallery( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>>? = null -) = buildMediaGroupWaiter(count, initRequest, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = buildMediaGroupWaiter(initRequest, errorFactory) suspend fun BehaviourContext.waitVideoGallery( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter>>? = null -) = buildMediaGroupWaiter(count, initRequest, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = buildMediaGroupWaiter(initRequest, errorFactory) diff --git a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitMediaGroupMessages.kt b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitMediaGroupMessages.kt new file mode 100644 index 0000000000..29f03d276e --- /dev/null +++ b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/expectations/WaitMediaGroupMessages.kt @@ -0,0 +1,54 @@ +package dev.inmo.tgbotapi.extensions.behaviour_builder.expectations + +import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext +import dev.inmo.tgbotapi.extensions.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.* +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.RiskFeature +import dev.inmo.tgbotapi.utils.lowLevelRiskFeatureMessage +import kotlinx.coroutines.flow.Flow + +@RiskFeature(lowLevelRiskFeatureMessage) +suspend inline fun BehaviourContext.buildMediaGroupMessagesWaiter( + initRequest: Request<*>? = null, + noinline errorFactory: NullableRequestBuilder<*> = { null } +): Flow>> = flowsUpdatesFilter.expectFlow(bot, initRequest, errorFactory) { update -> + update.asSentMediaGroupUpdate() ?.data ?.let { mediaGroup -> + val mapped = mediaGroup.mapNotNull { it.withContent() } + listOf( + mapped + ) + } ?: emptyList() +} + +suspend fun BehaviourContext.waitMediaGroupMessages( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = buildMediaGroupMessagesWaiter(initRequest, errorFactory) +suspend fun BehaviourContext.waitPlaylistMessages( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = buildMediaGroupMessagesWaiter(initRequest, errorFactory) +suspend fun BehaviourContext.waitDocumentsGroupMessages( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = buildMediaGroupMessagesWaiter(initRequest, errorFactory) +suspend fun BehaviourContext.waitVisualGalleryMessages( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = buildMediaGroupMessagesWaiter(initRequest, errorFactory) +suspend fun BehaviourContext.waitPhotoGalleryMessages( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = buildMediaGroupMessagesWaiter(initRequest, errorFactory) +suspend fun BehaviourContext.waitVideoGalleryMessages( + initRequest: Request<*>? = null, + errorFactory: NullableRequestBuilder<*> = { null } +) = buildMediaGroupMessagesWaiter(initRequest, errorFactory) 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 4529b0a2b7..2d1c16c90f 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 @@ -9,32 +9,24 @@ import dev.inmo.tgbotapi.types.message.PassportMessage import dev.inmo.tgbotapi.types.passport.PassportData import dev.inmo.tgbotapi.types.passport.encrypted.abstracts.EncryptedPassportElement import dev.inmo.tgbotapi.utils.RiskFeature +import dev.inmo.tgbotapi.utils.lowLevelRiskFeatureMessage +import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.toList typealias PassportMessageMapper = suspend PassportMessage.() -> PassportData -@RiskFeature("Do not use this message directly, use waitPassportMessagesWith or waitAnyPassportMessages instead") +@RiskFeature(lowLevelRiskFeatureMessage) suspend inline fun BehaviourContext.waitPassportMessagesWith( - count: Int = 1, initRequest: Request<*>? = null, - noinline errorFactory: NullableRequestBuilder<*> = { null }, - filter: SimpleFilter? = null -): List = expectFlow( + noinline errorFactory: NullableRequestBuilder<*> = { null } +): Flow = expectFlow( initRequest, - count, errorFactory ) { - val data = it.asMessageUpdate() ?.data ?.asPassportMessage() ?: return@expectFlow emptyList() - if (filter == null || filter(data)) { - data.passportData.data.filterIsInstance() - } else { - emptyList() - } -}.toList().toList() + it.asMessageUpdate() ?.data ?.asPassportMessage() ?.passportData ?.data ?.filterIsInstance() ?: emptyList() +} suspend fun BehaviourContext.waitAnyPassportMessages( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter? = null -) = waitPassportMessagesWith(count, initRequest, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitPassportMessagesWith(initRequest, errorFactory) 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 ec50dba0cd..a59fcccc4b 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 @@ -5,34 +5,19 @@ import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.SimpleFilter import dev.inmo.tgbotapi.extensions.utils.asPollAnswerUpdate import dev.inmo.tgbotapi.requests.abstracts.Request import dev.inmo.tgbotapi.types.polls.PollAnswer +import dev.inmo.tgbotapi.utils.RiskFeature +import dev.inmo.tgbotapi.utils.lowLevelRiskFeatureMessage +import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.toList typealias PollAnswerMapper = suspend PollAnswer.() -> PollAnswer? -private suspend inline fun BehaviourContext.waitPollAnswers( - count: Int = 1, - initRequest: Request<*>? = null, - noinline errorFactory: NullableRequestBuilder<*> = { null }, - filter: SimpleFilter? = null -): List = expectFlow( - initRequest, - count, - errorFactory -) { - val data = it.asPollAnswerUpdate() ?.data as? O ?: return@expectFlow emptyList() - if (filter == null || filter(data)) { - listOf(data) - } else { - emptyList() - } -}.toList().toList() - -/** - * This wait will be triggered only for stopped polls and polls, which are sent by the bot - */ suspend fun BehaviourContext.waitPollAnswers( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter? = null -) = waitPollAnswers(count, initRequest, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +): Flow = expectFlow( + initRequest, + errorFactory +) { + it.asPollAnswerUpdate() ?.data.let(::listOfNotNull) +} 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 f5f4c2e700..1dd9ad044c 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 @@ -5,54 +5,44 @@ import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.SimpleFilter import dev.inmo.tgbotapi.extensions.utils.asPollUpdate import dev.inmo.tgbotapi.requests.abstracts.Request import dev.inmo.tgbotapi.types.polls.* +import dev.inmo.tgbotapi.utils.RiskFeature +import dev.inmo.tgbotapi.utils.lowLevelRiskFeatureMessage +import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.toList typealias PollMapper = suspend T.() -> T? -private suspend inline fun BehaviourContext.waitPolls( - count: Int = 1, +@RiskFeature(lowLevelRiskFeatureMessage) +suspend inline fun BehaviourContext.waitPolls( initRequest: Request<*>? = null, - noinline errorFactory: NullableRequestBuilder<*> = { null }, - filter: SimpleFilter? = null -): List = expectFlow( + noinline errorFactory: NullableRequestBuilder<*> = { null } +): Flow = expectFlow( initRequest, - count, errorFactory ) { - val data = it.asPollUpdate() ?.data as? O ?: return@expectFlow emptyList() - if (filter == null || filter(data)) { - listOf(data) - } else { - emptyList() - } -}.toList().toList() + (it.asPollUpdate() ?.data as? O).let(::listOfNotNull) +} /** * This wait will be triggered only for stopped polls and polls, which are sent by the bot */ suspend fun BehaviourContext.waitPollUpdates( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter? = null -) = waitPolls(count, initRequest, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitPolls(initRequest, errorFactory) /** * This wait will be triggered only for stopped polls and polls, which are sent by the bot */ suspend fun BehaviourContext.waitQuizPollUpdates( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter? = null -) = waitPolls(count, initRequest, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitPolls(initRequest, errorFactory) /** * This wait will be triggered only for stopped polls and polls, which are sent by the bot */ suspend fun BehaviourContext.waitRegularPollUpdates( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter? = null -) = waitPolls(count, initRequest, errorFactory, filter) + errorFactory: NullableRequestBuilder<*> = { null } +) = waitPolls(initRequest, errorFactory) 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 5a072a1653..0c2fcb5cf3 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 @@ -5,37 +5,19 @@ import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.SimpleFilter import dev.inmo.tgbotapi.extensions.utils.asPreCheckoutQueryUpdate import dev.inmo.tgbotapi.requests.abstracts.Request import dev.inmo.tgbotapi.types.payments.PreCheckoutQuery +import dev.inmo.tgbotapi.utils.RiskFeature +import dev.inmo.tgbotapi.utils.lowLevelRiskFeatureMessage +import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.toList typealias PreCheckoutQueryMapper = suspend PreCheckoutQuery.() -> PreCheckoutQuery? -private suspend inline fun BehaviourContext.waitPreCheckoutQueries( - count: Int = 1, - initRequest: Request<*>? = null, - noinline errorFactory: NullableRequestBuilder<*> = { null }, - filter: SimpleFilter? = null -): List = expectFlow( - initRequest, - count, - errorFactory -) { - val data = it.asPreCheckoutQueryUpdate() ?.data as? O ?: return@expectFlow emptyList() - if (filter == null || filter(data)) { - listOf(data) - } else { - emptyList() - } -}.toList().toList() - - suspend fun BehaviourContext.waitPreCheckoutQueries( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter? = null -) : List = waitPreCheckoutQueries( - count, + errorFactory: NullableRequestBuilder<*> = { null } +): Flow = expectFlow( initRequest, - errorFactory, - filter -) + errorFactory +) { + it.asPreCheckoutQueryUpdate() ?.data.let(::listOfNotNull) +} 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 0788867926..a35a7b9a66 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 @@ -5,37 +5,17 @@ import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.SimpleFilter import dev.inmo.tgbotapi.extensions.utils.asShippingQueryUpdate import dev.inmo.tgbotapi.requests.abstracts.Request import dev.inmo.tgbotapi.types.payments.ShippingQuery +import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.toList typealias ShippingQueryMapper = suspend ShippingQuery.() -> ShippingQuery? -private suspend inline fun BehaviourContext.waitShippingQueries( - count: Int = 1, - initRequest: Request<*>? = null, - noinline errorFactory: NullableRequestBuilder<*> = { null }, - filter: SimpleFilter? = null -): List = expectFlow( - initRequest, - count, - errorFactory -) { - val data = it.asShippingQueryUpdate() ?.data as? O ?: return@expectFlow emptyList() - if (filter == null || filter(data)) { - listOf(data) - } else { - emptyList() - } -}.toList().toList() - - suspend fun BehaviourContext.waitShippingQueries( initRequest: Request<*>? = null, - errorFactory: NullableRequestBuilder<*> = { null }, - count: Int = 1, - filter: SimpleFilter? = null -) : List = waitShippingQueries( - count, + errorFactory: NullableRequestBuilder<*> = { null } +): Flow = expectFlow( initRequest, - errorFactory, - filter -) + errorFactory +) { + (it.asShippingQueryUpdate() ?.data).let(::listOfNotNull) +} diff --git a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/utils/LiveLocation.kt b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/utils/LiveLocation.kt index ac5b3deaba..5d7cfcc624 100644 --- a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/utils/LiveLocation.kt +++ b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/utils/LiveLocation.kt @@ -3,9 +3,12 @@ package dev.inmo.tgbotapi.extensions.behaviour_builder.utils import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContextAndTypeReceiver import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.waitEditedLocation +import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.waitEditedLocationMessage import dev.inmo.tgbotapi.types.location.* import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage import dev.inmo.tgbotapi.types.message.content.LiveLocationContent +import kotlinx.coroutines.flow.filter +import kotlinx.coroutines.flow.first /** * Use this extension when you want to follow [LiveLocation] until it will became [StaticLocation]. This method @@ -20,11 +23,7 @@ suspend fun BehaviourContext.followLocation( onLocation(message.content.location) while (currentLocation !is StaticLocation) { - currentLocation = waitEditedLocation( - filter = { - it.messageId == message.messageId && it.chat.id == message.chat.id - } - ).first().location + currentLocation = waitEditedLocationMessage().filter { it.messageId == message.messageId && it.chat.id == message.chat.id }.first().content.location onLocation(currentLocation) } } diff --git a/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/FlowsAggregation.kt b/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/FlowsAggregation.kt index 6f6bee5cc5..532aec780e 100644 --- a/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/FlowsAggregation.kt +++ b/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/FlowsAggregation.kt @@ -22,7 +22,7 @@ fun aggregateFlows( return sharedFlow } -fun Flow>.flatMap(): Flow = flow { +fun Flow>.flatten(): Flow = flow { collect { it.forEach { emit(it) @@ -30,6 +30,9 @@ fun Flow>.flatMap(): Flow = flow { } } +@Deprecated("Renamed", ReplaceWith("flatten", "dev.inmo.tgbotapi.extensions.utils.flatten")) +fun Flow>.flatMap(): Flow = flatten() + fun Flow.flatMap(mapper: (T) -> Iterable): Flow = flow { collect { mapper(it).forEach { diff --git a/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/shortcuts/FlowsUpdatesFilter.kt b/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/shortcuts/FlowsUpdatesFilter.kt index a2b75c0b95..dff78316e4 100644 --- a/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/shortcuts/FlowsUpdatesFilter.kt +++ b/tgbotapi.utils/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/utils/shortcuts/FlowsUpdatesFilter.kt @@ -2,6 +2,7 @@ package dev.inmo.tgbotapi.extensions.utils.shortcuts import dev.inmo.tgbotapi.extensions.utils.aggregateFlows import dev.inmo.tgbotapi.extensions.utils.flatMap +import dev.inmo.tgbotapi.extensions.utils.flatten import dev.inmo.tgbotapi.extensions.utils.updates.asContentMessagesFlow import dev.inmo.tgbotapi.types.message.abstracts.CommonMessage import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage @@ -111,7 +112,7 @@ fun FlowsUpdatesFilter.audioMessagesWithMediaGroups( scopeToIncludeChannels: CoroutineScope? = null ) = merge( filterContentMessages(scopeToIncludeChannels), - mediaGroupAudioMessages(scopeToIncludeChannels).flatMap() + mediaGroupAudioMessages(scopeToIncludeChannels).flatten() ) fun Flow.contactMessages() = filterContentMessages() @@ -132,7 +133,7 @@ fun FlowsUpdatesFilter.documentMessagesWithMediaGroups( scopeToIncludeChannels: CoroutineScope? = null ) = merge( filterContentMessages(scopeToIncludeChannels), - mediaGroupDocumentMessages(scopeToIncludeChannels).flatMap() + mediaGroupDocumentMessages(scopeToIncludeChannels).flatten() ) fun Flow.gameMessages() = filterContentMessages() @@ -159,7 +160,7 @@ fun FlowsUpdatesFilter.photoMessagesWithMediaGroups( scopeToIncludeChannels: CoroutineScope? = null ) = merge( filterContentMessages(scopeToIncludeChannels), - mediaGroupPhotosMessages(scopeToIncludeChannels).flatMap() + mediaGroupPhotosMessages(scopeToIncludeChannels).flatten() ) /** * Shortcut for [photoMessages] @@ -200,7 +201,7 @@ fun FlowsUpdatesFilter.videoMessagesWithMediaGroups( scopeToIncludeChannels: CoroutineScope? = null ) = merge( filterContentMessages(scopeToIncludeChannels), - mediaGroupVideosMessages(scopeToIncludeChannels).flatMap() + mediaGroupVideosMessages(scopeToIncludeChannels).flatten() ) fun Flow.videoNoteMessages() = filterContentMessages()