diff --git a/CHANGELOG.md b/CHANGELOG.md index 3bf6b5c..cc564ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,10 @@ * Now `SauceNaoAPI` working with synchronous queue * `SauceNaoAPI` now will wait for some time when one of limits will be achieved +### 0.4.2 + +Hotfix for autostop for some time when there is no remaining quotas for requests + ### 0.4.1 Managers experiments and row format in answer * Add `TimeManager` - it will manage work with requests times diff --git a/build.gradle b/build.gradle index 0446708..0e78261 100644 --- a/build.gradle +++ b/build.gradle @@ -1,4 +1,4 @@ -project.version = "0.4.1" +project.version = "0.4.2" project.group = "com.github.insanusmokrassar" buildscript { diff --git a/src/main/kotlin/com/github/insanusmokrassar/SauceNaoAPI/SauceNaoAPI.kt b/src/main/kotlin/com/github/insanusmokrassar/SauceNaoAPI/SauceNaoAPI.kt index e8e6dd6..b414b13 100644 --- a/src/main/kotlin/com/github/insanusmokrassar/SauceNaoAPI/SauceNaoAPI.kt +++ b/src/main/kotlin/com/github/insanusmokrassar/SauceNaoAPI/SauceNaoAPI.kt @@ -2,6 +2,7 @@ package com.github.insanusmokrassar.SauceNaoAPI import com.github.insanusmokrassar.SauceNaoAPI.additional.LONG_TIME_RECALCULATING_MILLIS import com.github.insanusmokrassar.SauceNaoAPI.additional.SHORT_TIME_RECALCULATING_MILLIS +import com.github.insanusmokrassar.SauceNaoAPI.exceptions.TooManyRequestsException import com.github.insanusmokrassar.SauceNaoAPI.exceptions.sauceNaoAPIException import com.github.insanusmokrassar.SauceNaoAPI.models.SauceNaoAnswer import com.github.insanusmokrassar.SauceNaoAPI.utils.* @@ -52,6 +53,9 @@ data class SauceNaoAPI( callback.resumeWith(Result.success(answer)) quotaManager.updateQuota(answer.header, timeManager) + } catch (e: TooManyRequestsException) { + quotaManager.happenTooManyRequests(timeManager) + requestsChannel.send(callback to requestBuilder) } catch (e: Exception) { try { callback.resumeWith(Result.failure(e)) diff --git a/src/main/kotlin/com/github/insanusmokrassar/SauceNaoAPI/utils/RequestQuotaManager.kt b/src/main/kotlin/com/github/insanusmokrassar/SauceNaoAPI/utils/RequestQuotaManager.kt index a94740b..0449d44 100644 --- a/src/main/kotlin/com/github/insanusmokrassar/SauceNaoAPI/utils/RequestQuotaManager.kt +++ b/src/main/kotlin/com/github/insanusmokrassar/SauceNaoAPI/utils/RequestQuotaManager.kt @@ -8,6 +8,7 @@ import kotlinx.coroutines.channels.Channel import kotlinx.io.core.Closeable import org.joda.time.DateTime import kotlin.coroutines.suspendCoroutine +import kotlin.math.max import kotlin.math.min class RequestQuotaManager ( @@ -26,33 +27,51 @@ class RequestQuotaManager ( } } - suspend fun updateQuota(header: Header, timeManager: TimeManager) { + private suspend fun updateQuota( + newLongQuota: Int, + newShortQuota: Int, + newMaxLongQuota: Int?, + newMaxShortQuota: Int?, + timeManager: TimeManager + ) { quotaActions.send( suspend { - longMaxQuota = header.longLimit - shortMaxQuota = header.shortLimit + longMaxQuota = newMaxLongQuota ?: longMaxQuota + shortMaxQuota = newMaxShortQuota ?: shortMaxQuota - longQuota = min(header.longLimit, header.longRemaining) - shortQuota = min(header.shortLimit, header.shortRemaining) + longQuota = min(newLongQuota, longMaxQuota) + shortQuota = min(newShortQuota, shortMaxQuota) when { - shortQuota < 1 -> timeManager.getMostOldestInShortPeriod() ?.millis ?.plus(SHORT_TIME_RECALCULATING_MILLIS) ?: let { - shortQuota = 1 - null - } - longQuota < 1 -> timeManager.getMostOldestInLongPeriod() ?.millis ?.plus(LONG_TIME_RECALCULATING_MILLIS) ?: let { - longQuota = 1 - null - } + longQuota < 1 -> (timeManager.getMostOldestInLongPeriod() ?: DateTime.now()).millis + LONG_TIME_RECALCULATING_MILLIS + shortQuota < 1 -> (timeManager.getMostOldestInShortPeriod() ?: DateTime.now()).millis + SHORT_TIME_RECALCULATING_MILLIS else -> null - } ?.let { + } ?.also { delay(it - DateTime.now().millis) + shortQuota = max(shortQuota, 1) + longQuota = max(longQuota, 1) } Unit } ) } + suspend fun updateQuota(header: Header, timeManager: TimeManager) = updateQuota( + header.longRemaining, + header.shortRemaining, + header.longLimit, + header.shortLimit, + timeManager + ) + + suspend fun happenTooManyRequests(timeManager: TimeManager) = updateQuota( + 1, + 0, + null, + null, + timeManager + ) + suspend fun getQuota() { return suspendCoroutine { lateinit var callback: suspend () -> Unit