mirror of
https://github.com/JustArchiNET/ArchiSteamFarm.git
synced 2026-01-06 17:10:13 +00:00
Include http errors in GetInventoryAsync()
And stop actively matching on first 429
This commit is contained in:
@@ -407,6 +407,7 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
|||||||
|
|
||||||
byte maxTradeHoldDuration = ASF.GlobalConfig?.MaxTradeHoldDuration ?? GlobalConfig.DefaultMaxTradeHoldDuration;
|
byte maxTradeHoldDuration = ASF.GlobalConfig?.MaxTradeHoldDuration ?? GlobalConfig.DefaultMaxTradeHoldDuration;
|
||||||
byte totalMatches = 0;
|
byte totalMatches = 0;
|
||||||
|
bool rateLimited = false;
|
||||||
|
|
||||||
HashSet<(uint RealAppID, Asset.EType Type, Asset.ERarity Rarity)> skippedSetsThisRound = new();
|
HashSet<(uint RealAppID, Asset.EType Type, Asset.ERarity Rarity)> skippedSetsThisRound = new();
|
||||||
|
|
||||||
@@ -443,6 +444,16 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
|||||||
} catch (HttpRequestException e) {
|
} catch (HttpRequestException e) {
|
||||||
Bot.ArchiLogger.LogGenericWarningException(e);
|
Bot.ArchiLogger.LogGenericWarningException(e);
|
||||||
|
|
||||||
|
#if NETFRAMEWORK
|
||||||
|
if (e.StatusCode == (HttpStatusCode) 429) {
|
||||||
|
#else
|
||||||
|
if (e.StatusCode == HttpStatusCode.TooManyRequests) {
|
||||||
|
#endif
|
||||||
|
rateLimited = true;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Bot.ArchiLogger.LogGenericException(e);
|
Bot.ArchiLogger.LogGenericException(e);
|
||||||
@@ -702,6 +713,6 @@ internal sealed class RemoteCommunication : IAsyncDisposable, IDisposable {
|
|||||||
Bot.ArchiLogger.LogGenericInfo(string.Format(CultureInfo.CurrentCulture, Strings.ActivelyMatchingItemsRound, skippedSetsThisRound.Count));
|
Bot.ArchiLogger.LogGenericInfo(string.Format(CultureInfo.CurrentCulture, Strings.ActivelyMatchingItemsRound, skippedSetsThisRound.Count));
|
||||||
|
|
||||||
// Keep matching when we either traded something this round (so it makes sense for a refresh) or if we didn't try all available bots yet (so it makes sense to keep going)
|
// Keep matching when we either traded something this round (so it makes sense for a refresh) or if we didn't try all available bots yet (so it makes sense to keep going)
|
||||||
return ((totalMatches > 0) && ((skippedSetsThisRound.Count > 0) || triedSteamIDs.Values.All(static data => data.Tries < 2)), skippedSetsThisRound.Count > 0);
|
return (!rateLimited && (totalMatches > 0) && ((skippedSetsThisRound.Count > 0) || triedSteamIDs.Values.All(static data => data.Tries < 2)), skippedSetsThisRound.Count > 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -173,12 +173,16 @@ public sealed class ArchiWebHandler : IDisposable {
|
|||||||
await Task.Delay(rateLimitingDelay).ConfigureAwait(false);
|
await Task.Delay(rateLimitingDelay).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
response = await UrlGetToJsonObjectWithSession<InventoryResponse>(request, requestOptions: WebBrowser.ERequestOptions.ReturnServerErrors | WebBrowser.ERequestOptions.AllowInvalidBodyOnErrors, rateLimitingDelay: rateLimitingDelay).ConfigureAwait(false);
|
response = await UrlGetToJsonObjectWithSession<InventoryResponse>(request, requestOptions: WebBrowser.ERequestOptions.ReturnClientErrors | WebBrowser.ERequestOptions.ReturnServerErrors | WebBrowser.ERequestOptions.AllowInvalidBodyOnErrors, rateLimitingDelay: rateLimitingDelay).ConfigureAwait(false);
|
||||||
|
|
||||||
if (response == null) {
|
if (response == null) {
|
||||||
throw new HttpRequestException(string.Format(CultureInfo.CurrentCulture, Strings.ErrorObjectIsNull, nameof(response)));
|
throw new HttpRequestException(string.Format(CultureInfo.CurrentCulture, Strings.ErrorObjectIsNull, nameof(response)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (response.StatusCode.IsClientErrorCode()) {
|
||||||
|
throw new HttpRequestException(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, response.StatusCode), null, response.StatusCode);
|
||||||
|
}
|
||||||
|
|
||||||
if (response.StatusCode.IsServerErrorCode()) {
|
if (response.StatusCode.IsServerErrorCode()) {
|
||||||
if (string.IsNullOrEmpty(response.Content?.Error)) {
|
if (string.IsNullOrEmpty(response.Content?.Error)) {
|
||||||
// This is a generic server error without a reason, try again
|
// This is a generic server error without a reason, try again
|
||||||
@@ -189,7 +193,7 @@ public sealed class ArchiWebHandler : IDisposable {
|
|||||||
|
|
||||||
// This is actually client error with a reason, so it doesn't make sense to retry
|
// This is actually client error with a reason, so it doesn't make sense to retry
|
||||||
// ReSharper disable once RedundantSuppressNullableWarningExpression - required for .NET Framework
|
// ReSharper disable once RedundantSuppressNullableWarningExpression - required for .NET Framework
|
||||||
throw new HttpRequestException(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, response.Content!.Error));
|
throw new HttpRequestException(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, response.Content!.Error), null, response.StatusCode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
|
|||||||
Reference in New Issue
Block a user