diff --git a/tgbotapi.extensions.steps/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/steps/ScenarioBuilders.kt b/tgbotapi.extensions.steps/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/steps/BehaviourBuilders.kt similarity index 75% rename from tgbotapi.extensions.steps/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/steps/ScenarioBuilders.kt rename to tgbotapi.extensions.steps/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/steps/BehaviourBuilders.kt index a15f6a9a10..269586e649 100644 --- a/tgbotapi.extensions.steps/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/steps/ScenarioBuilders.kt +++ b/tgbotapi.extensions.steps/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/steps/BehaviourBuilders.kt @@ -5,23 +5,23 @@ import dev.inmo.tgbotapi.extensions.utils.updates.retrieving.startGettingOfUpdat import dev.inmo.tgbotapi.updateshandlers.FlowsUpdatesFilter import kotlinx.coroutines.CoroutineScope -suspend fun TelegramBot.buildScenarios( +suspend fun TelegramBot.buildBehaviour( scope: CoroutineScope, flowUpdatesFilter: FlowsUpdatesFilter, - block: ScenarioReceiver + block: BehaviourContextReceiver ) { - Scenario( + BehaviourContext( this, scope, flowUpdatesFilter ).block() } -suspend fun TelegramBot.buildScenarios( +suspend fun TelegramBot.buildBehaviour( scope: CoroutineScope, - block: ScenarioReceiver + block: BehaviourContextReceiver ) = FlowsUpdatesFilter().also { - buildScenarios( + buildBehaviour( scope, it, block diff --git a/tgbotapi.extensions.steps/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/steps/Scenario.kt b/tgbotapi.extensions.steps/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/steps/BehaviourContext.kt similarity index 63% rename from tgbotapi.extensions.steps/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/steps/Scenario.kt rename to tgbotapi.extensions.steps/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/steps/BehaviourContext.kt index 9d34dee99f..935455e6f2 100644 --- a/tgbotapi.extensions.steps/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/steps/Scenario.kt +++ b/tgbotapi.extensions.steps/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/steps/BehaviourContext.kt @@ -4,10 +4,10 @@ import dev.inmo.tgbotapi.bot.TelegramBot import dev.inmo.tgbotapi.updateshandlers.FlowsUpdatesFilter import kotlinx.coroutines.CoroutineScope -typealias ScenarioReceiver = suspend Scenario.() -> T -typealias ScenarioAndTypeReceiver = suspend Scenario.(I) -> T +typealias BehaviourContextReceiver = suspend BehaviourContext.() -> T +typealias BehaviourContextAndTypeReceiver = suspend BehaviourContext.(I) -> T -data class Scenario( +data class BehaviourContext( val bot: TelegramBot, val scope: CoroutineScope, val flowsUpdatesFilter: FlowsUpdatesFilter = FlowsUpdatesFilter() diff --git a/tgbotapi.extensions.steps/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/steps/expectations/Base.kt b/tgbotapi.extensions.steps/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/steps/expectations/Base.kt index 63b081f9e9..7317ae0841 100644 --- a/tgbotapi.extensions.steps/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/steps/expectations/Base.kt +++ b/tgbotapi.extensions.steps/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/steps/expectations/Base.kt @@ -2,7 +2,7 @@ package dev.inmo.tgbotapi.extensions.steps.expectations import dev.inmo.micro_utils.coroutines.safelyWithoutExceptions import dev.inmo.tgbotapi.bot.TelegramBot -import dev.inmo.tgbotapi.extensions.steps.Scenario +import dev.inmo.tgbotapi.extensions.steps.BehaviourContext import dev.inmo.tgbotapi.requests.abstracts.Request import dev.inmo.tgbotapi.types.update.abstracts.Update import dev.inmo.tgbotapi.updateshandlers.FlowsUpdatesFilter @@ -73,7 +73,7 @@ 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 */ -suspend fun Scenario.expectFlow( +suspend fun BehaviourContext.expectFlow( initRequest: Request<*>? = null, count: Int? = null, errorFactory: NullableRequestBuilder<*> = { null }, @@ -112,7 +112,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 */ -suspend fun Scenario.expectOne( +suspend fun BehaviourContext.expectOne( initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, cancelRequestFactory: NullableRequestBuilder<*> = { null }, diff --git a/tgbotapi.extensions.steps/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/steps/expectations/WaitCallbackQuery.kt b/tgbotapi.extensions.steps/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/steps/expectations/WaitCallbackQuery.kt index 18716f49d7..0aa468d436 100644 --- a/tgbotapi.extensions.steps/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/steps/expectations/WaitCallbackQuery.kt +++ b/tgbotapi.extensions.steps/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/steps/expectations/WaitCallbackQuery.kt @@ -2,20 +2,15 @@ package dev.inmo.tgbotapi.extensions.steps.expectations -import dev.inmo.tgbotapi.extensions.steps.Scenario +import dev.inmo.tgbotapi.extensions.steps.BehaviourContext import dev.inmo.tgbotapi.extensions.utils.* import dev.inmo.tgbotapi.requests.abstracts.Request import dev.inmo.tgbotapi.types.CallbackQuery.* -import dev.inmo.tgbotapi.types.message.ChatEvents.* -import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.* -import dev.inmo.tgbotapi.types.message.abstracts.ChatEventMessage -import dev.inmo.tgbotapi.types.message.content.ContactContent -import dev.inmo.tgbotapi.types.update.CallbackQueryUpdate import kotlinx.coroutines.flow.toList typealias CallbackQueryMapper = T.() -> T? -private suspend fun Scenario.waitCallbackQueries( +private suspend fun BehaviourContext.waitCallbackQueries( count: Int = 1, initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, @@ -29,7 +24,7 @@ private suspend fun Scenario.waitCallbackQueries( }.toList().toList() -private suspend inline fun Scenario.waitEvents( +private suspend inline fun BehaviourContext.waitEvents( count: Int = 1, initRequest: Request<*>? = null, noinline errorFactory: NullableRequestBuilder<*> = { null }, @@ -51,55 +46,55 @@ private suspend inline fun Scenario.waitEvents( } -suspend fun Scenario.waitDataCallbackQuery( +suspend fun BehaviourContext.waitDataCallbackQuery( count: Int = 1, initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, filter: CallbackQueryMapper? = null ) = waitEvents(count, initRequest, errorFactory, filter) -suspend fun Scenario.waitGameShortNameCallbackQuery( +suspend fun BehaviourContext.waitGameShortNameCallbackQuery( count: Int = 1, initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, filter: CallbackQueryMapper? = null ) = waitEvents(count, initRequest, errorFactory, filter) -suspend fun Scenario.waitInlineMessageIdCallbackQuery( +suspend fun BehaviourContext.waitInlineMessageIdCallbackQuery( count: Int = 1, initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, filter: CallbackQueryMapper? = null ) = waitEvents(count, initRequest, errorFactory, filter) -suspend fun Scenario.waitInlineMessageIdDataCallbackQuery( +suspend fun BehaviourContext.waitInlineMessageIdDataCallbackQuery( count: Int = 1, initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, filter: CallbackQueryMapper? = null ) = waitEvents(count, initRequest, errorFactory, filter) -suspend fun Scenario.waitInlineMessageIdGameShortNameCallbackQuery( +suspend fun BehaviourContext.waitInlineMessageIdGameShortNameCallbackQuery( count: Int = 1, initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, filter: CallbackQueryMapper? = null ) = waitEvents(count, initRequest, errorFactory, filter) -suspend fun Scenario.waitMessageCallbackQuery( +suspend fun BehaviourContext.waitMessageCallbackQuery( count: Int = 1, initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, filter: CallbackQueryMapper? = null ) = waitEvents(count, initRequest, errorFactory, filter) -suspend fun Scenario.waitMessageDataCallbackQuery( +suspend fun BehaviourContext.waitMessageDataCallbackQuery( count: Int = 1, initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, filter: CallbackQueryMapper? = null ) = waitEvents(count, initRequest, errorFactory, filter) -suspend fun Scenario.waitMessageGameShortNameCallbackQuery( +suspend fun BehaviourContext.waitMessageGameShortNameCallbackQuery( count: Int = 1, initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, filter: CallbackQueryMapper? = null ) = waitEvents(count, initRequest, errorFactory, filter) -suspend fun Scenario.waitUnknownCallbackQuery( +suspend fun BehaviourContext.waitUnknownCallbackQuery( count: Int = 1, initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, diff --git a/tgbotapi.extensions.steps/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/steps/expectations/WaitContent.kt b/tgbotapi.extensions.steps/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/steps/expectations/WaitContent.kt index 20e15bbcb6..b1b5ef71db 100644 --- a/tgbotapi.extensions.steps/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/steps/expectations/WaitContent.kt +++ b/tgbotapi.extensions.steps/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/steps/expectations/WaitContent.kt @@ -2,7 +2,7 @@ package dev.inmo.tgbotapi.extensions.steps.expectations -import dev.inmo.tgbotapi.extensions.steps.Scenario +import dev.inmo.tgbotapi.extensions.steps.BehaviourContext import dev.inmo.tgbotapi.extensions.utils.asContentMessage import dev.inmo.tgbotapi.extensions.utils.asMessageUpdate import dev.inmo.tgbotapi.requests.abstracts.Request @@ -15,7 +15,7 @@ import kotlinx.coroutines.flow.toList typealias ContentMessageToContentMapper = suspend ContentMessage.() -> T? -private suspend fun Scenario.waitContentMessage( +private suspend fun BehaviourContext.waitContentMessage( count: Int = 1, initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, @@ -28,7 +28,7 @@ private suspend fun Scenario.waitContentMessage( it.asMessageUpdate() ?.data ?.asContentMessage() ?.mapper() }.toList().toList() -private suspend inline fun Scenario.waitContent( +private suspend inline fun BehaviourContext.waitContent( count: Int = 1, initRequest: Request<*>? = null, noinline errorFactory: NullableRequestBuilder<*> = { null }, @@ -51,127 +51,127 @@ private suspend inline fun Scenario.waitContent( } } -suspend fun Scenario.waitContact( +suspend fun BehaviourContext.waitContact( count: Int = 1, initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, filter: ContentMessageToContentMapper? = null ) = waitContent(count, initRequest, errorFactory, filter) -suspend fun Scenario.waitDice( +suspend fun BehaviourContext.waitDice( count: Int = 1, initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, filter: ContentMessageToContentMapper? = null ) = waitContent(count, initRequest, errorFactory, filter) -suspend fun Scenario.waitGame( +suspend fun BehaviourContext.waitGame( count: Int = 1, initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, filter: ContentMessageToContentMapper? = null ) = waitContent(count, initRequest, errorFactory, filter) -suspend fun Scenario.waitLocation( +suspend fun BehaviourContext.waitLocation( count: Int = 1, initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, filter: ContentMessageToContentMapper? = null ) = waitContent(count, initRequest, errorFactory, filter) -suspend fun Scenario.waitPoll( +suspend fun BehaviourContext.waitPoll( count: Int = 1, initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, filter: ContentMessageToContentMapper? = null ) = waitContent(count, initRequest, errorFactory, filter) -suspend fun Scenario.waitText( +suspend fun BehaviourContext.waitText( count: Int = 1, initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, filter: ContentMessageToContentMapper? = null ) = waitContent(count, initRequest, errorFactory, filter) -suspend fun Scenario.waitVenue( +suspend fun BehaviourContext.waitVenue( count: Int = 1, initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, filter: ContentMessageToContentMapper? = null ) = waitContent(count, initRequest, errorFactory, filter) -suspend fun Scenario.waitAudioMediaGroup( +suspend fun BehaviourContext.waitAudioMediaGroup( count: Int = 1, initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, filter: ContentMessageToContentMapper? = null ) = waitContent(count, initRequest, errorFactory, filter) -suspend fun Scenario.waitDocumentMediaGroup( +suspend fun BehaviourContext.waitDocumentMediaGroup( count: Int = 1, initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, filter: ContentMessageToContentMapper? = null ) = waitContent(count, initRequest, errorFactory, filter) -suspend fun Scenario.waitMedia( +suspend fun BehaviourContext.waitMedia( count: Int = 1, initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, filter: ContentMessageToContentMapper? = null ) = waitContent(count, initRequest, errorFactory, filter) -suspend fun Scenario.waitMediaGroup( +suspend fun BehaviourContext.waitMediaGroup( count: Int = 1, initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, filter: ContentMessageToContentMapper? = null ) = waitContent(count, initRequest, errorFactory, filter) -suspend fun Scenario.waitVisualMediaGroup( +suspend fun BehaviourContext.waitVisualMediaGroup( count: Int = 1, initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, filter: ContentMessageToContentMapper? = null ) = waitContent(count, initRequest, errorFactory, filter) -suspend fun Scenario.waitAnimation( +suspend fun BehaviourContext.waitAnimation( count: Int = 1, initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, filter: ContentMessageToContentMapper? = null ) = waitContent(count, initRequest, errorFactory, filter) -suspend fun Scenario.waitAudio( +suspend fun BehaviourContext.waitAudio( count: Int = 1, initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, filter: ContentMessageToContentMapper? = null ) = waitContent(count, initRequest, errorFactory, filter) -suspend fun Scenario.waitDocument( +suspend fun BehaviourContext.waitDocument( count: Int = 1, initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, filter: ContentMessageToContentMapper? = null ) = waitContent(count, initRequest, errorFactory, filter) -suspend fun Scenario.waitPhoto( +suspend fun BehaviourContext.waitPhoto( count: Int = 1, initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, filter: ContentMessageToContentMapper? = null ) = waitContent(count, initRequest, errorFactory, filter) -suspend fun Scenario.waitSticker( +suspend fun BehaviourContext.waitSticker( count: Int = 1, initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, filter: ContentMessageToContentMapper? = null ) = waitContent(count, initRequest, errorFactory, filter) -suspend fun Scenario.waitVideo( +suspend fun BehaviourContext.waitVideo( count: Int = 1, initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, filter: ContentMessageToContentMapper? = null ) = waitContent(count, initRequest, errorFactory, filter) -suspend fun Scenario.waitVideoNote( +suspend fun BehaviourContext.waitVideoNote( count: Int = 1, initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, filter: ContentMessageToContentMapper? = null ) = waitContent(count, initRequest, errorFactory, filter) -suspend fun Scenario.waitVoice( +suspend fun BehaviourContext.waitVoice( count: Int = 1, initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, filter: ContentMessageToContentMapper? = null ) = waitContent(count, initRequest, errorFactory, filter) -suspend fun Scenario.waitInvoice( +suspend fun BehaviourContext.waitInvoice( count: Int = 1, initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, diff --git a/tgbotapi.extensions.steps/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/steps/expectations/WaitEventAction.kt b/tgbotapi.extensions.steps/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/steps/expectations/WaitEventAction.kt index b96a999eed..61cfc69f74 100644 --- a/tgbotapi.extensions.steps/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/steps/expectations/WaitEventAction.kt +++ b/tgbotapi.extensions.steps/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/steps/expectations/WaitEventAction.kt @@ -2,18 +2,17 @@ package dev.inmo.tgbotapi.extensions.steps.expectations -import dev.inmo.tgbotapi.extensions.steps.Scenario +import dev.inmo.tgbotapi.extensions.steps.BehaviourContext import dev.inmo.tgbotapi.extensions.utils.* import dev.inmo.tgbotapi.requests.abstracts.Request import dev.inmo.tgbotapi.types.message.ChatEvents.* import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.* import dev.inmo.tgbotapi.types.message.abstracts.ChatEventMessage -import dev.inmo.tgbotapi.types.message.content.ContactContent import kotlinx.coroutines.flow.toList typealias EventMessageToEventMapper = suspend ChatEventMessage.() -> T? -private suspend fun Scenario.waitEventMessages( +private suspend fun BehaviourContext.waitEventMessages( count: Int = 1, initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, @@ -27,7 +26,7 @@ private suspend fun Scenario.waitEventMessages( }.toList().toList() -private suspend inline fun Scenario.waitEvents( +private suspend inline fun BehaviourContext.waitEvents( count: Int = 1, initRequest: Request<*>? = null, noinline errorFactory: NullableRequestBuilder<*> = { null }, @@ -50,93 +49,93 @@ private suspend inline fun Scenario.waitEvents( } } -suspend fun Scenario.waitChannelEvents( +suspend fun BehaviourContext.waitChannelEvents( count: Int = 1, initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, filter: EventMessageToEventMapper? = null ) = waitEvents(count, initRequest, errorFactory, filter) -suspend fun Scenario.waitChatEvents( +suspend fun BehaviourContext.waitChatEvents( count: Int = 1, initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, filter: EventMessageToEventMapper? = null ) = waitEvents(count, initRequest, errorFactory, filter) -suspend fun Scenario.waitCommonEvents( +suspend fun BehaviourContext.waitCommonEvents( count: Int = 1, initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, filter: EventMessageToEventMapper? = null ) = waitEvents(count, initRequest, errorFactory, filter) -suspend fun Scenario.waitGroupEvents( +suspend fun BehaviourContext.waitGroupEvents( count: Int = 1, initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, filter: EventMessageToEventMapper? = null ) = waitEvents(count, initRequest, errorFactory, filter) -suspend fun Scenario.waitSupergroupEvents( +suspend fun BehaviourContext.waitSupergroupEvents( count: Int = 1, initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, filter: EventMessageToEventMapper? = null ) = waitEvents(count, initRequest, errorFactory, filter) -suspend fun Scenario.waitChannelChatCreatedEvents( +suspend fun BehaviourContext.waitChannelChatCreatedEvents( count: Int = 1, initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, filter: EventMessageToEventMapper? = null ) = waitEvents(count, initRequest, errorFactory, filter) -suspend fun Scenario.waitDeleteChatPhotoEvents( +suspend fun BehaviourContext.waitDeleteChatPhotoEvents( count: Int = 1, initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, filter: EventMessageToEventMapper? = null ) = waitEvents(count, initRequest, errorFactory, filter) -suspend fun Scenario.waitGroupChatCreatedEvents( +suspend fun BehaviourContext.waitGroupChatCreatedEvents( count: Int = 1, initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, filter: EventMessageToEventMapper? = null ) = waitEvents(count, initRequest, errorFactory, filter) -suspend fun Scenario.waitLeftChatMemberEvents( +suspend fun BehaviourContext.waitLeftChatMemberEvents( count: Int = 1, initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, filter: EventMessageToEventMapper? = null ) = waitEvents(count, initRequest, errorFactory, filter) -suspend fun Scenario.waitNewChatPhotoEvents( +suspend fun BehaviourContext.waitNewChatPhotoEvents( count: Int = 1, initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, filter: EventMessageToEventMapper? = null ) = waitEvents(count, initRequest, errorFactory, filter) -suspend fun Scenario.waitNewChatMembersEvents( +suspend fun BehaviourContext.waitNewChatMembersEvents( count: Int = 1, initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, filter: EventMessageToEventMapper? = null ) = waitEvents(count, initRequest, errorFactory, filter) -suspend fun Scenario.waitNewChatTitleEvents( +suspend fun BehaviourContext.waitNewChatTitleEvents( count: Int = 1, initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, filter: EventMessageToEventMapper? = null ) = waitEvents(count, initRequest, errorFactory, filter) -suspend fun Scenario.waitPinnedMessageEvents( +suspend fun BehaviourContext.waitPinnedMessageEvents( count: Int = 1, initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, filter: EventMessageToEventMapper? = null ) = waitEvents(count, initRequest, errorFactory, filter) -suspend fun Scenario.waitProximityAlertTriggeredEvents( +suspend fun BehaviourContext.waitProximityAlertTriggeredEvents( count: Int = 1, initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, filter: EventMessageToEventMapper? = null ) = waitEvents(count, initRequest, errorFactory, filter) -suspend fun Scenario.waitSupergroupChatCreatedEvents( +suspend fun BehaviourContext.waitSupergroupChatCreatedEvents( count: Int = 1, initRequest: Request<*>? = null, errorFactory: NullableRequestBuilder<*> = { null }, diff --git a/tgbotapi.extensions.steps/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/steps/triggers_handling/CallbackQueryTriggers.kt b/tgbotapi.extensions.steps/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/steps/triggers_handling/CallbackQueryTriggers.kt index 1e9f97dc9b..9896dff146 100644 --- a/tgbotapi.extensions.steps/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/steps/triggers_handling/CallbackQueryTriggers.kt +++ b/tgbotapi.extensions.steps/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/steps/triggers_handling/CallbackQueryTriggers.kt @@ -3,8 +3,8 @@ package dev.inmo.tgbotapi.extensions.steps.triggers_handling import dev.inmo.micro_utils.coroutines.safelyWithoutExceptions import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions -import dev.inmo.tgbotapi.extensions.steps.Scenario -import dev.inmo.tgbotapi.extensions.steps.ScenarioAndTypeReceiver +import dev.inmo.tgbotapi.extensions.steps.BehaviourContext +import dev.inmo.tgbotapi.extensions.steps.BehaviourContextAndTypeReceiver import dev.inmo.tgbotapi.extensions.steps.expectations.expectFlow import dev.inmo.tgbotapi.extensions.utils.* import dev.inmo.tgbotapi.extensions.utils.extensions.sourceChat @@ -14,10 +14,10 @@ import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.* import dev.inmo.tgbotapi.updateshandlers.FlowsUpdatesFilter import kotlinx.coroutines.flow.filter -internal suspend inline fun Scenario.onCallbackQuery( - includeFilterByChatInSubScenario: Boolean = true, +internal suspend inline fun BehaviourContext.onCallbackQuery( + includeFilterByChatInBehaviourSubContext: Boolean = true, noinline additionalFilter: (suspend (T) -> Boolean)? = null, - noinline scenarioReceiver: ScenarioAndTypeReceiver + noinline scenarioReceiver: BehaviourContextAndTypeReceiver ) = flowsUpdatesFilter.expectFlow(bot) { it.asCallbackQueryUpdate() ?.data ?.let { query -> if (query is T) { @@ -27,14 +27,14 @@ internal suspend inline fun Scenario.onCallbackQuery } } }.subscribeSafelyWithoutExceptions(scope) { triggerQuery -> - val (jobToCancel, scenario) = if (includeFilterByChatInSubScenario) { + val (jobToCancel, scenario) = if (includeFilterByChatInBehaviourSubContext) { val subFilter = FlowsUpdatesFilter() - val subScenario = copy(flowsUpdatesFilter = subFilter) + val subBehaviourContext = copy(flowsUpdatesFilter = subFilter) flowsUpdatesFilter.allUpdatesFlow.filter { val chat = it.sourceChat() ?: return@filter false chat.id.chatId == triggerQuery.user.id.chatId - }.subscribeSafelyWithoutExceptions(scope, subFilter.asUpdateReceiver) to subScenario + }.subscribeSafelyWithoutExceptions(scope, subFilter.asUpdateReceiver) to subBehaviourContext } else { null to this } @@ -43,49 +43,49 @@ internal suspend inline fun Scenario.onCallbackQuery } -suspend fun Scenario.onDataCallbackQuery( - includeFilterByChatInSubScenario: Boolean = true, +suspend fun BehaviourContext.onDataCallbackQuery( + includeFilterByChatInBehaviourSubContext: Boolean = true, additionalFilter: (suspend (DataCallbackQuery) -> Boolean)? = null, - scenarioReceiver: ScenarioAndTypeReceiver -) = onCallbackQuery(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) + scenarioReceiver: BehaviourContextAndTypeReceiver +) = onCallbackQuery(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver) -suspend fun Scenario.onGameShortNameCallbackQuery( - includeFilterByChatInSubScenario: Boolean = true, +suspend fun BehaviourContext.onGameShortNameCallbackQuery( + includeFilterByChatInBehaviourSubContext: Boolean = true, additionalFilter: (suspend (GameShortNameCallbackQuery) -> Boolean)? = null, - scenarioReceiver: ScenarioAndTypeReceiver -) = onCallbackQuery(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) -suspend fun Scenario.onInlineMessageIdCallbackQuery( - includeFilterByChatInSubScenario: Boolean = true, + scenarioReceiver: BehaviourContextAndTypeReceiver +) = onCallbackQuery(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver) +suspend fun BehaviourContext.onInlineMessageIdCallbackQuery( + includeFilterByChatInBehaviourSubContext: Boolean = true, additionalFilter: (suspend (InlineMessageIdCallbackQuery) -> Boolean)? = null, - scenarioReceiver: ScenarioAndTypeReceiver -) = onCallbackQuery(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) -suspend fun Scenario.onInlineMessageIdDataCallbackQuery( - includeFilterByChatInSubScenario: Boolean = true, + scenarioReceiver: BehaviourContextAndTypeReceiver +) = onCallbackQuery(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver) +suspend fun BehaviourContext.onInlineMessageIdDataCallbackQuery( + includeFilterByChatInBehaviourSubContext: Boolean = true, additionalFilter: (suspend (InlineMessageIdDataCallbackQuery) -> Boolean)? = null, - scenarioReceiver: ScenarioAndTypeReceiver -) = onCallbackQuery(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) -suspend fun Scenario.onInlineMessageIdGameShortNameCallbackQuery( - includeFilterByChatInSubScenario: Boolean = true, + scenarioReceiver: BehaviourContextAndTypeReceiver +) = onCallbackQuery(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver) +suspend fun BehaviourContext.onInlineMessageIdGameShortNameCallbackQuery( + includeFilterByChatInBehaviourSubContext: Boolean = true, additionalFilter: (suspend (InlineMessageIdGameShortNameCallbackQuery) -> Boolean)? = null, - scenarioReceiver: ScenarioAndTypeReceiver -) = onCallbackQuery(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) -suspend fun Scenario.onMessageCallbackQuery( - includeFilterByChatInSubScenario: Boolean = true, + scenarioReceiver: BehaviourContextAndTypeReceiver +) = onCallbackQuery(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver) +suspend fun BehaviourContext.onMessageCallbackQuery( + includeFilterByChatInBehaviourSubContext: Boolean = true, additionalFilter: (suspend (MessageCallbackQuery) -> Boolean)? = null, - scenarioReceiver: ScenarioAndTypeReceiver -) = onCallbackQuery(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) -suspend fun Scenario.onMessageDataCallbackQuery( - includeFilterByChatInSubScenario: Boolean = true, + scenarioReceiver: BehaviourContextAndTypeReceiver +) = onCallbackQuery(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver) +suspend fun BehaviourContext.onMessageDataCallbackQuery( + includeFilterByChatInBehaviourSubContext: Boolean = true, additionalFilter: (suspend (MessageDataCallbackQuery) -> Boolean)? = null, - scenarioReceiver: ScenarioAndTypeReceiver -) = onCallbackQuery(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) -suspend fun Scenario.onMessageGameShortNameCallbackQuery( - includeFilterByChatInSubScenario: Boolean = true, + scenarioReceiver: BehaviourContextAndTypeReceiver +) = onCallbackQuery(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver) +suspend fun BehaviourContext.onMessageGameShortNameCallbackQuery( + includeFilterByChatInBehaviourSubContext: Boolean = true, additionalFilter: (suspend (MessageGameShortNameCallbackQuery) -> Boolean)? = null, - scenarioReceiver: ScenarioAndTypeReceiver -) = onCallbackQuery(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) -suspend fun Scenario.onUnknownCallbackQueryType( - includeFilterByChatInSubScenario: Boolean = true, + scenarioReceiver: BehaviourContextAndTypeReceiver +) = onCallbackQuery(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver) +suspend fun BehaviourContext.onUnknownCallbackQueryType( + includeFilterByChatInBehaviourSubContext: Boolean = true, additionalFilter: (suspend (UnknownCallbackQueryType) -> Boolean)? = null, - scenarioReceiver: ScenarioAndTypeReceiver -) = onCallbackQuery(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) + scenarioReceiver: BehaviourContextAndTypeReceiver +) = onCallbackQuery(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver) diff --git a/tgbotapi.extensions.steps/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/steps/triggers_handling/CommandHandling.kt b/tgbotapi.extensions.steps/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/steps/triggers_handling/CommandHandling.kt index a730143072..f257208f3d 100644 --- a/tgbotapi.extensions.steps/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/steps/triggers_handling/CommandHandling.kt +++ b/tgbotapi.extensions.steps/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/steps/triggers_handling/CommandHandling.kt @@ -7,13 +7,13 @@ import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage import dev.inmo.tgbotapi.types.message.content.TextContent import kotlinx.coroutines.Job -suspend fun Scenario.command( +suspend fun BehaviourContext.command( commandRegex: Regex, requireOnlyCommandInMessage: Boolean = true, - includeFilterByChatInSubScenario: Boolean = true, - scenarioReceiver: ScenarioAndTypeReceiver> + includeFilterByChatInBehaviourSubContext: Boolean = true, + scenarioReceiver: BehaviourContextAndTypeReceiver> ): Job = onText( - includeFilterByChatInSubScenario, + includeFilterByChatInBehaviourSubContext, { message -> val content = message.content val textSources = content.textSources @@ -27,4 +27,9 @@ suspend fun Scenario.command( scenarioReceiver ) - +suspend inline fun BehaviourContext.onCommand( + commandRegex: Regex, + requireOnlyCommandInMessage: Boolean = true, + includeFilterByChatInBehaviourSubContext: Boolean = true, + noinline scenarioReceiver: BehaviourContextAndTypeReceiver> +): Job = command(commandRegex, requireOnlyCommandInMessage, includeFilterByChatInBehaviourSubContext, scenarioReceiver) diff --git a/tgbotapi.extensions.steps/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/steps/triggers_handling/ContentTriggers.kt b/tgbotapi.extensions.steps/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/steps/triggers_handling/ContentTriggers.kt index 9bb3a49bb9..75209b1436 100644 --- a/tgbotapi.extensions.steps/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/steps/triggers_handling/ContentTriggers.kt +++ b/tgbotapi.extensions.steps/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/steps/triggers_handling/ContentTriggers.kt @@ -3,8 +3,8 @@ package dev.inmo.tgbotapi.extensions.steps.triggers_handling import dev.inmo.micro_utils.coroutines.safelyWithoutExceptions import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions -import dev.inmo.tgbotapi.extensions.steps.Scenario -import dev.inmo.tgbotapi.extensions.steps.ScenarioAndTypeReceiver +import dev.inmo.tgbotapi.extensions.steps.BehaviourContext +import dev.inmo.tgbotapi.extensions.steps.BehaviourContextAndTypeReceiver import dev.inmo.tgbotapi.extensions.steps.expectations.expectFlow import dev.inmo.tgbotapi.extensions.utils.asContentMessage import dev.inmo.tgbotapi.extensions.utils.asMessageUpdate @@ -19,10 +19,10 @@ import dev.inmo.tgbotapi.updateshandlers.FlowsUpdatesFilter import kotlinx.coroutines.flow.filter -internal suspend inline fun Scenario.onContent( - includeFilterByChatInSubScenario: Boolean = true, +internal suspend inline fun BehaviourContext.onContent( + includeFilterByChatInBehaviourSubContext: Boolean = true, noinline additionalFilter: (suspend (ContentMessage) -> Boolean)? = null, - noinline scenarioReceiver: ScenarioAndTypeReceiver> + noinline scenarioReceiver: BehaviourContextAndTypeReceiver> ) = flowsUpdatesFilter.expectFlow(bot) { it.asMessageUpdate() ?.data ?.asContentMessage() ?.let { message -> if (message.content is T) { @@ -33,14 +33,14 @@ internal suspend inline fun Scenario.onContent( } } }.subscribeSafelyWithoutExceptions(scope) { triggerMessage -> - val (jobToCancel, scenario) = if (includeFilterByChatInSubScenario) { + val (jobToCancel, scenario) = if (includeFilterByChatInBehaviourSubContext) { val subFilter = FlowsUpdatesFilter() - val subScenario = copy(flowsUpdatesFilter = subFilter) + val subBehaviourContext = copy(flowsUpdatesFilter = subFilter) flowsUpdatesFilter.allUpdatesFlow.filter { val chat = it.sourceChat() ?: return@filter false chat.id.chatId == triggerMessage.chat.id.chatId - }.subscribeSafelyWithoutExceptions(scope, subFilter.asUpdateReceiver) to subScenario + }.subscribeSafelyWithoutExceptions(scope, subFilter.asUpdateReceiver) to subBehaviourContext } else { null to this } @@ -48,113 +48,113 @@ internal suspend inline fun Scenario.onContent( jobToCancel ?.cancel() } -suspend fun Scenario.onContact( - includeFilterByChatInSubScenario: Boolean = true, +suspend fun BehaviourContext.onContact( + includeFilterByChatInBehaviourSubContext: Boolean = true, additionalFilter: (suspend (ContentMessage) -> Boolean)? = null, - scenarioReceiver: ScenarioAndTypeReceiver> -) = onContent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) -suspend fun Scenario.onDice( - includeFilterByChatInSubScenario: Boolean = true, + scenarioReceiver: BehaviourContextAndTypeReceiver> +) = onContent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver) +suspend fun BehaviourContext.onDice( + includeFilterByChatInBehaviourSubContext: Boolean = true, additionalFilter: (suspend (ContentMessage) -> Boolean)? = null, - scenarioReceiver: ScenarioAndTypeReceiver> -) = onContent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) -suspend fun Scenario.onGame( - includeFilterByChatInSubScenario: Boolean = true, + scenarioReceiver: BehaviourContextAndTypeReceiver> +) = onContent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver) +suspend fun BehaviourContext.onGame( + includeFilterByChatInBehaviourSubContext: Boolean = true, additionalFilter: (suspend (ContentMessage) -> Boolean)? = null, - scenarioReceiver: ScenarioAndTypeReceiver> -) = onContent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) -suspend fun Scenario.onLocation( - includeFilterByChatInSubScenario: Boolean = true, + scenarioReceiver: BehaviourContextAndTypeReceiver> +) = onContent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver) +suspend fun BehaviourContext.onLocation( + includeFilterByChatInBehaviourSubContext: Boolean = true, additionalFilter: (suspend (ContentMessage) -> Boolean)? = null, - scenarioReceiver: ScenarioAndTypeReceiver> -) = onContent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) -suspend fun Scenario.onPoll( - includeFilterByChatInSubScenario: Boolean = true, + scenarioReceiver: BehaviourContextAndTypeReceiver> +) = onContent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver) +suspend fun BehaviourContext.onPoll( + includeFilterByChatInBehaviourSubContext: Boolean = true, additionalFilter: (suspend (ContentMessage) -> Boolean)? = null, - scenarioReceiver: ScenarioAndTypeReceiver> -) = onContent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) -suspend fun Scenario.onText( - includeFilterByChatInSubScenario: Boolean = true, + scenarioReceiver: BehaviourContextAndTypeReceiver> +) = onContent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver) +suspend fun BehaviourContext.onText( + includeFilterByChatInBehaviourSubContext: Boolean = true, additionalFilter: (suspend (ContentMessage) -> Boolean)? = null, - scenarioReceiver: ScenarioAndTypeReceiver> -) = onContent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) -suspend fun Scenario.onVenue( - includeFilterByChatInSubScenario: Boolean = true, + scenarioReceiver: BehaviourContextAndTypeReceiver> +) = onContent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver) +suspend fun BehaviourContext.onVenue( + includeFilterByChatInBehaviourSubContext: Boolean = true, additionalFilter: (suspend (ContentMessage) -> Boolean)? = null, - scenarioReceiver: ScenarioAndTypeReceiver> -) = onContent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) -suspend fun Scenario.onAudioMediaGroup( - includeFilterByChatInSubScenario: Boolean = true, + scenarioReceiver: BehaviourContextAndTypeReceiver> +) = onContent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver) +suspend fun BehaviourContext.onAudioMediaGroup( + includeFilterByChatInBehaviourSubContext: Boolean = true, additionalFilter: (suspend (ContentMessage) -> Boolean)? = null, - scenarioReceiver: ScenarioAndTypeReceiver> -) = onContent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) -suspend fun Scenario.onDocumentMediaGroup( - includeFilterByChatInSubScenario: Boolean = true, + scenarioReceiver: BehaviourContextAndTypeReceiver> +) = onContent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver) +suspend fun BehaviourContext.onDocumentMediaGroup( + includeFilterByChatInBehaviourSubContext: Boolean = true, additionalFilter: (suspend (ContentMessage) -> Boolean)? = null, - scenarioReceiver: ScenarioAndTypeReceiver> -) = onContent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) -suspend fun Scenario.onMediaCollection( - includeFilterByChatInSubScenario: Boolean = true, + scenarioReceiver: BehaviourContextAndTypeReceiver> +) = onContent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver) +suspend fun BehaviourContext.onMediaCollection( + includeFilterByChatInBehaviourSubContext: Boolean = true, additionalFilter: (suspend (ContentMessage>) -> Boolean)? = null, - scenarioReceiver: ScenarioAndTypeReceiver>> -) = onContent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) -suspend fun Scenario.onMedia( - includeFilterByChatInSubScenario: Boolean = true, + scenarioReceiver: BehaviourContextAndTypeReceiver>> +) = onContent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver) +suspend fun BehaviourContext.onMedia( + includeFilterByChatInBehaviourSubContext: Boolean = true, additionalFilter: (suspend (ContentMessage) -> Boolean)? = null, - scenarioReceiver: ScenarioAndTypeReceiver> -) = onContent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) -suspend fun Scenario.onMediaGroup( - includeFilterByChatInSubScenario: Boolean = true, + scenarioReceiver: BehaviourContextAndTypeReceiver> +) = onContent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver) +suspend fun BehaviourContext.onMediaGroup( + includeFilterByChatInBehaviourSubContext: Boolean = true, additionalFilter: (suspend (ContentMessage) -> Boolean)? = null, - scenarioReceiver: ScenarioAndTypeReceiver> -) = onContent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) -suspend fun Scenario.onVisualMediaGroup( - includeFilterByChatInSubScenario: Boolean = true, + scenarioReceiver: BehaviourContextAndTypeReceiver> +) = onContent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver) +suspend fun BehaviourContext.onVisualMediaGroup( + includeFilterByChatInBehaviourSubContext: Boolean = true, additionalFilter: (suspend (ContentMessage) -> Boolean)? = null, - scenarioReceiver: ScenarioAndTypeReceiver> -) = onContent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) -suspend fun Scenario.onAnimation( - includeFilterByChatInSubScenario: Boolean = true, + scenarioReceiver: BehaviourContextAndTypeReceiver> +) = onContent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver) +suspend fun BehaviourContext.onAnimation( + includeFilterByChatInBehaviourSubContext: Boolean = true, additionalFilter: (suspend (ContentMessage) -> Boolean)? = null, - scenarioReceiver: ScenarioAndTypeReceiver> -) = onContent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) -suspend fun Scenario.onAudio( - includeFilterByChatInSubScenario: Boolean = true, + scenarioReceiver: BehaviourContextAndTypeReceiver> +) = onContent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver) +suspend fun BehaviourContext.onAudio( + includeFilterByChatInBehaviourSubContext: Boolean = true, additionalFilter: (suspend (ContentMessage) -> Boolean)? = null, - scenarioReceiver: ScenarioAndTypeReceiver> -) = onContent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) -suspend fun Scenario.onDocument( - includeFilterByChatInSubScenario: Boolean = true, + scenarioReceiver: BehaviourContextAndTypeReceiver> +) = onContent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver) +suspend fun BehaviourContext.onDocument( + includeFilterByChatInBehaviourSubContext: Boolean = true, additionalFilter: (suspend (ContentMessage) -> Boolean)? = null, - scenarioReceiver: ScenarioAndTypeReceiver> -) = onContent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) -suspend fun Scenario.onPhoto( - includeFilterByChatInSubScenario: Boolean = true, + scenarioReceiver: BehaviourContextAndTypeReceiver> +) = onContent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver) +suspend fun BehaviourContext.onPhoto( + includeFilterByChatInBehaviourSubContext: Boolean = true, additionalFilter: (suspend (ContentMessage) -> Boolean)? = null, - scenarioReceiver: ScenarioAndTypeReceiver> -) = onContent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) -suspend fun Scenario.onSticker( - includeFilterByChatInSubScenario: Boolean = true, + scenarioReceiver: BehaviourContextAndTypeReceiver> +) = onContent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver) +suspend fun BehaviourContext.onSticker( + includeFilterByChatInBehaviourSubContext: Boolean = true, additionalFilter: (suspend (ContentMessage) -> Boolean)? = null, - scenarioReceiver: ScenarioAndTypeReceiver> -) = onContent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) -suspend fun Scenario.onVideo( - includeFilterByChatInSubScenario: Boolean = true, + scenarioReceiver: BehaviourContextAndTypeReceiver> +) = onContent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver) +suspend fun BehaviourContext.onVideo( + includeFilterByChatInBehaviourSubContext: Boolean = true, additionalFilter: (suspend (ContentMessage) -> Boolean)? = null, - scenarioReceiver: ScenarioAndTypeReceiver> -) = onContent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) -suspend fun Scenario.onVideoNote( - includeFilterByChatInSubScenario: Boolean = true, + scenarioReceiver: BehaviourContextAndTypeReceiver> +) = onContent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver) +suspend fun BehaviourContext.onVideoNote( + includeFilterByChatInBehaviourSubContext: Boolean = true, additionalFilter: (suspend (ContentMessage) -> Boolean)? = null, - scenarioReceiver: ScenarioAndTypeReceiver> -) = onContent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) -suspend fun Scenario.onVoice( - includeFilterByChatInSubScenario: Boolean = true, + scenarioReceiver: BehaviourContextAndTypeReceiver> +) = onContent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver) +suspend fun BehaviourContext.onVoice( + includeFilterByChatInBehaviourSubContext: Boolean = true, additionalFilter: (suspend (ContentMessage) -> Boolean)? = null, - scenarioReceiver: ScenarioAndTypeReceiver> -) = onContent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) -suspend fun Scenario.onInvoice( - includeFilterByChatInSubScenario: Boolean = true, + scenarioReceiver: BehaviourContextAndTypeReceiver> +) = onContent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver) +suspend fun BehaviourContext.onInvoice( + includeFilterByChatInBehaviourSubContext: Boolean = true, additionalFilter: (suspend (ContentMessage) -> Boolean)? = null, - scenarioReceiver: ScenarioAndTypeReceiver> -) = onContent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) + scenarioReceiver: BehaviourContextAndTypeReceiver> +) = onContent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver) diff --git a/tgbotapi.extensions.steps/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/steps/triggers_handling/EventTriggers.kt b/tgbotapi.extensions.steps/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/steps/triggers_handling/EventTriggers.kt index e447a0d842..db46c07ac6 100644 --- a/tgbotapi.extensions.steps/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/steps/triggers_handling/EventTriggers.kt +++ b/tgbotapi.extensions.steps/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/steps/triggers_handling/EventTriggers.kt @@ -3,27 +3,24 @@ package dev.inmo.tgbotapi.extensions.steps.triggers_handling import dev.inmo.micro_utils.coroutines.safelyWithoutExceptions import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions -import dev.inmo.tgbotapi.extensions.steps.Scenario -import dev.inmo.tgbotapi.extensions.steps.ScenarioAndTypeReceiver +import dev.inmo.tgbotapi.extensions.steps.BehaviourContext +import dev.inmo.tgbotapi.extensions.steps.BehaviourContextAndTypeReceiver import dev.inmo.tgbotapi.extensions.steps.expectations.expectFlow import dev.inmo.tgbotapi.extensions.utils.* import dev.inmo.tgbotapi.extensions.utils.extensions.sourceChat -import dev.inmo.tgbotapi.types.files.abstracts.TelegramMediaFile import dev.inmo.tgbotapi.types.message.ChatEvents.* import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.* import dev.inmo.tgbotapi.types.message.abstracts.ChatEventMessage -import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage import dev.inmo.tgbotapi.types.message.content.* import dev.inmo.tgbotapi.types.message.content.abstracts.* import dev.inmo.tgbotapi.types.message.content.media.* -import dev.inmo.tgbotapi.types.message.payments.InvoiceContent import dev.inmo.tgbotapi.updateshandlers.FlowsUpdatesFilter import kotlinx.coroutines.flow.filter -internal suspend inline fun Scenario.onEvent( - includeFilterByChatInSubScenario: Boolean = true, +internal suspend inline fun BehaviourContext.onEvent( + includeFilterByChatInBehaviourSubContext: Boolean = true, noinline additionalFilter: (suspend (ChatEventMessage) -> Boolean)? = null, - noinline scenarioReceiver: ScenarioAndTypeReceiver> + noinline scenarioReceiver: BehaviourContextAndTypeReceiver> ) = flowsUpdatesFilter.expectFlow(bot) { it.asMessageUpdate() ?.data ?.asChatEventMessage() ?.let { message -> if (message.chatEvent is T) { @@ -34,14 +31,14 @@ internal suspend inline fun Scenario.onEvent( } } }.subscribeSafelyWithoutExceptions(scope) { triggerMessage -> - val (jobToCancel, scenario) = if (includeFilterByChatInSubScenario) { + val (jobToCancel, scenario) = if (includeFilterByChatInBehaviourSubContext) { val subFilter = FlowsUpdatesFilter() - val subScenario = copy(flowsUpdatesFilter = subFilter) + val subBehaviourContext = copy(flowsUpdatesFilter = subFilter) flowsUpdatesFilter.allUpdatesFlow.filter { val chat = it.sourceChat() ?: return@filter false chat.id.chatId == triggerMessage.chat.id.chatId - }.subscribeSafelyWithoutExceptions(scope, subFilter.asUpdateReceiver) to subScenario + }.subscribeSafelyWithoutExceptions(scope, subFilter.asUpdateReceiver) to subBehaviourContext } else { null to this } @@ -49,79 +46,79 @@ internal suspend inline fun Scenario.onEvent( jobToCancel ?.cancel() } -suspend fun Scenario.onChannelEvent( - includeFilterByChatInSubScenario: Boolean = true, +suspend fun BehaviourContext.onChannelEvent( + includeFilterByChatInBehaviourSubContext: Boolean = true, additionalFilter: (suspend (ChatEventMessage) -> Boolean)? = null, - scenarioReceiver: ScenarioAndTypeReceiver> -) = onEvent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) -suspend fun Scenario.onChatEvent( - includeFilterByChatInSubScenario: Boolean = true, + scenarioReceiver: BehaviourContextAndTypeReceiver> +) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver) +suspend fun BehaviourContext.onChatEvent( + includeFilterByChatInBehaviourSubContext: Boolean = true, additionalFilter: (suspend (ChatEventMessage) -> Boolean)? = null, - scenarioReceiver: ScenarioAndTypeReceiver> -) = onEvent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) -suspend fun Scenario.onCommonEvent( - includeFilterByChatInSubScenario: Boolean = true, + scenarioReceiver: BehaviourContextAndTypeReceiver> +) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver) +suspend fun BehaviourContext.onCommonEvent( + includeFilterByChatInBehaviourSubContext: Boolean = true, additionalFilter: (suspend (ChatEventMessage) -> Boolean)? = null, - scenarioReceiver: ScenarioAndTypeReceiver> -) = onEvent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) -suspend fun Scenario.onGroupEvent( - includeFilterByChatInSubScenario: Boolean = true, + scenarioReceiver: BehaviourContextAndTypeReceiver> +) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver) +suspend fun BehaviourContext.onGroupEvent( + includeFilterByChatInBehaviourSubContext: Boolean = true, additionalFilter: (suspend (ChatEventMessage) -> Boolean)? = null, - scenarioReceiver: ScenarioAndTypeReceiver> -) = onEvent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) -suspend fun Scenario.onSupergroupEvent( - includeFilterByChatInSubScenario: Boolean = true, + scenarioReceiver: BehaviourContextAndTypeReceiver> +) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver) +suspend fun BehaviourContext.onSupergroupEvent( + includeFilterByChatInBehaviourSubContext: Boolean = true, additionalFilter: (suspend (ChatEventMessage) -> Boolean)? = null, - scenarioReceiver: ScenarioAndTypeReceiver> -) = onEvent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) + scenarioReceiver: BehaviourContextAndTypeReceiver> +) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver) -suspend fun Scenario.onChannelChatCreated( - includeFilterByChatInSubScenario: Boolean = true, +suspend fun BehaviourContext.onChannelChatCreated( + includeFilterByChatInBehaviourSubContext: Boolean = true, additionalFilter: (suspend (ChatEventMessage) -> Boolean)? = null, - scenarioReceiver: ScenarioAndTypeReceiver> -) = onEvent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) -suspend fun Scenario.onDeleteChatPhoto( - includeFilterByChatInSubScenario: Boolean = true, + scenarioReceiver: BehaviourContextAndTypeReceiver> +) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver) +suspend fun BehaviourContext.onDeleteChatPhoto( + includeFilterByChatInBehaviourSubContext: Boolean = true, additionalFilter: (suspend (ChatEventMessage) -> Boolean)? = null, - scenarioReceiver: ScenarioAndTypeReceiver> -) = onEvent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) -suspend fun Scenario.onGroupChatCreated( - includeFilterByChatInSubScenario: Boolean = true, + scenarioReceiver: BehaviourContextAndTypeReceiver> +) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver) +suspend fun BehaviourContext.onGroupChatCreated( + includeFilterByChatInBehaviourSubContext: Boolean = true, additionalFilter: (suspend (ChatEventMessage) -> Boolean)? = null, - scenarioReceiver: ScenarioAndTypeReceiver> -) = onEvent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) -suspend fun Scenario.onLeftChatMember( - includeFilterByChatInSubScenario: Boolean = true, + scenarioReceiver: BehaviourContextAndTypeReceiver> +) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver) +suspend fun BehaviourContext.onLeftChatMember( + includeFilterByChatInBehaviourSubContext: Boolean = true, additionalFilter: (suspend (ChatEventMessage) -> Boolean)? = null, - scenarioReceiver: ScenarioAndTypeReceiver> -) = onEvent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) -suspend fun Scenario.onNewChatMembers( - includeFilterByChatInSubScenario: Boolean = true, + scenarioReceiver: BehaviourContextAndTypeReceiver> +) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver) +suspend fun BehaviourContext.onNewChatMembers( + includeFilterByChatInBehaviourSubContext: Boolean = true, additionalFilter: (suspend (ChatEventMessage) -> Boolean)? = null, - scenarioReceiver: ScenarioAndTypeReceiver> -) = onEvent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) -suspend fun Scenario.onNewChatPhoto( - includeFilterByChatInSubScenario: Boolean = true, + scenarioReceiver: BehaviourContextAndTypeReceiver> +) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver) +suspend fun BehaviourContext.onNewChatPhoto( + includeFilterByChatInBehaviourSubContext: Boolean = true, additionalFilter: (suspend (ChatEventMessage) -> Boolean)? = null, - scenarioReceiver: ScenarioAndTypeReceiver> -) = onEvent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) -suspend fun Scenario.onNewChatTitle( - includeFilterByChatInSubScenario: Boolean = true, + scenarioReceiver: BehaviourContextAndTypeReceiver> +) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver) +suspend fun BehaviourContext.onNewChatTitle( + includeFilterByChatInBehaviourSubContext: Boolean = true, additionalFilter: (suspend (ChatEventMessage) -> Boolean)? = null, - scenarioReceiver: ScenarioAndTypeReceiver> -) = onEvent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) -suspend fun Scenario.onPinnedMessage( - includeFilterByChatInSubScenario: Boolean = true, + scenarioReceiver: BehaviourContextAndTypeReceiver> +) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver) +suspend fun BehaviourContext.onPinnedMessage( + includeFilterByChatInBehaviourSubContext: Boolean = true, additionalFilter: (suspend (ChatEventMessage) -> Boolean)? = null, - scenarioReceiver: ScenarioAndTypeReceiver> -) = onEvent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) -suspend fun Scenario.onProximityAlertTriggered( - includeFilterByChatInSubScenario: Boolean = true, + scenarioReceiver: BehaviourContextAndTypeReceiver> +) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver) +suspend fun BehaviourContext.onProximityAlertTriggered( + includeFilterByChatInBehaviourSubContext: Boolean = true, additionalFilter: (suspend (ChatEventMessage) -> Boolean)? = null, - scenarioReceiver: ScenarioAndTypeReceiver> -) = onEvent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) -suspend fun Scenario.onSupergroupChatCreated( - includeFilterByChatInSubScenario: Boolean = true, + scenarioReceiver: BehaviourContextAndTypeReceiver> +) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver) +suspend fun BehaviourContext.onSupergroupChatCreated( + includeFilterByChatInBehaviourSubContext: Boolean = true, additionalFilter: (suspend (ChatEventMessage) -> Boolean)? = null, - scenarioReceiver: ScenarioAndTypeReceiver> -) = onEvent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) + scenarioReceiver: BehaviourContextAndTypeReceiver> +) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)