mirror of
https://github.com/InsanusMokrassar/TelegramBotAPI.git
synced 2024-11-22 16:23:48 +00:00
start to add pipelines and fix mention creation
This commit is contained in:
parent
ece6a917ed
commit
863c872f35
@ -2,6 +2,9 @@
|
|||||||
|
|
||||||
## 0.38.13
|
## 0.38.13
|
||||||
|
|
||||||
|
* `Core`:
|
||||||
|
* Fixes in `mention` creation
|
||||||
|
|
||||||
## 0.38.12
|
## 0.38.12
|
||||||
|
|
||||||
* `Common`:
|
* `Common`:
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package dev.inmo.tgbotapi.bot.Ktor
|
package dev.inmo.tgbotapi.bot.Ktor
|
||||||
|
|
||||||
|
import dev.inmo.micro_utils.common.Optional
|
||||||
import dev.inmo.tgbotapi.requests.abstracts.Request
|
import dev.inmo.tgbotapi.requests.abstracts.Request
|
||||||
import dev.inmo.tgbotapi.utils.TelegramAPIUrlsKeeper
|
import dev.inmo.tgbotapi.utils.TelegramAPIUrlsKeeper
|
||||||
import io.ktor.client.HttpClient
|
import io.ktor.client.HttpClient
|
||||||
|
@ -5,6 +5,7 @@ import dev.inmo.tgbotapi.bot.BaseRequestsExecutor
|
|||||||
import dev.inmo.tgbotapi.bot.Ktor.base.*
|
import dev.inmo.tgbotapi.bot.Ktor.base.*
|
||||||
import dev.inmo.tgbotapi.bot.TelegramBot
|
import dev.inmo.tgbotapi.bot.TelegramBot
|
||||||
import dev.inmo.tgbotapi.bot.exceptions.newRequestException
|
import dev.inmo.tgbotapi.bot.exceptions.newRequestException
|
||||||
|
import dev.inmo.tgbotapi.bot.ktor.KtorPipelineStepsHolder
|
||||||
import dev.inmo.tgbotapi.bot.settings.limiters.ExceptionsOnlyLimiter
|
import dev.inmo.tgbotapi.bot.settings.limiters.ExceptionsOnlyLimiter
|
||||||
import dev.inmo.tgbotapi.bot.settings.limiters.RequestLimiter
|
import dev.inmo.tgbotapi.bot.settings.limiters.RequestLimiter
|
||||||
import dev.inmo.tgbotapi.requests.abstracts.Request
|
import dev.inmo.tgbotapi.requests.abstracts.Request
|
||||||
@ -56,7 +57,8 @@ class KtorRequestsExecutor(
|
|||||||
callsFactories: List<KtorCallFactory> = emptyList(),
|
callsFactories: List<KtorCallFactory> = emptyList(),
|
||||||
excludeDefaultFactories: Boolean = false,
|
excludeDefaultFactories: Boolean = false,
|
||||||
private val requestsLimiter: RequestLimiter = ExceptionsOnlyLimiter(),
|
private val requestsLimiter: RequestLimiter = ExceptionsOnlyLimiter(),
|
||||||
private val jsonFormatter: Json = nonstrictJsonFormat
|
private val jsonFormatter: Json = nonstrictJsonFormat,
|
||||||
|
private val pipelineStepsHolder: KtorPipelineStepsHolder = TODO()
|
||||||
) : BaseRequestsExecutor(telegramAPIUrlsKeeper) {
|
) : BaseRequestsExecutor(telegramAPIUrlsKeeper) {
|
||||||
private val callsFactories: List<KtorCallFactory> = callsFactories.run {
|
private val callsFactories: List<KtorCallFactory> = callsFactories.run {
|
||||||
if (!excludeDefaultFactories) {
|
if (!excludeDefaultFactories) {
|
||||||
@ -75,6 +77,8 @@ class KtorRequestsExecutor(
|
|||||||
override suspend fun <T : Any> execute(request: Request<T>): T {
|
override suspend fun <T : Any> execute(request: Request<T>): T {
|
||||||
return safely(
|
return safely(
|
||||||
{ e ->
|
{ e ->
|
||||||
|
pipelineStepsHolder.onRequestException(request, e) ?.let { return@safely it }
|
||||||
|
|
||||||
throw if (e is ClientRequestException) {
|
throw if (e is ClientRequestException) {
|
||||||
val content = e.response.readText()
|
val content = e.response.readText()
|
||||||
val responseObject = jsonFormatter.decodeFromString(Response.serializer(), content)
|
val responseObject = jsonFormatter.decodeFromString(Response.serializer(), content)
|
||||||
@ -88,21 +92,28 @@ class KtorRequestsExecutor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
) {
|
) {
|
||||||
|
pipelineStepsHolder.onBeforeSearchCallFactory(request, callsFactories)
|
||||||
requestsLimiter.limit {
|
requestsLimiter.limit {
|
||||||
var result: T? = null
|
var result: T? = null
|
||||||
|
lateinit var factoryHandledRequest: KtorCallFactory
|
||||||
for (potentialFactory in callsFactories) {
|
for (potentialFactory in callsFactories) {
|
||||||
|
pipelineStepsHolder.onBeforeCallFactoryMakeCall(request, potentialFactory)
|
||||||
result = potentialFactory.makeCall(
|
result = potentialFactory.makeCall(
|
||||||
client,
|
client,
|
||||||
telegramAPIUrlsKeeper,
|
telegramAPIUrlsKeeper,
|
||||||
request,
|
request,
|
||||||
jsonFormatter
|
jsonFormatter
|
||||||
)
|
)
|
||||||
|
result = pipelineStepsHolder.onAfterCallFactoryMakeCall(result, request, potentialFactory)
|
||||||
if (result != null) {
|
if (result != null) {
|
||||||
|
factoryHandledRequest = potentialFactory
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
result ?: error("Can't execute request: $request")
|
result ?.let {
|
||||||
|
pipelineStepsHolder.onRequestResultPresented(it, request, factoryHandledRequest, callsFactories)
|
||||||
|
} ?: pipelineStepsHolder.onRequestResultAbsent(request, callsFactories) ?: error("Can't execute request: $request")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,63 @@
|
|||||||
|
package dev.inmo.tgbotapi.bot.ktor
|
||||||
|
|
||||||
|
import dev.inmo.tgbotapi.bot.Ktor.KtorCallFactory
|
||||||
|
import dev.inmo.tgbotapi.requests.abstracts.Request
|
||||||
|
|
||||||
|
interface KtorPipelineStepsHolder {
|
||||||
|
/**
|
||||||
|
* Will be called when any exception will happen due to the [request] handling. If returns value - that value
|
||||||
|
* will be returned from [dev.inmo.tgbotapi.bot.RequestsExecutor.execute] instead
|
||||||
|
*/
|
||||||
|
suspend fun <T: Any> onRequestException(
|
||||||
|
request: Request<T>,
|
||||||
|
t: Throwable
|
||||||
|
): T? = null
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Will always be called before requests executor will check all [callsFactories] for an opportunity to make call of
|
||||||
|
* [request]
|
||||||
|
*/
|
||||||
|
suspend fun onBeforeSearchCallFactory(
|
||||||
|
request: Request<*>,
|
||||||
|
callsFactories: List<KtorCallFactory>
|
||||||
|
) {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Will always be called before [potentialFactory] will try to make [request]
|
||||||
|
*/
|
||||||
|
suspend fun onBeforeCallFactoryMakeCall(
|
||||||
|
request: Request<*>,
|
||||||
|
potentialFactory: KtorCallFactory
|
||||||
|
) {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Will always be called after [potentialFactory] has tried to make [request] and got some [result]. If returns
|
||||||
|
* value - that value will be returned from [dev.inmo.tgbotapi.bot.RequestsExecutor.execute] instead
|
||||||
|
*/
|
||||||
|
suspend fun <T : Any> onAfterCallFactoryMakeCall(
|
||||||
|
result: T?,
|
||||||
|
request: Request<T>,
|
||||||
|
potentialFactory: KtorCallFactory
|
||||||
|
): T? = result
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Will be called when [resultCallFactory] is the [KtorCallFactory] from [callsFactories] which has successfully
|
||||||
|
* handled [request] and returned [result]. If returns value - that value will be returned from
|
||||||
|
* [dev.inmo.tgbotapi.bot.RequestsExecutor.execute] instead
|
||||||
|
*/
|
||||||
|
suspend fun <T : Any> onRequestResultPresented(
|
||||||
|
result: T,
|
||||||
|
request: Request<T>,
|
||||||
|
resultCallFactory: KtorCallFactory,
|
||||||
|
callsFactories: List<KtorCallFactory>
|
||||||
|
): T? = result
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Will be called when there is no [KtorCallFactory] from [callsFactories] which may handle [request]. If returns
|
||||||
|
* value - that value will be returned from [dev.inmo.tgbotapi.bot.RequestsExecutor.execute] instead
|
||||||
|
*/
|
||||||
|
suspend fun <T : Any> onRequestResultAbsent(
|
||||||
|
request: Request<T>,
|
||||||
|
callsFactories: List<KtorCallFactory>
|
||||||
|
): T? = null
|
||||||
|
}
|
@ -33,7 +33,12 @@ inline fun mention(parts: TextSourcesList, id: Identifier) = mention(parts, User
|
|||||||
@Suppress("NOTHING_TO_INLINE")
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
inline fun Identifier.mention(parts: TextSourcesList) = mention(parts, this)
|
inline fun Identifier.mention(parts: TextSourcesList) = mention(parts, this)
|
||||||
@Suppress("NOTHING_TO_INLINE")
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
inline fun mention(user: User, vararg parts: TextSource) = mention(parts.toList(), user)
|
inline fun mention(user: User, vararg parts: TextSource) = mention(
|
||||||
|
textSourcesOrElseTextSource(parts.toList()) {
|
||||||
|
RegularTextSource("${user.lastName} ${user.firstName}")
|
||||||
|
},
|
||||||
|
user
|
||||||
|
)
|
||||||
@Suppress("NOTHING_TO_INLINE")
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
inline fun mention(text: String, user: User) = mention(user, regular(text))
|
inline fun mention(text: String, user: User) = mention(user, regular(text))
|
||||||
@Suppress("NOTHING_TO_INLINE")
|
@Suppress("NOTHING_TO_INLINE")
|
||||||
|
@ -0,0 +1,17 @@
|
|||||||
|
package dev.inmo.tgbotapi.types.MessageEntity.textsources
|
||||||
|
|
||||||
|
import dev.inmo.tgbotapi.utils.RiskFeature
|
||||||
|
import kotlin.js.JsName
|
||||||
|
import kotlin.jvm.JvmName
|
||||||
|
|
||||||
|
@RiskFeature
|
||||||
|
inline fun textSourcesOrElse(
|
||||||
|
textSources: TextSourcesList,
|
||||||
|
block: () -> TextSourcesList
|
||||||
|
): TextSourcesList = textSources.takeIf { it.isNotEmpty() } ?: block()
|
||||||
|
|
||||||
|
@RiskFeature
|
||||||
|
inline fun textSourcesOrElseTextSource(
|
||||||
|
textSources: TextSourcesList,
|
||||||
|
block: () -> TextSource
|
||||||
|
): TextSourcesList = textSources.takeIf { it.isNotEmpty() } ?: listOf(block())
|
Loading…
Reference in New Issue
Block a user