diff --git a/CHANGELOG.md b/CHANGELOG.md index 7cd06aa56e..bcff6bdc64 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -62,6 +62,7 @@ * All `String` formatting public extensions and functions * All extensions like `CaptionedInput#toHtmlCaptions` * All helper extensions for `List` + * All `RequestsExecutor#executeAsync` and `RequestsExecutor#executeUnsafe` * `TelegramBotAPI-extensions-utils`: * `safely` function was introduced. It is in `PreviewFeature` state currently * `makeLinkToMessage` extensions has been added @@ -76,6 +77,7 @@ * `SentMediaGroupUpdate#chat` * `SentMediaGroupUpdate#mediaGroupId` * Several `List.createResend` extensions were added + * `RequestsExecutor#executeAsync` and `RequestsExecutor#executeUnsafe` ### 0.27.4 diff --git a/TelegramBotAPI-extensions-utils/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/extensions/utils/shortcuts/RequestsExecutor.kt b/TelegramBotAPI-extensions-utils/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/extensions/utils/shortcuts/RequestsExecutor.kt new file mode 100644 index 0000000000..5157918216 --- /dev/null +++ b/TelegramBotAPI-extensions-utils/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/extensions/utils/shortcuts/RequestsExecutor.kt @@ -0,0 +1,45 @@ +package com.github.insanusmokrassar.TelegramBotAPI.extensions.utils.shortcuts + +import com.github.insanusmokrassar.TelegramBotAPI.bot.RequestsExecutor +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.Request +import com.github.insanusmokrassar.TelegramBotAPI.utils.handleSafely +import kotlinx.coroutines.* + +fun RequestsExecutor.executeAsync( + request: Request, + scope: CoroutineScope +): Deferred = scope.async { + handleSafely { + execute(request) + } +} + +suspend fun RequestsExecutor.executeAsync( + request: Request +): Deferred = coroutineScope { + executeAsync(request, this) +} + +suspend fun RequestsExecutor.executeUnsafe( + request: Request, + retries: Int = 0, + retriesDelay: Long = 1000L, + onAllFailed: (suspend (exceptions: Array) -> Unit)? = null +): T? { + var leftRetries = retries + val exceptions = onAllFailed ?.let { mutableListOf() } + do { + return handleSafely( + { + leftRetries-- + delay(retriesDelay) + exceptions ?.add(it) + null + } + ) { + execute(request) + } ?: continue + } while(leftRetries >= 0) + onAllFailed ?.invoke(exceptions ?.toTypedArray() ?: emptyArray()) + return null +} diff --git a/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/RequestsExecutor.kt b/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/RequestsExecutor.kt index 13c531a527..90fafa2e4c 100644 --- a/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/RequestsExecutor.kt +++ b/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/RequestsExecutor.kt @@ -13,8 +13,8 @@ import io.ktor.utils.io.core.Closeable interface RequestsExecutor : Closeable { /** * Unsafe execution of incoming [request]. Can throw almost any exception. So, it is better to use - * something like [com.github.insanusmokrassar.TelegramBotAPI.utils.extensions.executeAsync] or - * [com.github.insanusmokrassar.TelegramBotAPI.utils.extensions.executeUnsafe] + * something like [com.github.insanusmokrassar.TelegramBotAPI.extensions.utils.shortcuts.executeAsync] or + * [com.github.insanusmokrassar.TelegramBotAPI.extensions.utils.shortcuts.executeUnsafe] * * @throws Exception */ diff --git a/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/extensions/Executes.kt b/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/extensions/Executes.kt index 6e4a4f50ef..84904405af 100644 --- a/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/extensions/Executes.kt +++ b/TelegramBotAPI/src/commonMain/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/extensions/Executes.kt @@ -7,7 +7,7 @@ import com.github.insanusmokrassar.TelegramBotAPI.types.Response import com.github.insanusmokrassar.TelegramBotAPI.utils.handleSafely import kotlinx.coroutines.* - +@Deprecated("Will be removed in next major update") fun RequestsExecutor.executeAsync( request: Request, onFail: (suspend (Response) -> Unit)? = null, @@ -24,6 +24,7 @@ fun RequestsExecutor.executeAsync( } } +@Deprecated("Replaced and modified inside of TelegramBotAPI-extensions-utils") fun RequestsExecutor.executeAsync( request: Request, scope: CoroutineScope = GlobalScope @@ -31,6 +32,7 @@ fun RequestsExecutor.executeAsync( return scope.async { execute(request) } } +@Deprecated("Replaced and modified inside of TelegramBotAPI-extensions-utils") suspend fun RequestsExecutor.executeUnsafe( request: Request, retries: Int = 0,