From 3b619767343c54be1907df64d200b0005e5bd8df Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Sat, 23 May 2026 00:00:36 +0600 Subject: [PATCH] add guest bot --- GuestQueryBot/build.gradle | 21 +++++ .../src/main/kotlin/GuestQueryBot.kt | 87 +++++++++++++++++++ gradle.properties | 2 +- settings.gradle | 2 + 4 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 GuestQueryBot/build.gradle create mode 100644 GuestQueryBot/src/main/kotlin/GuestQueryBot.kt diff --git a/GuestQueryBot/build.gradle b/GuestQueryBot/build.gradle new file mode 100644 index 0000000..da6a659 --- /dev/null +++ b/GuestQueryBot/build.gradle @@ -0,0 +1,21 @@ +buildscript { + repositories { + mavenCentral() + } + + dependencies { + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +apply plugin: 'kotlin' +apply plugin: 'application' + +mainClassName="GuestQueryBotKt" + + +dependencies { + implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" + + implementation "dev.inmo:tgbotapi:$telegram_bot_api_version" +} diff --git a/GuestQueryBot/src/main/kotlin/GuestQueryBot.kt b/GuestQueryBot/src/main/kotlin/GuestQueryBot.kt new file mode 100644 index 0000000..466cc26 --- /dev/null +++ b/GuestQueryBot/src/main/kotlin/GuestQueryBot.kt @@ -0,0 +1,87 @@ +import dev.inmo.kslog.common.KSLog +import dev.inmo.kslog.common.LogLevel +import dev.inmo.kslog.common.defaultMessageFormatter +import dev.inmo.kslog.common.setDefaultKSLog +import dev.inmo.micro_utils.coroutines.subscribeLoggingDropExceptions +import dev.inmo.tgbotapi.extensions.api.bot.getMe +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.onGuestMessage +import dev.inmo.tgbotapi.types.InlineQueries.InlineQueryResult.InlineQueryResultArticle +import dev.inmo.tgbotapi.types.InlineQueries.InputMessageContent.InputTextMessageContent +import dev.inmo.tgbotapi.types.InlineQueryId +import dev.inmo.tgbotapi.utils.buildEntities +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers + +/** + * This bot demonstrates guest mode support introduced in Telegram Bot API. + * + * Guest mode allows bots to receive messages and reply within chats they are not a member of. + * To enable guest queries for your bot, set `supports_guest_queries` in BotFather settings. + * + * Key concepts demonstrated: + * - `supportsGuestQueries` field on the bot itself (via getMe()) + * - `GuestMessageUpdate` — a new update type for messages sent in guest mode + * - `guestQueryId` — unique ID used to answer the guest query + * - `guestBotCallerUser` — the user who initiated the guest query + * - `guestBotCallerChat` — the chat from which the guest query was sent + * - `answerGuestQuery` / `reply(GuestMessage, InlineQueryResult)` — how to respond + * - `SentGuestMessage` — the result returned after answering, containing the inline_message_id + */ +suspend fun main(vararg args: String) { + val botToken = args.first() + val isDebug = args.any { it == "debug" } + val isTestServer = args.any { it == "testServer" } + + if (isDebug) { + setDefaultKSLog( + KSLog { level: LogLevel, tag: String?, message: Any, throwable: Throwable? -> + println(defaultMessageFormatter(level, tag, message, throwable)) + } + ) + } + + telegramBotWithBehaviourAndLongPolling( + botToken, + CoroutineScope(Dispatchers.IO), + testServer = isTestServer + ) { + val me = getMe() + println("Bot info: $me") + // supportsGuestQueries reflects the supports_guest_queries field from the Telegram API + println("Supports guest queries: ${me.supportsGuestQueries}") + + onGuestMessage { message -> + println("=== Guest message received ===") + // guestQueryId is the unique ID required to answer this guest query + println(" guestQueryId: ${message.guestQueryId}") + println(" from: ${message.from}") + println(" chat: ${message.chat}") + println(" content: ${message.content}") + + // reply() on GuestMessage calls answerGuestQuery internally and returns SentGuestMessage + val sentGuestMessage = reply( + message, + InlineQueryResultArticle( + id = InlineQueryId(message.guestQueryId.string), + title = "Guest reply", + inputMessageContent = InputTextMessageContent( + buildEntities { + +"Guest mode reply" + +"\nQuery ID: " + +message.guestQueryId.string + } + ), + description = "Reply to guest query from ${message.from.firstName}" + ) + ) + // SentGuestMessage contains the inline_message_id of the sent reply + println(" SentGuestMessage: $sentGuestMessage") + } + + allUpdatesFlow.subscribeLoggingDropExceptions(scope = this) { + println(it) + } + }.second.join() +} diff --git a/gradle.properties b/gradle.properties index 146e866..1b86e0c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ kotlin.daemon.jvmargs=-Xmx3g -Xms500m kotlin_version=2.3.20 -telegram_bot_api_version=34.0.0 +telegram_bot_api_version=34.0.0-t3 micro_utils_version=0.29.1 serialization_version=1.10.0 ktor_version=3.4.1 diff --git a/settings.gradle b/settings.gradle index 5309208..3c73f89 100644 --- a/settings.gradle +++ b/settings.gradle @@ -71,3 +71,5 @@ include ":GiftsBot" include ":TagsBot" include ":ManagedBotsBot" + +include ":GuestQueryBot"