From 6c0d9613395e6380df9ad792c1868349a6f144b5 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Mon, 11 Aug 2025 01:08:55 +0600 Subject: [PATCH] temporal improvements for fsm --- FSMBot/src/main/kotlin/SimpleFSMBot.kt | 36 ++++++++++++++++++-------- gradle.properties | 4 +-- 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/FSMBot/src/main/kotlin/SimpleFSMBot.kt b/FSMBot/src/main/kotlin/SimpleFSMBot.kt index 53751f8..0ec7fb7 100644 --- a/FSMBot/src/main/kotlin/SimpleFSMBot.kt +++ b/FSMBot/src/main/kotlin/SimpleFSMBot.kt @@ -1,10 +1,13 @@ +import dev.inmo.micro_utils.coroutines.awaitFirst import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions import dev.inmo.micro_utils.fsm.common.State import dev.inmo.tgbotapi.extensions.api.send.send import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.waitAnyContentMessage +import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.waitCommandMessage import dev.inmo.tgbotapi.extensions.behaviour_builder.telegramBotWithBehaviourAndFSMAndStartLongPolling import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.command import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onContentMessage +import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.containsCommand import dev.inmo.tgbotapi.extensions.utils.extensions.parseCommandsWithArgs import dev.inmo.tgbotapi.extensions.utils.extensions.sameThread import dev.inmo.tgbotapi.extensions.utils.textContentOrNull @@ -13,10 +16,12 @@ import dev.inmo.tgbotapi.types.IdChatIdentifier import dev.inmo.tgbotapi.types.message.abstracts.CommonMessage import dev.inmo.tgbotapi.types.message.content.TextContent import dev.inmo.tgbotapi.utils.botCommand +import dev.inmo.tgbotapi.utils.firstOf import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.map sealed interface BotState : State data class ExpectContentOrStopState(override val context: IdChatIdentifier, val sourceMessage: CommonMessage) : BotState @@ -48,19 +53,28 @@ suspend fun main(args: Array) { +"Send me some content or " + botCommand("stop") + " if you want to stop sending" } - val contentMessage = waitAnyContentMessage().filter { message -> - message.sameThread(it.sourceMessage) - }.first() + val contentMessage = firstOf( + { + waitCommandMessage("stop").filter { message -> + message.sameThread(it.sourceMessage) + }.first() + null + }, + { + waitAnyContentMessage().filter { message -> + message.sameThread(it.sourceMessage) + }.filter { + it.withContentOrNull() ?.content ?.textSources ?.run { + containsCommand("stop") + } != true + }.first() + } + ) ?: return@strictlyOn StopState(it.context) + val content = contentMessage.content - when { - content is TextContent && content.text == "/stop" - || content is TextContent && content.parseCommandsWithArgs().keys.contains("stop") -> StopState(it.context) - else -> { - execute(content.createResend(it.context)) - it - } - } + execute(content.createResend(it.context)) + it } strictlyOn { send(it.context) { +"You have stopped sending of content" } diff --git a/gradle.properties b/gradle.properties index b6a28ee..e0c3df5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,8 +6,8 @@ kotlin.daemon.jvmargs=-Xmx3g -Xms500m kotlin_version=2.2.0 -telegram_bot_api_version=27.1.2 -micro_utils_version=0.26.1 +telegram_bot_api_version=28.0.0-rc5 +micro_utils_version=0.26.2 serialization_version=1.9.0 ktor_version=3.2.3 compose_version=1.8.2