2020-05-13 17:22:35 +00:00
|
|
|
package com.github.insanusmokrassar.TelegramBotAPI.extensions.utils.updates.retrieving
|
2020-05-13 15:21:07 +00:00
|
|
|
|
|
|
|
import com.github.insanusmokrassar.TelegramBotAPI.bot.RequestsExecutor
|
2020-05-13 17:22:35 +00:00
|
|
|
import com.github.insanusmokrassar.TelegramBotAPI.extensions.utils.nonstrictJsonFormat
|
2020-05-13 15:21:07 +00:00
|
|
|
import com.github.insanusmokrassar.TelegramBotAPI.requests.webhook.SetWebhook
|
2020-05-13 17:22:35 +00:00
|
|
|
import com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts.Update
|
|
|
|
import com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts.UpdateDeserializationStrategy
|
2020-05-13 15:21:07 +00:00
|
|
|
import com.github.insanusmokrassar.TelegramBotAPI.updateshandlers.UpdateReceiver
|
|
|
|
import com.github.insanusmokrassar.TelegramBotAPI.updateshandlers.UpdatesFilter
|
|
|
|
import com.github.insanusmokrassar.TelegramBotAPI.updateshandlers.webhook.WebhookPrivateKeyConfig
|
2020-05-14 18:28:16 +00:00
|
|
|
import com.github.insanusmokrassar.TelegramBotAPI.utils.ExceptionHandler
|
2020-05-13 15:21:07 +00:00
|
|
|
import com.github.insanusmokrassar.TelegramBotAPI.utils.handleSafely
|
|
|
|
import io.ktor.application.call
|
|
|
|
import io.ktor.request.receiveText
|
|
|
|
import io.ktor.response.respond
|
|
|
|
import io.ktor.routing.*
|
|
|
|
import io.ktor.server.engine.*
|
|
|
|
import kotlinx.coroutines.*
|
|
|
|
import java.util.concurrent.Executors
|
|
|
|
|
2020-05-13 17:22:35 +00:00
|
|
|
|
2020-05-13 15:21:07 +00:00
|
|
|
/**
|
2020-05-14 07:11:46 +00:00
|
|
|
* Allows to include webhook in custom route everywhere in your server
|
|
|
|
*
|
2020-05-13 15:21:07 +00:00
|
|
|
* @param [scope] Will be used for mapping of media groups
|
|
|
|
* @param [exceptionsHandler] Pass this parameter to set custom exception handler for getting updates
|
|
|
|
* @param [block] Some receiver block like [com.github.insanusmokrassar.TelegramBotAPI.updateshandlers.FlowsUpdatesFilter]
|
|
|
|
*
|
|
|
|
* @see com.github.insanusmokrassar.TelegramBotAPI.updateshandlers.FlowsUpdatesFilter
|
|
|
|
* @see UpdatesFilter
|
|
|
|
* @see UpdatesFilter.asUpdateReceiver
|
|
|
|
*/
|
2020-05-14 18:28:16 +00:00
|
|
|
fun Route.includeWebhookHandlingInRoute(
|
2020-05-13 15:21:07 +00:00
|
|
|
scope: CoroutineScope,
|
2020-05-14 18:28:16 +00:00
|
|
|
exceptionsHandler: ExceptionHandler<Unit>? = null,
|
2020-05-13 15:21:07 +00:00
|
|
|
block: UpdateReceiver<Update>
|
|
|
|
) {
|
|
|
|
val transformer = scope.updateHandlerWithMediaGroupsAdaptation(block)
|
|
|
|
post {
|
|
|
|
handleSafely(
|
|
|
|
exceptionsHandler ?: {}
|
|
|
|
) {
|
|
|
|
val asJson =
|
|
|
|
nonstrictJsonFormat.parseJson(call.receiveText())
|
|
|
|
val update = nonstrictJsonFormat.fromJson(
|
|
|
|
UpdateDeserializationStrategy,
|
|
|
|
asJson
|
|
|
|
)
|
|
|
|
transformer(update)
|
|
|
|
}
|
|
|
|
call.respond("Ok")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Setting up ktor server, set webhook info via [SetWebhook] request.
|
|
|
|
*
|
2020-05-14 18:28:16 +00:00
|
|
|
* @param listenPort port which will be listen by bot
|
2020-05-13 15:21:07 +00:00
|
|
|
* @param listenRoute address to listen by bot
|
|
|
|
* @param scope Scope which will be used for
|
2020-05-14 07:11:46 +00:00
|
|
|
* @param privateKeyConfig If configured - server will be created with [sslConnector]. [connector] will be used otherwise
|
2020-05-13 15:21:07 +00:00
|
|
|
*
|
|
|
|
* @see com.github.insanusmokrassar.TelegramBotAPI.updateshandlers.FlowsUpdatesFilter
|
|
|
|
* @see UpdatesFilter
|
|
|
|
* @see UpdatesFilter.asUpdateReceiver
|
|
|
|
*/
|
2020-05-14 18:28:16 +00:00
|
|
|
fun startListenWebhooks(
|
|
|
|
listenPort: Int,
|
2020-05-13 15:21:07 +00:00
|
|
|
engineFactory: ApplicationEngineFactory<*, *>,
|
2020-05-14 18:28:16 +00:00
|
|
|
exceptionsHandler: ExceptionHandler<Unit>,
|
2020-05-13 15:21:07 +00:00
|
|
|
listenHost: String = "0.0.0.0",
|
|
|
|
listenRoute: String = "/",
|
|
|
|
privateKeyConfig: WebhookPrivateKeyConfig? = null,
|
|
|
|
scope: CoroutineScope = CoroutineScope(Executors.newFixedThreadPool(4).asCoroutineDispatcher()),
|
|
|
|
block: UpdateReceiver<Update>
|
|
|
|
): ApplicationEngine {
|
|
|
|
lateinit var engine: ApplicationEngine
|
|
|
|
val env = applicationEngineEnvironment {
|
|
|
|
|
|
|
|
module {
|
|
|
|
routing {
|
|
|
|
route(listenRoute) {
|
2020-05-14 18:28:16 +00:00
|
|
|
includeWebhookHandlingInRoute(scope, exceptionsHandler, block)
|
2020-05-13 15:21:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
privateKeyConfig ?.let {
|
|
|
|
sslConnector(
|
|
|
|
privateKeyConfig.keyStore,
|
|
|
|
privateKeyConfig.aliasName,
|
|
|
|
privateKeyConfig::keyStorePassword,
|
|
|
|
privateKeyConfig::aliasPassword
|
|
|
|
) {
|
|
|
|
host = listenHost
|
2020-05-14 18:28:16 +00:00
|
|
|
this.port = listenPort
|
2020-05-13 15:21:07 +00:00
|
|
|
}
|
|
|
|
} ?: connector {
|
|
|
|
host = listenHost
|
2020-05-14 18:28:16 +00:00
|
|
|
this.port = listenPort
|
2020-05-13 15:21:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
engine = embeddedServer(engineFactory, env)
|
|
|
|
engine.start(false)
|
|
|
|
|
|
|
|
return engine
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Setting up ktor server, set webhook info via [SetWebhook] request.
|
|
|
|
*
|
2020-05-14 18:28:16 +00:00
|
|
|
* @param listenPort port which will be listen by bot
|
2020-05-13 15:21:07 +00:00
|
|
|
* @param listenRoute address to listen by bot
|
|
|
|
* @param scope Scope which will be used for
|
|
|
|
*
|
|
|
|
* @see com.github.insanusmokrassar.TelegramBotAPI.updateshandlers.FlowsUpdatesFilter
|
|
|
|
* @see UpdatesFilter
|
|
|
|
* @see UpdatesFilter.asUpdateReceiver
|
|
|
|
*/
|
2020-05-14 18:28:16 +00:00
|
|
|
@Suppress("unused")
|
|
|
|
suspend fun RequestsExecutor.setWebhookInfoAndStartListenWebhooks(
|
|
|
|
listenPort: Int,
|
2020-05-13 15:21:07 +00:00
|
|
|
engineFactory: ApplicationEngineFactory<*, *>,
|
2020-05-14 18:28:16 +00:00
|
|
|
setWebhookRequest: SetWebhook,
|
|
|
|
exceptionsHandler: ExceptionHandler<Unit> = {},
|
2020-05-13 15:21:07 +00:00
|
|
|
listenHost: String = "0.0.0.0",
|
|
|
|
listenRoute: String = "/",
|
|
|
|
privateKeyConfig: WebhookPrivateKeyConfig? = null,
|
|
|
|
scope: CoroutineScope = CoroutineScope(Executors.newFixedThreadPool(4).asCoroutineDispatcher()),
|
|
|
|
block: UpdateReceiver<Update>
|
|
|
|
): Job {
|
|
|
|
return try {
|
2020-05-14 18:28:16 +00:00
|
|
|
execute(setWebhookRequest)
|
|
|
|
val engine = startListenWebhooks(listenPort, engineFactory, exceptionsHandler, listenHost, listenRoute, privateKeyConfig, scope, block)
|
2020-05-13 15:21:07 +00:00
|
|
|
scope.launch {
|
|
|
|
engine.environment.parentCoroutineContext[Job] ?.join()
|
|
|
|
engine.stop(1000, 5000)
|
|
|
|
}
|
|
|
|
} catch (e: Exception) {
|
|
|
|
throw e
|
|
|
|
}
|
|
|
|
}
|