1
0
mirror of https://github.com/InsanusMokrassar/TelegramBotAPI.git synced 2025-02-18 12:41:50 +00:00

rename scenario to behaviour context

This commit is contained in:
InsanusMokrassar 2021-01-07 18:11:01 +06:00
parent 3125c2fc1b
commit 383e722d07
10 changed files with 284 additions and 288 deletions

View File

@ -5,23 +5,23 @@ import dev.inmo.tgbotapi.extensions.utils.updates.retrieving.startGettingOfUpdat
import dev.inmo.tgbotapi.updateshandlers.FlowsUpdatesFilter import dev.inmo.tgbotapi.updateshandlers.FlowsUpdatesFilter
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
suspend fun TelegramBot.buildScenarios( suspend fun TelegramBot.buildBehaviour(
scope: CoroutineScope, scope: CoroutineScope,
flowUpdatesFilter: FlowsUpdatesFilter, flowUpdatesFilter: FlowsUpdatesFilter,
block: ScenarioReceiver<Unit> block: BehaviourContextReceiver<Unit>
) { ) {
Scenario( BehaviourContext(
this, this,
scope, scope,
flowUpdatesFilter flowUpdatesFilter
).block() ).block()
} }
suspend fun TelegramBot.buildScenarios( suspend fun TelegramBot.buildBehaviour(
scope: CoroutineScope, scope: CoroutineScope,
block: ScenarioReceiver<Unit> block: BehaviourContextReceiver<Unit>
) = FlowsUpdatesFilter().also { ) = FlowsUpdatesFilter().also {
buildScenarios( buildBehaviour(
scope, scope,
it, it,
block block

View File

@ -4,10 +4,10 @@ import dev.inmo.tgbotapi.bot.TelegramBot
import dev.inmo.tgbotapi.updateshandlers.FlowsUpdatesFilter import dev.inmo.tgbotapi.updateshandlers.FlowsUpdatesFilter
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
typealias ScenarioReceiver<T> = suspend Scenario.() -> T typealias BehaviourContextReceiver<T> = suspend BehaviourContext.() -> T
typealias ScenarioAndTypeReceiver<T, I> = suspend Scenario.(I) -> T typealias BehaviourContextAndTypeReceiver<T, I> = suspend BehaviourContext.(I) -> T
data class Scenario( data class BehaviourContext(
val bot: TelegramBot, val bot: TelegramBot,
val scope: CoroutineScope, val scope: CoroutineScope,
val flowsUpdatesFilter: FlowsUpdatesFilter = FlowsUpdatesFilter() val flowsUpdatesFilter: FlowsUpdatesFilter = FlowsUpdatesFilter()

View File

@ -2,7 +2,7 @@ package dev.inmo.tgbotapi.extensions.steps.expectations
import dev.inmo.micro_utils.coroutines.safelyWithoutExceptions import dev.inmo.micro_utils.coroutines.safelyWithoutExceptions
import dev.inmo.tgbotapi.bot.TelegramBot 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.requests.abstracts.Request
import dev.inmo.tgbotapi.types.update.abstracts.Update import dev.inmo.tgbotapi.types.update.abstracts.Update
import dev.inmo.tgbotapi.updateshandlers.FlowsUpdatesFilter import dev.inmo.tgbotapi.updateshandlers.FlowsUpdatesFilter
@ -73,7 +73,7 @@ suspend fun <T> FlowsUpdatesFilter.expectFlow(
* as is, but when it returns null, then will be called [cancelTrigger] (if it will return true - [cancelRequestFactory] * 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 * will be called too), [errorFactory] and then will be returned null
*/ */
suspend fun <T> Scenario.expectFlow( suspend fun <T> BehaviourContext.expectFlow(
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
count: Int? = null, count: Int? = null,
errorFactory: NullableRequestBuilder<*> = { null }, errorFactory: NullableRequestBuilder<*> = { null },
@ -112,7 +112,7 @@ suspend fun <T> FlowsUpdatesFilter.expectOne(
* as is, but when it returns null, then will be called [cancelTrigger] (if it will return true - [cancelRequestFactory] * 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 * will be called too), [errorFactory] and then will be returned null
*/ */
suspend fun <T> Scenario.expectOne( suspend fun <T> BehaviourContext.expectOne(
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }, errorFactory: NullableRequestBuilder<*> = { null },
cancelRequestFactory: NullableRequestBuilder<*> = { null }, cancelRequestFactory: NullableRequestBuilder<*> = { null },

View File

@ -2,20 +2,15 @@
package dev.inmo.tgbotapi.extensions.steps.expectations 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.extensions.utils.*
import dev.inmo.tgbotapi.requests.abstracts.Request import dev.inmo.tgbotapi.requests.abstracts.Request
import dev.inmo.tgbotapi.types.CallbackQuery.* 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 import kotlinx.coroutines.flow.toList
typealias CallbackQueryMapper<T> = T.() -> T? typealias CallbackQueryMapper<T> = T.() -> T?
private suspend fun <O> Scenario.waitCallbackQueries( private suspend fun <O> BehaviourContext.waitCallbackQueries(
count: Int = 1, count: Int = 1,
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }, errorFactory: NullableRequestBuilder<*> = { null },
@ -29,7 +24,7 @@ private suspend fun <O> Scenario.waitCallbackQueries(
}.toList().toList() }.toList().toList()
private suspend inline fun <reified T : CallbackQuery> Scenario.waitEvents( private suspend inline fun <reified T : CallbackQuery> BehaviourContext.waitEvents(
count: Int = 1, count: Int = 1,
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
noinline errorFactory: NullableRequestBuilder<*> = { null }, noinline errorFactory: NullableRequestBuilder<*> = { null },
@ -51,55 +46,55 @@ private suspend inline fun <reified T : CallbackQuery> Scenario.waitEvents(
} }
suspend fun Scenario.waitDataCallbackQuery( suspend fun BehaviourContext.waitDataCallbackQuery(
count: Int = 1, count: Int = 1,
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }, errorFactory: NullableRequestBuilder<*> = { null },
filter: CallbackQueryMapper<DataCallbackQuery>? = null filter: CallbackQueryMapper<DataCallbackQuery>? = null
) = waitEvents(count, initRequest, errorFactory, filter) ) = waitEvents(count, initRequest, errorFactory, filter)
suspend fun Scenario.waitGameShortNameCallbackQuery( suspend fun BehaviourContext.waitGameShortNameCallbackQuery(
count: Int = 1, count: Int = 1,
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }, errorFactory: NullableRequestBuilder<*> = { null },
filter: CallbackQueryMapper<GameShortNameCallbackQuery>? = null filter: CallbackQueryMapper<GameShortNameCallbackQuery>? = null
) = waitEvents(count, initRequest, errorFactory, filter) ) = waitEvents(count, initRequest, errorFactory, filter)
suspend fun Scenario.waitInlineMessageIdCallbackQuery( suspend fun BehaviourContext.waitInlineMessageIdCallbackQuery(
count: Int = 1, count: Int = 1,
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }, errorFactory: NullableRequestBuilder<*> = { null },
filter: CallbackQueryMapper<InlineMessageIdCallbackQuery>? = null filter: CallbackQueryMapper<InlineMessageIdCallbackQuery>? = null
) = waitEvents(count, initRequest, errorFactory, filter) ) = waitEvents(count, initRequest, errorFactory, filter)
suspend fun Scenario.waitInlineMessageIdDataCallbackQuery( suspend fun BehaviourContext.waitInlineMessageIdDataCallbackQuery(
count: Int = 1, count: Int = 1,
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }, errorFactory: NullableRequestBuilder<*> = { null },
filter: CallbackQueryMapper<InlineMessageIdDataCallbackQuery>? = null filter: CallbackQueryMapper<InlineMessageIdDataCallbackQuery>? = null
) = waitEvents(count, initRequest, errorFactory, filter) ) = waitEvents(count, initRequest, errorFactory, filter)
suspend fun Scenario.waitInlineMessageIdGameShortNameCallbackQuery( suspend fun BehaviourContext.waitInlineMessageIdGameShortNameCallbackQuery(
count: Int = 1, count: Int = 1,
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }, errorFactory: NullableRequestBuilder<*> = { null },
filter: CallbackQueryMapper<InlineMessageIdGameShortNameCallbackQuery>? = null filter: CallbackQueryMapper<InlineMessageIdGameShortNameCallbackQuery>? = null
) = waitEvents(count, initRequest, errorFactory, filter) ) = waitEvents(count, initRequest, errorFactory, filter)
suspend fun Scenario.waitMessageCallbackQuery( suspend fun BehaviourContext.waitMessageCallbackQuery(
count: Int = 1, count: Int = 1,
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }, errorFactory: NullableRequestBuilder<*> = { null },
filter: CallbackQueryMapper<MessageCallbackQuery>? = null filter: CallbackQueryMapper<MessageCallbackQuery>? = null
) = waitEvents(count, initRequest, errorFactory, filter) ) = waitEvents(count, initRequest, errorFactory, filter)
suspend fun Scenario.waitMessageDataCallbackQuery( suspend fun BehaviourContext.waitMessageDataCallbackQuery(
count: Int = 1, count: Int = 1,
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }, errorFactory: NullableRequestBuilder<*> = { null },
filter: CallbackQueryMapper<MessageDataCallbackQuery>? = null filter: CallbackQueryMapper<MessageDataCallbackQuery>? = null
) = waitEvents(count, initRequest, errorFactory, filter) ) = waitEvents(count, initRequest, errorFactory, filter)
suspend fun Scenario.waitMessageGameShortNameCallbackQuery( suspend fun BehaviourContext.waitMessageGameShortNameCallbackQuery(
count: Int = 1, count: Int = 1,
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }, errorFactory: NullableRequestBuilder<*> = { null },
filter: CallbackQueryMapper<MessageGameShortNameCallbackQuery>? = null filter: CallbackQueryMapper<MessageGameShortNameCallbackQuery>? = null
) = waitEvents(count, initRequest, errorFactory, filter) ) = waitEvents(count, initRequest, errorFactory, filter)
suspend fun Scenario.waitUnknownCallbackQuery( suspend fun BehaviourContext.waitUnknownCallbackQuery(
count: Int = 1, count: Int = 1,
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }, errorFactory: NullableRequestBuilder<*> = { null },

View File

@ -2,7 +2,7 @@
package dev.inmo.tgbotapi.extensions.steps.expectations 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.asContentMessage
import dev.inmo.tgbotapi.extensions.utils.asMessageUpdate import dev.inmo.tgbotapi.extensions.utils.asMessageUpdate
import dev.inmo.tgbotapi.requests.abstracts.Request import dev.inmo.tgbotapi.requests.abstracts.Request
@ -15,7 +15,7 @@ import kotlinx.coroutines.flow.toList
typealias ContentMessageToContentMapper<T> = suspend ContentMessage<T>.() -> T? typealias ContentMessageToContentMapper<T> = suspend ContentMessage<T>.() -> T?
private suspend fun <O> Scenario.waitContentMessage( private suspend fun <O> BehaviourContext.waitContentMessage(
count: Int = 1, count: Int = 1,
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }, errorFactory: NullableRequestBuilder<*> = { null },
@ -28,7 +28,7 @@ private suspend fun <O> Scenario.waitContentMessage(
it.asMessageUpdate() ?.data ?.asContentMessage() ?.mapper() it.asMessageUpdate() ?.data ?.asContentMessage() ?.mapper()
}.toList().toList() }.toList().toList()
private suspend inline fun <reified T : MessageContent> Scenario.waitContent( private suspend inline fun <reified T : MessageContent> BehaviourContext.waitContent(
count: Int = 1, count: Int = 1,
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
noinline errorFactory: NullableRequestBuilder<*> = { null }, noinline errorFactory: NullableRequestBuilder<*> = { null },
@ -51,127 +51,127 @@ private suspend inline fun <reified T : MessageContent> Scenario.waitContent(
} }
} }
suspend fun Scenario.waitContact( suspend fun BehaviourContext.waitContact(
count: Int = 1, count: Int = 1,
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }, errorFactory: NullableRequestBuilder<*> = { null },
filter: ContentMessageToContentMapper<ContactContent>? = null filter: ContentMessageToContentMapper<ContactContent>? = null
) = waitContent(count, initRequest, errorFactory, filter) ) = waitContent(count, initRequest, errorFactory, filter)
suspend fun Scenario.waitDice( suspend fun BehaviourContext.waitDice(
count: Int = 1, count: Int = 1,
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }, errorFactory: NullableRequestBuilder<*> = { null },
filter: ContentMessageToContentMapper<DiceContent>? = null filter: ContentMessageToContentMapper<DiceContent>? = null
) = waitContent(count, initRequest, errorFactory, filter) ) = waitContent(count, initRequest, errorFactory, filter)
suspend fun Scenario.waitGame( suspend fun BehaviourContext.waitGame(
count: Int = 1, count: Int = 1,
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }, errorFactory: NullableRequestBuilder<*> = { null },
filter: ContentMessageToContentMapper<GameContent>? = null filter: ContentMessageToContentMapper<GameContent>? = null
) = waitContent(count, initRequest, errorFactory, filter) ) = waitContent(count, initRequest, errorFactory, filter)
suspend fun Scenario.waitLocation( suspend fun BehaviourContext.waitLocation(
count: Int = 1, count: Int = 1,
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }, errorFactory: NullableRequestBuilder<*> = { null },
filter: ContentMessageToContentMapper<LocationContent>? = null filter: ContentMessageToContentMapper<LocationContent>? = null
) = waitContent(count, initRequest, errorFactory, filter) ) = waitContent(count, initRequest, errorFactory, filter)
suspend fun Scenario.waitPoll( suspend fun BehaviourContext.waitPoll(
count: Int = 1, count: Int = 1,
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }, errorFactory: NullableRequestBuilder<*> = { null },
filter: ContentMessageToContentMapper<PollContent>? = null filter: ContentMessageToContentMapper<PollContent>? = null
) = waitContent(count, initRequest, errorFactory, filter) ) = waitContent(count, initRequest, errorFactory, filter)
suspend fun Scenario.waitText( suspend fun BehaviourContext.waitText(
count: Int = 1, count: Int = 1,
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }, errorFactory: NullableRequestBuilder<*> = { null },
filter: ContentMessageToContentMapper<TextContent>? = null filter: ContentMessageToContentMapper<TextContent>? = null
) = waitContent(count, initRequest, errorFactory, filter) ) = waitContent(count, initRequest, errorFactory, filter)
suspend fun Scenario.waitVenue( suspend fun BehaviourContext.waitVenue(
count: Int = 1, count: Int = 1,
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }, errorFactory: NullableRequestBuilder<*> = { null },
filter: ContentMessageToContentMapper<VenueContent>? = null filter: ContentMessageToContentMapper<VenueContent>? = null
) = waitContent(count, initRequest, errorFactory, filter) ) = waitContent(count, initRequest, errorFactory, filter)
suspend fun Scenario.waitAudioMediaGroup( suspend fun BehaviourContext.waitAudioMediaGroup(
count: Int = 1, count: Int = 1,
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }, errorFactory: NullableRequestBuilder<*> = { null },
filter: ContentMessageToContentMapper<AudioMediaGroupContent>? = null filter: ContentMessageToContentMapper<AudioMediaGroupContent>? = null
) = waitContent(count, initRequest, errorFactory, filter) ) = waitContent(count, initRequest, errorFactory, filter)
suspend fun Scenario.waitDocumentMediaGroup( suspend fun BehaviourContext.waitDocumentMediaGroup(
count: Int = 1, count: Int = 1,
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }, errorFactory: NullableRequestBuilder<*> = { null },
filter: ContentMessageToContentMapper<DocumentMediaGroupContent>? = null filter: ContentMessageToContentMapper<DocumentMediaGroupContent>? = null
) = waitContent(count, initRequest, errorFactory, filter) ) = waitContent(count, initRequest, errorFactory, filter)
suspend fun Scenario.waitMedia( suspend fun BehaviourContext.waitMedia(
count: Int = 1, count: Int = 1,
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }, errorFactory: NullableRequestBuilder<*> = { null },
filter: ContentMessageToContentMapper<MediaContent>? = null filter: ContentMessageToContentMapper<MediaContent>? = null
) = waitContent(count, initRequest, errorFactory, filter) ) = waitContent(count, initRequest, errorFactory, filter)
suspend fun Scenario.waitMediaGroup( suspend fun BehaviourContext.waitMediaGroup(
count: Int = 1, count: Int = 1,
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }, errorFactory: NullableRequestBuilder<*> = { null },
filter: ContentMessageToContentMapper<MediaGroupContent>? = null filter: ContentMessageToContentMapper<MediaGroupContent>? = null
) = waitContent(count, initRequest, errorFactory, filter) ) = waitContent(count, initRequest, errorFactory, filter)
suspend fun Scenario.waitVisualMediaGroup( suspend fun BehaviourContext.waitVisualMediaGroup(
count: Int = 1, count: Int = 1,
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }, errorFactory: NullableRequestBuilder<*> = { null },
filter: ContentMessageToContentMapper<VisualMediaGroupContent>? = null filter: ContentMessageToContentMapper<VisualMediaGroupContent>? = null
) = waitContent(count, initRequest, errorFactory, filter) ) = waitContent(count, initRequest, errorFactory, filter)
suspend fun Scenario.waitAnimation( suspend fun BehaviourContext.waitAnimation(
count: Int = 1, count: Int = 1,
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }, errorFactory: NullableRequestBuilder<*> = { null },
filter: ContentMessageToContentMapper<AnimationContent>? = null filter: ContentMessageToContentMapper<AnimationContent>? = null
) = waitContent(count, initRequest, errorFactory, filter) ) = waitContent(count, initRequest, errorFactory, filter)
suspend fun Scenario.waitAudio( suspend fun BehaviourContext.waitAudio(
count: Int = 1, count: Int = 1,
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }, errorFactory: NullableRequestBuilder<*> = { null },
filter: ContentMessageToContentMapper<AudioContent>? = null filter: ContentMessageToContentMapper<AudioContent>? = null
) = waitContent(count, initRequest, errorFactory, filter) ) = waitContent(count, initRequest, errorFactory, filter)
suspend fun Scenario.waitDocument( suspend fun BehaviourContext.waitDocument(
count: Int = 1, count: Int = 1,
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }, errorFactory: NullableRequestBuilder<*> = { null },
filter: ContentMessageToContentMapper<DocumentContent>? = null filter: ContentMessageToContentMapper<DocumentContent>? = null
) = waitContent(count, initRequest, errorFactory, filter) ) = waitContent(count, initRequest, errorFactory, filter)
suspend fun Scenario.waitPhoto( suspend fun BehaviourContext.waitPhoto(
count: Int = 1, count: Int = 1,
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }, errorFactory: NullableRequestBuilder<*> = { null },
filter: ContentMessageToContentMapper<PhotoContent>? = null filter: ContentMessageToContentMapper<PhotoContent>? = null
) = waitContent(count, initRequest, errorFactory, filter) ) = waitContent(count, initRequest, errorFactory, filter)
suspend fun Scenario.waitSticker( suspend fun BehaviourContext.waitSticker(
count: Int = 1, count: Int = 1,
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }, errorFactory: NullableRequestBuilder<*> = { null },
filter: ContentMessageToContentMapper<StickerContent>? = null filter: ContentMessageToContentMapper<StickerContent>? = null
) = waitContent(count, initRequest, errorFactory, filter) ) = waitContent(count, initRequest, errorFactory, filter)
suspend fun Scenario.waitVideo( suspend fun BehaviourContext.waitVideo(
count: Int = 1, count: Int = 1,
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }, errorFactory: NullableRequestBuilder<*> = { null },
filter: ContentMessageToContentMapper<VideoContent>? = null filter: ContentMessageToContentMapper<VideoContent>? = null
) = waitContent(count, initRequest, errorFactory, filter) ) = waitContent(count, initRequest, errorFactory, filter)
suspend fun Scenario.waitVideoNote( suspend fun BehaviourContext.waitVideoNote(
count: Int = 1, count: Int = 1,
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }, errorFactory: NullableRequestBuilder<*> = { null },
filter: ContentMessageToContentMapper<VideoNoteContent>? = null filter: ContentMessageToContentMapper<VideoNoteContent>? = null
) = waitContent(count, initRequest, errorFactory, filter) ) = waitContent(count, initRequest, errorFactory, filter)
suspend fun Scenario.waitVoice( suspend fun BehaviourContext.waitVoice(
count: Int = 1, count: Int = 1,
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }, errorFactory: NullableRequestBuilder<*> = { null },
filter: ContentMessageToContentMapper<VoiceContent>? = null filter: ContentMessageToContentMapper<VoiceContent>? = null
) = waitContent(count, initRequest, errorFactory, filter) ) = waitContent(count, initRequest, errorFactory, filter)
suspend fun Scenario.waitInvoice( suspend fun BehaviourContext.waitInvoice(
count: Int = 1, count: Int = 1,
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }, errorFactory: NullableRequestBuilder<*> = { null },

View File

@ -2,18 +2,17 @@
package dev.inmo.tgbotapi.extensions.steps.expectations 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.extensions.utils.*
import dev.inmo.tgbotapi.requests.abstracts.Request import dev.inmo.tgbotapi.requests.abstracts.Request
import dev.inmo.tgbotapi.types.message.ChatEvents.* import dev.inmo.tgbotapi.types.message.ChatEvents.*
import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.* import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.*
import dev.inmo.tgbotapi.types.message.abstracts.ChatEventMessage import dev.inmo.tgbotapi.types.message.abstracts.ChatEventMessage
import dev.inmo.tgbotapi.types.message.content.ContactContent
import kotlinx.coroutines.flow.toList import kotlinx.coroutines.flow.toList
typealias EventMessageToEventMapper<T> = suspend ChatEventMessage<T>.() -> T? typealias EventMessageToEventMapper<T> = suspend ChatEventMessage<T>.() -> T?
private suspend fun <O> Scenario.waitEventMessages( private suspend fun <O> BehaviourContext.waitEventMessages(
count: Int = 1, count: Int = 1,
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }, errorFactory: NullableRequestBuilder<*> = { null },
@ -27,7 +26,7 @@ private suspend fun <O> Scenario.waitEventMessages(
}.toList().toList() }.toList().toList()
private suspend inline fun <reified T : ChatEvent> Scenario.waitEvents( private suspend inline fun <reified T : ChatEvent> BehaviourContext.waitEvents(
count: Int = 1, count: Int = 1,
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
noinline errorFactory: NullableRequestBuilder<*> = { null }, noinline errorFactory: NullableRequestBuilder<*> = { null },
@ -50,93 +49,93 @@ private suspend inline fun <reified T : ChatEvent> Scenario.waitEvents(
} }
} }
suspend fun Scenario.waitChannelEvents( suspend fun BehaviourContext.waitChannelEvents(
count: Int = 1, count: Int = 1,
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }, errorFactory: NullableRequestBuilder<*> = { null },
filter: EventMessageToEventMapper<ChannelEvent>? = null filter: EventMessageToEventMapper<ChannelEvent>? = null
) = waitEvents(count, initRequest, errorFactory, filter) ) = waitEvents(count, initRequest, errorFactory, filter)
suspend fun Scenario.waitChatEvents( suspend fun BehaviourContext.waitChatEvents(
count: Int = 1, count: Int = 1,
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }, errorFactory: NullableRequestBuilder<*> = { null },
filter: EventMessageToEventMapper<ChatEvent>? = null filter: EventMessageToEventMapper<ChatEvent>? = null
) = waitEvents(count, initRequest, errorFactory, filter) ) = waitEvents(count, initRequest, errorFactory, filter)
suspend fun Scenario.waitCommonEvents( suspend fun BehaviourContext.waitCommonEvents(
count: Int = 1, count: Int = 1,
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }, errorFactory: NullableRequestBuilder<*> = { null },
filter: EventMessageToEventMapper<CommonEvent>? = null filter: EventMessageToEventMapper<CommonEvent>? = null
) = waitEvents(count, initRequest, errorFactory, filter) ) = waitEvents(count, initRequest, errorFactory, filter)
suspend fun Scenario.waitGroupEvents( suspend fun BehaviourContext.waitGroupEvents(
count: Int = 1, count: Int = 1,
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }, errorFactory: NullableRequestBuilder<*> = { null },
filter: EventMessageToEventMapper<GroupEvent>? = null filter: EventMessageToEventMapper<GroupEvent>? = null
) = waitEvents(count, initRequest, errorFactory, filter) ) = waitEvents(count, initRequest, errorFactory, filter)
suspend fun Scenario.waitSupergroupEvents( suspend fun BehaviourContext.waitSupergroupEvents(
count: Int = 1, count: Int = 1,
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }, errorFactory: NullableRequestBuilder<*> = { null },
filter: EventMessageToEventMapper<SupergroupEvent>? = null filter: EventMessageToEventMapper<SupergroupEvent>? = null
) = waitEvents(count, initRequest, errorFactory, filter) ) = waitEvents(count, initRequest, errorFactory, filter)
suspend fun Scenario.waitChannelChatCreatedEvents( suspend fun BehaviourContext.waitChannelChatCreatedEvents(
count: Int = 1, count: Int = 1,
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }, errorFactory: NullableRequestBuilder<*> = { null },
filter: EventMessageToEventMapper<ChannelChatCreated>? = null filter: EventMessageToEventMapper<ChannelChatCreated>? = null
) = waitEvents(count, initRequest, errorFactory, filter) ) = waitEvents(count, initRequest, errorFactory, filter)
suspend fun Scenario.waitDeleteChatPhotoEvents( suspend fun BehaviourContext.waitDeleteChatPhotoEvents(
count: Int = 1, count: Int = 1,
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }, errorFactory: NullableRequestBuilder<*> = { null },
filter: EventMessageToEventMapper<DeleteChatPhoto>? = null filter: EventMessageToEventMapper<DeleteChatPhoto>? = null
) = waitEvents(count, initRequest, errorFactory, filter) ) = waitEvents(count, initRequest, errorFactory, filter)
suspend fun Scenario.waitGroupChatCreatedEvents( suspend fun BehaviourContext.waitGroupChatCreatedEvents(
count: Int = 1, count: Int = 1,
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }, errorFactory: NullableRequestBuilder<*> = { null },
filter: EventMessageToEventMapper<GroupChatCreated>? = null filter: EventMessageToEventMapper<GroupChatCreated>? = null
) = waitEvents(count, initRequest, errorFactory, filter) ) = waitEvents(count, initRequest, errorFactory, filter)
suspend fun Scenario.waitLeftChatMemberEvents( suspend fun BehaviourContext.waitLeftChatMemberEvents(
count: Int = 1, count: Int = 1,
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }, errorFactory: NullableRequestBuilder<*> = { null },
filter: EventMessageToEventMapper<LeftChatMember>? = null filter: EventMessageToEventMapper<LeftChatMember>? = null
) = waitEvents(count, initRequest, errorFactory, filter) ) = waitEvents(count, initRequest, errorFactory, filter)
suspend fun Scenario.waitNewChatPhotoEvents( suspend fun BehaviourContext.waitNewChatPhotoEvents(
count: Int = 1, count: Int = 1,
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }, errorFactory: NullableRequestBuilder<*> = { null },
filter: EventMessageToEventMapper<NewChatPhoto>? = null filter: EventMessageToEventMapper<NewChatPhoto>? = null
) = waitEvents(count, initRequest, errorFactory, filter) ) = waitEvents(count, initRequest, errorFactory, filter)
suspend fun Scenario.waitNewChatMembersEvents( suspend fun BehaviourContext.waitNewChatMembersEvents(
count: Int = 1, count: Int = 1,
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }, errorFactory: NullableRequestBuilder<*> = { null },
filter: EventMessageToEventMapper<NewChatMembers>? = null filter: EventMessageToEventMapper<NewChatMembers>? = null
) = waitEvents(count, initRequest, errorFactory, filter) ) = waitEvents(count, initRequest, errorFactory, filter)
suspend fun Scenario.waitNewChatTitleEvents( suspend fun BehaviourContext.waitNewChatTitleEvents(
count: Int = 1, count: Int = 1,
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }, errorFactory: NullableRequestBuilder<*> = { null },
filter: EventMessageToEventMapper<NewChatTitle>? = null filter: EventMessageToEventMapper<NewChatTitle>? = null
) = waitEvents(count, initRequest, errorFactory, filter) ) = waitEvents(count, initRequest, errorFactory, filter)
suspend fun Scenario.waitPinnedMessageEvents( suspend fun BehaviourContext.waitPinnedMessageEvents(
count: Int = 1, count: Int = 1,
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }, errorFactory: NullableRequestBuilder<*> = { null },
filter: EventMessageToEventMapper<PinnedMessage>? = null filter: EventMessageToEventMapper<PinnedMessage>? = null
) = waitEvents(count, initRequest, errorFactory, filter) ) = waitEvents(count, initRequest, errorFactory, filter)
suspend fun Scenario.waitProximityAlertTriggeredEvents( suspend fun BehaviourContext.waitProximityAlertTriggeredEvents(
count: Int = 1, count: Int = 1,
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }, errorFactory: NullableRequestBuilder<*> = { null },
filter: EventMessageToEventMapper<ProximityAlertTriggered>? = null filter: EventMessageToEventMapper<ProximityAlertTriggered>? = null
) = waitEvents(count, initRequest, errorFactory, filter) ) = waitEvents(count, initRequest, errorFactory, filter)
suspend fun Scenario.waitSupergroupChatCreatedEvents( suspend fun BehaviourContext.waitSupergroupChatCreatedEvents(
count: Int = 1, count: Int = 1,
initRequest: Request<*>? = null, initRequest: Request<*>? = null,
errorFactory: NullableRequestBuilder<*> = { null }, errorFactory: NullableRequestBuilder<*> = { null },

View File

@ -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.safelyWithoutExceptions
import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions
import dev.inmo.tgbotapi.extensions.steps.Scenario import dev.inmo.tgbotapi.extensions.steps.BehaviourContext
import dev.inmo.tgbotapi.extensions.steps.ScenarioAndTypeReceiver import dev.inmo.tgbotapi.extensions.steps.BehaviourContextAndTypeReceiver
import dev.inmo.tgbotapi.extensions.steps.expectations.expectFlow import dev.inmo.tgbotapi.extensions.steps.expectations.expectFlow
import dev.inmo.tgbotapi.extensions.utils.* import dev.inmo.tgbotapi.extensions.utils.*
import dev.inmo.tgbotapi.extensions.utils.extensions.sourceChat 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 dev.inmo.tgbotapi.updateshandlers.FlowsUpdatesFilter
import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.filter
internal suspend inline fun <reified T : CallbackQuery> Scenario.onCallbackQuery( internal suspend inline fun <reified T : CallbackQuery> BehaviourContext.onCallbackQuery(
includeFilterByChatInSubScenario: Boolean = true, includeFilterByChatInBehaviourSubContext: Boolean = true,
noinline additionalFilter: (suspend (T) -> Boolean)? = null, noinline additionalFilter: (suspend (T) -> Boolean)? = null,
noinline scenarioReceiver: ScenarioAndTypeReceiver<Unit, T> noinline scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, T>
) = flowsUpdatesFilter.expectFlow(bot) { ) = flowsUpdatesFilter.expectFlow(bot) {
it.asCallbackQueryUpdate() ?.data ?.let { query -> it.asCallbackQueryUpdate() ?.data ?.let { query ->
if (query is T) { if (query is T) {
@ -27,14 +27,14 @@ internal suspend inline fun <reified T : CallbackQuery> Scenario.onCallbackQuery
} }
} }
}.subscribeSafelyWithoutExceptions(scope) { triggerQuery -> }.subscribeSafelyWithoutExceptions(scope) { triggerQuery ->
val (jobToCancel, scenario) = if (includeFilterByChatInSubScenario) { val (jobToCancel, scenario) = if (includeFilterByChatInBehaviourSubContext) {
val subFilter = FlowsUpdatesFilter() val subFilter = FlowsUpdatesFilter()
val subScenario = copy(flowsUpdatesFilter = subFilter) val subBehaviourContext = copy(flowsUpdatesFilter = subFilter)
flowsUpdatesFilter.allUpdatesFlow.filter { flowsUpdatesFilter.allUpdatesFlow.filter {
val chat = it.sourceChat() ?: return@filter false val chat = it.sourceChat() ?: return@filter false
chat.id.chatId == triggerQuery.user.id.chatId chat.id.chatId == triggerQuery.user.id.chatId
}.subscribeSafelyWithoutExceptions(scope, subFilter.asUpdateReceiver) to subScenario }.subscribeSafelyWithoutExceptions(scope, subFilter.asUpdateReceiver) to subBehaviourContext
} else { } else {
null to this null to this
} }
@ -43,49 +43,49 @@ internal suspend inline fun <reified T : CallbackQuery> Scenario.onCallbackQuery
} }
suspend fun Scenario.onDataCallbackQuery( suspend fun BehaviourContext.onDataCallbackQuery(
includeFilterByChatInSubScenario: Boolean = true, includeFilterByChatInBehaviourSubContext: Boolean = true,
additionalFilter: (suspend (DataCallbackQuery) -> Boolean)? = null, additionalFilter: (suspend (DataCallbackQuery) -> Boolean)? = null,
scenarioReceiver: ScenarioAndTypeReceiver<Unit, DataCallbackQuery> scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, DataCallbackQuery>
) = onCallbackQuery(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) ) = onCallbackQuery(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
suspend fun Scenario.onGameShortNameCallbackQuery( suspend fun BehaviourContext.onGameShortNameCallbackQuery(
includeFilterByChatInSubScenario: Boolean = true, includeFilterByChatInBehaviourSubContext: Boolean = true,
additionalFilter: (suspend (GameShortNameCallbackQuery) -> Boolean)? = null, additionalFilter: (suspend (GameShortNameCallbackQuery) -> Boolean)? = null,
scenarioReceiver: ScenarioAndTypeReceiver<Unit, GameShortNameCallbackQuery> scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, GameShortNameCallbackQuery>
) = onCallbackQuery(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) ) = onCallbackQuery(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
suspend fun Scenario.onInlineMessageIdCallbackQuery( suspend fun BehaviourContext.onInlineMessageIdCallbackQuery(
includeFilterByChatInSubScenario: Boolean = true, includeFilterByChatInBehaviourSubContext: Boolean = true,
additionalFilter: (suspend (InlineMessageIdCallbackQuery) -> Boolean)? = null, additionalFilter: (suspend (InlineMessageIdCallbackQuery) -> Boolean)? = null,
scenarioReceiver: ScenarioAndTypeReceiver<Unit, InlineMessageIdCallbackQuery> scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, InlineMessageIdCallbackQuery>
) = onCallbackQuery(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) ) = onCallbackQuery(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
suspend fun Scenario.onInlineMessageIdDataCallbackQuery( suspend fun BehaviourContext.onInlineMessageIdDataCallbackQuery(
includeFilterByChatInSubScenario: Boolean = true, includeFilterByChatInBehaviourSubContext: Boolean = true,
additionalFilter: (suspend (InlineMessageIdDataCallbackQuery) -> Boolean)? = null, additionalFilter: (suspend (InlineMessageIdDataCallbackQuery) -> Boolean)? = null,
scenarioReceiver: ScenarioAndTypeReceiver<Unit, InlineMessageIdDataCallbackQuery> scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, InlineMessageIdDataCallbackQuery>
) = onCallbackQuery(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) ) = onCallbackQuery(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
suspend fun Scenario.onInlineMessageIdGameShortNameCallbackQuery( suspend fun BehaviourContext.onInlineMessageIdGameShortNameCallbackQuery(
includeFilterByChatInSubScenario: Boolean = true, includeFilterByChatInBehaviourSubContext: Boolean = true,
additionalFilter: (suspend (InlineMessageIdGameShortNameCallbackQuery) -> Boolean)? = null, additionalFilter: (suspend (InlineMessageIdGameShortNameCallbackQuery) -> Boolean)? = null,
scenarioReceiver: ScenarioAndTypeReceiver<Unit, InlineMessageIdGameShortNameCallbackQuery> scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, InlineMessageIdGameShortNameCallbackQuery>
) = onCallbackQuery(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) ) = onCallbackQuery(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
suspend fun Scenario.onMessageCallbackQuery( suspend fun BehaviourContext.onMessageCallbackQuery(
includeFilterByChatInSubScenario: Boolean = true, includeFilterByChatInBehaviourSubContext: Boolean = true,
additionalFilter: (suspend (MessageCallbackQuery) -> Boolean)? = null, additionalFilter: (suspend (MessageCallbackQuery) -> Boolean)? = null,
scenarioReceiver: ScenarioAndTypeReceiver<Unit, MessageCallbackQuery> scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, MessageCallbackQuery>
) = onCallbackQuery(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) ) = onCallbackQuery(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
suspend fun Scenario.onMessageDataCallbackQuery( suspend fun BehaviourContext.onMessageDataCallbackQuery(
includeFilterByChatInSubScenario: Boolean = true, includeFilterByChatInBehaviourSubContext: Boolean = true,
additionalFilter: (suspend (MessageDataCallbackQuery) -> Boolean)? = null, additionalFilter: (suspend (MessageDataCallbackQuery) -> Boolean)? = null,
scenarioReceiver: ScenarioAndTypeReceiver<Unit, MessageDataCallbackQuery> scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, MessageDataCallbackQuery>
) = onCallbackQuery(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) ) = onCallbackQuery(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
suspend fun Scenario.onMessageGameShortNameCallbackQuery( suspend fun BehaviourContext.onMessageGameShortNameCallbackQuery(
includeFilterByChatInSubScenario: Boolean = true, includeFilterByChatInBehaviourSubContext: Boolean = true,
additionalFilter: (suspend (MessageGameShortNameCallbackQuery) -> Boolean)? = null, additionalFilter: (suspend (MessageGameShortNameCallbackQuery) -> Boolean)? = null,
scenarioReceiver: ScenarioAndTypeReceiver<Unit, MessageGameShortNameCallbackQuery> scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, MessageGameShortNameCallbackQuery>
) = onCallbackQuery(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) ) = onCallbackQuery(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
suspend fun Scenario.onUnknownCallbackQueryType( suspend fun BehaviourContext.onUnknownCallbackQueryType(
includeFilterByChatInSubScenario: Boolean = true, includeFilterByChatInBehaviourSubContext: Boolean = true,
additionalFilter: (suspend (UnknownCallbackQueryType) -> Boolean)? = null, additionalFilter: (suspend (UnknownCallbackQueryType) -> Boolean)? = null,
scenarioReceiver: ScenarioAndTypeReceiver<Unit, UnknownCallbackQueryType> scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, UnknownCallbackQueryType>
) = onCallbackQuery(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) ) = onCallbackQuery(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)

View File

@ -7,13 +7,13 @@ import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage
import dev.inmo.tgbotapi.types.message.content.TextContent import dev.inmo.tgbotapi.types.message.content.TextContent
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
suspend fun Scenario.command( suspend fun BehaviourContext.command(
commandRegex: Regex, commandRegex: Regex,
requireOnlyCommandInMessage: Boolean = true, requireOnlyCommandInMessage: Boolean = true,
includeFilterByChatInSubScenario: Boolean = true, includeFilterByChatInBehaviourSubContext: Boolean = true,
scenarioReceiver: ScenarioAndTypeReceiver<Unit, ContentMessage<TextContent>> scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ContentMessage<TextContent>>
): Job = onText( ): Job = onText(
includeFilterByChatInSubScenario, includeFilterByChatInBehaviourSubContext,
{ message -> { message ->
val content = message.content val content = message.content
val textSources = content.textSources val textSources = content.textSources
@ -27,4 +27,9 @@ suspend fun Scenario.command(
scenarioReceiver scenarioReceiver
) )
suspend inline fun BehaviourContext.onCommand(
commandRegex: Regex,
requireOnlyCommandInMessage: Boolean = true,
includeFilterByChatInBehaviourSubContext: Boolean = true,
noinline scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ContentMessage<TextContent>>
): Job = command(commandRegex, requireOnlyCommandInMessage, includeFilterByChatInBehaviourSubContext, scenarioReceiver)

View File

@ -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.safelyWithoutExceptions
import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions
import dev.inmo.tgbotapi.extensions.steps.Scenario import dev.inmo.tgbotapi.extensions.steps.BehaviourContext
import dev.inmo.tgbotapi.extensions.steps.ScenarioAndTypeReceiver import dev.inmo.tgbotapi.extensions.steps.BehaviourContextAndTypeReceiver
import dev.inmo.tgbotapi.extensions.steps.expectations.expectFlow import dev.inmo.tgbotapi.extensions.steps.expectations.expectFlow
import dev.inmo.tgbotapi.extensions.utils.asContentMessage import dev.inmo.tgbotapi.extensions.utils.asContentMessage
import dev.inmo.tgbotapi.extensions.utils.asMessageUpdate import dev.inmo.tgbotapi.extensions.utils.asMessageUpdate
@ -19,10 +19,10 @@ import dev.inmo.tgbotapi.updateshandlers.FlowsUpdatesFilter
import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.filter
internal suspend inline fun <reified T : MessageContent> Scenario.onContent( internal suspend inline fun <reified T : MessageContent> BehaviourContext.onContent(
includeFilterByChatInSubScenario: Boolean = true, includeFilterByChatInBehaviourSubContext: Boolean = true,
noinline additionalFilter: (suspend (ContentMessage<T>) -> Boolean)? = null, noinline additionalFilter: (suspend (ContentMessage<T>) -> Boolean)? = null,
noinline scenarioReceiver: ScenarioAndTypeReceiver<Unit, ContentMessage<T>> noinline scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ContentMessage<T>>
) = flowsUpdatesFilter.expectFlow(bot) { ) = flowsUpdatesFilter.expectFlow(bot) {
it.asMessageUpdate() ?.data ?.asContentMessage() ?.let { message -> it.asMessageUpdate() ?.data ?.asContentMessage() ?.let { message ->
if (message.content is T) { if (message.content is T) {
@ -33,14 +33,14 @@ internal suspend inline fun <reified T : MessageContent> Scenario.onContent(
} }
} }
}.subscribeSafelyWithoutExceptions(scope) { triggerMessage -> }.subscribeSafelyWithoutExceptions(scope) { triggerMessage ->
val (jobToCancel, scenario) = if (includeFilterByChatInSubScenario) { val (jobToCancel, scenario) = if (includeFilterByChatInBehaviourSubContext) {
val subFilter = FlowsUpdatesFilter() val subFilter = FlowsUpdatesFilter()
val subScenario = copy(flowsUpdatesFilter = subFilter) val subBehaviourContext = copy(flowsUpdatesFilter = subFilter)
flowsUpdatesFilter.allUpdatesFlow.filter { flowsUpdatesFilter.allUpdatesFlow.filter {
val chat = it.sourceChat() ?: return@filter false val chat = it.sourceChat() ?: return@filter false
chat.id.chatId == triggerMessage.chat.id.chatId chat.id.chatId == triggerMessage.chat.id.chatId
}.subscribeSafelyWithoutExceptions(scope, subFilter.asUpdateReceiver) to subScenario }.subscribeSafelyWithoutExceptions(scope, subFilter.asUpdateReceiver) to subBehaviourContext
} else { } else {
null to this null to this
} }
@ -48,113 +48,113 @@ internal suspend inline fun <reified T : MessageContent> Scenario.onContent(
jobToCancel ?.cancel() jobToCancel ?.cancel()
} }
suspend fun Scenario.onContact( suspend fun BehaviourContext.onContact(
includeFilterByChatInSubScenario: Boolean = true, includeFilterByChatInBehaviourSubContext: Boolean = true,
additionalFilter: (suspend (ContentMessage<ContactContent>) -> Boolean)? = null, additionalFilter: (suspend (ContentMessage<ContactContent>) -> Boolean)? = null,
scenarioReceiver: ScenarioAndTypeReceiver<Unit, ContentMessage<ContactContent>> scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ContentMessage<ContactContent>>
) = onContent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) ) = onContent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
suspend fun Scenario.onDice( suspend fun BehaviourContext.onDice(
includeFilterByChatInSubScenario: Boolean = true, includeFilterByChatInBehaviourSubContext: Boolean = true,
additionalFilter: (suspend (ContentMessage<DiceContent>) -> Boolean)? = null, additionalFilter: (suspend (ContentMessage<DiceContent>) -> Boolean)? = null,
scenarioReceiver: ScenarioAndTypeReceiver<Unit, ContentMessage<DiceContent>> scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ContentMessage<DiceContent>>
) = onContent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) ) = onContent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
suspend fun Scenario.onGame( suspend fun BehaviourContext.onGame(
includeFilterByChatInSubScenario: Boolean = true, includeFilterByChatInBehaviourSubContext: Boolean = true,
additionalFilter: (suspend (ContentMessage<GameContent>) -> Boolean)? = null, additionalFilter: (suspend (ContentMessage<GameContent>) -> Boolean)? = null,
scenarioReceiver: ScenarioAndTypeReceiver<Unit, ContentMessage<GameContent>> scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ContentMessage<GameContent>>
) = onContent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) ) = onContent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
suspend fun Scenario.onLocation( suspend fun BehaviourContext.onLocation(
includeFilterByChatInSubScenario: Boolean = true, includeFilterByChatInBehaviourSubContext: Boolean = true,
additionalFilter: (suspend (ContentMessage<LocationContent>) -> Boolean)? = null, additionalFilter: (suspend (ContentMessage<LocationContent>) -> Boolean)? = null,
scenarioReceiver: ScenarioAndTypeReceiver<Unit, ContentMessage<LocationContent>> scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ContentMessage<LocationContent>>
) = onContent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) ) = onContent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
suspend fun Scenario.onPoll( suspend fun BehaviourContext.onPoll(
includeFilterByChatInSubScenario: Boolean = true, includeFilterByChatInBehaviourSubContext: Boolean = true,
additionalFilter: (suspend (ContentMessage<PollContent>) -> Boolean)? = null, additionalFilter: (suspend (ContentMessage<PollContent>) -> Boolean)? = null,
scenarioReceiver: ScenarioAndTypeReceiver<Unit, ContentMessage<PollContent>> scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ContentMessage<PollContent>>
) = onContent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) ) = onContent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
suspend fun Scenario.onText( suspend fun BehaviourContext.onText(
includeFilterByChatInSubScenario: Boolean = true, includeFilterByChatInBehaviourSubContext: Boolean = true,
additionalFilter: (suspend (ContentMessage<TextContent>) -> Boolean)? = null, additionalFilter: (suspend (ContentMessage<TextContent>) -> Boolean)? = null,
scenarioReceiver: ScenarioAndTypeReceiver<Unit, ContentMessage<TextContent>> scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ContentMessage<TextContent>>
) = onContent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) ) = onContent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
suspend fun Scenario.onVenue( suspend fun BehaviourContext.onVenue(
includeFilterByChatInSubScenario: Boolean = true, includeFilterByChatInBehaviourSubContext: Boolean = true,
additionalFilter: (suspend (ContentMessage<VenueContent>) -> Boolean)? = null, additionalFilter: (suspend (ContentMessage<VenueContent>) -> Boolean)? = null,
scenarioReceiver: ScenarioAndTypeReceiver<Unit, ContentMessage<VenueContent>> scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ContentMessage<VenueContent>>
) = onContent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) ) = onContent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
suspend fun Scenario.onAudioMediaGroup( suspend fun BehaviourContext.onAudioMediaGroup(
includeFilterByChatInSubScenario: Boolean = true, includeFilterByChatInBehaviourSubContext: Boolean = true,
additionalFilter: (suspend (ContentMessage<AudioMediaGroupContent>) -> Boolean)? = null, additionalFilter: (suspend (ContentMessage<AudioMediaGroupContent>) -> Boolean)? = null,
scenarioReceiver: ScenarioAndTypeReceiver<Unit, ContentMessage<AudioMediaGroupContent>> scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ContentMessage<AudioMediaGroupContent>>
) = onContent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) ) = onContent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
suspend fun Scenario.onDocumentMediaGroup( suspend fun BehaviourContext.onDocumentMediaGroup(
includeFilterByChatInSubScenario: Boolean = true, includeFilterByChatInBehaviourSubContext: Boolean = true,
additionalFilter: (suspend (ContentMessage<DocumentMediaGroupContent>) -> Boolean)? = null, additionalFilter: (suspend (ContentMessage<DocumentMediaGroupContent>) -> Boolean)? = null,
scenarioReceiver: ScenarioAndTypeReceiver<Unit, ContentMessage<DocumentMediaGroupContent>> scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ContentMessage<DocumentMediaGroupContent>>
) = onContent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) ) = onContent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
suspend fun Scenario.onMediaCollection( suspend fun BehaviourContext.onMediaCollection(
includeFilterByChatInSubScenario: Boolean = true, includeFilterByChatInBehaviourSubContext: Boolean = true,
additionalFilter: (suspend (ContentMessage<MediaCollectionContent<TelegramMediaFile>>) -> Boolean)? = null, additionalFilter: (suspend (ContentMessage<MediaCollectionContent<TelegramMediaFile>>) -> Boolean)? = null,
scenarioReceiver: ScenarioAndTypeReceiver<Unit, ContentMessage<MediaCollectionContent<TelegramMediaFile>>> scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ContentMessage<MediaCollectionContent<TelegramMediaFile>>>
) = onContent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) ) = onContent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
suspend fun Scenario.onMedia( suspend fun BehaviourContext.onMedia(
includeFilterByChatInSubScenario: Boolean = true, includeFilterByChatInBehaviourSubContext: Boolean = true,
additionalFilter: (suspend (ContentMessage<MediaContent>) -> Boolean)? = null, additionalFilter: (suspend (ContentMessage<MediaContent>) -> Boolean)? = null,
scenarioReceiver: ScenarioAndTypeReceiver<Unit, ContentMessage<MediaContent>> scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ContentMessage<MediaContent>>
) = onContent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) ) = onContent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
suspend fun Scenario.onMediaGroup( suspend fun BehaviourContext.onMediaGroup(
includeFilterByChatInSubScenario: Boolean = true, includeFilterByChatInBehaviourSubContext: Boolean = true,
additionalFilter: (suspend (ContentMessage<MediaGroupContent>) -> Boolean)? = null, additionalFilter: (suspend (ContentMessage<MediaGroupContent>) -> Boolean)? = null,
scenarioReceiver: ScenarioAndTypeReceiver<Unit, ContentMessage<MediaGroupContent>> scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ContentMessage<MediaGroupContent>>
) = onContent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) ) = onContent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
suspend fun Scenario.onVisualMediaGroup( suspend fun BehaviourContext.onVisualMediaGroup(
includeFilterByChatInSubScenario: Boolean = true, includeFilterByChatInBehaviourSubContext: Boolean = true,
additionalFilter: (suspend (ContentMessage<VisualMediaGroupContent>) -> Boolean)? = null, additionalFilter: (suspend (ContentMessage<VisualMediaGroupContent>) -> Boolean)? = null,
scenarioReceiver: ScenarioAndTypeReceiver<Unit, ContentMessage<VisualMediaGroupContent>> scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ContentMessage<VisualMediaGroupContent>>
) = onContent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) ) = onContent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
suspend fun Scenario.onAnimation( suspend fun BehaviourContext.onAnimation(
includeFilterByChatInSubScenario: Boolean = true, includeFilterByChatInBehaviourSubContext: Boolean = true,
additionalFilter: (suspend (ContentMessage<AnimationContent>) -> Boolean)? = null, additionalFilter: (suspend (ContentMessage<AnimationContent>) -> Boolean)? = null,
scenarioReceiver: ScenarioAndTypeReceiver<Unit, ContentMessage<AnimationContent>> scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ContentMessage<AnimationContent>>
) = onContent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) ) = onContent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
suspend fun Scenario.onAudio( suspend fun BehaviourContext.onAudio(
includeFilterByChatInSubScenario: Boolean = true, includeFilterByChatInBehaviourSubContext: Boolean = true,
additionalFilter: (suspend (ContentMessage<AudioContent>) -> Boolean)? = null, additionalFilter: (suspend (ContentMessage<AudioContent>) -> Boolean)? = null,
scenarioReceiver: ScenarioAndTypeReceiver<Unit, ContentMessage<AudioContent>> scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ContentMessage<AudioContent>>
) = onContent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) ) = onContent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
suspend fun Scenario.onDocument( suspend fun BehaviourContext.onDocument(
includeFilterByChatInSubScenario: Boolean = true, includeFilterByChatInBehaviourSubContext: Boolean = true,
additionalFilter: (suspend (ContentMessage<DocumentContent>) -> Boolean)? = null, additionalFilter: (suspend (ContentMessage<DocumentContent>) -> Boolean)? = null,
scenarioReceiver: ScenarioAndTypeReceiver<Unit, ContentMessage<DocumentContent>> scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ContentMessage<DocumentContent>>
) = onContent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) ) = onContent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
suspend fun Scenario.onPhoto( suspend fun BehaviourContext.onPhoto(
includeFilterByChatInSubScenario: Boolean = true, includeFilterByChatInBehaviourSubContext: Boolean = true,
additionalFilter: (suspend (ContentMessage<PhotoContent>) -> Boolean)? = null, additionalFilter: (suspend (ContentMessage<PhotoContent>) -> Boolean)? = null,
scenarioReceiver: ScenarioAndTypeReceiver<Unit, ContentMessage<PhotoContent>> scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ContentMessage<PhotoContent>>
) = onContent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) ) = onContent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
suspend fun Scenario.onSticker( suspend fun BehaviourContext.onSticker(
includeFilterByChatInSubScenario: Boolean = true, includeFilterByChatInBehaviourSubContext: Boolean = true,
additionalFilter: (suspend (ContentMessage<StickerContent>) -> Boolean)? = null, additionalFilter: (suspend (ContentMessage<StickerContent>) -> Boolean)? = null,
scenarioReceiver: ScenarioAndTypeReceiver<Unit, ContentMessage<StickerContent>> scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ContentMessage<StickerContent>>
) = onContent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) ) = onContent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
suspend fun Scenario.onVideo( suspend fun BehaviourContext.onVideo(
includeFilterByChatInSubScenario: Boolean = true, includeFilterByChatInBehaviourSubContext: Boolean = true,
additionalFilter: (suspend (ContentMessage<VideoContent>) -> Boolean)? = null, additionalFilter: (suspend (ContentMessage<VideoContent>) -> Boolean)? = null,
scenarioReceiver: ScenarioAndTypeReceiver<Unit, ContentMessage<VideoContent>> scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ContentMessage<VideoContent>>
) = onContent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) ) = onContent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
suspend fun Scenario.onVideoNote( suspend fun BehaviourContext.onVideoNote(
includeFilterByChatInSubScenario: Boolean = true, includeFilterByChatInBehaviourSubContext: Boolean = true,
additionalFilter: (suspend (ContentMessage<VideoNoteContent>) -> Boolean)? = null, additionalFilter: (suspend (ContentMessage<VideoNoteContent>) -> Boolean)? = null,
scenarioReceiver: ScenarioAndTypeReceiver<Unit, ContentMessage<VideoNoteContent>> scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ContentMessage<VideoNoteContent>>
) = onContent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) ) = onContent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
suspend fun Scenario.onVoice( suspend fun BehaviourContext.onVoice(
includeFilterByChatInSubScenario: Boolean = true, includeFilterByChatInBehaviourSubContext: Boolean = true,
additionalFilter: (suspend (ContentMessage<VoiceContent>) -> Boolean)? = null, additionalFilter: (suspend (ContentMessage<VoiceContent>) -> Boolean)? = null,
scenarioReceiver: ScenarioAndTypeReceiver<Unit, ContentMessage<VoiceContent>> scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ContentMessage<VoiceContent>>
) = onContent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) ) = onContent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
suspend fun Scenario.onInvoice( suspend fun BehaviourContext.onInvoice(
includeFilterByChatInSubScenario: Boolean = true, includeFilterByChatInBehaviourSubContext: Boolean = true,
additionalFilter: (suspend (ContentMessage<InvoiceContent>) -> Boolean)? = null, additionalFilter: (suspend (ContentMessage<InvoiceContent>) -> Boolean)? = null,
scenarioReceiver: ScenarioAndTypeReceiver<Unit, ContentMessage<InvoiceContent>> scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ContentMessage<InvoiceContent>>
) = onContent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) ) = onContent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)

View File

@ -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.safelyWithoutExceptions
import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions
import dev.inmo.tgbotapi.extensions.steps.Scenario import dev.inmo.tgbotapi.extensions.steps.BehaviourContext
import dev.inmo.tgbotapi.extensions.steps.ScenarioAndTypeReceiver import dev.inmo.tgbotapi.extensions.steps.BehaviourContextAndTypeReceiver
import dev.inmo.tgbotapi.extensions.steps.expectations.expectFlow import dev.inmo.tgbotapi.extensions.steps.expectations.expectFlow
import dev.inmo.tgbotapi.extensions.utils.* import dev.inmo.tgbotapi.extensions.utils.*
import dev.inmo.tgbotapi.extensions.utils.extensions.sourceChat 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.*
import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.* import dev.inmo.tgbotapi.types.message.ChatEvents.abstracts.*
import dev.inmo.tgbotapi.types.message.abstracts.ChatEventMessage 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.*
import dev.inmo.tgbotapi.types.message.content.abstracts.* import dev.inmo.tgbotapi.types.message.content.abstracts.*
import dev.inmo.tgbotapi.types.message.content.media.* import dev.inmo.tgbotapi.types.message.content.media.*
import dev.inmo.tgbotapi.types.message.payments.InvoiceContent
import dev.inmo.tgbotapi.updateshandlers.FlowsUpdatesFilter import dev.inmo.tgbotapi.updateshandlers.FlowsUpdatesFilter
import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.filter
internal suspend inline fun <reified T : ChatEvent> Scenario.onEvent( internal suspend inline fun <reified T : ChatEvent> BehaviourContext.onEvent(
includeFilterByChatInSubScenario: Boolean = true, includeFilterByChatInBehaviourSubContext: Boolean = true,
noinline additionalFilter: (suspend (ChatEventMessage<T>) -> Boolean)? = null, noinline additionalFilter: (suspend (ChatEventMessage<T>) -> Boolean)? = null,
noinline scenarioReceiver: ScenarioAndTypeReceiver<Unit, ChatEventMessage<T>> noinline scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<T>>
) = flowsUpdatesFilter.expectFlow(bot) { ) = flowsUpdatesFilter.expectFlow(bot) {
it.asMessageUpdate() ?.data ?.asChatEventMessage() ?.let { message -> it.asMessageUpdate() ?.data ?.asChatEventMessage() ?.let { message ->
if (message.chatEvent is T) { if (message.chatEvent is T) {
@ -34,14 +31,14 @@ internal suspend inline fun <reified T : ChatEvent> Scenario.onEvent(
} }
} }
}.subscribeSafelyWithoutExceptions(scope) { triggerMessage -> }.subscribeSafelyWithoutExceptions(scope) { triggerMessage ->
val (jobToCancel, scenario) = if (includeFilterByChatInSubScenario) { val (jobToCancel, scenario) = if (includeFilterByChatInBehaviourSubContext) {
val subFilter = FlowsUpdatesFilter() val subFilter = FlowsUpdatesFilter()
val subScenario = copy(flowsUpdatesFilter = subFilter) val subBehaviourContext = copy(flowsUpdatesFilter = subFilter)
flowsUpdatesFilter.allUpdatesFlow.filter { flowsUpdatesFilter.allUpdatesFlow.filter {
val chat = it.sourceChat() ?: return@filter false val chat = it.sourceChat() ?: return@filter false
chat.id.chatId == triggerMessage.chat.id.chatId chat.id.chatId == triggerMessage.chat.id.chatId
}.subscribeSafelyWithoutExceptions(scope, subFilter.asUpdateReceiver) to subScenario }.subscribeSafelyWithoutExceptions(scope, subFilter.asUpdateReceiver) to subBehaviourContext
} else { } else {
null to this null to this
} }
@ -49,79 +46,79 @@ internal suspend inline fun <reified T : ChatEvent> Scenario.onEvent(
jobToCancel ?.cancel() jobToCancel ?.cancel()
} }
suspend fun Scenario.onChannelEvent( suspend fun BehaviourContext.onChannelEvent(
includeFilterByChatInSubScenario: Boolean = true, includeFilterByChatInBehaviourSubContext: Boolean = true,
additionalFilter: (suspend (ChatEventMessage<ChannelEvent>) -> Boolean)? = null, additionalFilter: (suspend (ChatEventMessage<ChannelEvent>) -> Boolean)? = null,
scenarioReceiver: ScenarioAndTypeReceiver<Unit, ChatEventMessage<ChannelEvent>> scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<ChannelEvent>>
) = onEvent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) ) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
suspend fun Scenario.onChatEvent( suspend fun BehaviourContext.onChatEvent(
includeFilterByChatInSubScenario: Boolean = true, includeFilterByChatInBehaviourSubContext: Boolean = true,
additionalFilter: (suspend (ChatEventMessage<ChatEvent>) -> Boolean)? = null, additionalFilter: (suspend (ChatEventMessage<ChatEvent>) -> Boolean)? = null,
scenarioReceiver: ScenarioAndTypeReceiver<Unit, ChatEventMessage<ChatEvent>> scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<ChatEvent>>
) = onEvent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) ) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
suspend fun Scenario.onCommonEvent( suspend fun BehaviourContext.onCommonEvent(
includeFilterByChatInSubScenario: Boolean = true, includeFilterByChatInBehaviourSubContext: Boolean = true,
additionalFilter: (suspend (ChatEventMessage<CommonEvent>) -> Boolean)? = null, additionalFilter: (suspend (ChatEventMessage<CommonEvent>) -> Boolean)? = null,
scenarioReceiver: ScenarioAndTypeReceiver<Unit, ChatEventMessage<CommonEvent>> scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<CommonEvent>>
) = onEvent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) ) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
suspend fun Scenario.onGroupEvent( suspend fun BehaviourContext.onGroupEvent(
includeFilterByChatInSubScenario: Boolean = true, includeFilterByChatInBehaviourSubContext: Boolean = true,
additionalFilter: (suspend (ChatEventMessage<GroupEvent>) -> Boolean)? = null, additionalFilter: (suspend (ChatEventMessage<GroupEvent>) -> Boolean)? = null,
scenarioReceiver: ScenarioAndTypeReceiver<Unit, ChatEventMessage<GroupEvent>> scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<GroupEvent>>
) = onEvent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) ) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
suspend fun Scenario.onSupergroupEvent( suspend fun BehaviourContext.onSupergroupEvent(
includeFilterByChatInSubScenario: Boolean = true, includeFilterByChatInBehaviourSubContext: Boolean = true,
additionalFilter: (suspend (ChatEventMessage<SupergroupEvent>) -> Boolean)? = null, additionalFilter: (suspend (ChatEventMessage<SupergroupEvent>) -> Boolean)? = null,
scenarioReceiver: ScenarioAndTypeReceiver<Unit, ChatEventMessage<SupergroupEvent>> scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<SupergroupEvent>>
) = onEvent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) ) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
suspend fun Scenario.onChannelChatCreated( suspend fun BehaviourContext.onChannelChatCreated(
includeFilterByChatInSubScenario: Boolean = true, includeFilterByChatInBehaviourSubContext: Boolean = true,
additionalFilter: (suspend (ChatEventMessage<ChannelChatCreated>) -> Boolean)? = null, additionalFilter: (suspend (ChatEventMessage<ChannelChatCreated>) -> Boolean)? = null,
scenarioReceiver: ScenarioAndTypeReceiver<Unit, ChatEventMessage<ChannelChatCreated>> scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<ChannelChatCreated>>
) = onEvent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) ) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
suspend fun Scenario.onDeleteChatPhoto( suspend fun BehaviourContext.onDeleteChatPhoto(
includeFilterByChatInSubScenario: Boolean = true, includeFilterByChatInBehaviourSubContext: Boolean = true,
additionalFilter: (suspend (ChatEventMessage<DeleteChatPhoto>) -> Boolean)? = null, additionalFilter: (suspend (ChatEventMessage<DeleteChatPhoto>) -> Boolean)? = null,
scenarioReceiver: ScenarioAndTypeReceiver<Unit, ChatEventMessage<DeleteChatPhoto>> scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<DeleteChatPhoto>>
) = onEvent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) ) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
suspend fun Scenario.onGroupChatCreated( suspend fun BehaviourContext.onGroupChatCreated(
includeFilterByChatInSubScenario: Boolean = true, includeFilterByChatInBehaviourSubContext: Boolean = true,
additionalFilter: (suspend (ChatEventMessage<GroupChatCreated>) -> Boolean)? = null, additionalFilter: (suspend (ChatEventMessage<GroupChatCreated>) -> Boolean)? = null,
scenarioReceiver: ScenarioAndTypeReceiver<Unit, ChatEventMessage<GroupChatCreated>> scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<GroupChatCreated>>
) = onEvent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) ) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
suspend fun Scenario.onLeftChatMember( suspend fun BehaviourContext.onLeftChatMember(
includeFilterByChatInSubScenario: Boolean = true, includeFilterByChatInBehaviourSubContext: Boolean = true,
additionalFilter: (suspend (ChatEventMessage<LeftChatMember>) -> Boolean)? = null, additionalFilter: (suspend (ChatEventMessage<LeftChatMember>) -> Boolean)? = null,
scenarioReceiver: ScenarioAndTypeReceiver<Unit, ChatEventMessage<LeftChatMember>> scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<LeftChatMember>>
) = onEvent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) ) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
suspend fun Scenario.onNewChatMembers( suspend fun BehaviourContext.onNewChatMembers(
includeFilterByChatInSubScenario: Boolean = true, includeFilterByChatInBehaviourSubContext: Boolean = true,
additionalFilter: (suspend (ChatEventMessage<NewChatMembers>) -> Boolean)? = null, additionalFilter: (suspend (ChatEventMessage<NewChatMembers>) -> Boolean)? = null,
scenarioReceiver: ScenarioAndTypeReceiver<Unit, ChatEventMessage<NewChatMembers>> scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<NewChatMembers>>
) = onEvent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) ) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
suspend fun Scenario.onNewChatPhoto( suspend fun BehaviourContext.onNewChatPhoto(
includeFilterByChatInSubScenario: Boolean = true, includeFilterByChatInBehaviourSubContext: Boolean = true,
additionalFilter: (suspend (ChatEventMessage<NewChatPhoto>) -> Boolean)? = null, additionalFilter: (suspend (ChatEventMessage<NewChatPhoto>) -> Boolean)? = null,
scenarioReceiver: ScenarioAndTypeReceiver<Unit, ChatEventMessage<NewChatPhoto>> scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<NewChatPhoto>>
) = onEvent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) ) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
suspend fun Scenario.onNewChatTitle( suspend fun BehaviourContext.onNewChatTitle(
includeFilterByChatInSubScenario: Boolean = true, includeFilterByChatInBehaviourSubContext: Boolean = true,
additionalFilter: (suspend (ChatEventMessage<NewChatTitle>) -> Boolean)? = null, additionalFilter: (suspend (ChatEventMessage<NewChatTitle>) -> Boolean)? = null,
scenarioReceiver: ScenarioAndTypeReceiver<Unit, ChatEventMessage<NewChatTitle>> scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<NewChatTitle>>
) = onEvent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) ) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
suspend fun Scenario.onPinnedMessage( suspend fun BehaviourContext.onPinnedMessage(
includeFilterByChatInSubScenario: Boolean = true, includeFilterByChatInBehaviourSubContext: Boolean = true,
additionalFilter: (suspend (ChatEventMessage<PinnedMessage>) -> Boolean)? = null, additionalFilter: (suspend (ChatEventMessage<PinnedMessage>) -> Boolean)? = null,
scenarioReceiver: ScenarioAndTypeReceiver<Unit, ChatEventMessage<PinnedMessage>> scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<PinnedMessage>>
) = onEvent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) ) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
suspend fun Scenario.onProximityAlertTriggered( suspend fun BehaviourContext.onProximityAlertTriggered(
includeFilterByChatInSubScenario: Boolean = true, includeFilterByChatInBehaviourSubContext: Boolean = true,
additionalFilter: (suspend (ChatEventMessage<ProximityAlertTriggered>) -> Boolean)? = null, additionalFilter: (suspend (ChatEventMessage<ProximityAlertTriggered>) -> Boolean)? = null,
scenarioReceiver: ScenarioAndTypeReceiver<Unit, ChatEventMessage<ProximityAlertTriggered>> scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<ProximityAlertTriggered>>
) = onEvent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) ) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)
suspend fun Scenario.onSupergroupChatCreated( suspend fun BehaviourContext.onSupergroupChatCreated(
includeFilterByChatInSubScenario: Boolean = true, includeFilterByChatInBehaviourSubContext: Boolean = true,
additionalFilter: (suspend (ChatEventMessage<SupergroupChatCreated>) -> Boolean)? = null, additionalFilter: (suspend (ChatEventMessage<SupergroupChatCreated>) -> Boolean)? = null,
scenarioReceiver: ScenarioAndTypeReceiver<Unit, ChatEventMessage<SupergroupChatCreated>> scenarioReceiver: BehaviourContextAndTypeReceiver<Unit, ChatEventMessage<SupergroupChatCreated>>
) = onEvent(includeFilterByChatInSubScenario, additionalFilter, scenarioReceiver) ) = onEvent(includeFilterByChatInBehaviourSubContext, additionalFilter, scenarioReceiver)