From 6b27aa01fb3e02014fcda2a18dd731328cb68048 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Sun, 15 Feb 2026 23:34:37 +0600 Subject: [PATCH] fix of topics according to 9.3 --- .../src/main/kotlin/TopicsHandling.kt | 157 +++++++++++------- 1 file changed, 101 insertions(+), 56 deletions(-) diff --git a/TopicsHandling/src/main/kotlin/TopicsHandling.kt b/TopicsHandling/src/main/kotlin/TopicsHandling.kt index 5b04a82..49c86ea 100644 --- a/TopicsHandling/src/main/kotlin/TopicsHandling.kt +++ b/TopicsHandling/src/main/kotlin/TopicsHandling.kt @@ -1,15 +1,26 @@ import com.benasher44.uuid.uuid4 +import dev.inmo.kslog.common.w +import dev.inmo.micro_utils.coroutines.runCatchingLogging import dev.inmo.micro_utils.coroutines.runCatchingSafely +import dev.inmo.micro_utils.coroutines.subscribeLoggingDropExceptions import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions +import dev.inmo.tgbotapi.bot.TelegramBot +import dev.inmo.tgbotapi.extensions.api.bot.getMe import dev.inmo.tgbotapi.extensions.api.bot.setMyCommands import dev.inmo.tgbotapi.extensions.api.chat.forum.* import dev.inmo.tgbotapi.extensions.api.send.reply import dev.inmo.tgbotapi.extensions.behaviour_builder.telegramBotWithBehaviourAndLongPolling import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onCommand +import dev.inmo.tgbotapi.extensions.utils.forumChatOrNull +import dev.inmo.tgbotapi.extensions.utils.forumContentMessageOrNull +import dev.inmo.tgbotapi.extensions.utils.privateChatOrNull +import dev.inmo.tgbotapi.extensions.utils.privateForumChatOrNull import dev.inmo.tgbotapi.extensions.utils.updates.retrieving.flushAccumulatedUpdates import dev.inmo.tgbotapi.types.BotCommand import dev.inmo.tgbotapi.types.ForumTopic +import dev.inmo.tgbotapi.types.chat.PrivateChat import dev.inmo.tgbotapi.types.commands.BotCommandScope +import io.ktor.client.plugins.* import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay @@ -20,13 +31,33 @@ suspend fun main(vararg args: String) { CoroutineScope(Dispatchers.Default), defaultExceptionsHandler = { it.printStackTrace() + }, + builder = { + client = client.config { + install(HttpTimeout) { + requestTimeoutMillis = 30000 + socketTimeoutMillis = 30000 + connectTimeoutMillis = 30000 + } + } } ) { + suspend fun TelegramBot.isPrivateForumsEnabled(): Boolean { + val me = getMe() + if (me.hasTopicsEnabled == false) { + Log.w("private forums are disabled. That means that they will not work in private chats") + } + return me.hasTopicsEnabled + } + println() flushAccumulatedUpdates() - allUpdatesFlow.subscribeSafelyWithoutExceptions(this) { + allUpdatesFlow.subscribeLoggingDropExceptions(this) { println(it) } onCommand("start_test_topics") { + if (it.chat is PrivateChat && isPrivateForumsEnabled() == false) { + return@onCommand + } val forumTopic = createForumTopic( it.chat, "Test", @@ -44,21 +75,23 @@ suspend fun main(vararg args: String) { reply(it, "Test topic has changed its name to Test 01") - delay(1000L) - closeForumTopic( - it.chat.id, - forumTopic.messageThreadId, - ) + if (it.chat.privateChatOrNull() == null) { // For private forums it is prohibited to close or reopen topics + delay(1000L) + closeForumTopic( + it.chat.id, + forumTopic.messageThreadId, + ) - reply(it, "Test topic has been closed") + reply(it, "Test topic has been closed") - delay(1000L) - reopenForumTopic( - it.chat.id, - forumTopic.messageThreadId, - ) + delay(1000L) + reopenForumTopic( + it.chat.id, + forumTopic.messageThreadId, + ) - reply(it, "Test topic has been reopened") + reply(it, "Test topic has been reopened") + } delay(1000L) deleteForumTopic( @@ -68,68 +101,80 @@ suspend fun main(vararg args: String) { reply(it, "Test topic has been deleted") - delay(1000L) - hideGeneralForumTopic( - it.chat.id, - ) + if (it.chat.privateChatOrNull() == null) { // For private forums it is prohibited to close or reopen topics + delay(1000L) + hideGeneralForumTopic( + it.chat.id, + ) - reply(it, "General topic has been hidden") + reply(it, "General topic has been hidden") - delay(1000L) - unhideGeneralForumTopic( - it.chat.id - ) + delay(1000L) + unhideGeneralForumTopic( + it.chat.id + ) - reply(it, "General topic has been shown") + reply(it, "General topic has been shown") - delay(1000L) - runCatchingSafely( - { _ -> - reopenGeneralForumTopic( - it.chat.id - ) + delay(1000L) + runCatchingSafely( + { _ -> + reopenGeneralForumTopic( + it.chat.id + ) + closeGeneralForumTopic( + it.chat.id + ) + } + ) { closeGeneralForumTopic( it.chat.id ) } - ) { - closeGeneralForumTopic( + + reply(it, "General topic has been closed") + + delay(1000L) + reopenGeneralForumTopic( it.chat.id ) + + reply(it, "General topic has been opened") + + delay(1000L) + editGeneralForumTopic( + it.chat.id, + uuid4().toString().take(10) + ) + + reply(it, "General topic has been renamed") + + delay(1000L) + editGeneralForumTopic( + it.chat.id, + "Main topic" + ) + + reply(it, "General topic has been renamed") } - reply(it, "General topic has been closed") - - delay(1000L) - reopenGeneralForumTopic( - it.chat.id - ) - - reply(it, "General topic has been opened") - - delay(1000L) - editGeneralForumTopic( - it.chat.id, - uuid4().toString().take(10) - ) - - reply(it, "General topic has been renamed") - - delay(1000L) - editGeneralForumTopic( - it.chat.id, - "Main topic" - ) - - reply(it, "General topic has been renamed") - delay(1000L) } + onCommand("delete_topic") { + val chat = it.chat.forumChatOrNull() ?: return@onCommand + + deleteForumTopic(chat, chat.id.threadId ?: return@onCommand) + } + setMyCommands( BotCommand("start_test_topics", "start test topics"), + BotCommand("delete_topic", "delete topic where message have been sent"), scope = BotCommandScope.AllGroupChats ) + allUpdatesFlow.subscribeLoggingDropExceptions(this) { + println(it) + } }.second.join() }