mirror of
https://github.com/InsanusMokrassar/TelegramBotAPI.git
synced 2024-11-26 12:08:43 +00:00
add handling of 429 status
This commit is contained in:
parent
66b4d06064
commit
d83e3eb10a
@ -1,5 +1,6 @@
|
|||||||
package dev.inmo.tgbotapi.bot.Ktor.base
|
package dev.inmo.tgbotapi.bot.Ktor.base
|
||||||
|
|
||||||
|
import dev.inmo.micro_utils.coroutines.safely
|
||||||
import dev.inmo.tgbotapi.bot.Ktor.KtorCallFactory
|
import dev.inmo.tgbotapi.bot.Ktor.KtorCallFactory
|
||||||
import dev.inmo.tgbotapi.bot.exceptions.newRequestException
|
import dev.inmo.tgbotapi.bot.exceptions.newRequestException
|
||||||
import dev.inmo.tgbotapi.requests.GetUpdates
|
import dev.inmo.tgbotapi.requests.GetUpdates
|
||||||
@ -51,15 +52,17 @@ abstract class AbstractRequestCallFactory : KtorCallFactory {
|
|||||||
val content = response.receive<String>()
|
val content = response.receive<String>()
|
||||||
val responseObject = jsonFormatter.decodeFromString(Response.serializer(), content)
|
val responseObject = jsonFormatter.decodeFromString(Response.serializer(), content)
|
||||||
|
|
||||||
return (responseObject.result?.let {
|
return safely {
|
||||||
jsonFormatter.decodeFromJsonElement(request.resultDeserializer, it)
|
(responseObject.result?.let {
|
||||||
} ?: response.let {
|
jsonFormatter.decodeFromJsonElement(request.resultDeserializer, it)
|
||||||
throw newRequestException(
|
} ?: response.let {
|
||||||
responseObject,
|
throw newRequestException(
|
||||||
content,
|
responseObject,
|
||||||
"Can't get result object from $content"
|
content,
|
||||||
)
|
"Can't get result object from $content"
|
||||||
})
|
)
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,6 +3,8 @@ package dev.inmo.tgbotapi.bot.settings.limiters
|
|||||||
import dev.inmo.micro_utils.coroutines.safely
|
import dev.inmo.micro_utils.coroutines.safely
|
||||||
import dev.inmo.tgbotapi.bot.exceptions.TooMuchRequestsException
|
import dev.inmo.tgbotapi.bot.exceptions.TooMuchRequestsException
|
||||||
import dev.inmo.tgbotapi.types.RetryAfterError
|
import dev.inmo.tgbotapi.types.RetryAfterError
|
||||||
|
import io.ktor.client.features.ClientRequestException
|
||||||
|
import io.ktor.http.HttpStatusCode
|
||||||
import kotlinx.coroutines.delay
|
import kotlinx.coroutines.delay
|
||||||
import kotlinx.coroutines.flow.*
|
import kotlinx.coroutines.flow.*
|
||||||
|
|
||||||
@ -16,18 +18,34 @@ object ExceptionsOnlyLimiter : RequestLimiter {
|
|||||||
while (true) {
|
while (true) {
|
||||||
lockState.first { !it }
|
lockState.first { !it }
|
||||||
val result = safely({
|
val result = safely({
|
||||||
if (it is TooMuchRequestsException) {
|
when (it) {
|
||||||
try {
|
is TooMuchRequestsException -> {
|
||||||
safely {
|
try {
|
||||||
lockState.emit(true)
|
safely {
|
||||||
delay(it.retryAfter.leftToRetry)
|
lockState.emit(true)
|
||||||
|
delay(it.retryAfter.leftToRetry)
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
lockState.emit(false)
|
||||||
}
|
}
|
||||||
} finally {
|
Result.failure(it)
|
||||||
lockState.emit(false)
|
|
||||||
}
|
}
|
||||||
Result.failure(it)
|
is ClientRequestException -> {
|
||||||
} else {
|
if (it.response.status == HttpStatusCode.TooManyRequests) {
|
||||||
throw it
|
try {
|
||||||
|
safely {
|
||||||
|
lockState.emit(true)
|
||||||
|
delay(1000L)
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
lockState.emit(false)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
throw it
|
||||||
|
}
|
||||||
|
Result.failure(it)
|
||||||
|
}
|
||||||
|
else -> throw it
|
||||||
}
|
}
|
||||||
}) {
|
}) {
|
||||||
Result.success(block())
|
Result.success(block())
|
||||||
|
Loading…
Reference in New Issue
Block a user