Skip to content

Commit

Permalink
Merge pull request #298 from InsanusMokrassar/19.0.0
Browse files Browse the repository at this point in the history
19.0.0
  • Loading branch information
InsanusMokrassar authored Nov 1, 2024
2 parents e34f0ec + 73064db commit b7d53a7
Show file tree
Hide file tree
Showing 6 changed files with 144 additions and 7 deletions.
5 changes: 1 addition & 4 deletions WebApp/src/jvmMain/kotlin/WebAppServer.kt
Original file line number Diff line number Diff line change
Expand Up @@ -63,10 +63,7 @@ suspend fun main(vararg args: String) {
val bot = telegramBot(telegramBotAPIUrlsKeeper)
createKtorServer(
"0.0.0.0",
args.getOrNull(2) ?.toIntOrNull() ?: 8080,
additionalEngineEnvironmentConfigurator = {
parentCoroutineContext += Dispatchers.IO
}
args.getOrNull(2) ?.toIntOrNull() ?: 8080
) {
routing {
val baseJsFolder = File("WebApp/build/dist/js/")
Expand Down
28 changes: 28 additions & 0 deletions WebHooks/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# WebHooks

Launches webhook-based simple bot. Use `/start` with bot to get simple info about webhooks

## Launch

```bash
../gradlew run --args="BOT_TOKEN https://sample.com it/is/subpath 8080 debug"
```

Required arguments:

1. Token
2. Arguments starting with `https://`

Optional arguments:

* Any argument == `debug` to enable debug mode
* Any argument **not** starting with `https://` and **not** equal to `debug` as **subpath** (will be used as
subroute to place listening of webhooks)
* Any argument as number of port

Sample: `TOKEN https://sample.com it/is/subpath 8080` will result to:

* `TOKEN` used as token
* Bot will set up its webhook info as `https://sample.com/it/is/subpath`
* Bot will set up to listen webhooks on route `it/is/subpath`
* Bot will start to listen any incoming request on port `8080` and url `0.0.0.0`
23 changes: 23 additions & 0 deletions WebHooks/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
buildscript {
repositories {
mavenCentral()
}

dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}

apply plugin: 'kotlin'
apply plugin: 'application'

mainClassName="WebHooksKt"


dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"

implementation "dev.inmo:tgbotapi:$telegram_bot_api_version"
implementation "dev.inmo:micro_utils.ktor.server:$micro_utils_version"
implementation "io.ktor:ktor-server-cio:$ktor_version"
}
87 changes: 87 additions & 0 deletions WebHooks/src/main/kotlin/WebHooks.kt
Original file line number Diff line number Diff line change
@@ -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.ktor.server.createKtorServer
import dev.inmo.tgbotapi.bot.ktor.telegramBot
import dev.inmo.tgbotapi.extensions.api.bot.setMyCommands
import dev.inmo.tgbotapi.extensions.api.send.reply
import dev.inmo.tgbotapi.extensions.api.webhook.setWebhookInfo
import dev.inmo.tgbotapi.extensions.behaviour_builder.buildBehaviour
import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onCommand
import dev.inmo.tgbotapi.extensions.utils.updates.retrieving.includeWebhookHandlingInRoute
import dev.inmo.tgbotapi.types.BotCommand
import dev.inmo.tgbotapi.types.chat.PrivateChat
import dev.inmo.tgbotapi.utils.buildEntities
import io.ktor.server.routing.*

/**
* Launches webhook-based simple bot. Required arguments:
*
* 1. Token
* *. Arguments starting with `https://`
*
* Optional arguments:
*
* *. Any argument == `debug` to enable debug mode
* *. Any argument **not** starting with `https://` and **not** equal to `debug` as **subpath** (will be used as
* subroute to place listening of webhooks)
* *. Any argument as number of port
*
* Sample: `TOKEN https://sample.com it/is/subpath 8080` will result to:
*
* * `TOKEN` used as token
* * Bot will set up its webhook info as `https://sample.com/it/is/subpath`
* * Bot will set up to listen webhooks on route `it/is/subpath`
* * Bot will start to listen any incoming request on port `8080` and url `0.0.0.0`
*/
suspend fun main(args: Array<String>) {
val botToken = args.first()
val address = args.first { it.startsWith("https://") }
val subpath = args.drop(1).firstOrNull { it != address && it != "debug" }
val port = args.firstNotNullOfOrNull { it.toIntOrNull() } ?: 8080
val isDebug = args.any { it == "debug" }

if (isDebug) {
setDefaultKSLog(
KSLog { level: LogLevel, tag: String?, message: Any, throwable: Throwable? ->
println(defaultMessageFormatter(level, tag, message, throwable))
}
)
}

val bot = telegramBot(botToken)

val behaviourContext = bot.buildBehaviour (defaultExceptionsHandler = { it.printStackTrace() }) {
onCommand("start", initialFilter = { it.chat is PrivateChat }) {
reply(
it,
buildEntities {
+"Url: $address" + "\n"
+"Listening server: 0.0.0.0" + "\n"
+"Listening port: $port"
}
)
}

setMyCommands(BotCommand("start", "Get webhook info"))
}

val webhookInfoSubpath = subpath ?.let { "/" + it.removePrefix("/") } ?: "" // drop leading `/` to add it in the beginning for correct construction of subpath
bot.setWebhookInfo(address + webhookInfoSubpath)

createKtorServer(
"0.0.0.0",
port,
) {
routing {
if (subpath == null) {
includeWebhookHandlingInRoute(behaviourContext, block = behaviourContext.asUpdateReceiver)
} else {
route(subpath) {
includeWebhookHandlingInRoute(behaviourContext, block = behaviourContext.asUpdateReceiver)
}
}
}
}.start(true)
}
6 changes: 3 additions & 3 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ kotlin.daemon.jvmargs=-Xmx3g -Xms500m


kotlin_version=2.0.21
telegram_bot_api_version=18.2.2
micro_utils_version=0.22.7
telegram_bot_api_version=19.0.0
micro_utils_version=0.23.0
serialization_version=1.7.3
ktor_version=2.3.12
ktor_version=3.0.1
2 changes: 2 additions & 0 deletions settings.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -57,3 +57,5 @@ include ":GiveawaysBot"
include ":CustomBot"

include ":MemberUpdatedWatcherBot"

include ":WebHooks"

0 comments on commit b7d53a7

Please sign in to comment.