mirror of
				https://github.com/InsanusMokrassar/TelegramBotAPI-examples.git
				synced 2025-10-31 04:00:32 +00:00 
			
		
		
		
	| @@ -4,13 +4,13 @@ import dev.inmo.kslog.common.defaultMessageFormatter | ||||
| import dev.inmo.kslog.common.setDefaultKSLog | ||||
| import dev.inmo.tgbotapi.bot.ktor.telegramBot | ||||
| import dev.inmo.tgbotapi.extensions.api.get.getUserChatBoosts | ||||
| import dev.inmo.tgbotapi.extensions.api.send.* | ||||
| import dev.inmo.tgbotapi.extensions.api.send.reply | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.buildBehaviourWithLongPolling | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onChatBoostUpdated | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onChatShared | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onCommand | ||||
| import dev.inmo.tgbotapi.extensions.utils.types.buttons.* | ||||
| import dev.inmo.tgbotapi.types.chat.member.ChatCommonAdministratorRights | ||||
| import dev.inmo.tgbotapi.extensions.utils.types.buttons.flatReplyKeyboard | ||||
| import dev.inmo.tgbotapi.extensions.utils.types.buttons.requestChannelButton | ||||
| import dev.inmo.tgbotapi.types.request.RequestId | ||||
| import dev.inmo.tgbotapi.utils.regular | ||||
| import korlibs.time.DateFormat | ||||
| @@ -52,12 +52,19 @@ suspend fun main(args: Array<String>) { | ||||
|         } | ||||
|  | ||||
|         onChatShared(initialFilter = { it.chatEvent.requestId == requestChatId }) { | ||||
|             val boosts = getUserChatBoosts(it.chatEvent.chatId, it.chat.id) | ||||
|             reply( | ||||
|                 it | ||||
|             ) { | ||||
|                 boosts.boosts.forEach { | ||||
|                     regular("Boost added: ${DateFormat.FORMAT1.format(it.addDate.asDate)}; Boost expire: ${DateFormat.FORMAT1.format(it.expirationDate.asDate)}; Unformatted: $it") + "\n" | ||||
|             val boostsInfoContrainer = runCatching { | ||||
|                 getUserChatBoosts(it.chatEvent.chatId, it.chat.id) | ||||
|             }.getOrNull() | ||||
|  | ||||
|             reply(it) { | ||||
|                 when { | ||||
|                     boostsInfoContrainer == null -> +"Unable to take info about boosts in shared chat" | ||||
|                     boostsInfoContrainer.boosts.isEmpty() -> +"There is no any boosts in passed chat" | ||||
|                     else -> { | ||||
|                         boostsInfoContrainer.boosts.forEach { | ||||
|                             regular("Boost added: ${DateFormat.FORMAT1.format(it.addDate.asDate)}; Boost expire: ${DateFormat.FORMAT1.format(it.expirationDate.asDate)}; Unformatted: $it") + "\n" | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|   | ||||
| @@ -49,22 +49,22 @@ suspend fun main(args: Array<String>) { | ||||
|         } | ||||
|  | ||||
|         onContentMessage { | ||||
|             it.ifBusinessContentMessage { | ||||
|                 val sent = execute(it.content.createResend(it.from.id)) | ||||
|                 if (it.sentByBusinessConnectionOwner) { | ||||
|                     reply(sent, "You have sent this message to the ${it.businessConnectionId.string} related chat") | ||||
|             it.ifBusinessContentMessage { businessContentMessage -> | ||||
|                 val sent = execute(it.content.createResend(businessContentMessage.from.id)) | ||||
|                 if (businessContentMessage.sentByBusinessConnectionOwner) { | ||||
|                     reply(sent, "You have sent this message to the ${businessContentMessage.businessConnectionId.string} related chat") | ||||
|                 } else { | ||||
|                     reply(sent, "User have sent this message to you in the ${it.businessConnectionId.string} related chat") | ||||
|                     reply(sent, "User have sent this message to you in the ${businessContentMessage.businessConnectionId.string} related chat") | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         onEditedContentMessage { | ||||
|             it.ifBusinessContentMessage { | ||||
|                 val sent = execute(it.content.createResend(it.from.id)) | ||||
|                 if (it.sentByBusinessConnectionOwner) { | ||||
|                     reply(sent, "You have edited this message in the ${it.businessConnectionId.string} related chat") | ||||
|             it.ifBusinessContentMessage { businessContentMessage -> | ||||
|                 val sent = execute(businessContentMessage.content.createResend(businessContentMessage.from.id)) | ||||
|                 if (businessContentMessage.sentByBusinessConnectionOwner) { | ||||
|                     reply(sent, "You have edited this message in the ${businessContentMessage.businessConnectionId.string} related chat") | ||||
|                 } else { | ||||
|                     reply(sent, "User have edited this message to you in the ${it.businessConnectionId.string} related chat") | ||||
|                     reply(sent, "User have edited this message to you in the ${businessContentMessage.businessConnectionId.string} related chat") | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|   | ||||
| @@ -5,9 +5,9 @@ import dev.inmo.tgbotapi.extensions.api.files.downloadFile | ||||
| import dev.inmo.tgbotapi.extensions.api.send.reply | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.buildBehaviourWithLongPolling | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onPhoto | ||||
| import dev.inmo.tgbotapi.extensions.utils.* | ||||
| import dev.inmo.tgbotapi.requests.abstracts.asMultipartFile | ||||
| import kotlinx.coroutines.* | ||||
| import kotlinx.coroutines.CoroutineScope | ||||
| import kotlinx.coroutines.Dispatchers | ||||
|  | ||||
| suspend fun main(args: Array<String>) { | ||||
|     val bot = telegramBot(args.first()) | ||||
|   | ||||
| @@ -5,13 +5,12 @@ 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.behaviour_builder.telegramBotWithBehaviourAndLongPolling | ||||
| import dev.inmo.tgbotapi.utils.PreviewFeature | ||||
| import kotlinx.coroutines.* | ||||
| import kotlinx.coroutines.CoroutineScope | ||||
| import kotlinx.coroutines.Dispatchers | ||||
|  | ||||
| /** | ||||
|  * The main purpose of this bot is just to answer "Oh, hi, " and add user mention here | ||||
|  * This place can be the playground for your code. | ||||
|  */ | ||||
| @OptIn(PreviewFeature::class) | ||||
| suspend fun main(vararg args: String) { | ||||
|     val botToken = args.first() | ||||
|  | ||||
| @@ -26,7 +25,9 @@ suspend fun main(vararg args: String) { | ||||
|     } | ||||
|  | ||||
|     telegramBotWithBehaviourAndLongPolling(botToken, CoroutineScope(Dispatchers.IO)) { | ||||
|         // start here!! | ||||
|         val me = getMe() | ||||
|         println(me) | ||||
|  | ||||
|         allUpdatesFlow.subscribeSafelyWithoutExceptions(this) { println(it) } | ||||
|     }.second.join() | ||||
|   | ||||
| @@ -1,11 +1,11 @@ | ||||
| import dev.inmo.micro_utils.coroutines.subscribeSafelySkippingExceptions | ||||
| import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions | ||||
| import dev.inmo.tgbotapi.bot.ktor.telegramBot | ||||
| import dev.inmo.tgbotapi.extensions.api.bot.getMe | ||||
| import dev.inmo.tgbotapi.extensions.api.send.reply | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.waitDeepLinks | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.telegramBotWithBehaviourAndLongPolling | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.* | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onCommand | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onDeepLink | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onText | ||||
| import dev.inmo.tgbotapi.extensions.utils.formatting.makeTelegramDeepLink | ||||
| import dev.inmo.tgbotapi.types.message.textsources.BotCommandTextSource | ||||
|  | ||||
|   | ||||
| @@ -1,23 +1,20 @@ | ||||
| import dev.inmo.micro_utils.coroutines.AccumulatorFlow | ||||
| import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions | ||||
| import dev.inmo.micro_utils.fsm.common.State | ||||
| import dev.inmo.tgbotapi.extensions.api.send.send | ||||
| 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.* | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.waitAnyContentMessage | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.telegramBotWithBehaviourAndFSMAndStartLongPolling | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.command | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onContentMessage | ||||
| import dev.inmo.tgbotapi.extensions.utils.extensions.parseCommandsWithArgs | ||||
| import dev.inmo.tgbotapi.extensions.utils.extensions.sameThread | ||||
| import dev.inmo.tgbotapi.extensions.utils.formatting.* | ||||
| import dev.inmo.tgbotapi.extensions.utils.textContentOrNull | ||||
| import dev.inmo.tgbotapi.extensions.utils.withContentOrNull | ||||
| import dev.inmo.tgbotapi.types.IdChatIdentifier | ||||
| import dev.inmo.tgbotapi.types.MessageThreadId | ||||
| import dev.inmo.tgbotapi.types.message.abstracts.CommonMessage | ||||
| import dev.inmo.tgbotapi.types.message.content.TextContent | ||||
| import dev.inmo.tgbotapi.utils.botCommand | ||||
| import dev.inmo.tgbotapi.utils.extensions.threadIdOrNull | ||||
| import kotlinx.coroutines.* | ||||
| import kotlinx.coroutines.CoroutineScope | ||||
| import kotlinx.coroutines.Dispatchers | ||||
| import kotlinx.coroutines.flow.filter | ||||
| import kotlinx.coroutines.flow.first | ||||
|  | ||||
|   | ||||
| @@ -2,38 +2,17 @@ import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions | ||||
| import dev.inmo.tgbotapi.extensions.api.files.downloadFile | ||||
| import dev.inmo.tgbotapi.extensions.api.files.downloadFileToTemp | ||||
| import dev.inmo.tgbotapi.extensions.api.get.getFileAdditionalInfo | ||||
| import dev.inmo.tgbotapi.extensions.api.send.reply | ||||
| import dev.inmo.tgbotapi.extensions.api.send.replyWithAnimation | ||||
| import dev.inmo.tgbotapi.extensions.api.send.replyWithAudio | ||||
| import dev.inmo.tgbotapi.extensions.api.send.replyWithDocument | ||||
| import dev.inmo.tgbotapi.extensions.api.send.replyWithMediaGroup | ||||
| import dev.inmo.tgbotapi.extensions.api.send.replyWithPhoto | ||||
| import dev.inmo.tgbotapi.extensions.api.send.replyWithSticker | ||||
| import dev.inmo.tgbotapi.extensions.api.send.replyWithVideo | ||||
| import dev.inmo.tgbotapi.extensions.api.send.replyWithVideoNote | ||||
| import dev.inmo.tgbotapi.extensions.api.send.replyWithVoice | ||||
| import dev.inmo.tgbotapi.extensions.api.send.withAction | ||||
| import dev.inmo.tgbotapi.extensions.api.send.* | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.telegramBotWithBehaviourAndLongPolling | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onCommand | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onContentMessage | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onMedia | ||||
| import dev.inmo.tgbotapi.requests.abstracts.asMultipartFile | ||||
| import dev.inmo.tgbotapi.requests.send.SendAction | ||||
| import dev.inmo.tgbotapi.types.actions.BotAction | ||||
| import dev.inmo.tgbotapi.types.actions.TypingAction | ||||
| import dev.inmo.tgbotapi.types.media.TelegramMediaAudio | ||||
| import dev.inmo.tgbotapi.types.media.TelegramMediaDocument | ||||
| import dev.inmo.tgbotapi.types.media.TelegramMediaPhoto | ||||
| import dev.inmo.tgbotapi.types.media.TelegramMediaVideo | ||||
| import dev.inmo.tgbotapi.types.message.content.AnimationContent | ||||
| import dev.inmo.tgbotapi.types.message.content.AudioContent | ||||
| import dev.inmo.tgbotapi.types.message.content.DocumentContent | ||||
| import dev.inmo.tgbotapi.types.message.content.MediaGroupContent | ||||
| import dev.inmo.tgbotapi.types.message.content.PhotoContent | ||||
| import dev.inmo.tgbotapi.types.message.content.StickerContent | ||||
| import dev.inmo.tgbotapi.types.message.content.VideoContent | ||||
| import dev.inmo.tgbotapi.types.message.content.VideoNoteContent | ||||
| import dev.inmo.tgbotapi.types.message.content.VoiceContent | ||||
| import dev.inmo.tgbotapi.types.message.content.* | ||||
| import dev.inmo.tgbotapi.utils.filenameFromUrl | ||||
| import kotlinx.coroutines.CoroutineScope | ||||
| import kotlinx.coroutines.Dispatchers | ||||
|   | ||||
| @@ -1,15 +1,13 @@ | ||||
| import dev.inmo.kslog.common.KSLog | ||||
| import dev.inmo.kslog.common.LogLevel | ||||
| import dev.inmo.kslog.common.defaultMessageFormatter | ||||
| import dev.inmo.kslog.common.filter.filtered | ||||
| import dev.inmo.kslog.common.setDefaultKSLog | ||||
| import dev.inmo.tgbotapi.bot.ktor.telegramBot | ||||
| import dev.inmo.tgbotapi.extensions.api.bot.getMe | ||||
| import dev.inmo.tgbotapi.extensions.api.chat.get.getChat | ||||
| import dev.inmo.tgbotapi.utils.DefaultKTgBotAPIKSLog | ||||
|  | ||||
| /** | ||||
|  * This is one of the most easiest bot - it will just print information about itself | ||||
|  * This is one of the easiest bots - it will just print information about itself | ||||
|  */ | ||||
| suspend fun main(vararg args: String) { | ||||
|     val botToken = args.first() | ||||
|   | ||||
| @@ -1,23 +1,18 @@ | ||||
| import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions | ||||
| import dev.inmo.tgbotapi.extensions.api.bot.getMe | ||||
| import dev.inmo.tgbotapi.extensions.api.chat.get.getChat | ||||
| import dev.inmo.tgbotapi.extensions.api.send.* | ||||
| 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.onContentMessage | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onMentionWithAnyContent | ||||
| 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 | ||||
| import dev.inmo.tgbotapi.extensions.utils.ifChannelChat | ||||
| import dev.inmo.tgbotapi.extensions.utils.ifFromChannelGroupContentMessage | ||||
| import dev.inmo.tgbotapi.types.chat.* | ||||
| 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.utils.PreviewFeature | ||||
| import dev.inmo.tgbotapi.utils.extensions.escapeMarkdownV2Common | ||||
| import kotlinx.coroutines.* | ||||
| import kotlinx.coroutines.CoroutineScope | ||||
| import kotlinx.coroutines.Dispatchers | ||||
|  | ||||
| /** | ||||
|  * The main purpose of this bot is just to answer "Oh, hi, " and add user mention here | ||||
| @@ -29,8 +24,6 @@ suspend fun main(vararg args: String) { | ||||
|     telegramBotWithBehaviourAndLongPolling(botToken, CoroutineScope(Dispatchers.IO)) { | ||||
|         val me = getMe() | ||||
|         onMentionWithAnyContent(me) { message -> | ||||
|             val chat = message.chat | ||||
|  | ||||
|             val answerText = when (val chat = message.chat) { | ||||
|                 is PreviewChannelChat -> { | ||||
|                     val answer = "Hi everybody in this channel \"${chat.title}\"" | ||||
| @@ -42,7 +35,7 @@ suspend fun main(vararg args: String) { | ||||
|                     return@onMentionWithAnyContent | ||||
|                 } | ||||
|                 is PreviewGroupChat -> { | ||||
|                     message.ifFromChannelGroupContentMessage { | ||||
|                     message.ifFromChannelGroupContentMessage<Unit> { | ||||
|                         val answer = "Hi, ${it.senderChat.title}" | ||||
|                         reply(message, answer, MarkdownV2) | ||||
|                         return@onMentionWithAnyContent | ||||
|   | ||||
| @@ -1,5 +1,3 @@ | ||||
| import dev.inmo.micro_utils.common.MPPFile | ||||
|  | ||||
| suspend fun main(args: Array<String>) { | ||||
|     doInlineQueriesBot(args.first()) | ||||
| } | ||||
|   | ||||
| @@ -1,14 +1,12 @@ | ||||
| import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions | ||||
| import dev.inmo.tgbotapi.extensions.api.bot.getMe | ||||
| import dev.inmo.tgbotapi.bot.ktor.telegramBot | ||||
| import dev.inmo.tgbotapi.extensions.api.answers.answer | ||||
| import dev.inmo.tgbotapi.extensions.api.bot.getMe | ||||
| import dev.inmo.tgbotapi.extensions.api.bot.setMyCommands | ||||
| import dev.inmo.tgbotapi.extensions.api.edit.edit | ||||
| import dev.inmo.tgbotapi.extensions.api.edit.editMessageText | ||||
| import dev.inmo.tgbotapi.extensions.api.edit.reply_markup.editMessageReplyMarkup | ||||
| import dev.inmo.tgbotapi.extensions.api.edit.text.editMessageText | ||||
| import dev.inmo.tgbotapi.extensions.api.send.* | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.* | ||||
| import dev.inmo.tgbotapi.extensions.api.send.reply | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.buildBehaviourWithLongPolling | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.* | ||||
| import dev.inmo.tgbotapi.extensions.utils.types.buttons.* | ||||
| import dev.inmo.tgbotapi.extensions.utils.withContent | ||||
| @@ -17,11 +15,13 @@ import dev.inmo.tgbotapi.types.InlineQueries.InlineQueryResult.InlineQueryResult | ||||
| import dev.inmo.tgbotapi.types.InlineQueries.InputMessageContent.InputTextMessageContent | ||||
| import dev.inmo.tgbotapi.types.InlineQueryId | ||||
| import dev.inmo.tgbotapi.types.message.content.TextContent | ||||
| import dev.inmo.tgbotapi.utils.* | ||||
| import kotlinx.coroutines.* | ||||
|  | ||||
| private const val nextPageData = "next" | ||||
| private const val previousPageData = "previous" | ||||
| import dev.inmo.tgbotapi.utils.PreviewFeature | ||||
| import dev.inmo.tgbotapi.utils.botCommand | ||||
| import dev.inmo.tgbotapi.utils.regular | ||||
| import dev.inmo.tgbotapi.utils.row | ||||
| import kotlinx.coroutines.CoroutineScope | ||||
| import kotlinx.coroutines.SupervisorJob | ||||
| import kotlinx.coroutines.currentCoroutineContext | ||||
|  | ||||
| fun String.parsePageAndCount(): Pair<Int, Int>? { | ||||
|     val (pageString, countString) = split(" ").takeIf { it.count() > 1 } ?: return null | ||||
| @@ -73,6 +73,7 @@ fun InlineKeyboardBuilder.includePageButtons(page: Int, count: Int) { | ||||
|     } | ||||
| } | ||||
|  | ||||
| @OptIn(PreviewFeature::class) | ||||
| suspend fun activateKeyboardsBot( | ||||
|     token: String, | ||||
|     print: (Any) -> Unit | ||||
|   | ||||
| @@ -3,24 +3,15 @@ import dev.inmo.kslog.common.LogLevel | ||||
| import dev.inmo.kslog.common.defaultMessageFormatter | ||||
| import dev.inmo.kslog.common.setDefaultKSLog | ||||
| import dev.inmo.tgbotapi.bot.ktor.telegramBot | ||||
| import dev.inmo.tgbotapi.extensions.api.chat.get.getChat | ||||
| import dev.inmo.tgbotapi.extensions.api.send.copyMessage | ||||
| import dev.inmo.tgbotapi.extensions.api.send.reply | ||||
| import dev.inmo.tgbotapi.extensions.api.send.send | ||||
| import dev.inmo.tgbotapi.extensions.api.send.setMessageReaction | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.buildBehaviourWithLongPolling | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onChatMessageReactionUpdatedByUser | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onChatMessageReactionsCountUpdated | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onContentMessage | ||||
| import dev.inmo.tgbotapi.extensions.utils.textLinkTextSourceOrNull | ||||
| import dev.inmo.tgbotapi.extensions.utils.uRLTextSourceOrNull | ||||
| import dev.inmo.tgbotapi.extensions.utils.withContentOrNull | ||||
| import dev.inmo.tgbotapi.types.LinkPreviewOptions | ||||
| import dev.inmo.tgbotapi.types.chat.ExtendedChat | ||||
| import dev.inmo.tgbotapi.types.message.content.TextContent | ||||
| import dev.inmo.tgbotapi.types.message.content.TextedContent | ||||
| import dev.inmo.tgbotapi.types.reactions.Reaction | ||||
| import dev.inmo.tgbotapi.utils.customEmoji | ||||
| import dev.inmo.tgbotapi.utils.regular | ||||
|  | ||||
| /** | ||||
| @@ -41,17 +32,17 @@ suspend fun main(vararg args: String) { | ||||
|     val bot = telegramBot(botToken) | ||||
|  | ||||
|     bot.buildBehaviourWithLongPolling { | ||||
|         onContentMessage { | ||||
|             val url = it.withContentOrNull<TextedContent>() ?.let { | ||||
|                 it.content.textSources.firstNotNullOfOrNull { | ||||
|         onContentMessage { contentMessage -> | ||||
|             val url = contentMessage.withContentOrNull<TextedContent>() ?.let { message -> | ||||
|                 message.content.textSources.firstNotNullOfOrNull { | ||||
|                     it.textLinkTextSourceOrNull() ?.url ?: it.uRLTextSourceOrNull() ?.source | ||||
|                 } | ||||
|             } ?: null.apply { | ||||
|                 reply(it) { | ||||
|                 reply(contentMessage) { | ||||
|                     regular("I am support only content with text contains url only") | ||||
|                 } | ||||
|             } ?: return@onContentMessage | ||||
|             it.withContentOrNull<TextedContent>() ?.let { | ||||
|             contentMessage.withContentOrNull<TextedContent>() ?.let { | ||||
|                 send( | ||||
|                     it.chat, | ||||
|                     it.content.textSources, | ||||
|   | ||||
| @@ -8,7 +8,6 @@ import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onComman | ||||
| import dev.inmo.tgbotapi.extensions.utils.extensions.sameMessage | ||||
| import dev.inmo.tgbotapi.extensions.utils.types.buttons.dataButton | ||||
| import dev.inmo.tgbotapi.extensions.utils.types.buttons.flatInlineKeyboard | ||||
| import dev.inmo.tgbotapi.types.location.LiveLocation | ||||
| import dev.inmo.tgbotapi.types.message.abstracts.ContentMessage | ||||
| import dev.inmo.tgbotapi.types.message.content.LocationContent | ||||
| import kotlinx.coroutines.* | ||||
| @@ -47,7 +46,7 @@ suspend fun main(vararg args: String) { | ||||
|                 handleLiveLocation( | ||||
|                     it.chat.id, | ||||
|                     locationsFlow, | ||||
|                     sentMessageFlow = FlowCollector { currentMessageState.emit(it) }, | ||||
|                     sentMessageFlow = { currentMessageState.emit(it) }, | ||||
|                 ) | ||||
|             } | ||||
|  | ||||
|   | ||||
| @@ -1,46 +1,41 @@ | ||||
| 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.api.send.send | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.telegramBotWithBehaviourAndLongPolling | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.* | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onCommand | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onPollAnswer | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onPollUpdates | ||||
| 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 | ||||
| import dev.inmo.tgbotapi.extensions.utils.ifChannelChat | ||||
| import dev.inmo.tgbotapi.extensions.utils.ifFromChannelGroupContentMessage | ||||
| import dev.inmo.tgbotapi.types.* | ||||
| import dev.inmo.tgbotapi.types.chat.* | ||||
| 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.* | ||||
| import dev.inmo.tgbotapi.utils.* | ||||
| import dev.inmo.tgbotapi.utils.extensions.escapeMarkdownV2Common | ||||
| import kotlinx.coroutines.* | ||||
| import dev.inmo.tgbotapi.types.BotCommand | ||||
| import dev.inmo.tgbotapi.types.IdChatIdentifier | ||||
| import dev.inmo.tgbotapi.types.PollId | ||||
| import dev.inmo.tgbotapi.types.ReplyParameters | ||||
| import dev.inmo.tgbotapi.types.polls.InputPollOption | ||||
| import dev.inmo.tgbotapi.types.polls.PollAnswer | ||||
| import dev.inmo.tgbotapi.utils.buildEntities | ||||
| import dev.inmo.tgbotapi.utils.customEmoji | ||||
| import dev.inmo.tgbotapi.utils.regular | ||||
| import dev.inmo.tgbotapi.utils.underline | ||||
| import kotlinx.coroutines.CoroutineScope | ||||
| import kotlinx.coroutines.Dispatchers | ||||
| 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 | ||||
|  * updates of any of it. | ||||
|  * any update. | ||||
|  *  | ||||
|  * * Use `/anonymous` to take anonymous regular poll | ||||
|  * * Use `/public` to take public regular poll | ||||
|  */ | ||||
| @OptIn(PreviewFeature::class) | ||||
| suspend fun main(vararg args: String) { | ||||
|     val botToken = args.first() | ||||
|     val isDebug = args.any { it == "debug" } | ||||
| @@ -54,8 +49,6 @@ suspend fun main(vararg args: String) { | ||||
|     } | ||||
|  | ||||
|     telegramBotWithBehaviourAndLongPolling(botToken, CoroutineScope(Dispatchers.IO)) { | ||||
|         val me = getMe() | ||||
|  | ||||
|         val pollToChat = mutableMapOf<PollId, IdChatIdentifier>() | ||||
|         val pollToChatMutex = Mutex() | ||||
|  | ||||
|   | ||||
| @@ -6,7 +6,6 @@ import dev.inmo.tgbotapi.bot.ktor.telegramBot | ||||
| import dev.inmo.tgbotapi.extensions.api.chat.get.getChat | ||||
| import dev.inmo.tgbotapi.extensions.api.send.reply | ||||
| import dev.inmo.tgbotapi.extensions.api.send.setMessageReaction | ||||
| import dev.inmo.tgbotapi.extensions.api.send.setMessageReactions | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.buildBehaviourWithLongPolling | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onChatMessageReactionUpdatedByUser | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onChatMessageReactionsCountUpdated | ||||
|   | ||||
| @@ -1,21 +1,19 @@ | ||||
| import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions | ||||
| import dev.inmo.tgbotapi.extensions.api.bot.getMe | ||||
| import dev.inmo.tgbotapi.bot.ktor.telegramBot | ||||
| import dev.inmo.tgbotapi.extensions.api.send.* | ||||
| import dev.inmo.tgbotapi.extensions.api.send.media.* | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.* | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.filters.CommonMessageFilterExcludeMediaGroups | ||||
| import dev.inmo.tgbotapi.extensions.api.send.withTypingAction | ||||
| 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.telegramBotWithBehaviourAndLongPolling | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onContentMessage | ||||
| import dev.inmo.tgbotapi.extensions.utils.possiblyWithEffectMessageOrNull | ||||
| import dev.inmo.tgbotapi.extensions.utils.shortcuts.* | ||||
| import dev.inmo.tgbotapi.extensions.utils.shortcuts.executeUnsafe | ||||
| import dev.inmo.tgbotapi.extensions.utils.withContentOrNull | ||||
| import dev.inmo.tgbotapi.types.ReplyParameters | ||||
| import dev.inmo.tgbotapi.types.message.abstracts.BusinessContentMessage | ||||
| import dev.inmo.tgbotapi.types.message.content.TextContent | ||||
| import dev.inmo.tgbotapi.types.quoteEntitiesField | ||||
| import dev.inmo.tgbotapi.utils.extensions.threadIdOrNull | ||||
| import kotlinx.coroutines.* | ||||
| import kotlinx.coroutines.CoroutineScope | ||||
| import kotlinx.coroutines.SupervisorJob | ||||
| import kotlinx.coroutines.currentCoroutineContext | ||||
|  | ||||
| suspend fun activateResenderBot( | ||||
|     token: String, | ||||
|   | ||||
| @@ -16,7 +16,9 @@ import dev.inmo.tgbotapi.extensions.api.send.reply | ||||
| import dev.inmo.tgbotapi.extensions.api.send.send | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.buildBehaviourWithFSMAndStartLongPolling | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.* | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.waitChatSharedEventsMessages | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.waitCommandMessage | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.waitUserSharedEventsMessages | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onCommand | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onMessageDataCallbackQuery | ||||
| import dev.inmo.tgbotapi.extensions.utils.* | ||||
| @@ -27,12 +29,12 @@ import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup | ||||
| import dev.inmo.tgbotapi.types.chat.ChannelChat | ||||
| import dev.inmo.tgbotapi.types.chat.ChatPermissions | ||||
| import dev.inmo.tgbotapi.types.chat.PublicChat | ||||
| import dev.inmo.tgbotapi.types.chat.member.* | ||||
| import dev.inmo.tgbotapi.types.chat.member.AdministratorChatMember | ||||
| import dev.inmo.tgbotapi.types.chat.member.ChatCommonAdministratorRights | ||||
| import dev.inmo.tgbotapi.types.commands.BotCommandScope | ||||
| import dev.inmo.tgbotapi.types.message.abstracts.AccessibleMessage | ||||
| import dev.inmo.tgbotapi.types.request.RequestId | ||||
| import dev.inmo.tgbotapi.utils.* | ||||
| import dev.inmo.tgbotapi.utils.mention | ||||
| import kotlinx.coroutines.flow.filter | ||||
| import kotlinx.coroutines.flow.first | ||||
| import kotlinx.coroutines.flow.mapNotNull | ||||
| @@ -52,6 +54,7 @@ sealed interface UserRetrievingStep : State { | ||||
|     ) : UserRetrievingStep | ||||
| } | ||||
|  | ||||
| @OptIn(PreviewFeature::class) | ||||
| suspend fun main(args: Array<String>) { | ||||
|     val botToken = args.first() | ||||
|  | ||||
| @@ -224,7 +227,6 @@ suspend fun main(args: Array<String>) { | ||||
|             } | ||||
|         ) { | ||||
|             val replyMessage = it.replyTo | ||||
|             val usernameInText = it.content.textSources.firstNotNullOfOrNull { it.mentionTextSourceOrNull() } ?.username | ||||
|             val userInReply = replyMessage?.fromUserMessageOrNull()?.user?.id ?: return@onCommand | ||||
|  | ||||
|             if (replyMessage is AccessibleMessage) { | ||||
| @@ -381,7 +383,6 @@ suspend fun main(args: Array<String>) { | ||||
|             val userId = ChatId(RawChatId(userIdString.toLong())) | ||||
|             val chatMember = getChatMember(channelId, userId) | ||||
|             val asAdmin = chatMember.administratorChatMemberOrNull() | ||||
|             val asMember = chatMember.memberChatMemberOrNull() | ||||
|  | ||||
|             val realData = it.data.takeWhile { it != ' ' } | ||||
|  | ||||
| @@ -504,7 +505,6 @@ suspend fun main(args: Array<String>) { | ||||
|         strictlyOn<UserRetrievingStep.RetrievingChatInfoDoneState> { state -> | ||||
|             val chatMember = getChatMember(state.channelId, state.userId).administratorChatMemberOrNull() | ||||
|             if (chatMember == null) { | ||||
|  | ||||
|                 return@strictlyOn null | ||||
|             } | ||||
|             send( | ||||
|   | ||||
| @@ -3,38 +3,43 @@ 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.answers.answer | ||||
| import dev.inmo.tgbotapi.extensions.api.answers.payments.answerPreCheckoutQueryOk | ||||
| import dev.inmo.tgbotapi.extensions.api.bot.getMe | ||||
| import dev.inmo.tgbotapi.extensions.api.edit.edit | ||||
| import dev.inmo.tgbotapi.extensions.api.files.downloadFileToTemp | ||||
| import dev.inmo.tgbotapi.extensions.api.get.getStarTransactions | ||||
| import dev.inmo.tgbotapi.extensions.api.send.reply | ||||
| import dev.inmo.tgbotapi.extensions.api.send.send | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.telegramBotWithBehaviourAndLongPolling | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.command | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onCommand | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onMessageDataCallbackQuery | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onPreCheckoutQuery | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.* | ||||
| import dev.inmo.tgbotapi.extensions.utils.extensions.sameChat | ||||
| import dev.inmo.tgbotapi.extensions.utils.types.buttons.dataButton | ||||
| import dev.inmo.tgbotapi.extensions.utils.types.buttons.flatInlineKeyboard | ||||
| import dev.inmo.tgbotapi.extensions.utils.types.buttons.inlineKeyboard | ||||
| import dev.inmo.tgbotapi.extensions.utils.types.buttons.payButton | ||||
| import dev.inmo.tgbotapi.extensions.utils.withContentOrNull | ||||
| import dev.inmo.tgbotapi.requests.abstracts.asMultipartFile | ||||
| import dev.inmo.tgbotapi.types.RawChatId | ||||
| import dev.inmo.tgbotapi.types.UserId | ||||
| import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup | ||||
| import dev.inmo.tgbotapi.types.files.* | ||||
| import dev.inmo.tgbotapi.types.media.TelegramPaidMediaPhoto | ||||
| import dev.inmo.tgbotapi.types.media.TelegramPaidMediaVideo | ||||
| import dev.inmo.tgbotapi.types.media.toTelegramPaidMediaPhoto | ||||
| import dev.inmo.tgbotapi.types.media.toTelegramPaidMediaVideo | ||||
| import dev.inmo.tgbotapi.types.message.content.TextContent | ||||
| import dev.inmo.tgbotapi.types.message.textsources.TextSource | ||||
| import dev.inmo.tgbotapi.types.message.textsources.TextSourcesList | ||||
| import dev.inmo.tgbotapi.types.payments.LabeledPrice | ||||
| import dev.inmo.tgbotapi.types.payments.stars.StarTransaction | ||||
| import dev.inmo.tgbotapi.utils.* | ||||
| import kotlinx.coroutines.* | ||||
| import dev.inmo.tgbotapi.utils.bold | ||||
| import dev.inmo.tgbotapi.utils.buildEntities | ||||
| import dev.inmo.tgbotapi.utils.regular | ||||
| import dev.inmo.tgbotapi.utils.row | ||||
| import kotlinx.coroutines.CoroutineScope | ||||
| import kotlinx.coroutines.Dispatchers | ||||
|  | ||||
| /** | ||||
|  * The main purpose of this bot is just to answer "Oh, hi, " and add user mention here | ||||
|  * An example bot that interacts with Telegram Stars API (used for payments) | ||||
|  */ | ||||
| @OptIn(PreviewFeature::class) | ||||
| suspend fun main(vararg args: String) { | ||||
|     val botToken = args.first() | ||||
|     val adminUserId = args.getOrNull(1) ?.toLongOrNull() ?.let(::RawChatId) ?.let(::UserId) ?: error("Pass user-admin for full access to the bot") | ||||
| @@ -51,8 +56,6 @@ suspend fun main(vararg args: String) { | ||||
|     } | ||||
|  | ||||
|     telegramBotWithBehaviourAndLongPolling(botToken, CoroutineScope(Dispatchers.IO), testServer = isTestServer) { | ||||
|         val me = getMe() | ||||
|  | ||||
|         val payload = "sample payload" | ||||
|         command("start") { | ||||
|             reply( | ||||
| @@ -126,6 +129,58 @@ suspend fun main(vararg args: String) { | ||||
|             ) | ||||
|         } | ||||
|  | ||||
|         onVisualGalleryMessages { | ||||
|             send( | ||||
|                 it.chat, | ||||
|                 1, | ||||
|                 it.content.group.mapNotNull { | ||||
|                     val file = downloadFileToTemp(it.content.media) | ||||
|                     when (it.content.media) { | ||||
|                         is VideoFile -> { | ||||
|                             TelegramPaidMediaVideo( | ||||
|                                 file.asMultipartFile() | ||||
|                             ) | ||||
|                         } | ||||
|                         is PhotoSize -> { | ||||
|                             TelegramPaidMediaPhoto( | ||||
|                                 file.asMultipartFile() | ||||
|                             ) | ||||
|                         } | ||||
|                         else -> null | ||||
|                     } | ||||
|                 }, | ||||
|                 it.content.textSources, | ||||
|                 showCaptionAboveMedia = true | ||||
|             ) | ||||
|         } | ||||
|  | ||||
|         onPhoto { | ||||
|             send( | ||||
|                 it.chat, | ||||
|                 1, | ||||
|                 listOf(it.content.media.toTelegramPaidMediaPhoto()) | ||||
|             ) | ||||
|         } | ||||
|  | ||||
|         onVideo { | ||||
|             send( | ||||
|                 it.chat, | ||||
|                 1, | ||||
|                 listOf(it.content.media.toTelegramPaidMediaVideo()) | ||||
|             ) | ||||
|         } | ||||
|  | ||||
|         onPaidMediaInfoContent { | ||||
|             println(it) | ||||
|         } | ||||
|  | ||||
|         onRefundedPayment { | ||||
|             reply( | ||||
|                 it, | ||||
|                 "Received your refund: ${it.chatEvent.payment}" | ||||
|             ) | ||||
|         } | ||||
|  | ||||
|         allUpdatesFlow.subscribeSafelyWithoutExceptions(this) { println(it) } | ||||
|     }.second.join() | ||||
| } | ||||
|   | ||||
| @@ -1,22 +1,25 @@ | ||||
| import dev.inmo.micro_utils.coroutines.defaultSafelyWithoutExceptionHandler | ||||
| import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions | ||||
| import dev.inmo.tgbotapi.extensions.api.bot.getMe | ||||
| import dev.inmo.tgbotapi.bot.ktor.telegramBot | ||||
| import dev.inmo.tgbotapi.extensions.api.get.* | ||||
| import dev.inmo.tgbotapi.extensions.api.send.* | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.* | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.* | ||||
| import dev.inmo.tgbotapi.types.StickerFormat | ||||
| import dev.inmo.tgbotapi.extensions.api.bot.getMe | ||||
| import dev.inmo.tgbotapi.extensions.api.get.getCustomEmojiStickerOrNull | ||||
| import dev.inmo.tgbotapi.extensions.api.get.getStickerSet | ||||
| import dev.inmo.tgbotapi.extensions.api.get.getStickerSetOrNull | ||||
| import dev.inmo.tgbotapi.extensions.api.send.reply | ||||
| import dev.inmo.tgbotapi.extensions.api.send.withTypingAction | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.buildBehaviourWithLongPolling | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onSticker | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onText | ||||
| import dev.inmo.tgbotapi.types.StickerType | ||||
| import dev.inmo.tgbotapi.types.message.textsources.* | ||||
| import dev.inmo.tgbotapi.types.stickers.CustomEmojiStickerSet | ||||
| import dev.inmo.tgbotapi.types.stickers.MaskStickerSet | ||||
| import dev.inmo.tgbotapi.types.stickers.RegularStickerSet | ||||
| import dev.inmo.tgbotapi.types.message.textsources.CustomEmojiTextSource | ||||
| import dev.inmo.tgbotapi.types.message.textsources.regular | ||||
| import dev.inmo.tgbotapi.types.message.textsources.separateForText | ||||
| import dev.inmo.tgbotapi.types.stickers.StickerSet | ||||
| import dev.inmo.tgbotapi.types.stickers.UnknownStickerSet | ||||
| import dev.inmo.tgbotapi.utils.bold | ||||
| import dev.inmo.tgbotapi.utils.buildEntities | ||||
| import kotlinx.coroutines.* | ||||
| import kotlinx.coroutines.CoroutineScope | ||||
| import kotlinx.coroutines.SupervisorJob | ||||
| import kotlinx.coroutines.currentCoroutineContext | ||||
|  | ||||
| fun StickerSet?.buildInfo() = buildEntities { | ||||
|     if (this@buildInfo == null) { | ||||
|   | ||||
| @@ -1,7 +1,6 @@ | ||||
| import dev.inmo.micro_utils.coroutines.runCatchingSafely | ||||
| import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions | ||||
| import dev.inmo.tgbotapi.extensions.api.bot.getMe | ||||
| import dev.inmo.tgbotapi.extensions.api.files.downloadFile | ||||
| import dev.inmo.tgbotapi.extensions.api.files.downloadFileToTemp | ||||
| import dev.inmo.tgbotapi.extensions.api.get.getStickerSet | ||||
| import dev.inmo.tgbotapi.extensions.api.send.reply | ||||
| @@ -11,12 +10,14 @@ import dev.inmo.tgbotapi.extensions.api.stickers.deleteStickerSet | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.telegramBotWithBehaviourAndLongPolling | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onCommand | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onSticker | ||||
| import dev.inmo.tgbotapi.extensions.utils.extensions.raw.sticker | ||||
| import dev.inmo.tgbotapi.requests.abstracts.asMultipartFile | ||||
| import dev.inmo.tgbotapi.requests.stickers.InputSticker | ||||
| import dev.inmo.tgbotapi.types.StickerSetName | ||||
| import dev.inmo.tgbotapi.types.chat.Chat | ||||
| import dev.inmo.tgbotapi.types.files.* | ||||
| import dev.inmo.tgbotapi.types.files.CustomEmojiSticker | ||||
| import dev.inmo.tgbotapi.types.files.MaskSticker | ||||
| import dev.inmo.tgbotapi.types.files.RegularSticker | ||||
| import dev.inmo.tgbotapi.types.files.UnknownSticker | ||||
| import dev.inmo.tgbotapi.types.toChatId | ||||
| import dev.inmo.tgbotapi.utils.botCommand | ||||
| import kotlinx.coroutines.CoroutineScope | ||||
|   | ||||
| @@ -1,18 +1,8 @@ | ||||
| import com.benasher44.uuid.uuid4 | ||||
| import dev.inmo.micro_utils.common.repeatOnFailure | ||||
| import dev.inmo.micro_utils.coroutines.runCatchingSafely | ||||
| import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions | ||||
| import dev.inmo.tgbotapi.extensions.api.bot.setMyCommands | ||||
| import dev.inmo.tgbotapi.extensions.api.chat.forum.closeForumTopic | ||||
| import dev.inmo.tgbotapi.extensions.api.chat.forum.closeGeneralForumTopic | ||||
| import dev.inmo.tgbotapi.extensions.api.chat.forum.createForumTopic | ||||
| import dev.inmo.tgbotapi.extensions.api.chat.forum.deleteForumTopic | ||||
| import dev.inmo.tgbotapi.extensions.api.chat.forum.editForumTopic | ||||
| import dev.inmo.tgbotapi.extensions.api.chat.forum.editGeneralForumTopic | ||||
| import dev.inmo.tgbotapi.extensions.api.chat.forum.hideGeneralForumTopic | ||||
| import dev.inmo.tgbotapi.extensions.api.chat.forum.reopenForumTopic | ||||
| import dev.inmo.tgbotapi.extensions.api.chat.forum.reopenGeneralForumTopic | ||||
| import dev.inmo.tgbotapi.extensions.api.chat.forum.unhideGeneralForumTopic | ||||
| 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 | ||||
|   | ||||
| @@ -6,11 +6,10 @@ import dev.inmo.micro_utils.coroutines.runCatchingSafely | ||||
| import dev.inmo.tgbotapi.bot.ktor.telegramBot | ||||
| 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.reply | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.buildBehaviourWithLongPolling | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onChatShared | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onCommand | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onUserShared | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onUsersShared | ||||
| import dev.inmo.tgbotapi.extensions.utils.types.buttons.* | ||||
| import dev.inmo.tgbotapi.types.BotCommand | ||||
|   | ||||
| @@ -26,6 +26,7 @@ fun HTMLElement.log(text: String) { | ||||
|     appendElement("p", {}) | ||||
| } | ||||
|  | ||||
| @OptIn(ExperimentalUnsignedTypes::class) | ||||
| fun main() { | ||||
|     console.log("Web app started") | ||||
|     val client = HttpClient() | ||||
| @@ -38,7 +39,7 @@ fun main() { | ||||
|             scope.launchSafelyWithoutExceptions { | ||||
|                 val response = client.post("$baseUrl/check") { | ||||
|                     setBody( | ||||
|                         Json { }.encodeToString( | ||||
|                         Json.encodeToString( | ||||
|                             WebAppDataWrapper.serializer(), | ||||
|                             WebAppDataWrapper(webApp.initData, webApp.initDataUnsafe.hash) | ||||
|                         ) | ||||
|   | ||||
| @@ -1,16 +1,20 @@ | ||||
| import dev.inmo.kslog.common.* | ||||
| import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions | ||||
| import dev.inmo.micro_utils.ktor.server.createKtorServer | ||||
| import dev.inmo.tgbotapi.extensions.api.answers.answer | ||||
| import dev.inmo.tgbotapi.extensions.api.answers.answerInlineQuery | ||||
| import dev.inmo.tgbotapi.extensions.api.bot.getMe | ||||
| import dev.inmo.tgbotapi.extensions.api.bot.setMyCommands | ||||
| import dev.inmo.tgbotapi.extensions.api.send.* | ||||
| import dev.inmo.tgbotapi.extensions.api.send.reply | ||||
| import dev.inmo.tgbotapi.extensions.api.send.send | ||||
| import dev.inmo.tgbotapi.extensions.api.telegramBot | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.* | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.* | ||||
| import dev.inmo.tgbotapi.extensions.utils.formatting.makeTelegramStartattach | ||||
| import dev.inmo.tgbotapi.extensions.utils.types.buttons.* | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.buildBehaviourWithLongPolling | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onBaseInlineQuery | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onCommand | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onUnhandledCommand | ||||
| import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onWriteAccessAllowed | ||||
| import dev.inmo.tgbotapi.extensions.utils.types.buttons.inlineKeyboard | ||||
| import dev.inmo.tgbotapi.extensions.utils.types.buttons.replyKeyboard | ||||
| import dev.inmo.tgbotapi.extensions.utils.types.buttons.webAppButton | ||||
| import dev.inmo.tgbotapi.requests.answers.InlineQueryResultsButton | ||||
| import dev.inmo.tgbotapi.types.BotCommand | ||||
| import dev.inmo.tgbotapi.types.InlineQueries.InlineQueryResult.InlineQueryResultArticle | ||||
| @@ -21,16 +25,14 @@ import dev.inmo.tgbotapi.types.webAppQueryIdField | ||||
| import dev.inmo.tgbotapi.types.webapps.WebAppInfo | ||||
| import dev.inmo.tgbotapi.utils.* | ||||
| import io.ktor.http.* | ||||
| import io.ktor.server.application.call | ||||
| import io.ktor.server.application.* | ||||
| import io.ktor.server.http.content.* | ||||
| import io.ktor.server.request.receiveText | ||||
| import io.ktor.server.response.respond | ||||
| import io.ktor.server.routing.post | ||||
| import io.ktor.server.routing.routing | ||||
| import io.ktor.server.request.* | ||||
| import io.ktor.server.response.* | ||||
| import io.ktor.server.routing.* | ||||
| import kotlinx.coroutines.Dispatchers | ||||
| import kotlinx.serialization.json.Json | ||||
| import java.io.File | ||||
| import java.nio.charset.Charset | ||||
|  | ||||
| /** | ||||
|  * Accepts two parameters: | ||||
| @@ -100,7 +102,7 @@ suspend fun main(vararg args: String) { | ||||
|             } | ||||
|             post("check") { | ||||
|                 val requestBody = call.receiveText() | ||||
|                 val webAppCheckData = Json {  }.decodeFromString(WebAppDataWrapper.serializer(), requestBody) | ||||
|                 val webAppCheckData = Json.decodeFromString(WebAppDataWrapper.serializer(), requestBody) | ||||
|  | ||||
|                 val isSafe = telegramBotAPIUrlsKeeper.checkWebAppData(webAppCheckData.data, webAppCheckData.hash) | ||||
|  | ||||
| @@ -112,7 +114,6 @@ suspend fun main(vararg args: String) { | ||||
|     bot.buildBehaviourWithLongPolling( | ||||
|         defaultExceptionsHandler = { it.printStackTrace() } | ||||
|     ) { | ||||
|         val me = getMe() | ||||
|         onCommand("reply_markup") { | ||||
|             reply( | ||||
|                 it, | ||||
|   | ||||
| @@ -6,7 +6,7 @@ kotlin.daemon.jvmargs=-Xmx2g -Xms500m | ||||
|  | ||||
|  | ||||
| kotlin_version=1.9.23 | ||||
| telegram_bot_api_version=15.0.0 | ||||
| micro_utils_version=0.21.0 | ||||
| telegram_bot_api_version=15.1.0 | ||||
| micro_utils_version=0.21.2 | ||||
| serialization_version=1.6.3 | ||||
| ktor_version=2.3.11 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user