From 238533a3500eea40fee4ac621ebeee9d53cbf412 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Fri, 10 May 2024 16:35:07 +0600 Subject: [PATCH] update polls sample --- PollsBot/src/main/kotlin/PollsBot.kt | 95 ++++++++++++++++++++++++---- gradle.properties | 2 +- 2 files changed, 84 insertions(+), 13 deletions(-) diff --git a/PollsBot/src/main/kotlin/PollsBot.kt b/PollsBot/src/main/kotlin/PollsBot.kt index 647a167..03f1776 100644 --- a/PollsBot/src/main/kotlin/PollsBot.kt +++ b/PollsBot/src/main/kotlin/PollsBot.kt @@ -1,11 +1,19 @@ import com.benasher44.uuid.uuid4 +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.subscribeSafelyWithoutExceptions import dev.inmo.tgbotapi.extensions.api.bot.getMe +import dev.inmo.tgbotapi.extensions.api.bot.setMyCommands import dev.inmo.tgbotapi.extensions.api.chat.get.getChat import dev.inmo.tgbotapi.extensions.api.send.* +import dev.inmo.tgbotapi.extensions.api.send.polls.sendQuizPoll import dev.inmo.tgbotapi.extensions.api.send.polls.sendRegularPoll import dev.inmo.tgbotapi.extensions.behaviour_builder.telegramBotWithBehaviourAndLongPolling import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.* +import dev.inmo.tgbotapi.extensions.utils.customEmojiTextSourceOrNull +import dev.inmo.tgbotapi.extensions.utils.extensions.parseCommandsWithArgsSources import dev.inmo.tgbotapi.extensions.utils.extensions.raw.sender_chat import dev.inmo.tgbotapi.extensions.utils.formatting.linkMarkdownV2 import dev.inmo.tgbotapi.extensions.utils.formatting.textMentionMarkdownV2 @@ -17,15 +25,13 @@ import dev.inmo.tgbotapi.types.chat.GroupChat import dev.inmo.tgbotapi.types.chat.PrivateChat import dev.inmo.tgbotapi.types.chat.SupergroupChat import dev.inmo.tgbotapi.types.message.MarkdownV2 -import dev.inmo.tgbotapi.types.polls.Poll -import dev.inmo.tgbotapi.types.polls.PollAnswer -import dev.inmo.tgbotapi.types.polls.PollOption -import dev.inmo.tgbotapi.types.polls.RegularPoll -import dev.inmo.tgbotapi.utils.PreviewFeature +import dev.inmo.tgbotapi.types.polls.* +import dev.inmo.tgbotapi.utils.* import dev.inmo.tgbotapi.utils.extensions.escapeMarkdownV2Common import kotlinx.coroutines.* import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock +import kotlin.random.Random /** * This bot will answer with anonymous or public poll and send message on @@ -37,6 +43,15 @@ import kotlinx.coroutines.sync.withLock @OptIn(PreviewFeature::class) suspend fun main(vararg args: String) { val botToken = args.first() + val isDebug = args.any { it == "debug" } + + if (isDebug) { + setDefaultKSLog( + KSLog { level: LogLevel, tag: String?, message: Any, throwable: Throwable? -> + println(defaultMessageFormatter(level, tag, message, throwable)) + } + ) + } telegramBotWithBehaviourAndLongPolling(botToken, CoroutineScope(Dispatchers.IO)) { val me = getMe() @@ -44,12 +59,22 @@ suspend fun main(vararg args: String) { val pollToChat = mutableMapOf() val pollToChatMutex = Mutex() - onCommand("anonymous") { + onCommand("anonymous", requireOnlyCommandInMessage = false) { + val customEmoji = it.content.parseCommandsWithArgsSources() + .toList() + .firstOrNull { it.first.command == "anonymous" } + ?.second + ?.firstNotNullOfOrNull { it.customEmojiTextSourceOrNull() } val sentPoll = sendRegularPoll( - it.chat, + it.chat.id, "Test regular anonymous poll", (1 .. 10).map { - it.toString() + InputPollOption { + regular(it.toString()) + " " + if (customEmoji != null) { + customEmoji(customEmoji.customEmojiId, customEmoji.subsources) + } + } }, isAnonymous = true, replyParameters = ReplyParameters(it) @@ -59,12 +84,22 @@ suspend fun main(vararg args: String) { } } - onCommand("public") { + onCommand("public", requireOnlyCommandInMessage = false) { + val customEmoji = it.content.parseCommandsWithArgsSources() + .toList() + .firstOrNull { it.first.command == "public" } + ?.second + ?.firstNotNullOfOrNull { it.customEmojiTextSourceOrNull() } val sentPoll = sendRegularPoll( - it.chat, - "Test regular anonymous poll", + it.chat.id, + "Test regular non anonymous poll", (1 .. 10).map { - it.toString() + InputPollOption { + regular(it.toString()) + " " + if (customEmoji != null) { + customEmoji(customEmoji.customEmojiId, customEmoji.subsources) + } + } }, isAnonymous = false, replyParameters = ReplyParameters(it) @@ -74,6 +109,36 @@ suspend fun main(vararg args: String) { } } + onCommand("quiz", requireOnlyCommandInMessage = false) { + val customEmoji = it.content.parseCommandsWithArgsSources() + .toList() + .firstOrNull { it.first.command == "quiz" } + ?.second + ?.firstNotNullOfOrNull { it.customEmojiTextSourceOrNull() } + val correctAnswer = Random.nextInt(10) + val sentPoll = sendQuizPoll( + it.chat.id, + "Test quiz poll", + (1 .. 10).map { + InputPollOption { + regular(it.toString()) + " " + if (customEmoji != null) { + customEmoji(customEmoji.customEmojiId, customEmoji.subsources) + } + } + }, + isAnonymous = false, + replyParameters = ReplyParameters(it), + correctOptionId = correctAnswer, + explanationTextSources = buildEntities { + regular("Random solved it to be ") + underline((correctAnswer + 1).toString()) + } + ) + pollToChatMutex.withLock { + pollToChat[sentPoll.content.poll.id] = sentPoll.chat.id + } + } + onPollAnswer { val chatId = pollToChat[it.pollId] ?: return@onPollAnswer @@ -92,6 +157,12 @@ suspend fun main(vararg args: String) { } } + setMyCommands( + BotCommand("anonymous", "Create anonymous regular poll"), + BotCommand("public", "Create non anonymous regular poll"), + BotCommand("quiz", "Create quiz poll with random right answer"), + ) + allUpdatesFlow.subscribeSafelyWithoutExceptions(this) { println(it) } }.second.join() } diff --git a/gradle.properties b/gradle.properties index 456645c..613a32e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,7 +5,7 @@ org.gradle.jvmargs=-Xmx2344m kotlin_version=1.9.23 -telegram_bot_api_version=12.0.1 +telegram_bot_api_version=13.0.0 micro_utils_version=0.20.45 serialization_version=1.6.3 ktor_version=2.3.10