diff --git a/FSMBot/src/main/kotlin/SimpleFSMBot.kt b/FSMBot/src/main/kotlin/SimpleFSMBot.kt index 7384a2f..164b971 100644 --- a/FSMBot/src/main/kotlin/SimpleFSMBot.kt +++ b/FSMBot/src/main/kotlin/SimpleFSMBot.kt @@ -6,7 +6,7 @@ import dev.inmo.tgbotapi.extensions.api.send.reply import dev.inmo.tgbotapi.extensions.api.send.sendMessage import dev.inmo.tgbotapi.extensions.behaviour_builder.* import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.* -import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.command +import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.* import dev.inmo.tgbotapi.extensions.utils.extensions.parseCommandsWithParams import dev.inmo.tgbotapi.extensions.utils.formatting.* import dev.inmo.tgbotapi.extensions.utils.shortcuts.chat @@ -15,14 +15,11 @@ import dev.inmo.tgbotapi.types.message.abstracts.CommonMessage import dev.inmo.tgbotapi.types.message.content.TextContent import dev.inmo.tgbotapi.types.message.content.abstracts.MediaGroupContent import dev.inmo.tgbotapi.types.message.content.abstracts.MessageContent -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.* -sealed interface State : State -data class ExpectContentOrStopState(override val context: ChatId, val sourceMessage: CommonMessage) : State -data class StopState(override val context: ChatId) : State - -fun TextContent.containsStopCommand() = parseCommandsWithParams().keys.firstOrNull { it == "stop" } != null +sealed interface BotState : State +data class ExpectContentOrStopState(override val context: ChatId, val sourceMessage: CommonMessage) : BotState +data class StopState(override val context: ChatId) : BotState suspend fun main(args: Array) { val botToken = args.first() @@ -33,46 +30,23 @@ suspend fun main(args: Array) { sendMessage( it.context, buildEntities { - +"Send me some content or " - botCommand("stop") - +" if you want to stop sending" + +"Send me some content or " + botCommand("stop") + " if you want to stop sending" } ) - val content = oneOf( - parallel { - waitContentMessage(includeMediaGroups = false, filter = { message -> message.chat.id == it.context }).also(::println) - }, - parallel { - waitMediaGroup { chat ?.id == it.context }.also(::println) - }, - parallel { - waitText (filter = { it.content.containsStopCommand() }).also(::println) + doInSubContext(stopOnCompletion = false) { + val behaviourSubcontext = this + onContentMessage( + initialFilter = { message -> message.chat.id == it.context } + ) { message -> + execute(message.content.createResend(it.context)) } - ).first() - - when { - content is TextContent && content.containsStopCommand() -> StopState(it.context) // assume we got "stop" command - content is List<*> -> { // assume it is media group - val casted = (content as List) - - reply(it.sourceMessage, "Ok, I got this media group and now will resend it to you") - sendMediaGroup(it.context, casted.map { it.toMediaGroupMemberInputMedia() }) - - it + onCommand("stop") { + behaviourSubcontext.cancel() } - content is MessageContent -> { + }.join() - reply(it.sourceMessage, "Ok, I got this content and now will resend it to you") - execute(content.createResend(it.context)) - - it - } - else -> { - sendMessage(it.context, "Unknown internal error") - it - } - } + StopState(it.context) } strictlyOn { sendMessage(it.context, "You have stopped sending of content") diff --git a/FilesLoaderBot/src/main/kotlin/FilesLoaderBot.kt b/FilesLoaderBot/src/main/kotlin/FilesLoaderBot.kt index 88a3363..cb35183 100644 --- a/FilesLoaderBot/src/main/kotlin/FilesLoaderBot.kt +++ b/FilesLoaderBot/src/main/kotlin/FilesLoaderBot.kt @@ -18,7 +18,7 @@ suspend fun main(args: Array) { directoryOrFile.mkdirs() telegramBotWithBehaviour(botToken, CoroutineScope(Dispatchers.IO)) { - onMedia(includeMediaGroups = true) { + onMedia(initialFilter = null) { val pathedFile = bot.getFileAdditionalInfo(it.content.media) val file = File(directoryOrFile, pathedFile.filePath.filenameFromUrl).apply { createNewFile() diff --git a/ForwardInfoSenderBot/src/main/kotlin/ForwardInfoSenderBot.kt b/ForwardInfoSenderBot/src/main/kotlin/ForwardInfoSenderBot.kt index 3d61406..c99e1f3 100644 --- a/ForwardInfoSenderBot/src/main/kotlin/ForwardInfoSenderBot.kt +++ b/ForwardInfoSenderBot/src/main/kotlin/ForwardInfoSenderBot.kt @@ -17,7 +17,7 @@ suspend fun main(vararg args: String) { val botToken = args.first() telegramBotWithBehaviour(botToken, CoroutineScope(Dispatchers.IO)) { - onContentMessage(includeMediaGroups = true) { + onContentMessage(subcontextUpdatesFilter = { _, _ -> true }) { val toAnswer = buildEntities { when (val forwardInfo = it.forwardInfo) { null -> +"There is no forward info" diff --git a/RandomFileSenderBot/src/main/kotlin/RandomFileSenderBot.kt b/RandomFileSenderBot/src/main/kotlin/RandomFileSenderBot.kt index 81064cb..dde785d 100644 --- a/RandomFileSenderBot/src/main/kotlin/RandomFileSenderBot.kt +++ b/RandomFileSenderBot/src/main/kotlin/RandomFileSenderBot.kt @@ -36,7 +36,7 @@ suspend fun main(args: Array) { if (currentRoot.isFile) { return currentRoot } else { - return pickFile(currentRoot.listFiles() ?.random() ?: return null) + return pickFile(currentRoot.listFiles() ?.takeIf { it.isNotEmpty() } ?.random() ?: return null) } } @@ -76,8 +76,10 @@ suspend fun main(args: Array) { } } - sendFiles(message.chat, chosen) - sent || chosen.isNotEmpty() + if (chosen.isNotEmpty()) { + sendFiles(message.chat, chosen) + sent = true + } if (!sent) { bot.reply(message, "Nothing selected :(") diff --git a/ResenderBot/ResenderBotLib/src/commonMain/kotlin/ResenderBot.kt b/ResenderBot/ResenderBotLib/src/commonMain/kotlin/ResenderBot.kt index 8eeaf23..cfec8f5 100644 --- a/ResenderBot/ResenderBotLib/src/commonMain/kotlin/ResenderBot.kt +++ b/ResenderBot/ResenderBotLib/src/commonMain/kotlin/ResenderBot.kt @@ -2,7 +2,9 @@ import dev.inmo.tgbotapi.extensions.api.bot.getMe import dev.inmo.tgbotapi.bot.Ktor.telegramBot import dev.inmo.tgbotapi.extensions.api.send.media.* import dev.inmo.tgbotapi.extensions.behaviour_builder.* +import dev.inmo.tgbotapi.extensions.behaviour_builder.filters.MessageFilterByChat import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.* +import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.plus import dev.inmo.tgbotapi.extensions.utils.shortcuts.* import dev.inmo.tgbotapi.types.message.abstracts.MediaGroupMessage import kotlinx.coroutines.* @@ -18,7 +20,7 @@ suspend fun activateResenderBot( bot.buildBehaviour(CoroutineScope(coroutineContext + SupervisorJob())) { onContentMessage( - additionalFilter = { it !is MediaGroupMessage<*> } + subcontextUpdatesFilter = MessageFilterByChat + BehaviourContextAndTwoTypesReceiver { it, _ -> it !is MediaGroupMessage<*> } ) { executeUnsafe(it.content.createResend(it.chat.id, replyToMessageId = it.messageId)) } diff --git a/gradle.properties b/gradle.properties index 2acebe7..928f53d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,6 +2,6 @@ kotlin.code.style=official org.gradle.parallel=true -kotlin_version=1.5.30 -telegram_bot_api_version=0.35.8 -micro_utils_version=0.5.26 +kotlin_version=1.5.31 +telegram_bot_api_version=0.35.9 +micro_utils_version=0.5.28