mirror of
				https://github.com/InsanusMokrassar/TelegramBotAPI-bot_template.git
				synced 2025-10-31 20:21:21 +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 | ||||
|   | ||||
							
								
								
									
										24
									
								
								build.gradle
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								build.gradle
									
									
									
									
									
								
							| @@ -1,31 +1,37 @@ | ||||
| buildscript { | ||||
|     repositories { | ||||
|         jcenter() | ||||
|         mavenCentral() | ||||
|     } | ||||
|  | ||||
|     dependencies { | ||||
|         classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" | ||||
|         classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version" | ||||
|         classpath libs.kotlin.gradle.plugin | ||||
|         classpath libs.kotlin.serialization.plugin | ||||
|     } | ||||
| } | ||||
|  | ||||
| plugins { | ||||
|     id 'org.jetbrains.kotlin.jvm' version "$kotlin_version" | ||||
|     id "org.jetbrains.kotlin.plugin.serialization" version "$kotlin_version" | ||||
|     alias libs.plugins.kotlin.jvm | ||||
|     alias libs.plugins.kotlin.serialization | ||||
|     id 'application' | ||||
| } | ||||
|  | ||||
| repositories { | ||||
|     jcenter() | ||||
|     mavenCentral() | ||||
|     maven { url "https://git.inmo.dev/api/packages/InsanusMokrassar/maven" } | ||||
| } | ||||
|  | ||||
| dependencies { | ||||
|     implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" | ||||
|     implementation libs.kotlin | ||||
|  | ||||
|     implementation "dev.inmo:tgbotapi:$tgbotapi_version" | ||||
|     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