1+ import dev.inmo.micro_utils.coroutines.awaitFirst
12import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions
23import dev.inmo.micro_utils.fsm.common.State
34import dev.inmo.tgbotapi.extensions.api.send.send
45import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.waitAnyContentMessage
6+ import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.waitCommandMessage
57import dev.inmo.tgbotapi.extensions.behaviour_builder.telegramBotWithBehaviourAndFSMAndStartLongPolling
68import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.command
79import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onContentMessage
10+ import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.containsCommand
811import dev.inmo.tgbotapi.extensions.utils.extensions.parseCommandsWithArgs
912import dev.inmo.tgbotapi.extensions.utils.extensions.sameThread
1013import dev.inmo.tgbotapi.extensions.utils.textContentOrNull
@@ -13,10 +16,12 @@ import dev.inmo.tgbotapi.types.IdChatIdentifier
1316import dev.inmo.tgbotapi.types.message.abstracts.CommonMessage
1417import dev.inmo.tgbotapi.types.message.content.TextContent
1518import dev.inmo.tgbotapi.utils.botCommand
19+ import dev.inmo.tgbotapi.utils.firstOf
1620import kotlinx.coroutines.CoroutineScope
1721import kotlinx.coroutines.Dispatchers
1822import kotlinx.coroutines.flow.filter
1923import kotlinx.coroutines.flow.first
24+ import kotlinx.coroutines.flow.map
2025
2126sealed interface BotState : State
2227data class ExpectContentOrStopState (override val context : IdChatIdentifier , val sourceMessage : CommonMessage <TextContent >) : BotState
@@ -48,19 +53,28 @@ suspend fun main(args: Array<String>) {
4853 + " Send me some content or " + botCommand(" stop" ) + " if you want to stop sending"
4954 }
5055
51- val contentMessage = waitAnyContentMessage().filter { message ->
52- message.sameThread(it.sourceMessage)
53- }.first()
56+ val contentMessage = firstOf(
57+ {
58+ waitCommandMessage(" stop" ).filter { message ->
59+ message.sameThread(it.sourceMessage)
60+ }.first()
61+ null
62+ },
63+ {
64+ waitAnyContentMessage().filter { message ->
65+ message.sameThread(it.sourceMessage)
66+ }.filter {
67+ it.withContentOrNull<TextContent >() ?.content ?.textSources ?.run {
68+ containsCommand(" stop" )
69+ } != true
70+ }.first()
71+ }
72+ ) ? : return @strictlyOn StopState (it.context)
73+
5474 val content = contentMessage.content
5575
56- when {
57- content is TextContent && content.text == " /stop"
58- || content is TextContent && content.parseCommandsWithArgs().keys.contains(" stop" ) -> StopState (it.context)
59- else -> {
60- execute(content.createResend(it.context))
61- it
62- }
63- }
76+ execute(content.createResend(it.context))
77+ it
6478 }
6579 strictlyOn<StopState > {
6680 send(it.context) { + " You have stopped sending of content" }
0 commit comments