mirror of
https://github.com/InsanusMokrassar/TelegramBotAPI-examples.git
synced 2025-12-06 06:15:39 +00:00
Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| d8e5825ccf | |||
| 3a4c0c4226 | |||
| b85d7a697c | |||
| ad57e4142c | |||
| c7068182e3 | |||
| a5740e6315 | |||
| 3a35995bc7 | |||
| 41fc5a9a4c |
2
.github/workflows/build.yml
vendored
2
.github/workflows/build.yml
vendored
@@ -16,4 +16,4 @@ jobs:
|
||||
with:
|
||||
java-version: 17
|
||||
- name: Build with Gradle
|
||||
run: ./gradlew build
|
||||
run: ./gradlew build --no-daemon
|
||||
|
||||
@@ -7,6 +7,7 @@ import dev.inmo.tgbotapi.extensions.behaviour_builder.*
|
||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.filters.CommonMessageFilterExcludeMediaGroups
|
||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.filters.MessageFilterByChat
|
||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.*
|
||||
import dev.inmo.tgbotapi.extensions.utils.possiblyWithEffectMessageOrNull
|
||||
import dev.inmo.tgbotapi.extensions.utils.shortcuts.*
|
||||
import dev.inmo.tgbotapi.extensions.utils.withContentOrNull
|
||||
import dev.inmo.tgbotapi.types.ReplyParameters
|
||||
@@ -39,7 +40,8 @@ suspend fun activateResenderBot(
|
||||
entities = quote ?.textSources ?: emptyList(),
|
||||
quotePosition = quote ?.position
|
||||
)
|
||||
}
|
||||
},
|
||||
effectId = it.possiblyWithEffectMessageOrNull() ?.effectId
|
||||
)
|
||||
) {
|
||||
it.forEach(print)
|
||||
|
||||
9
StarTransactionsBot/README.md
Normal file
9
StarTransactionsBot/README.md
Normal file
@@ -0,0 +1,9 @@
|
||||
# CustomBot
|
||||
|
||||
This bot basically have no any useful behaviour, but you may customize it as a playground
|
||||
|
||||
## Launch
|
||||
|
||||
```bash
|
||||
../gradlew run --args="BOT_TOKEN"
|
||||
```
|
||||
21
StarTransactionsBot/build.gradle
Normal file
21
StarTransactionsBot/build.gradle
Normal file
@@ -0,0 +1,21 @@
|
||||
buildscript {
|
||||
repositories {
|
||||
mavenCentral()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||
}
|
||||
}
|
||||
|
||||
apply plugin: 'kotlin'
|
||||
apply plugin: 'application'
|
||||
|
||||
mainClassName="StarTransactionsBotKt"
|
||||
|
||||
|
||||
dependencies {
|
||||
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
|
||||
|
||||
implementation "dev.inmo:tgbotapi:$telegram_bot_api_version"
|
||||
}
|
||||
131
StarTransactionsBot/src/main/kotlin/StarTransactionsBot.kt
Normal file
131
StarTransactionsBot/src/main/kotlin/StarTransactionsBot.kt
Normal file
@@ -0,0 +1,131 @@
|
||||
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.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.get.getStarTransactions
|
||||
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.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.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.types.RawChatId
|
||||
import dev.inmo.tgbotapi.types.UserId
|
||||
import dev.inmo.tgbotapi.types.buttons.InlineKeyboardMarkup
|
||||
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.*
|
||||
|
||||
/**
|
||||
* The main purpose of this bot is just to answer "Oh, hi, " and add user mention here
|
||||
*/
|
||||
@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")
|
||||
|
||||
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()
|
||||
|
||||
val payload = "sample payload"
|
||||
command("start") {
|
||||
reply(
|
||||
it,
|
||||
price = LabeledPrice("1", 1L),
|
||||
title = "Sample",
|
||||
description = "Sample description",
|
||||
payload = payload,
|
||||
replyMarkup = flatInlineKeyboard {
|
||||
payButton("Pay")
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
onPreCheckoutQuery(initialFilter = { it.invoicePayload == payload }) {
|
||||
answerPreCheckoutQueryOk(it)
|
||||
}
|
||||
|
||||
val transactionsDataPrefix = "getStarTransactions"
|
||||
fun buildTransactionsData(offset: Int, limit: Int = 10) = "$transactionsDataPrefix $offset $limit"
|
||||
fun parseTransactionsData(data: String): Pair<Int, Int> = data.split(" ").drop(1).let {
|
||||
it.first().toInt() to it.last().toInt()
|
||||
}
|
||||
suspend fun buildStarTransactionsPage(offset: Int, limit: Int = 10): Pair<TextSourcesList, InlineKeyboardMarkup> {
|
||||
val transactions = getStarTransactions(offset, limit)
|
||||
return buildEntities {
|
||||
transactions.transactions.forEach {
|
||||
regular("Transaction Id: ") + bold(it.id.string) + "\n"
|
||||
regular("Date: ") + bold(it.date.asDate.toStringDefault()) + "\n"
|
||||
regular("Amount: ") + bold(it.amount.toString()) + "\n"
|
||||
when (it) {
|
||||
is StarTransaction.Incoming -> {
|
||||
regular("Type: ") + bold("incoming") + "\n"
|
||||
regular("Partner: ") + bold(it.partner.type) + "\n"
|
||||
}
|
||||
is StarTransaction.Outgoing -> {
|
||||
regular("Type: ") + bold("outgoing") + "\n"
|
||||
regular("Partner: ") + bold(it.partner.type) + "\n"
|
||||
}
|
||||
is StarTransaction.Unknown -> {
|
||||
regular("Type: ") + bold("unknown") + "\n"
|
||||
regular("Partner: ") + bold(it.partner.type) + "\n"
|
||||
}
|
||||
}
|
||||
}
|
||||
} to inlineKeyboard {
|
||||
row {
|
||||
val prevOffset = (offset - limit).coerceAtLeast(0)
|
||||
if (prevOffset < offset) {
|
||||
dataButton("<", buildTransactionsData(prevOffset, limit))
|
||||
}
|
||||
val nextOffset = (offset + limit)
|
||||
dataButton(">", buildTransactionsData(nextOffset, limit))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
onCommand("transactions", initialFilter = { it.sameChat(adminUserId) }) {
|
||||
val (text, keyboard) = buildStarTransactionsPage(0)
|
||||
|
||||
reply(it, text, replyMarkup = keyboard)
|
||||
}
|
||||
|
||||
onMessageDataCallbackQuery(Regex("$transactionsDataPrefix \\d+ \\d+")) {
|
||||
val (offset, limit) = parseTransactionsData(it.data)
|
||||
val (text, keyboard) = buildStarTransactionsPage(offset, limit)
|
||||
edit(
|
||||
it.message.withContentOrNull<TextContent>() ?: return@onMessageDataCallbackQuery,
|
||||
text,
|
||||
replyMarkup = keyboard,
|
||||
)
|
||||
}
|
||||
|
||||
allUpdatesFlow.subscribeSafelyWithoutExceptions(this) { println(it) }
|
||||
}.second.join()
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
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
|
||||
@@ -77,10 +78,18 @@ suspend fun main(args: Array<String>) {
|
||||
runCatchingSafely {
|
||||
getStickerSet(stickerSetName)
|
||||
}.onSuccess { stickerSet ->
|
||||
addStickerToSet(it.chat.id.toChatId(), stickerSet.name, newSticker).also { _ ->
|
||||
runCatching {
|
||||
addStickerToSet(it.chat.id.toChatId(), stickerSet.name, newSticker).also { _ ->
|
||||
reply(
|
||||
it,
|
||||
getStickerSet(stickerSetName).stickers.last()
|
||||
)
|
||||
}
|
||||
}.onFailure { exception ->
|
||||
exception.printStackTrace()
|
||||
reply(
|
||||
it,
|
||||
getStickerSet(stickerSetName).stickers.last()
|
||||
"Unable to add sticker in stickerset"
|
||||
)
|
||||
}
|
||||
}.onFailure { exception ->
|
||||
@@ -100,5 +109,9 @@ suspend fun main(args: Array<String>) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
allUpdatesFlow.subscribeSafelyWithoutExceptions(this) {
|
||||
println(it)
|
||||
}
|
||||
}.second.join()
|
||||
}
|
||||
|
||||
@@ -1,7 +1,4 @@
|
||||
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.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
|
||||
@@ -40,6 +37,7 @@ import java.nio.charset.Charset
|
||||
*
|
||||
* * Telegram Token
|
||||
* * URL where will be placed
|
||||
* * Port (default 8080)
|
||||
*
|
||||
* Will start the server to share the static (index.html and WebApp.js) on 0.0.0.0:8080
|
||||
*/
|
||||
@@ -58,6 +56,7 @@ suspend fun main(vararg args: String) {
|
||||
}
|
||||
)
|
||||
}
|
||||
val initiationLogger = KSLog("Initialization")
|
||||
|
||||
val bot = telegramBot(telegramBotAPIUrlsKeeper)
|
||||
createKtorServer(
|
||||
@@ -69,12 +68,28 @@ suspend fun main(vararg args: String) {
|
||||
) {
|
||||
routing {
|
||||
val baseJsFolder = File("WebApp/build/dist/js/")
|
||||
baseJsFolder.list() ?.forEach {
|
||||
if (it == "productionExecutable" || it == "developmentExecutable") {
|
||||
staticFiles("", File(baseJsFolder, it)) {
|
||||
default("WebApp/build/dist/js/$it/index.html")
|
||||
}
|
||||
val prodSubFolder = File(baseJsFolder, "productionExecutable")
|
||||
val devSubFolder = File(baseJsFolder, "developmentExecutable")
|
||||
|
||||
val staticFolder = when {
|
||||
prodSubFolder.exists() -> {
|
||||
initiationLogger.i("Folder for static is ${prodSubFolder.absolutePath}")
|
||||
prodSubFolder
|
||||
}
|
||||
devSubFolder.exists() -> {
|
||||
initiationLogger.i("Folder for static is ${devSubFolder.absolutePath}")
|
||||
devSubFolder
|
||||
}
|
||||
else -> error("""
|
||||
Unable to detect any folder with static. Current working directory: ${File("").absolutePath}.
|
||||
Searched paths:
|
||||
* ${prodSubFolder.absolutePath}
|
||||
* ${devSubFolder.absolutePath}
|
||||
""".trimIndent())
|
||||
}
|
||||
|
||||
staticFiles("", staticFolder) {
|
||||
default("${staticFolder.absolutePath}${File.separator}index.html")
|
||||
}
|
||||
post("inline") {
|
||||
val requestBody = call.receiveText()
|
||||
|
||||
@@ -2,10 +2,11 @@ kotlin.code.style=official
|
||||
org.gradle.parallel=true
|
||||
# Due to parallel compilation project require next amount of memory on full build
|
||||
org.gradle.jvmargs=-Xmx2344m
|
||||
kotlin.daemon.jvmargs=-Xmx2g -Xms500m
|
||||
|
||||
|
||||
kotlin_version=1.9.23
|
||||
telegram_bot_api_version=13.0.0
|
||||
micro_utils_version=0.20.45
|
||||
telegram_bot_api_version=15.0.0
|
||||
micro_utils_version=0.21.0
|
||||
serialization_version=1.6.3
|
||||
ktor_version=2.3.10
|
||||
ktor_version=2.3.11
|
||||
|
||||
@@ -50,4 +50,6 @@ include ":BoostsInfoBot"
|
||||
|
||||
include ":BusinessConnectionsBot"
|
||||
|
||||
include ":StarTransactionsBot"
|
||||
|
||||
include ":CustomBot"
|
||||
|
||||
Reference in New Issue
Block a user