From b4c41d7dd899acb9951f2eb3e476bf009cd01eb2 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Sun, 24 Apr 2022 18:39:07 +0600 Subject: [PATCH 1/8] start 0.38.15 --- CHANGELOG.md | 2 ++ gradle.properties | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 25ff0bf2be..848bb125ab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ # TelegramBotAPI changelog +## 0.38.15 + ## 0.38.14 __This update contains including of [Telegram Bot API 6.0](https://core.telegram.org/bots/api-changelog#april-16-2022)__ diff --git a/gradle.properties b/gradle.properties index 6dc6597a22..89048daa48 100644 --- a/gradle.properties +++ b/gradle.properties @@ -20,6 +20,6 @@ javax_activation_version=1.1.1 dokka_version=1.6.10 library_group=dev.inmo -library_version=0.38.14 +library_version=0.38.15 github_release_plugin_version=2.3.7 From 6ebf4ff65212fd18a0f19be8294e890e9d3cb4a8 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Mon, 25 Apr 2022 21:19:08 +0600 Subject: [PATCH 2/8] fixes in MessageContent#serializationModule --- CHANGELOG.md | 3 +++ .../tgbotapi/extensions/behaviour_builder/BehaviourContext.kt | 2 +- .../tgbotapi/types/message/content/abstracts/MessageContent.kt | 3 +-- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 848bb125ab..5cd0f960b7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ ## 0.38.15 +* `Core`: + * Fixes in `MessageContent#serializationModule` + ## 0.38.14 __This update contains including of [Telegram Bot API 6.0](https://core.telegram.org/bots/api-changelog#april-16-2022)__ diff --git a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/BehaviourContext.kt b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/BehaviourContext.kt index 6d99c2c291..2426853a51 100644 --- a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/BehaviourContext.kt +++ b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/BehaviourContext.kt @@ -26,7 +26,7 @@ internal inline fun CustomBehaviourContextAndTwoTypesReceiver = { invoke(this, i1, it) } /** - * This class contains all necessary tools for work with bots and especially for [buildBehaviour] + * This class contains all necessary tools for work with bots and especially [buildBehaviour] * * @see DefaultBehaviourContext */ diff --git a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/abstracts/MessageContent.kt b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/abstracts/MessageContent.kt index ed5545ffe5..0c5b7e8a89 100644 --- a/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/abstracts/MessageContent.kt +++ b/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/message/content/abstracts/MessageContent.kt @@ -20,8 +20,7 @@ interface MessageContent: ResendableContent { subclass(DiceContent::class) subclass(TextContent::class) - subclass(LiveLocationContent::class) - subclass(StaticLocationContent::class) + subclass(LocationContent::class, LocationContentSerializer) subclass(PhotoContent::class) subclass(VideoContent::class) From 048f2444498ed65fd21909b875bcb029b652a6b4 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Mon, 25 Apr 2022 21:19:49 +0600 Subject: [PATCH 3/8] update microutils --- CHANGELOG.md | 3 +++ gradle.properties | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5cd0f960b7..be46412261 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ ## 0.38.15 +* `Common`: + * `Version`: + * `MicroUtils`: `0.9.20` -> `0.9.24` * `Core`: * Fixes in `MessageContent#serializationModule` diff --git a/gradle.properties b/gradle.properties index 89048daa48..b7a490f218 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,7 +12,7 @@ klock_version=2.7.0 uuid_version=0.4.0 ktor_version=1.6.8 -micro_utils_version=0.9.20 +micro_utils_version=0.9.24 javax_activation_version=1.1.1 From 61d3131bf296948d42db5ac5cd06062e3d5f4b7b Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Mon, 25 Apr 2022 21:58:25 +0600 Subject: [PATCH 4/8] update micro_utils --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index b7a490f218..ec7f59c1b4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,7 +12,7 @@ klock_version=2.7.0 uuid_version=0.4.0 ktor_version=1.6.8 -micro_utils_version=0.9.24 +micro_utils_version=0.9.25 javax_activation_version=1.1.1 From ab5937449c716a96241150cf9dbaaf580ed4757e Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Mon, 25 Apr 2022 22:28:35 +0600 Subject: [PATCH 5/8] add telegram update handler --- .../BehaviourContextWithFSM.kt | 5 +- .../BehaviourContextWithFSMBuilder.kt | 14 ++++- .../behaviour_builder/TelegramBotWithFSM.kt | 6 +++ tgbotapi.behaviour_builder/build.gradle | 1 + .../behaviour_builder/BehaviourBuilders.kt | 8 ++- .../behaviour_builder/BehaviourContext.kt | 27 +++++++--- .../behaviour_builder/TelegramBot.kt | 6 +++ .../DefaultTelegramHandlersRegistrar.kt | 51 +++++++++++++++++++ .../handlers/TelegramHandlersRegistrar.kt | 9 ++++ .../utils/handlers/TelegramUpdateHandler.kt | 6 +++ 10 files changed, 122 insertions(+), 11 deletions(-) create mode 100644 tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/utils/handlers/DefaultTelegramHandlersRegistrar.kt create mode 100644 tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/utils/handlers/TelegramHandlersRegistrar.kt create mode 100644 tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/utils/handlers/TelegramUpdateHandler.kt diff --git a/tgbotapi.behaviour_builder.fsm/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/BehaviourContextWithFSM.kt b/tgbotapi.behaviour_builder.fsm/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/BehaviourContextWithFSM.kt index be5cdb8923..334a8b8f7b 100644 --- a/tgbotapi.behaviour_builder.fsm/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/BehaviourContextWithFSM.kt +++ b/tgbotapi.behaviour_builder.fsm/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/BehaviourContextWithFSM.kt @@ -6,6 +6,7 @@ import dev.inmo.micro_utils.fsm.common.* import dev.inmo.tgbotapi.bot.TelegramBot import dev.inmo.tgbotapi.types.update.abstracts.Update import dev.inmo.micro_utils.coroutines.accumulatorFlow +import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.handlers.TelegramHandlersRegistrar import kotlinx.coroutines.* import kotlinx.coroutines.channels.BufferOverflow import kotlinx.coroutines.flow.* @@ -36,6 +37,7 @@ interface BehaviourContextWithFSM : BehaviourContext, StatesMachine?, + telegramHandlersRegistrar: TelegramHandlersRegistrar, updatesFilter: BehaviourContextAndTypeReceiver? ): BehaviourContextWithFSM @@ -105,9 +107,10 @@ class DefaultBehaviourContextWithFSM( broadcastChannelsSize: Int, onBufferOverflow: BufferOverflow, upstreamUpdatesFlow: Flow?, + telegramHandlersRegistrar: TelegramHandlersRegistrar, updatesFilter: BehaviourContextAndTypeReceiver? ): BehaviourContextWithFSM = BehaviourContextWithFSM( - behaviourContext.copy(bot, scope, broadcastChannelsSize, onBufferOverflow, upstreamUpdatesFlow, updatesFilter), + behaviourContext.copy(bot, scope, broadcastChannelsSize, onBufferOverflow, upstreamUpdatesFlow, telegramHandlersRegistrar, updatesFilter), handlers, statesManager ) diff --git a/tgbotapi.behaviour_builder.fsm/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/BehaviourContextWithFSMBuilder.kt b/tgbotapi.behaviour_builder.fsm/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/BehaviourContextWithFSMBuilder.kt index 7723b81c70..1cedf2184f 100644 --- a/tgbotapi.behaviour_builder.fsm/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/BehaviourContextWithFSMBuilder.kt +++ b/tgbotapi.behaviour_builder.fsm/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/BehaviourContextWithFSMBuilder.kt @@ -5,6 +5,8 @@ import dev.inmo.micro_utils.fsm.common.* import dev.inmo.micro_utils.fsm.common.managers.DefaultStatesManager import dev.inmo.micro_utils.fsm.common.managers.InMemoryDefaultStatesManagerRepo import dev.inmo.tgbotapi.bot.TelegramBot +import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.handlers.DefaultTelegramHandlersRegistrar +import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.handlers.TelegramHandlersRegistrar import dev.inmo.tgbotapi.extensions.utils.updates.retrieving.longPolling import dev.inmo.tgbotapi.extensions.utils.updates.retrieving.startGettingOfUpdatesByLongPolling import dev.inmo.tgbotapi.types.update.abstracts.Update @@ -95,12 +97,14 @@ suspend fun TelegramBot.buildBehaviourWithFSM( defaultExceptionsHandler: ExceptionHandler? = null, statesManager: StatesManager = DefaultStatesManager(InMemoryDefaultStatesManagerRepo()), presetHandlers: MutableList> = mutableListOf(), + telegramHandlersRegistrar: TelegramHandlersRegistrar = DefaultTelegramHandlersRegistrar(), block: CustomBehaviourContextReceiver, Unit> ): BehaviourContextWithFSM = BehaviourContextWithFSMBuilder( DefaultBehaviourContext( this, defaultExceptionsHandler ?.let { scope + ContextSafelyExceptionHandler(it) } ?: scope, - upstreamUpdatesFlow = upstreamUpdatesFlow + upstreamUpdatesFlow = upstreamUpdatesFlow, + telegramHandlersRegistrar = telegramHandlersRegistrar ), statesManager, presetHandlers @@ -117,6 +121,7 @@ suspend fun TelegramBot.buildBehaviourWithFSMAndStartLongPolling( defaultExceptionsHandler: ExceptionHandler? = null, statesManager: StatesManager = DefaultStatesManager(InMemoryDefaultStatesManagerRepo()), presetHandlers: MutableList> = mutableListOf(), + telegramHandlersRegistrar: TelegramHandlersRegistrar = DefaultTelegramHandlersRegistrar(), block: CustomBehaviourContextReceiver, Unit> ): Pair, Job> = buildBehaviourWithFSM( upstreamUpdatesFlow, @@ -124,6 +129,7 @@ suspend fun TelegramBot.buildBehaviourWithFSMAndStartLongPolling( defaultExceptionsHandler, statesManager, presetHandlers, + telegramHandlersRegistrar, block ).run { this to scope.launch { @@ -157,12 +163,14 @@ suspend fun TelegramBot.buildBehaviourWithFSM( defaultExceptionsHandler: ExceptionHandler? = null, statesManager: StatesManager = DefaultStatesManager(InMemoryDefaultStatesManagerRepo()), presetHandlers: MutableList> = mutableListOf(), + telegramHandlersRegistrar: TelegramHandlersRegistrar = DefaultTelegramHandlersRegistrar(), block: CustomBehaviourContextReceiver, Unit> ): BehaviourContextWithFSM = BehaviourContextWithFSMBuilder( DefaultBehaviourContext( this, defaultExceptionsHandler ?.let { scope + ContextSafelyExceptionHandler(it) } ?: scope, - upstreamUpdatesFlow = flowUpdatesFilter.allUpdatesFlow + upstreamUpdatesFlow = flowUpdatesFilter.allUpdatesFlow, + telegramHandlersRegistrar = telegramHandlersRegistrar ), statesManager, presetHandlers @@ -185,6 +193,7 @@ suspend fun TelegramBot.buildBehaviourWithFSMAndStartLongPolling( defaultExceptionsHandler: ExceptionHandler? = null, statesManager: StatesManager = DefaultStatesManager(InMemoryDefaultStatesManagerRepo()), presetHandlers: MutableList> = mutableListOf(), + telegramHandlersRegistrar: TelegramHandlersRegistrar = DefaultTelegramHandlersRegistrar(), block: CustomBehaviourContextReceiver, Unit> ) = FlowsUpdatesFilter().let { buildBehaviourWithFSM( @@ -193,6 +202,7 @@ suspend fun TelegramBot.buildBehaviourWithFSMAndStartLongPolling( defaultExceptionsHandler, statesManager, presetHandlers, + telegramHandlersRegistrar, block ).run { start() diff --git a/tgbotapi.behaviour_builder.fsm/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/TelegramBotWithFSM.kt b/tgbotapi.behaviour_builder.fsm/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/TelegramBotWithFSM.kt index 0c5b881580..7c1ea560dc 100644 --- a/tgbotapi.behaviour_builder.fsm/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/TelegramBotWithFSM.kt +++ b/tgbotapi.behaviour_builder.fsm/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/TelegramBotWithFSM.kt @@ -8,6 +8,8 @@ import dev.inmo.micro_utils.fsm.common.managers.InMemoryDefaultStatesManagerRepo import dev.inmo.tgbotapi.bot.Ktor.KtorRequestsExecutorBuilder import dev.inmo.tgbotapi.bot.Ktor.telegramBot import dev.inmo.tgbotapi.bot.TelegramBot +import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.handlers.DefaultTelegramHandlersRegistrar +import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.handlers.TelegramHandlersRegistrar import dev.inmo.tgbotapi.extensions.utils.updates.retrieving.startGettingOfUpdatesByLongPolling import dev.inmo.tgbotapi.updateshandlers.FlowsUpdatesFilter import dev.inmo.tgbotapi.utils.telegramBotAPIDefaultUrl @@ -38,6 +40,7 @@ suspend fun telegramBotWithBehaviourAndFSM( defaultExceptionsHandler: ExceptionHandler? = null, statesManager: StatesManager = DefaultStatesManager(InMemoryDefaultStatesManagerRepo()), presetHandlers: MutableList> = mutableListOf(), + telegramHandlersRegistrar: TelegramHandlersRegistrar = DefaultTelegramHandlersRegistrar(), block: CustomBehaviourContextReceiver, Unit> ): TelegramBot = telegramBot( token, @@ -50,6 +53,7 @@ suspend fun telegramBotWithBehaviourAndFSM( defaultExceptionsHandler, statesManager, presetHandlers, + telegramHandlersRegistrar, block ) } @@ -73,6 +77,7 @@ suspend fun telegramBotWithBehaviourAndFSMAndStartLongPolling( defaultExceptionsHandler: ExceptionHandler? = null, statesManager: StatesManager = DefaultStatesManager(InMemoryDefaultStatesManagerRepo()), presetHandlers: MutableList> = mutableListOf(), + telegramHandlersRegistrar: TelegramHandlersRegistrar = DefaultTelegramHandlersRegistrar(), block: CustomBehaviourContextReceiver, Unit> ): Pair { return telegramBot( @@ -85,6 +90,7 @@ suspend fun telegramBotWithBehaviourAndFSMAndStartLongPolling( defaultExceptionsHandler, statesManager, presetHandlers, + telegramHandlersRegistrar, block ) } diff --git a/tgbotapi.behaviour_builder/build.gradle b/tgbotapi.behaviour_builder/build.gradle index 68224e8bc7..537da9052c 100644 --- a/tgbotapi.behaviour_builder/build.gradle +++ b/tgbotapi.behaviour_builder/build.gradle @@ -44,6 +44,7 @@ kotlin { dependencies { implementation kotlin('stdlib') api project(":tgbotapi.utils") + api "dev.inmo:micro_utils.handlers.common:$micro_utils_version" } } } diff --git a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/BehaviourBuilders.kt b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/BehaviourBuilders.kt index dd17203ef3..420f991320 100644 --- a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/BehaviourBuilders.kt +++ b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/BehaviourBuilders.kt @@ -3,6 +3,8 @@ package dev.inmo.tgbotapi.extensions.behaviour_builder import dev.inmo.micro_utils.coroutines.ContextSafelyExceptionHandler import dev.inmo.micro_utils.coroutines.ExceptionHandler import dev.inmo.tgbotapi.bot.TelegramBot +import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.handlers.DefaultTelegramHandlersRegistrar +import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.handlers.TelegramHandlersRegistrar import dev.inmo.tgbotapi.extensions.utils.updates.retrieving.longPolling import dev.inmo.tgbotapi.extensions.utils.updates.retrieving.startGettingOfUpdatesByLongPolling import dev.inmo.tgbotapi.updateshandlers.FlowsUpdatesFilter @@ -30,6 +32,7 @@ suspend fun TelegramBot.buildBehaviour( flowUpdatesFilter: FlowsUpdatesFilter = FlowsUpdatesFilter(), scope: CoroutineScope = defaultCoroutineScopeProvider(), defaultExceptionsHandler: ExceptionHandler? = null, + telegramHandlersRegistrar: TelegramHandlersRegistrar = DefaultTelegramHandlersRegistrar(), block: BehaviourContextReceiver ) { BehaviourContext( @@ -41,7 +44,8 @@ suspend fun TelegramBot.buildBehaviour( it + ContextSafelyExceptionHandler(defaultExceptionsHandler) } }, - flowUpdatesFilter + flowUpdatesFilter, + telegramHandlersRegistrar ).block() } @@ -57,12 +61,14 @@ suspend fun TelegramBot.buildBehaviour( suspend fun TelegramBot.buildBehaviourWithLongPolling( scope: CoroutineScope = defaultCoroutineScopeProvider(), defaultExceptionsHandler: ExceptionHandler? = null, + telegramHandlersRegistrar: TelegramHandlersRegistrar = DefaultTelegramHandlersRegistrar(), block: BehaviourContextReceiver ) = FlowsUpdatesFilter().let { buildBehaviour( it, scope, defaultExceptionsHandler, + telegramHandlersRegistrar, block ) longPolling( diff --git a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/BehaviourContext.kt b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/BehaviourContext.kt index 2426853a51..27630d47e2 100644 --- a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/BehaviourContext.kt +++ b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/BehaviourContext.kt @@ -4,9 +4,10 @@ package dev.inmo.tgbotapi.extensions.behaviour_builder import dev.inmo.micro_utils.coroutines.* import dev.inmo.tgbotapi.bot.TelegramBot +import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.handlers.DefaultTelegramHandlersRegistrar +import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.handlers.TelegramHandlersRegistrar import dev.inmo.tgbotapi.types.update.abstracts.Update import dev.inmo.tgbotapi.updateshandlers.* -import dev.inmo.tgbotapi.utils.RiskFeature import kotlinx.coroutines.* import kotlinx.coroutines.channels.BufferOverflow import kotlinx.coroutines.flow.* @@ -30,7 +31,7 @@ internal inline fun CustomBehaviourContextAndTwoTypesReceiver? = null, + telegramHandlersRegistrar: TelegramHandlersRegistrar = this.telegramHandlersRegistrar, updatesFilter: BehaviourContextAndTypeReceiver? = null ): BehaviourContext } @@ -60,11 +65,16 @@ interface BehaviourContext : FlowsUpdatesFilter, TelegramBot, CoroutineScope { class DefaultBehaviourContext( override val bot: TelegramBot, override val scope: CoroutineScope, + override val telegramHandlersRegistrar: TelegramHandlersRegistrar, broadcastChannelsSize: Int = 100, onBufferOverflow: BufferOverflow = BufferOverflow.SUSPEND, private val upstreamUpdatesFlow: Flow? = null, private val updatesFilter: BehaviourContextAndTypeReceiver? = null -) : AbstractFlowsUpdatesFilter(), TelegramBot by bot, CoroutineScope by scope, BehaviourContext { +) : AbstractFlowsUpdatesFilter(), + TelegramBot by bot, + CoroutineScope by scope, + TelegramHandlersRegistrar by telegramHandlersRegistrar, + BehaviourContext { private val additionalUpdatesSharedFlow = MutableSharedFlow(0, broadcastChannelsSize, onBufferOverflow) override val allUpdatesFlow: Flow = (additionalUpdatesSharedFlow.asSharedFlow()).let { @@ -89,22 +99,25 @@ class DefaultBehaviourContext( broadcastChannelsSize: Int, onBufferOverflow: BufferOverflow, upstreamUpdatesFlow: Flow?, + telegramHandlersRegistrar: TelegramHandlersRegistrar, updatesFilter: BehaviourContextAndTypeReceiver? - ): BehaviourContext = DefaultBehaviourContext(bot, scope, broadcastChannelsSize, onBufferOverflow, upstreamUpdatesFlow, updatesFilter) + ): BehaviourContext = DefaultBehaviourContext(bot, scope, telegramHandlersRegistrar, broadcastChannelsSize, onBufferOverflow, upstreamUpdatesFlow, updatesFilter) } fun BehaviourContext( bot: TelegramBot, scope: CoroutineScope, - flowsUpdatesFilter: FlowsUpdatesFilter = FlowsUpdatesFilter() -) = DefaultBehaviourContext(bot, scope, upstreamUpdatesFlow = flowsUpdatesFilter.allUpdatesFlow) + flowsUpdatesFilter: FlowsUpdatesFilter = FlowsUpdatesFilter(), + telegramHandlersRegistrar: TelegramHandlersRegistrar = DefaultTelegramHandlersRegistrar(), +) = DefaultBehaviourContext(bot, scope, telegramHandlersRegistrar, upstreamUpdatesFlow = flowsUpdatesFilter.allUpdatesFlow) inline fun BehaviourContext( bot: TelegramBot, scope: CoroutineScope, flowsUpdatesFilter: FlowsUpdatesFilter = FlowsUpdatesFilter(), + telegramHandlersRegistrar: TelegramHandlersRegistrar = DefaultTelegramHandlersRegistrar(), crossinline block: BehaviourContext.() -> T -) = DefaultBehaviourContext(bot, scope, upstreamUpdatesFlow = flowsUpdatesFilter.allUpdatesFlow).run(block) +) = DefaultBehaviourContext(bot, scope, telegramHandlersRegistrar, upstreamUpdatesFlow = flowsUpdatesFilter.allUpdatesFlow).run(block) /** * Creates new one [BehaviourContext], adding subsequent [FlowsUpdatesFilter] in case [updatesFilter] is provided and diff --git a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/TelegramBot.kt b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/TelegramBot.kt index 6ab989cd08..cfaeebcf27 100644 --- a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/TelegramBot.kt +++ b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/TelegramBot.kt @@ -4,6 +4,8 @@ import dev.inmo.micro_utils.coroutines.ExceptionHandler import dev.inmo.tgbotapi.bot.Ktor.KtorRequestsExecutorBuilder import dev.inmo.tgbotapi.bot.Ktor.telegramBot import dev.inmo.tgbotapi.bot.TelegramBot +import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.handlers.DefaultTelegramHandlersRegistrar +import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.handlers.TelegramHandlersRegistrar import dev.inmo.tgbotapi.extensions.utils.updates.retrieving.startGettingOfUpdatesByLongPolling import dev.inmo.tgbotapi.updateshandlers.FlowsUpdatesFilter import dev.inmo.tgbotapi.utils.telegramBotAPIDefaultUrl @@ -30,6 +32,7 @@ suspend fun telegramBotWithBehaviour( apiUrl: String = telegramBotAPIDefaultUrl, builder: KtorRequestsExecutorBuilder.() -> Unit = {}, defaultExceptionsHandler: ExceptionHandler? = null, + telegramHandlersRegistrar: TelegramHandlersRegistrar = DefaultTelegramHandlersRegistrar(), block: BehaviourContextReceiver ): TelegramBot = telegramBot( token, @@ -40,6 +43,7 @@ suspend fun telegramBotWithBehaviour( flowsUpdatesFilter, scope ?: CoroutineScope(coroutineContext), defaultExceptionsHandler, + telegramHandlersRegistrar, block ) } @@ -63,6 +67,7 @@ suspend fun telegramBotWithBehaviourAndLongPolling( apiUrl: String = telegramBotAPIDefaultUrl, builder: KtorRequestsExecutorBuilder.() -> Unit = {}, defaultExceptionsHandler: ExceptionHandler? = null, + telegramHandlersRegistrar: TelegramHandlersRegistrar = DefaultTelegramHandlersRegistrar(), block: BehaviourContextReceiver ): Pair { return telegramBot( @@ -73,6 +78,7 @@ suspend fun telegramBotWithBehaviourAndLongPolling( it to it.buildBehaviourWithLongPolling( scope ?: CoroutineScope(coroutineContext), defaultExceptionsHandler, + telegramHandlersRegistrar, block ) } diff --git a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/utils/handlers/DefaultTelegramHandlersRegistrar.kt b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/utils/handlers/DefaultTelegramHandlersRegistrar.kt new file mode 100644 index 0000000000..4081424dfc --- /dev/null +++ b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/utils/handlers/DefaultTelegramHandlersRegistrar.kt @@ -0,0 +1,51 @@ +package dev.inmo.tgbotapi.extensions.behaviour_builder.utils.handlers + +import dev.inmo.micro_utils.handlers.common.HandlersRegistrar +import dev.inmo.tgbotapi.types.update.abstracts.Update + +class DefaultTelegramHandlersRegistrar : TelegramUpdateHandler, TelegramHandlersRegistrar { + private val mainLayer = mutableListOf() + private val defaultsLayer = mutableListOf() + private var defaultHandler: TelegramUpdateHandler? = null + + private val handlersRegistrar = HandlersRegistrar( + listOf( + mainLayer, + defaultsLayer + ), + object : TelegramUpdateHandler { + override suspend fun check(data: Update): Boolean = defaultHandler ?.check(data) ?: false + override suspend fun handle(data: Update) { defaultHandler ?.handle(data) } + } + ) + + override suspend fun check(data: Update): Boolean { + return handlersRegistrar.check(data) + } + + override suspend fun handle(data: Update) { + handlersRegistrar.handle(data) + } + + override suspend fun includeHandler(handler: TelegramUpdateHandler) { + if (handler in mainLayer) { + return + } + mainLayer.add(handler) + } + + override suspend fun excludeHandler(handler: TelegramUpdateHandler) { + mainLayer.remove(handler) + } + + override suspend fun includeDefaultHandler(handler: TelegramUpdateHandler) { + if (handler in defaultsLayer) { + return + } + defaultsLayer.add(handler) + } + + override suspend fun excludeDefaultHandler(handler: TelegramUpdateHandler) { + defaultsLayer.remove(handler) + } +} diff --git a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/utils/handlers/TelegramHandlersRegistrar.kt b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/utils/handlers/TelegramHandlersRegistrar.kt new file mode 100644 index 0000000000..797b3e6477 --- /dev/null +++ b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/utils/handlers/TelegramHandlersRegistrar.kt @@ -0,0 +1,9 @@ +package dev.inmo.tgbotapi.extensions.behaviour_builder.utils.handlers + +interface TelegramHandlersRegistrar { + suspend fun includeHandler(handler: TelegramUpdateHandler) + suspend fun excludeHandler(handler: TelegramUpdateHandler) + + suspend fun includeDefaultHandler(handler: TelegramUpdateHandler) + suspend fun excludeDefaultHandler(handler: TelegramUpdateHandler) +} diff --git a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/utils/handlers/TelegramUpdateHandler.kt b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/utils/handlers/TelegramUpdateHandler.kt new file mode 100644 index 0000000000..41f34fca4b --- /dev/null +++ b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/utils/handlers/TelegramUpdateHandler.kt @@ -0,0 +1,6 @@ +package dev.inmo.tgbotapi.extensions.behaviour_builder.utils.handlers + +import dev.inmo.micro_utils.handlers.common.Handler +import dev.inmo.tgbotapi.types.update.abstracts.Update + +interface TelegramUpdateHandler : Handler From 6b977e67d03d75083294affb0b239fb7ff13c8f6 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Tue, 26 Apr 2022 13:05:56 +0600 Subject: [PATCH 6/8] Revert "add telegram update handler" This reverts commit ab5937449c716a96241150cf9dbaaf580ed4757e. --- .../BehaviourContextWithFSM.kt | 5 +- .../BehaviourContextWithFSMBuilder.kt | 14 +---- .../behaviour_builder/TelegramBotWithFSM.kt | 6 --- tgbotapi.behaviour_builder/build.gradle | 1 - .../behaviour_builder/BehaviourBuilders.kt | 8 +-- .../behaviour_builder/BehaviourContext.kt | 27 +++------- .../behaviour_builder/TelegramBot.kt | 6 --- .../DefaultTelegramHandlersRegistrar.kt | 51 ------------------- .../handlers/TelegramHandlersRegistrar.kt | 9 ---- .../utils/handlers/TelegramUpdateHandler.kt | 6 --- 10 files changed, 11 insertions(+), 122 deletions(-) delete mode 100644 tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/utils/handlers/DefaultTelegramHandlersRegistrar.kt delete mode 100644 tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/utils/handlers/TelegramHandlersRegistrar.kt delete mode 100644 tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/utils/handlers/TelegramUpdateHandler.kt diff --git a/tgbotapi.behaviour_builder.fsm/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/BehaviourContextWithFSM.kt b/tgbotapi.behaviour_builder.fsm/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/BehaviourContextWithFSM.kt index 334a8b8f7b..be5cdb8923 100644 --- a/tgbotapi.behaviour_builder.fsm/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/BehaviourContextWithFSM.kt +++ b/tgbotapi.behaviour_builder.fsm/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/BehaviourContextWithFSM.kt @@ -6,7 +6,6 @@ import dev.inmo.micro_utils.fsm.common.* import dev.inmo.tgbotapi.bot.TelegramBot import dev.inmo.tgbotapi.types.update.abstracts.Update import dev.inmo.micro_utils.coroutines.accumulatorFlow -import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.handlers.TelegramHandlersRegistrar import kotlinx.coroutines.* import kotlinx.coroutines.channels.BufferOverflow import kotlinx.coroutines.flow.* @@ -37,7 +36,6 @@ interface BehaviourContextWithFSM : BehaviourContext, StatesMachine?, - telegramHandlersRegistrar: TelegramHandlersRegistrar, updatesFilter: BehaviourContextAndTypeReceiver? ): BehaviourContextWithFSM @@ -107,10 +105,9 @@ class DefaultBehaviourContextWithFSM( broadcastChannelsSize: Int, onBufferOverflow: BufferOverflow, upstreamUpdatesFlow: Flow?, - telegramHandlersRegistrar: TelegramHandlersRegistrar, updatesFilter: BehaviourContextAndTypeReceiver? ): BehaviourContextWithFSM = BehaviourContextWithFSM( - behaviourContext.copy(bot, scope, broadcastChannelsSize, onBufferOverflow, upstreamUpdatesFlow, telegramHandlersRegistrar, updatesFilter), + behaviourContext.copy(bot, scope, broadcastChannelsSize, onBufferOverflow, upstreamUpdatesFlow, updatesFilter), handlers, statesManager ) diff --git a/tgbotapi.behaviour_builder.fsm/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/BehaviourContextWithFSMBuilder.kt b/tgbotapi.behaviour_builder.fsm/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/BehaviourContextWithFSMBuilder.kt index 1cedf2184f..7723b81c70 100644 --- a/tgbotapi.behaviour_builder.fsm/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/BehaviourContextWithFSMBuilder.kt +++ b/tgbotapi.behaviour_builder.fsm/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/BehaviourContextWithFSMBuilder.kt @@ -5,8 +5,6 @@ import dev.inmo.micro_utils.fsm.common.* import dev.inmo.micro_utils.fsm.common.managers.DefaultStatesManager import dev.inmo.micro_utils.fsm.common.managers.InMemoryDefaultStatesManagerRepo import dev.inmo.tgbotapi.bot.TelegramBot -import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.handlers.DefaultTelegramHandlersRegistrar -import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.handlers.TelegramHandlersRegistrar import dev.inmo.tgbotapi.extensions.utils.updates.retrieving.longPolling import dev.inmo.tgbotapi.extensions.utils.updates.retrieving.startGettingOfUpdatesByLongPolling import dev.inmo.tgbotapi.types.update.abstracts.Update @@ -97,14 +95,12 @@ suspend fun TelegramBot.buildBehaviourWithFSM( defaultExceptionsHandler: ExceptionHandler? = null, statesManager: StatesManager = DefaultStatesManager(InMemoryDefaultStatesManagerRepo()), presetHandlers: MutableList> = mutableListOf(), - telegramHandlersRegistrar: TelegramHandlersRegistrar = DefaultTelegramHandlersRegistrar(), block: CustomBehaviourContextReceiver, Unit> ): BehaviourContextWithFSM = BehaviourContextWithFSMBuilder( DefaultBehaviourContext( this, defaultExceptionsHandler ?.let { scope + ContextSafelyExceptionHandler(it) } ?: scope, - upstreamUpdatesFlow = upstreamUpdatesFlow, - telegramHandlersRegistrar = telegramHandlersRegistrar + upstreamUpdatesFlow = upstreamUpdatesFlow ), statesManager, presetHandlers @@ -121,7 +117,6 @@ suspend fun TelegramBot.buildBehaviourWithFSMAndStartLongPolling( defaultExceptionsHandler: ExceptionHandler? = null, statesManager: StatesManager = DefaultStatesManager(InMemoryDefaultStatesManagerRepo()), presetHandlers: MutableList> = mutableListOf(), - telegramHandlersRegistrar: TelegramHandlersRegistrar = DefaultTelegramHandlersRegistrar(), block: CustomBehaviourContextReceiver, Unit> ): Pair, Job> = buildBehaviourWithFSM( upstreamUpdatesFlow, @@ -129,7 +124,6 @@ suspend fun TelegramBot.buildBehaviourWithFSMAndStartLongPolling( defaultExceptionsHandler, statesManager, presetHandlers, - telegramHandlersRegistrar, block ).run { this to scope.launch { @@ -163,14 +157,12 @@ suspend fun TelegramBot.buildBehaviourWithFSM( defaultExceptionsHandler: ExceptionHandler? = null, statesManager: StatesManager = DefaultStatesManager(InMemoryDefaultStatesManagerRepo()), presetHandlers: MutableList> = mutableListOf(), - telegramHandlersRegistrar: TelegramHandlersRegistrar = DefaultTelegramHandlersRegistrar(), block: CustomBehaviourContextReceiver, Unit> ): BehaviourContextWithFSM = BehaviourContextWithFSMBuilder( DefaultBehaviourContext( this, defaultExceptionsHandler ?.let { scope + ContextSafelyExceptionHandler(it) } ?: scope, - upstreamUpdatesFlow = flowUpdatesFilter.allUpdatesFlow, - telegramHandlersRegistrar = telegramHandlersRegistrar + upstreamUpdatesFlow = flowUpdatesFilter.allUpdatesFlow ), statesManager, presetHandlers @@ -193,7 +185,6 @@ suspend fun TelegramBot.buildBehaviourWithFSMAndStartLongPolling( defaultExceptionsHandler: ExceptionHandler? = null, statesManager: StatesManager = DefaultStatesManager(InMemoryDefaultStatesManagerRepo()), presetHandlers: MutableList> = mutableListOf(), - telegramHandlersRegistrar: TelegramHandlersRegistrar = DefaultTelegramHandlersRegistrar(), block: CustomBehaviourContextReceiver, Unit> ) = FlowsUpdatesFilter().let { buildBehaviourWithFSM( @@ -202,7 +193,6 @@ suspend fun TelegramBot.buildBehaviourWithFSMAndStartLongPolling( defaultExceptionsHandler, statesManager, presetHandlers, - telegramHandlersRegistrar, block ).run { start() diff --git a/tgbotapi.behaviour_builder.fsm/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/TelegramBotWithFSM.kt b/tgbotapi.behaviour_builder.fsm/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/TelegramBotWithFSM.kt index 7c1ea560dc..0c5b881580 100644 --- a/tgbotapi.behaviour_builder.fsm/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/TelegramBotWithFSM.kt +++ b/tgbotapi.behaviour_builder.fsm/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/TelegramBotWithFSM.kt @@ -8,8 +8,6 @@ import dev.inmo.micro_utils.fsm.common.managers.InMemoryDefaultStatesManagerRepo import dev.inmo.tgbotapi.bot.Ktor.KtorRequestsExecutorBuilder import dev.inmo.tgbotapi.bot.Ktor.telegramBot import dev.inmo.tgbotapi.bot.TelegramBot -import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.handlers.DefaultTelegramHandlersRegistrar -import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.handlers.TelegramHandlersRegistrar import dev.inmo.tgbotapi.extensions.utils.updates.retrieving.startGettingOfUpdatesByLongPolling import dev.inmo.tgbotapi.updateshandlers.FlowsUpdatesFilter import dev.inmo.tgbotapi.utils.telegramBotAPIDefaultUrl @@ -40,7 +38,6 @@ suspend fun telegramBotWithBehaviourAndFSM( defaultExceptionsHandler: ExceptionHandler? = null, statesManager: StatesManager = DefaultStatesManager(InMemoryDefaultStatesManagerRepo()), presetHandlers: MutableList> = mutableListOf(), - telegramHandlersRegistrar: TelegramHandlersRegistrar = DefaultTelegramHandlersRegistrar(), block: CustomBehaviourContextReceiver, Unit> ): TelegramBot = telegramBot( token, @@ -53,7 +50,6 @@ suspend fun telegramBotWithBehaviourAndFSM( defaultExceptionsHandler, statesManager, presetHandlers, - telegramHandlersRegistrar, block ) } @@ -77,7 +73,6 @@ suspend fun telegramBotWithBehaviourAndFSMAndStartLongPolling( defaultExceptionsHandler: ExceptionHandler? = null, statesManager: StatesManager = DefaultStatesManager(InMemoryDefaultStatesManagerRepo()), presetHandlers: MutableList> = mutableListOf(), - telegramHandlersRegistrar: TelegramHandlersRegistrar = DefaultTelegramHandlersRegistrar(), block: CustomBehaviourContextReceiver, Unit> ): Pair { return telegramBot( @@ -90,7 +85,6 @@ suspend fun telegramBotWithBehaviourAndFSMAndStartLongPolling( defaultExceptionsHandler, statesManager, presetHandlers, - telegramHandlersRegistrar, block ) } diff --git a/tgbotapi.behaviour_builder/build.gradle b/tgbotapi.behaviour_builder/build.gradle index 537da9052c..68224e8bc7 100644 --- a/tgbotapi.behaviour_builder/build.gradle +++ b/tgbotapi.behaviour_builder/build.gradle @@ -44,7 +44,6 @@ kotlin { dependencies { implementation kotlin('stdlib') api project(":tgbotapi.utils") - api "dev.inmo:micro_utils.handlers.common:$micro_utils_version" } } } diff --git a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/BehaviourBuilders.kt b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/BehaviourBuilders.kt index 420f991320..dd17203ef3 100644 --- a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/BehaviourBuilders.kt +++ b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/BehaviourBuilders.kt @@ -3,8 +3,6 @@ package dev.inmo.tgbotapi.extensions.behaviour_builder import dev.inmo.micro_utils.coroutines.ContextSafelyExceptionHandler import dev.inmo.micro_utils.coroutines.ExceptionHandler import dev.inmo.tgbotapi.bot.TelegramBot -import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.handlers.DefaultTelegramHandlersRegistrar -import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.handlers.TelegramHandlersRegistrar import dev.inmo.tgbotapi.extensions.utils.updates.retrieving.longPolling import dev.inmo.tgbotapi.extensions.utils.updates.retrieving.startGettingOfUpdatesByLongPolling import dev.inmo.tgbotapi.updateshandlers.FlowsUpdatesFilter @@ -32,7 +30,6 @@ suspend fun TelegramBot.buildBehaviour( flowUpdatesFilter: FlowsUpdatesFilter = FlowsUpdatesFilter(), scope: CoroutineScope = defaultCoroutineScopeProvider(), defaultExceptionsHandler: ExceptionHandler? = null, - telegramHandlersRegistrar: TelegramHandlersRegistrar = DefaultTelegramHandlersRegistrar(), block: BehaviourContextReceiver ) { BehaviourContext( @@ -44,8 +41,7 @@ suspend fun TelegramBot.buildBehaviour( it + ContextSafelyExceptionHandler(defaultExceptionsHandler) } }, - flowUpdatesFilter, - telegramHandlersRegistrar + flowUpdatesFilter ).block() } @@ -61,14 +57,12 @@ suspend fun TelegramBot.buildBehaviour( suspend fun TelegramBot.buildBehaviourWithLongPolling( scope: CoroutineScope = defaultCoroutineScopeProvider(), defaultExceptionsHandler: ExceptionHandler? = null, - telegramHandlersRegistrar: TelegramHandlersRegistrar = DefaultTelegramHandlersRegistrar(), block: BehaviourContextReceiver ) = FlowsUpdatesFilter().let { buildBehaviour( it, scope, defaultExceptionsHandler, - telegramHandlersRegistrar, block ) longPolling( diff --git a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/BehaviourContext.kt b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/BehaviourContext.kt index 27630d47e2..2426853a51 100644 --- a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/BehaviourContext.kt +++ b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/BehaviourContext.kt @@ -4,10 +4,9 @@ package dev.inmo.tgbotapi.extensions.behaviour_builder import dev.inmo.micro_utils.coroutines.* import dev.inmo.tgbotapi.bot.TelegramBot -import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.handlers.DefaultTelegramHandlersRegistrar -import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.handlers.TelegramHandlersRegistrar import dev.inmo.tgbotapi.types.update.abstracts.Update import dev.inmo.tgbotapi.updateshandlers.* +import dev.inmo.tgbotapi.utils.RiskFeature import kotlinx.coroutines.* import kotlinx.coroutines.channels.BufferOverflow import kotlinx.coroutines.flow.* @@ -31,7 +30,7 @@ internal inline fun CustomBehaviourContextAndTwoTypesReceiver? = null, - telegramHandlersRegistrar: TelegramHandlersRegistrar = this.telegramHandlersRegistrar, updatesFilter: BehaviourContextAndTypeReceiver? = null ): BehaviourContext } @@ -65,16 +60,11 @@ interface BehaviourContext : FlowsUpdatesFilter, TelegramBot, CoroutineScope, Te class DefaultBehaviourContext( override val bot: TelegramBot, override val scope: CoroutineScope, - override val telegramHandlersRegistrar: TelegramHandlersRegistrar, broadcastChannelsSize: Int = 100, onBufferOverflow: BufferOverflow = BufferOverflow.SUSPEND, private val upstreamUpdatesFlow: Flow? = null, private val updatesFilter: BehaviourContextAndTypeReceiver? = null -) : AbstractFlowsUpdatesFilter(), - TelegramBot by bot, - CoroutineScope by scope, - TelegramHandlersRegistrar by telegramHandlersRegistrar, - BehaviourContext { +) : AbstractFlowsUpdatesFilter(), TelegramBot by bot, CoroutineScope by scope, BehaviourContext { private val additionalUpdatesSharedFlow = MutableSharedFlow(0, broadcastChannelsSize, onBufferOverflow) override val allUpdatesFlow: Flow = (additionalUpdatesSharedFlow.asSharedFlow()).let { @@ -99,25 +89,22 @@ class DefaultBehaviourContext( broadcastChannelsSize: Int, onBufferOverflow: BufferOverflow, upstreamUpdatesFlow: Flow?, - telegramHandlersRegistrar: TelegramHandlersRegistrar, updatesFilter: BehaviourContextAndTypeReceiver? - ): BehaviourContext = DefaultBehaviourContext(bot, scope, telegramHandlersRegistrar, broadcastChannelsSize, onBufferOverflow, upstreamUpdatesFlow, updatesFilter) + ): BehaviourContext = DefaultBehaviourContext(bot, scope, broadcastChannelsSize, onBufferOverflow, upstreamUpdatesFlow, updatesFilter) } fun BehaviourContext( bot: TelegramBot, scope: CoroutineScope, - flowsUpdatesFilter: FlowsUpdatesFilter = FlowsUpdatesFilter(), - telegramHandlersRegistrar: TelegramHandlersRegistrar = DefaultTelegramHandlersRegistrar(), -) = DefaultBehaviourContext(bot, scope, telegramHandlersRegistrar, upstreamUpdatesFlow = flowsUpdatesFilter.allUpdatesFlow) + flowsUpdatesFilter: FlowsUpdatesFilter = FlowsUpdatesFilter() +) = DefaultBehaviourContext(bot, scope, upstreamUpdatesFlow = flowsUpdatesFilter.allUpdatesFlow) inline fun BehaviourContext( bot: TelegramBot, scope: CoroutineScope, flowsUpdatesFilter: FlowsUpdatesFilter = FlowsUpdatesFilter(), - telegramHandlersRegistrar: TelegramHandlersRegistrar = DefaultTelegramHandlersRegistrar(), crossinline block: BehaviourContext.() -> T -) = DefaultBehaviourContext(bot, scope, telegramHandlersRegistrar, upstreamUpdatesFlow = flowsUpdatesFilter.allUpdatesFlow).run(block) +) = DefaultBehaviourContext(bot, scope, upstreamUpdatesFlow = flowsUpdatesFilter.allUpdatesFlow).run(block) /** * Creates new one [BehaviourContext], adding subsequent [FlowsUpdatesFilter] in case [updatesFilter] is provided and diff --git a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/TelegramBot.kt b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/TelegramBot.kt index cfaeebcf27..6ab989cd08 100644 --- a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/TelegramBot.kt +++ b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/TelegramBot.kt @@ -4,8 +4,6 @@ import dev.inmo.micro_utils.coroutines.ExceptionHandler import dev.inmo.tgbotapi.bot.Ktor.KtorRequestsExecutorBuilder import dev.inmo.tgbotapi.bot.Ktor.telegramBot import dev.inmo.tgbotapi.bot.TelegramBot -import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.handlers.DefaultTelegramHandlersRegistrar -import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.handlers.TelegramHandlersRegistrar import dev.inmo.tgbotapi.extensions.utils.updates.retrieving.startGettingOfUpdatesByLongPolling import dev.inmo.tgbotapi.updateshandlers.FlowsUpdatesFilter import dev.inmo.tgbotapi.utils.telegramBotAPIDefaultUrl @@ -32,7 +30,6 @@ suspend fun telegramBotWithBehaviour( apiUrl: String = telegramBotAPIDefaultUrl, builder: KtorRequestsExecutorBuilder.() -> Unit = {}, defaultExceptionsHandler: ExceptionHandler? = null, - telegramHandlersRegistrar: TelegramHandlersRegistrar = DefaultTelegramHandlersRegistrar(), block: BehaviourContextReceiver ): TelegramBot = telegramBot( token, @@ -43,7 +40,6 @@ suspend fun telegramBotWithBehaviour( flowsUpdatesFilter, scope ?: CoroutineScope(coroutineContext), defaultExceptionsHandler, - telegramHandlersRegistrar, block ) } @@ -67,7 +63,6 @@ suspend fun telegramBotWithBehaviourAndLongPolling( apiUrl: String = telegramBotAPIDefaultUrl, builder: KtorRequestsExecutorBuilder.() -> Unit = {}, defaultExceptionsHandler: ExceptionHandler? = null, - telegramHandlersRegistrar: TelegramHandlersRegistrar = DefaultTelegramHandlersRegistrar(), block: BehaviourContextReceiver ): Pair { return telegramBot( @@ -78,7 +73,6 @@ suspend fun telegramBotWithBehaviourAndLongPolling( it to it.buildBehaviourWithLongPolling( scope ?: CoroutineScope(coroutineContext), defaultExceptionsHandler, - telegramHandlersRegistrar, block ) } diff --git a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/utils/handlers/DefaultTelegramHandlersRegistrar.kt b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/utils/handlers/DefaultTelegramHandlersRegistrar.kt deleted file mode 100644 index 4081424dfc..0000000000 --- a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/utils/handlers/DefaultTelegramHandlersRegistrar.kt +++ /dev/null @@ -1,51 +0,0 @@ -package dev.inmo.tgbotapi.extensions.behaviour_builder.utils.handlers - -import dev.inmo.micro_utils.handlers.common.HandlersRegistrar -import dev.inmo.tgbotapi.types.update.abstracts.Update - -class DefaultTelegramHandlersRegistrar : TelegramUpdateHandler, TelegramHandlersRegistrar { - private val mainLayer = mutableListOf() - private val defaultsLayer = mutableListOf() - private var defaultHandler: TelegramUpdateHandler? = null - - private val handlersRegistrar = HandlersRegistrar( - listOf( - mainLayer, - defaultsLayer - ), - object : TelegramUpdateHandler { - override suspend fun check(data: Update): Boolean = defaultHandler ?.check(data) ?: false - override suspend fun handle(data: Update) { defaultHandler ?.handle(data) } - } - ) - - override suspend fun check(data: Update): Boolean { - return handlersRegistrar.check(data) - } - - override suspend fun handle(data: Update) { - handlersRegistrar.handle(data) - } - - override suspend fun includeHandler(handler: TelegramUpdateHandler) { - if (handler in mainLayer) { - return - } - mainLayer.add(handler) - } - - override suspend fun excludeHandler(handler: TelegramUpdateHandler) { - mainLayer.remove(handler) - } - - override suspend fun includeDefaultHandler(handler: TelegramUpdateHandler) { - if (handler in defaultsLayer) { - return - } - defaultsLayer.add(handler) - } - - override suspend fun excludeDefaultHandler(handler: TelegramUpdateHandler) { - defaultsLayer.remove(handler) - } -} diff --git a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/utils/handlers/TelegramHandlersRegistrar.kt b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/utils/handlers/TelegramHandlersRegistrar.kt deleted file mode 100644 index 797b3e6477..0000000000 --- a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/utils/handlers/TelegramHandlersRegistrar.kt +++ /dev/null @@ -1,9 +0,0 @@ -package dev.inmo.tgbotapi.extensions.behaviour_builder.utils.handlers - -interface TelegramHandlersRegistrar { - suspend fun includeHandler(handler: TelegramUpdateHandler) - suspend fun excludeHandler(handler: TelegramUpdateHandler) - - suspend fun includeDefaultHandler(handler: TelegramUpdateHandler) - suspend fun excludeDefaultHandler(handler: TelegramUpdateHandler) -} diff --git a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/utils/handlers/TelegramUpdateHandler.kt b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/utils/handlers/TelegramUpdateHandler.kt deleted file mode 100644 index 41f34fca4b..0000000000 --- a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/utils/handlers/TelegramUpdateHandler.kt +++ /dev/null @@ -1,6 +0,0 @@ -package dev.inmo.tgbotapi.extensions.behaviour_builder.utils.handlers - -import dev.inmo.micro_utils.handlers.common.Handler -import dev.inmo.tgbotapi.types.update.abstracts.Update - -interface TelegramUpdateHandler : Handler From 7e57a0e4e0c91e553506ca441689fbcadd058ffd Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Tue, 26 Apr 2022 13:07:16 +0600 Subject: [PATCH 7/8] revert update of microutils version --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index ec7f59c1b4..b7a490f218 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,7 +12,7 @@ klock_version=2.7.0 uuid_version=0.4.0 ktor_version=1.6.8 -micro_utils_version=0.9.25 +micro_utils_version=0.9.24 javax_activation_version=1.1.1 From efd1c8f83a9bcdfc8be205242412ac92a08d882a Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Tue, 26 Apr 2022 13:22:00 +0600 Subject: [PATCH 8/8] add additional onDataCallbackQuery variants with regex filters --- CHANGELOG.md | 2 + .../CallbackQueryTriggers.kt | 169 ++++++++++++++++++ .../behaviour_builder/utils/SimpleFilter.kt | 16 +- 3 files changed, 181 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index be46412261..b03c87e77b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ * `MicroUtils`: `0.9.20` -> `0.9.24` * `Core`: * Fixes in `MessageContent#serializationModule` +* `BehaviourBuilder`: + * Add triggers for `DataCallbackQuery` and subtypes with regex checking of data ## 0.38.14 diff --git a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/CallbackQueryTriggers.kt b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/CallbackQueryTriggers.kt index 9e7bdce543..4689320dd2 100644 --- a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/CallbackQueryTriggers.kt +++ b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/triggers_handling/CallbackQueryTriggers.kt @@ -7,6 +7,7 @@ import dev.inmo.tgbotapi.extensions.behaviour_builder.filters.CallbackQueryFilte import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.SimpleFilter import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.ByUserCallbackQueryMarkerFactory import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.MarkerFactory +import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.plus import dev.inmo.tgbotapi.extensions.utils.asCallbackQueryUpdate import dev.inmo.tgbotapi.types.CallbackQuery.* import dev.inmo.tgbotapi.types.update.abstracts.Update @@ -44,6 +45,62 @@ suspend fun BC.onDataCallbackQuery( scenarioReceiver ) +/** + * @param dataRegex Will be used with [initialFilter] as [initialFilter] for upstream [onDataCallbackQuery] to filter + * [DataCallbackQuery] with [DataCallbackQuery.data] [String.matches] to [dataRegex] + * @param initialFilter This filter will be called to remove unnecessary data BEFORE [scenarioReceiver] call + * @param subcontextUpdatesFilter This filter will be applied to each update inside of [scenarioReceiver]. For example, + * this filter will be used if you will call [dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.waitContentMessage]. + * Use [dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContextAndTwoTypesReceiver] function to create your own. + * Use [dev.inmo.tgbotapi.extensions.behaviour_builder.utils.plus] or [dev.inmo.tgbotapi.extensions.behaviour_builder.utils.times] + * to combinate several filters + * @param [markerFactory] Will be used to identify different "stream". [scenarioReceiver] will be called synchronously + * in one "stream". Output of [markerFactory] will be used as a key for "stream" + * @param scenarioReceiver Main callback which will be used to handle incoming data if [initialFilter] will pass that + * data + */ +suspend fun BC.onDataCallbackQuery( + dataRegex: Regex, + initialFilter: SimpleFilter? = null, + subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver? = CallbackQueryFilterByUser, + markerFactory: MarkerFactory = ByUserCallbackQueryMarkerFactory, + scenarioReceiver: CustomBehaviourContextAndTypeReceiver +) = onDataCallbackQuery( + initialFilter = initialFilter + { + it.data.matches(dataRegex) + }, + subcontextUpdatesFilter, + markerFactory, + scenarioReceiver +) + +/** + * @param data Will be converted to [Regex] via its constructor and pass it to upstream [onDataCallbackQuery] + * @param initialFilter This filter will be called to remove unnecessary data BEFORE [scenarioReceiver] call + * @param subcontextUpdatesFilter This filter will be applied to each update inside of [scenarioReceiver]. For example, + * this filter will be used if you will call [dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.waitContentMessage]. + * Use [dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContextAndTwoTypesReceiver] function to create your own. + * Use [dev.inmo.tgbotapi.extensions.behaviour_builder.utils.plus] or [dev.inmo.tgbotapi.extensions.behaviour_builder.utils.times] + * to combinate several filters + * @param [markerFactory] Will be used to identify different "stream". [scenarioReceiver] will be called synchronously + * in one "stream". Output of [markerFactory] will be used as a key for "stream" + * @param scenarioReceiver Main callback which will be used to handle incoming data if [initialFilter] will pass that + * data + */ +suspend fun BC.onDataCallbackQuery( + data: String, + initialFilter: SimpleFilter? = null, + subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver? = CallbackQueryFilterByUser, + markerFactory: MarkerFactory = ByUserCallbackQueryMarkerFactory, + scenarioReceiver: CustomBehaviourContextAndTypeReceiver +) = onDataCallbackQuery( + Regex(data), + initialFilter, + subcontextUpdatesFilter, + markerFactory, + scenarioReceiver +) + /** * @param initialFilter This filter will be called to remove unnecessary data BEFORE [scenarioReceiver] call * @param subcontextUpdatesFilter This filter will be applied to each update inside of [scenarioReceiver]. For example, @@ -116,6 +173,62 @@ suspend fun BC.onInlineMessageIdDataCallbackQuery( scenarioReceiver ) +/** + * @param dataRegex Will be used with [initialFilter] as [initialFilter] for upstream [onInlineMessageIdDataCallbackQuery] + * to filter [InlineMessageIdDataCallbackQuery] with [InlineMessageIdDataCallbackQuery.data] [String.matches] to [dataRegex] + * @param initialFilter This filter will be called to remove unnecessary data BEFORE [scenarioReceiver] call + * @param subcontextUpdatesFilter This filter will be applied to each update inside of [scenarioReceiver]. For example, + * this filter will be used if you will call [dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.waitContentMessage]. + * Use [dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContextAndTwoTypesReceiver] function to create your own. + * Use [dev.inmo.tgbotapi.extensions.behaviour_builder.utils.plus] or [dev.inmo.tgbotapi.extensions.behaviour_builder.utils.times] + * to combinate several filters + * @param [markerFactory] Will be used to identify different "stream". [scenarioReceiver] will be called synchronously + * in one "stream". Output of [markerFactory] will be used as a key for "stream" + * @param scenarioReceiver Main callback which will be used to handle incoming data if [initialFilter] will pass that + * data + */ +suspend fun BC.onInlineMessageIdDataCallbackQuery( + dataRegex: Regex, + initialFilter: SimpleFilter? = null, + subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver? = CallbackQueryFilterByUser, + markerFactory: MarkerFactory = ByUserCallbackQueryMarkerFactory, + scenarioReceiver: CustomBehaviourContextAndTypeReceiver +) = onInlineMessageIdDataCallbackQuery( + initialFilter = initialFilter + { + it.data.matches(dataRegex) + }, + subcontextUpdatesFilter, + markerFactory, + scenarioReceiver +) + +/** + * @param data Will be converted to [Regex] via its constructor and pass it to upstream [onInlineMessageIdDataCallbackQuery] + * @param initialFilter This filter will be called to remove unnecessary data BEFORE [scenarioReceiver] call + * @param subcontextUpdatesFilter This filter will be applied to each update inside of [scenarioReceiver]. For example, + * this filter will be used if you will call [dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.waitContentMessage]. + * Use [dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContextAndTwoTypesReceiver] function to create your own. + * Use [dev.inmo.tgbotapi.extensions.behaviour_builder.utils.plus] or [dev.inmo.tgbotapi.extensions.behaviour_builder.utils.times] + * to combinate several filters + * @param [markerFactory] Will be used to identify different "stream". [scenarioReceiver] will be called synchronously + * in one "stream". Output of [markerFactory] will be used as a key for "stream" + * @param scenarioReceiver Main callback which will be used to handle incoming data if [initialFilter] will pass that + * data + */ +suspend fun BC.onInlineMessageIdDataCallbackQuery( + data: String, + initialFilter: SimpleFilter? = null, + subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver? = CallbackQueryFilterByUser, + markerFactory: MarkerFactory = ByUserCallbackQueryMarkerFactory, + scenarioReceiver: CustomBehaviourContextAndTypeReceiver +) = onInlineMessageIdDataCallbackQuery( + Regex(data), + initialFilter, + subcontextUpdatesFilter, + markerFactory, + scenarioReceiver +) + /** * @param initialFilter This filter will be called to remove unnecessary data BEFORE [scenarioReceiver] call * @param subcontextUpdatesFilter This filter will be applied to each update inside of [scenarioReceiver]. For example, @@ -188,6 +301,62 @@ suspend fun BC.onMessageDataCallbackQuery( scenarioReceiver ) +/** + * @param dataRegex Will be used with [initialFilter] as [initialFilter] for upstream [onMessageDataCallbackQuery] to filter + * [MessageDataCallbackQuery] with [MessageDataCallbackQuery.data] [String.matches] to [dataRegex] + * @param initialFilter This filter will be called to remove unnecessary data BEFORE [scenarioReceiver] call + * @param subcontextUpdatesFilter This filter will be applied to each update inside of [scenarioReceiver]. For example, + * this filter will be used if you will call [dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.waitContentMessage]. + * Use [dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContextAndTwoTypesReceiver] function to create your own. + * Use [dev.inmo.tgbotapi.extensions.behaviour_builder.utils.plus] or [dev.inmo.tgbotapi.extensions.behaviour_builder.utils.times] + * to combinate several filters + * @param [markerFactory] Will be used to identify different "stream". [scenarioReceiver] will be called synchronously + * in one "stream". Output of [markerFactory] will be used as a key for "stream" + * @param scenarioReceiver Main callback which will be used to handle incoming data if [initialFilter] will pass that + * data + */ +suspend fun BC.onMessageDataCallbackQuery( + dataRegex: Regex, + initialFilter: SimpleFilter? = null, + subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver? = CallbackQueryFilterByUser, + markerFactory: MarkerFactory = ByUserCallbackQueryMarkerFactory, + scenarioReceiver: CustomBehaviourContextAndTypeReceiver +) = onMessageDataCallbackQuery( + initialFilter = initialFilter + { + it.data.matches(dataRegex) + }, + subcontextUpdatesFilter, + markerFactory, + scenarioReceiver +) + +/** + * @param data Will be converted to [Regex] via its constructor and pass it to upstream [onMessageDataCallbackQuery] + * @param initialFilter This filter will be called to remove unnecessary data BEFORE [scenarioReceiver] call + * @param subcontextUpdatesFilter This filter will be applied to each update inside of [scenarioReceiver]. For example, + * this filter will be used if you will call [dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.waitContentMessage]. + * Use [dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContextAndTwoTypesReceiver] function to create your own. + * Use [dev.inmo.tgbotapi.extensions.behaviour_builder.utils.plus] or [dev.inmo.tgbotapi.extensions.behaviour_builder.utils.times] + * to combinate several filters + * @param [markerFactory] Will be used to identify different "stream". [scenarioReceiver] will be called synchronously + * in one "stream". Output of [markerFactory] will be used as a key for "stream" + * @param scenarioReceiver Main callback which will be used to handle incoming data if [initialFilter] will pass that + * data + */ +suspend fun BC.onMessageDataCallbackQuery( + data: String, + initialFilter: SimpleFilter? = null, + subcontextUpdatesFilter: CustomBehaviourContextAndTwoTypesReceiver? = CallbackQueryFilterByUser, + markerFactory: MarkerFactory = ByUserCallbackQueryMarkerFactory, + scenarioReceiver: CustomBehaviourContextAndTypeReceiver +) = onMessageDataCallbackQuery( + Regex(data), + initialFilter, + subcontextUpdatesFilter, + markerFactory, + scenarioReceiver +) + /** * @param initialFilter This filter will be called to remove unnecessary data BEFORE [scenarioReceiver] call * @param subcontextUpdatesFilter This filter will be applied to each update inside of [scenarioReceiver]. For example, diff --git a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/utils/SimpleFilter.kt b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/utils/SimpleFilter.kt index 45cdf3b004..6f12abd39c 100644 --- a/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/utils/SimpleFilter.kt +++ b/tgbotapi.behaviour_builder/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/behaviour_builder/utils/SimpleFilter.kt @@ -28,16 +28,20 @@ fun SimpleFilter.listNone() = SimpleFilter> { /** * Makes an AND (&&) operation between [this] and [other] */ -operator fun SimpleFilter.times(other: SimpleFilter): SimpleFilter = { - this(it) && other(it) -} +operator fun SimpleFilter?.times(other: SimpleFilter): SimpleFilter = this ?.let { + { + this(it) && other(it) + } +} ?: other /** * Makes an OR (||) operation between [this] and [other] */ -operator fun SimpleFilter.plus(other: SimpleFilter): SimpleFilter = { - this(it) || other(it) -} +operator fun SimpleFilter?.plus(other: SimpleFilter): SimpleFilter = this ?.let { + { + this(it) || other(it) + } +} ?: other /** * Reverse results of [this]