mirror of
				https://github.com/InsanusMokrassar/TelegramBotAPI-bot_template.git
				synced 2025-11-04 06:00:04 +00:00 
			
		
		
		
	Compare commits
	
		
			152 Commits
		
	
	
		
			0.32.5-upd
			...
			renovate/k
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					7e39c17f6e | ||
| 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 | |||
| 285afbe942 | |||
| 1e3cfeebcc | |||
| e6b75e5000 | |||
| 4a71d78aba | |||
| 6e7210326a | |||
| 25583c6947 | |||
| c7a5631184 | |||
| 9f1ae5bd17 | |||
| 1f2bd0b14a | |||
| 18ff841e9a | |||
| a103cfb0f3 | |||
| cbaf7277b0 | |||
| ede5d944d5 | |||
| 0b08886be1 | |||
| 0487b44a3e | |||
| ed12f41336 | |||
| 171a4a5060 | |||
| 0477319f12 | |||
| fcc0b49576 | |||
| e86d07d25d | |||
| 2c1f4e8202 | |||
| 14ce90d323 | |||
| fbbc7d8cc0 | |||
| c543f7ff6c | |||
| 77b61dff04 | |||
| be4cefb875 | |||
| 97731ea814 | |||
| 6db81e1cb4 | |||
| 5428b048b8 | |||
| 86d535a1dc | |||
| cf91388eef | |||
| 72e1e2feab | |||
| dc1c783df3 | |||
| df5c32a194 | |||
| 3181e7c985 | |||
| 0d9965f953 | |||
| e2626f4163 | |||
| f46b976f52 | |||
| cfe4a79b19 | |||
| 31b5a18354 | |||
| 439d51cdfe | |||
| 84677466f2 | |||
| 28e5b337f2 | |||
| 25b264d8ed | |||
| 558c047d26 | 
							
								
								
									
										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 1.8
 | 
			
		||||
      - name: Set up JDK 17
 | 
			
		||||
        uses: actions/setup-java@v1
 | 
			
		||||
        with:
 | 
			
		||||
          java-version: 1.8
 | 
			
		||||
          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
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										8
									
								
								Dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								Dockerfile
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,8 @@
 | 
			
		||||
FROM adoptopenjdk/openjdk11
 | 
			
		||||
 | 
			
		||||
USER 1000
 | 
			
		||||
 | 
			
		||||
ENTRYPOINT ["/telegram_bot/bin/telegram_bot", "/telegram_bot/local.config.json"]
 | 
			
		||||
 | 
			
		||||
ADD ./build/distributions/telegram_bot.tar /
 | 
			
		||||
ADD ./local.config.json /telegram_bot/
 | 
			
		||||
							
								
								
									
										19
									
								
								Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								Makefile
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
			
		||||
#!make
 | 
			
		||||
 | 
			
		||||
.ONESHELL:
 | 
			
		||||
.PHONY:
 | 
			
		||||
 | 
			
		||||
clean:
 | 
			
		||||
	./gradlew clean
 | 
			
		||||
 | 
			
		||||
build:
 | 
			
		||||
	./gradlew build
 | 
			
		||||
 | 
			
		||||
start:
 | 
			
		||||
	./gradlew run
 | 
			
		||||
 | 
			
		||||
startCompose:
 | 
			
		||||
	docker-compose build && docker-compose up
 | 
			
		||||
 | 
			
		||||
buildAndStartCompose:
 | 
			
		||||
	make clean build startCompose
 | 
			
		||||
							
								
								
									
										61
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										61
									
								
								README.md
									
									
									
									
									
								
							@@ -9,19 +9,72 @@ 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))
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Docker
 | 
			
		||||
 | 
			
		||||
In this template there is template-like [docker-compose](docker-compose.yml) and [docker](Dockerfile) files. Besides,
 | 
			
		||||
there is [Makefile](Makefile) and you may use something like `make buildAndStartCompose` to start your bot.
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										46
									
								
								build.gradle
									
									
									
									
									
								
							
							
						
						
									
										46
									
								
								build.gradle
									
									
									
									
									
								
							@@ -1,31 +1,37 @@
 | 
			
		||||
buildscript {
 | 
			
		||||
    repositories {
 | 
			
		||||
        jcenter()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    dependencies {
 | 
			
		||||
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
 | 
			
		||||
        classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version"
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
plugins {
 | 
			
		||||
    id 'org.jetbrains.kotlin.jvm' version "$kotlin_version"
 | 
			
		||||
    id "org.jetbrains.kotlin.plugin.serialization" version "$kotlin_version"
 | 
			
		||||
    id 'application'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
repositories {
 | 
			
		||||
    jcenter()
 | 
			
		||||
        mavenCentral()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    dependencies {
 | 
			
		||||
    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
 | 
			
		||||
        classpath libs.kotlin.gradle.plugin
 | 
			
		||||
        classpath libs.kotlin.serialization.plugin
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
    implementation "dev.inmo:tgbotapi:$tgbotapi_version"
 | 
			
		||||
plugins {
 | 
			
		||||
    alias libs.plugins.kotlin.jvm
 | 
			
		||||
    alias libs.plugins.kotlin.serialization
 | 
			
		||||
    id 'application'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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_17
 | 
			
		||||
    targetCompatibility = JavaVersion.VERSION_17
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										6
									
								
								docker-compose.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								docker-compose.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
version: "3.4"
 | 
			
		||||
 | 
			
		||||
services:
 | 
			
		||||
  server:
 | 
			
		||||
    build: .
 | 
			
		||||
    restart: unless-stopped
 | 
			
		||||
							
								
								
									
										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"
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@@ -3,6 +3,3 @@ kotlin.code.style=official
 | 
			
		||||
org.gradle.parallel=true
 | 
			
		||||
kotlin.js.generate.externals=true
 | 
			
		||||
kotlin.incremental=true
 | 
			
		||||
 | 
			
		||||
kotlin_version=1.4.30
 | 
			
		||||
tgbotapi_version=0.32.5
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										22
									
								
								gradle/libs.versions.toml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								gradle/libs.versions.toml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
			
		||||
[versions]
 | 
			
		||||
 | 
			
		||||
kotlin = "2.2.21"
 | 
			
		||||
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" }
 | 
			
		||||
 | 
			
		||||
[plugins]
 | 
			
		||||
 | 
			
		||||
kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" }
 | 
			
		||||
kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.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-6.8.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,24 +1,38 @@
 | 
			
		||||
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.buildBehaviour
 | 
			
		||||
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)
 | 
			
		||||
 | 
			
		||||
    // here should be main logic of your bot
 | 
			
		||||
    bot.buildBehaviour(scope) {
 | 
			
		||||
    bot.buildBehaviourWithLongPolling(scope) {
 | 
			
		||||
        // in this lambda you will be able to call methods without "bot." prefix
 | 
			
		||||
        val me = getMe()
 | 
			
		||||
 | 
			
		||||
@@ -27,7 +41,9 @@ suspend fun main(args: Array<String>) {
 | 
			
		||||
            // simply reply :)
 | 
			
		||||
            reply(it, "Hello, I am ${me.firstName}")
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    scope.coroutineContext.job.join()
 | 
			
		||||
        // 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