mirror of
https://github.com/InsanusMokrassar/TelegramBotAPI-bot_template.git
synced 2025-12-08 15:26:07 +00:00
Compare commits
106 Commits
285afbe942
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 56c327cd97 | |||
|
|
a767563a9a | ||
| c997084d86 | |||
| cef55f412a | |||
|
|
0e4c009c09 | ||
|
|
6d997e4fe0 | ||
| c91fff9a97 | |||
|
|
13b52ba699 | ||
| 36763aac7c | |||
|
|
84e5dce2f4 | ||
| 235dbabe21 | |||
| 1fa3d1d289 | |||
| 4b2c9863e1 | |||
| a35790afb0 | |||
|
|
413f732c43 | ||
| fefc185605 | |||
| b3d54ac79a | |||
|
|
15b0d8fff7 | ||
|
|
9266bc68dd | ||
| a596620ea5 | |||
|
|
3824cf2a8b | ||
| 6e4f31ad22 | |||
|
|
f176a18308 | ||
| 1a0fd756e6 | |||
|
|
3ae0c9e21e | ||
| e24941d1b9 | |||
| 26d8d123f8 | |||
|
|
0f633ef7e9 | ||
|
|
ce441d36c1 | ||
| c2d44b87db | |||
|
|
3843bafb33 | ||
| e07c673ba0 | |||
| a4c50d6f54 | |||
| 83fe9adaf0 | |||
| 82fbd7a471 | |||
| c4f214758d | |||
| 22562426e7 | |||
| ee1bb997ab | |||
| 3c452d2417 | |||
| d08b371e26 | |||
| f8b5a6c139 | |||
| fc921b530e | |||
| 550ae4da60 | |||
| 8306b79953 | |||
| 9d08354e65 | |||
| d16dca314a | |||
| e648090336 | |||
| 8354866654 | |||
| b0a11c3bd6 | |||
| 50442ddcb8 | |||
| 2f981eb68b | |||
| c26832f7a9 | |||
| 819c2fdb0d | |||
| ebab694ac3 | |||
| d82b62a069 | |||
| 098fed3b81 | |||
| bc3662da25 | |||
| 2da218c805 | |||
| c5638743af | |||
| faa77ef5ac | |||
| 607bd00a3c | |||
| 0c5bbd5bb1 | |||
| 3ee9f9c46b | |||
| f7ff501e58 | |||
| 353c28657d | |||
| dfe0b475b4 | |||
| ff63fad928 | |||
| 9538d320cf | |||
| 8d9be29f6e | |||
| 99a4ea2b12 | |||
| 0c66784ab7 | |||
| df25274079 | |||
| 6cd6489cb2 | |||
| 5c6ad721d2 | |||
| 2acf32ec62 | |||
|
|
d0905c6d17 | ||
| b243a19cdf | |||
| ec944a3e68 | |||
| 4becd4fe60 | |||
| acd13ea731 | |||
| 00363fd506 | |||
| 59b948bece | |||
| 8a857d3109 | |||
| 6ffe47d645 | |||
| 6088f79cc6 | |||
| 4747b48df4 | |||
| f0aebfa800 | |||
| 04467a2416 | |||
| a2e97be75a | |||
| 6a203863c7 | |||
| dcb3665adc | |||
| 699b58f952 | |||
| ea4a906e9a | |||
| 1bbd3b2ea1 | |||
| 5f2924c21b | |||
| 873e495daa | |||
| 7c2115739a | |||
| 50d5718ba0 | |||
| 12d345b067 | |||
| a443205237 | |||
| 2afd9bb156 | |||
| f41f756107 | |||
| 9b3a01a50b | |||
| d5379b02e7 | |||
| bf31c92bf1 | |||
| ee93a83ed5 |
4
.github/workflows/build.yml
vendored
4
.github/workflows/build.yml
vendored
@@ -8,9 +8,9 @@ jobs:
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Set up JDK 11
|
||||
- name: Set up JDK 17
|
||||
uses: actions/setup-java@v1
|
||||
with:
|
||||
java-version: 11
|
||||
java-version: 17
|
||||
- name: Build with Gradle
|
||||
run: ./gradlew build
|
||||
|
||||
4
.gitignore
vendored
4
.gitignore
vendored
@@ -1,4 +1,5 @@
|
||||
.idea
|
||||
.kotlin
|
||||
out/*
|
||||
*.iml
|
||||
target
|
||||
@@ -9,5 +10,6 @@ settings.xml
|
||||
build/
|
||||
out/
|
||||
|
||||
local.properties
|
||||
local.*
|
||||
local.*/
|
||||
secret.gradle
|
||||
|
||||
@@ -2,8 +2,7 @@ FROM adoptopenjdk/openjdk11
|
||||
|
||||
USER 1000
|
||||
|
||||
VOLUME /config.json
|
||||
|
||||
ENTRYPOINT ["/telegram_bot/bin/telegram_bot", "TOKEN"]
|
||||
ENTRYPOINT ["/telegram_bot/bin/telegram_bot", "/telegram_bot/local.config.json"]
|
||||
|
||||
ADD ./build/distributions/telegram_bot.tar /
|
||||
ADD ./local.config.json /telegram_bot/
|
||||
|
||||
54
README.md
54
README.md
@@ -9,9 +9,7 @@ it was described [here](https://github.com/InsanusMokrassar/TelegramBotAPI#ok-wh
|
||||
|
||||
## Default
|
||||
|
||||
Since you have used this repo as a template you can simply run command `./gradlew run --args="BOT_TOKEN"` (of course,
|
||||
replace here `BOT_TOKEN` with your telegram bot token like `1234567890:ABCDEFGHIJKLM_OPqrstuvwxyz012345678`). As an
|
||||
output you will get your bot information like:
|
||||
Since you have used this repo as a template you can copy file `example.config.json` as `local.config.json`, put there your bot token and simply run command `./gradlew run --args="local.config.json"`. As an output you will get your bot information like:
|
||||
|
||||
```bash
|
||||
ExtendedBot(id=ChatId(chatId=1234567890), username=Username(username=@username_of_your_bot), firstName=Name of bot, lastName=, canJoinGroups=(some boolean), canReadAllGroupMessages=(some boolean), supportsInlineQueries=(some boolean))
|
||||
@@ -24,11 +22,59 @@ there is [Makefile](Makefile) and you may use something like `make buildAndStart
|
||||
|
||||
It is important to replace `"TOKEN"` in [Dockerfile](Dockerfile) or remove and add some config as a volume.
|
||||
|
||||
### Config
|
||||
|
||||
But you may set up several things for your bot. You should start with adding client object:
|
||||
|
||||
```json
|
||||
{
|
||||
"token": "your bot token",
|
||||
"client": {
|
||||
"connectionTimeoutMillis": 10000,
|
||||
"requestTimeoutMillis": 10000,
|
||||
"responseTimeoutMillis": 10000,
|
||||
"proxy": {
|
||||
"hostname": "127.0.0.1",
|
||||
"port": 1080,
|
||||
"type": "socks",
|
||||
"username": "username",
|
||||
"password": "password"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
__Required__ fields:
|
||||
|
||||
* `token`
|
||||
* `client/proxy/hostname` (if you pass `client` and `proxy` fields) - hostname of proxy server
|
||||
* `client/proxy/password` - password for authentication on proxy server, required if `client/proxy/type` is `socks` and `client/proxy/username` passed
|
||||
|
||||
__Optional__ fields:
|
||||
|
||||
* `client` - object with client configs
|
||||
* `client/connectionTimeoutMillis` - timeout for connection to the server
|
||||
* `client/requestTimeoutMillis` - timeout for request complete (when request taken on server)
|
||||
* `client/responseTimeoutMillis` - timeout for getting a response after request taken on server
|
||||
* `client/proxy` - proxy settings
|
||||
* `client/proxy/port` - port of proxy server
|
||||
* `client/proxy/type` - type of proxy server (can be `socks` or `http`)
|
||||
* `client/proxy/username` - username for authentication on proxy server
|
||||
* `client/proxy/password` - password for authentication on proxy server
|
||||
|
||||
Basically, your config looks like an object with token:
|
||||
|
||||
```json
|
||||
{
|
||||
"token": "your bot token"
|
||||
}
|
||||
```
|
||||
|
||||
## What next?
|
||||
|
||||
There are several ways to continue:
|
||||
|
||||
* [Tutorials](https://bookstack.inmo.dev/books/telegrambotapi)
|
||||
* [Tutorials](https://docs.inmo.dev/tgbotapi/index.html)
|
||||
* [Github readme](https://github.com/InsanusMokrassar/TelegramBotAPI)
|
||||
|
||||
In other words, this template (and [TelegramBotAPI library](https://github.com/InsanusMokrassar/TelegramBotAPI)) does
|
||||
|
||||
@@ -17,19 +17,21 @@ plugins {
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
maven { url "https://git.inmo.dev/api/packages/InsanusMokrassar/maven" }
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation libs.kotlin
|
||||
|
||||
implementation libs.tgbotapi
|
||||
implementation libs.ktor.client.okhttp
|
||||
}
|
||||
|
||||
application {
|
||||
mainClassName = 'telegram_bot.AppKt'
|
||||
mainClassName = 'AppKt'
|
||||
}
|
||||
|
||||
java {
|
||||
sourceCompatibility = JavaVersion.VERSION_11
|
||||
targetCompatibility = JavaVersion.VERSION_11
|
||||
sourceCompatibility = JavaVersion.VERSION_17
|
||||
targetCompatibility = JavaVersion.VERSION_17
|
||||
}
|
||||
|
||||
15
example.config.json
Normal file
15
example.config.json
Normal file
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"token": "your bot token",
|
||||
"client": {
|
||||
"connectionTimeoutMillis": 10000,
|
||||
"requestTimeoutMillis": 10000,
|
||||
"responseTimeoutMillis": 10000,
|
||||
"proxy": {
|
||||
"hostname": "127.0.0.1",
|
||||
"port": 1080,
|
||||
"type": "socks",
|
||||
"username": "username",
|
||||
"password": "password"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,13 +1,16 @@
|
||||
[versions]
|
||||
|
||||
kotlin = "1.6.10"
|
||||
tgbotapi = "0.38.13"
|
||||
kotlin = "2.1.20"
|
||||
tgbotapi = "24.0.2"
|
||||
ktor = "3.1.2"
|
||||
|
||||
[libraries]
|
||||
|
||||
kotlin = { module = "org.jetbrains.kotlin:kotlin-stdlib", version.ref = "kotlin" }
|
||||
tgbotapi = { module = "dev.inmo:tgbotapi", version.ref = "tgbotapi" }
|
||||
|
||||
ktor-client-okhttp = { module = "io.ktor:ktor-client-okhttp", version.ref = "ktor" }
|
||||
|
||||
# Libs for classpath
|
||||
kotlin-gradle-plugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" }
|
||||
kotlin-serialization-plugin = { module = "org.jetbrains.kotlin:kotlin-serialization", version.ref = "kotlin" }
|
||||
|
||||
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -1,5 +1,5 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.12.1-bin.zip
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
|
||||
6
renovate.json
Normal file
6
renovate.json
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
|
||||
"extends": [
|
||||
"config:recommended"
|
||||
]
|
||||
}
|
||||
@@ -1,3 +1 @@
|
||||
rootProject.name = 'telegram_bot'
|
||||
|
||||
enableFeaturePreview("VERSION_CATALOGS")
|
||||
|
||||
@@ -1,18 +1,32 @@
|
||||
package telegram_bot
|
||||
|
||||
import dev.inmo.tgbotapi.bot.Ktor.telegramBot
|
||||
import config.Config
|
||||
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.buildBehaviourWithLongPolling
|
||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onCommand
|
||||
import io.ktor.client.*
|
||||
import io.ktor.client.engine.okhttp.*
|
||||
import java.io.File
|
||||
import kotlinx.coroutines.*
|
||||
import kotlinx.serialization.json.Json
|
||||
|
||||
/**
|
||||
* This method by default expects one argument in [args] field: telegram bot token
|
||||
* This method by default expects one argument in [args] field: telegram bot configuration
|
||||
*/
|
||||
suspend fun main(args: Array<String>) {
|
||||
// create json to decode config
|
||||
val json = Json { ignoreUnknownKeys = true }
|
||||
// decode config
|
||||
val config: Config = json.decodeFromString(Config.serializer(), File(args.first()).readText())
|
||||
// that is your bot
|
||||
val bot = telegramBot(args.first())
|
||||
val bot = telegramBot(config.token) {
|
||||
client = HttpClient(OkHttp) {
|
||||
config.client ?.apply {
|
||||
// setting up telegram bot client
|
||||
setupConfig()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// that is kotlin coroutine scope which will be used in requests and parallel works under the hood
|
||||
val scope = CoroutineScope(Dispatchers.Default)
|
||||
@@ -28,7 +42,7 @@ suspend fun main(args: Array<String>) {
|
||||
reply(it, "Hello, I am ${me.firstName}")
|
||||
}
|
||||
|
||||
// That will be called on the end of bot initiation. After that prinln will be started long polling and bot will
|
||||
// That will be called on the end of bot initiation. After that println will be started long polling and bot will
|
||||
// react on your commands
|
||||
println(me)
|
||||
}.join()
|
||||
9
src/main/kotlin/config/Config.kt
Normal file
9
src/main/kotlin/config/Config.kt
Normal file
@@ -0,0 +1,9 @@
|
||||
package config
|
||||
|
||||
import kotlinx.serialization.Serializable
|
||||
|
||||
@Serializable
|
||||
data class Config(
|
||||
val token: String,
|
||||
val client: HttpClientConfig? = null
|
||||
)
|
||||
90
src/main/kotlin/config/HttpClientConfig.kt
Normal file
90
src/main/kotlin/config/HttpClientConfig.kt
Normal file
@@ -0,0 +1,90 @@
|
||||
package config
|
||||
|
||||
import dev.inmo.tgbotapi.types.MilliSeconds
|
||||
import io.ktor.client.HttpClientConfig
|
||||
import io.ktor.client.engine.okhttp.*
|
||||
import io.ktor.client.plugins.*
|
||||
import io.ktor.client.request.*
|
||||
import io.ktor.http.*
|
||||
import kotlinx.serialization.Serializable
|
||||
import java.net.*
|
||||
import java.util.*
|
||||
import java.util.concurrent.TimeUnit
|
||||
|
||||
@Serializable
|
||||
data class HttpClientConfig(
|
||||
val connectionTimeoutMillis: MilliSeconds? = null,
|
||||
val requestTimeoutMillis: MilliSeconds? = null,
|
||||
val responseTimeoutMillis: MilliSeconds? = null,
|
||||
val proxy: ProxyConfig? = null
|
||||
) {
|
||||
@Serializable
|
||||
data class ProxyConfig(
|
||||
val hostname: String,
|
||||
val type: ProxyType = ProxyType.socks,
|
||||
val port: Int = type.defaultPort,
|
||||
val username: String? = null,
|
||||
val password: String? = null
|
||||
) {
|
||||
@Serializable
|
||||
enum class ProxyType(val defaultPort: Int, val proxyType: Proxy.Type) {
|
||||
socks(1080, Proxy.Type.SOCKS),
|
||||
http(3128, Proxy.Type.HTTP),
|
||||
}
|
||||
|
||||
val socketAddress
|
||||
get() = InetSocketAddress(hostname, port)
|
||||
}
|
||||
|
||||
fun HttpClientConfig<OkHttpConfig>.setupConfig() {
|
||||
// setting up telegram bot client
|
||||
engine {
|
||||
// Start setup bot client engine configuration
|
||||
config {
|
||||
// setting up connection timeout millis
|
||||
connectionTimeoutMillis ?.let { connectTimeout(it, TimeUnit.MILLISECONDS) }
|
||||
// setting up write timeout millis
|
||||
requestTimeoutMillis ?.let { writeTimeout(it, TimeUnit.MILLISECONDS) }
|
||||
// setting up read timeout millis
|
||||
responseTimeoutMillis ?.let { readTimeout(it, TimeUnit.MILLISECONDS) }
|
||||
|
||||
// Start setup bot client engine proxy
|
||||
this@HttpClientConfig.proxy ?.let { proxyConfig ->
|
||||
proxy(
|
||||
Proxy(
|
||||
proxyConfig.type.proxyType,
|
||||
proxyConfig.socketAddress
|
||||
)
|
||||
)
|
||||
|
||||
proxyConfig.username ?.let { username ->
|
||||
when (proxyConfig.type) {
|
||||
config.HttpClientConfig.ProxyConfig.ProxyType.socks -> {
|
||||
val passwordAuthentication = PasswordAuthentication(
|
||||
username,
|
||||
proxyConfig.password ?.toCharArray() ?: error("For Socks proxy you should use both username and password or do not use authentication at all")
|
||||
)
|
||||
Authenticator.setDefault(object : Authenticator() {
|
||||
override fun getPasswordAuthentication(): PasswordAuthentication? {
|
||||
return if (requestingHost.lowercase() == proxyConfig.hostname.lowercase()) {
|
||||
passwordAuthentication
|
||||
} else {
|
||||
null
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
config.HttpClientConfig.ProxyConfig.ProxyType.http -> {
|
||||
val passwordSuffix = proxyConfig.password ?.let { ":$it" }
|
||||
val credentials = Base64.getEncoder().encodeToString("${username}${passwordSuffix}".toByteArray())
|
||||
this@setupConfig.defaultRequest {
|
||||
header(HttpHeaders.ProxyAuthorization, "Basic $credentials")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user