Use cancellation in more places

This commit is contained in:
Archi 2023-11-14 21:20:51 +01:00
parent ac9d4a7783
commit 3f04144e41
No known key found for this signature in database
GPG key ID: 6B138B4C64555AEA
3 changed files with 19 additions and 14 deletions

View file

@ -21,6 +21,7 @@
using System;
using System.Net;
using System.Threading;
using System.Threading.Tasks;
using ArchiSteamFarm.Core;
using ArchiSteamFarm.IPC.Controllers.Api;
@ -45,7 +46,9 @@ public sealed class CatController : ArchiController {
throw new InvalidOperationException(nameof(ASF.WebBrowser));
}
Uri? url = await CatAPI.GetRandomCatURL(ASF.WebBrowser).ConfigureAwait(false);
CancellationToken cancellationToken = HttpContext.RequestAborted;
Uri? url = await CatAPI.GetRandomCatURL(ASF.WebBrowser, cancellationToken).ConfigureAwait(false);
return url != null ? Ok(new GenericResponse<Uri>(url)) : StatusCode((int) HttpStatusCode.ServiceUnavailable, new GenericResponse(false));
}

View file

@ -56,7 +56,7 @@ internal sealed class SteamTokenDumperPlugin : OfficialPlugin, IASF, IBot, IBotC
private static readonly ConcurrentDictionary<Bot, IDisposable> BotSubscriptions = new();
private static readonly ConcurrentDictionary<Bot, (SemaphoreSlim RefreshSemaphore, Timer RefreshTimer)> BotSynchronizations = new();
private static readonly SemaphoreSlim SubmissionSemaphore = new(1, 1);
private static readonly Timer SubmissionTimer = new(SubmitData);
private static readonly Timer SubmissionTimer = new(OnSubmissionTimer);
private static GlobalCache? GlobalCache;
private static DateTimeOffset LastUploadAt = DateTimeOffset.MinValue;
@ -311,6 +311,8 @@ internal sealed class SteamTokenDumperPlugin : OfficialPlugin, IASF, IBot, IBotC
await Refresh(bot, packageTokens.Keys).ConfigureAwait(false);
}
private static async void OnSubmissionTimer(object? state = null) => await SubmitData().ConfigureAwait(false);
private static async Task Refresh(Bot bot, IReadOnlyCollection<uint>? packageIDs = null) {
ArgumentNullException.ThrowIfNull(bot);
@ -544,7 +546,7 @@ internal sealed class SteamTokenDumperPlugin : OfficialPlugin, IASF, IBot, IBotC
}
}
private static async void SubmitData(object? state = null) {
private static async Task SubmitData(CancellationToken cancellationToken = default) {
if (Bot.Bots == null) {
throw new InvalidOperationException(nameof(Bot.Bots));
}
@ -565,7 +567,7 @@ internal sealed class SteamTokenDumperPlugin : OfficialPlugin, IASF, IBot, IBotC
return;
}
if (!await SubmissionSemaphore.WaitAsync(0).ConfigureAwait(false)) {
if (!await SubmissionSemaphore.WaitAsync(0, cancellationToken).ConfigureAwait(false)) {
return;
}
@ -593,7 +595,7 @@ internal sealed class SteamTokenDumperPlugin : OfficialPlugin, IASF, IBot, IBotC
ASF.ArchiLogger.LogGenericInfo(string.Format(CultureInfo.CurrentCulture, Strings.SubmissionInProgress, appTokens.Count, packageTokens.Count, depotKeys.Count));
ObjectResponse<SubmitResponse>? response = await ASF.WebBrowser.UrlPostToJsonObject<SubmitResponse, SubmitRequest>(request, data: data, requestOptions: WebBrowser.ERequestOptions.ReturnClientErrors | WebBrowser.ERequestOptions.AllowInvalidBodyOnErrors).ConfigureAwait(false);
ObjectResponse<SubmitResponse>? response = await ASF.WebBrowser.UrlPostToJsonObject<SubmitResponse, SubmitRequest>(request, data: data, requestOptions: WebBrowser.ERequestOptions.ReturnClientErrors | WebBrowser.ERequestOptions.AllowInvalidBodyOnErrors, cancellationToken: cancellationToken).ConfigureAwait(false);
if (response == null) {
ASF.ArchiLogger.LogGenericWarning(ArchiSteamFarm.Localization.Strings.WarningFailed);

View file

@ -43,7 +43,7 @@ internal static class ArchiNet {
private static readonly ArchiCacheable<IReadOnlyCollection<ulong>> CachedBadBots = new(ResolveCachedBadBots, TimeSpan.FromDays(1));
internal static async Task<string?> FetchBuildChecksum(Version version, string variant) {
internal static async Task<string?> FetchBuildChecksum(Version version, string variant, CancellationToken cancellationToken = default) {
ArgumentNullException.ThrowIfNull(version);
ArgumentException.ThrowIfNullOrEmpty(variant);
@ -53,7 +53,7 @@ internal static class ArchiNet {
Uri request = new(URL, $"/Api/Checksum/{version}/{variant}");
ObjectResponse<GenericResponse<string>>? response = await ASF.WebBrowser.UrlGetToJsonObject<GenericResponse<string>>(request).ConfigureAwait(false);
ObjectResponse<GenericResponse<string>>? response = await ASF.WebBrowser.UrlGetToJsonObject<GenericResponse<string>>(request, cancellationToken: cancellationToken).ConfigureAwait(false);
if (response?.Content == null) {
return null;
@ -62,17 +62,17 @@ internal static class ArchiNet {
return response.Content.Result ?? "";
}
internal static async Task<bool?> IsBadBot(ulong steamID) {
internal static async Task<bool?> IsBadBot(ulong steamID, CancellationToken cancellationToken = default) {
if ((steamID == 0) || !new SteamID(steamID).IsIndividualAccount) {
throw new ArgumentOutOfRangeException(nameof(steamID));
}
(_, IReadOnlyCollection<ulong>? badBots) = await CachedBadBots.GetValue(ECacheFallback.FailedNow).ConfigureAwait(false);
(_, IReadOnlyCollection<ulong>? badBots) = await CachedBadBots.GetValue(ECacheFallback.FailedNow, cancellationToken).ConfigureAwait(false);
return badBots?.Contains(steamID);
}
internal static async Task<HttpStatusCode?> SignInWithSteam(Bot bot, WebBrowser webBrowser) {
internal static async Task<HttpStatusCode?> SignInWithSteam(Bot bot, WebBrowser webBrowser, CancellationToken cancellationToken = default) {
ArgumentNullException.ThrowIfNull(bot);
ArgumentNullException.ThrowIfNull(webBrowser);
@ -83,7 +83,7 @@ internal static class ArchiNet {
// We expect data or redirection to Steam OpenID
Uri authenticateRequest = new(URL, $"/Api/Steam/Authenticate?steamID={bot.SteamID}");
ObjectResponse<GenericResponse<ulong>>? authenticateResponse = await webBrowser.UrlGetToJsonObject<GenericResponse<ulong>>(authenticateRequest, requestOptions: WebBrowser.ERequestOptions.ReturnRedirections | WebBrowser.ERequestOptions.ReturnClientErrors | WebBrowser.ERequestOptions.AllowInvalidBodyOnErrors).ConfigureAwait(false);
ObjectResponse<GenericResponse<ulong>>? authenticateResponse = await webBrowser.UrlGetToJsonObject<GenericResponse<ulong>>(authenticateRequest, requestOptions: WebBrowser.ERequestOptions.ReturnRedirections | WebBrowser.ERequestOptions.ReturnClientErrors | WebBrowser.ERequestOptions.AllowInvalidBodyOnErrors, cancellationToken: cancellationToken).ConfigureAwait(false);
if (authenticateResponse == null) {
return null;
@ -98,7 +98,7 @@ internal static class ArchiNet {
}
// We've got a redirection, initiate OpenID procedure by following it
using HtmlDocumentResponse? challengeResponse = await bot.ArchiWebHandler.UrlGetToHtmlDocumentWithSession(authenticateResponse.FinalUri).ConfigureAwait(false);
using HtmlDocumentResponse? challengeResponse = await bot.ArchiWebHandler.UrlGetToHtmlDocumentWithSession(authenticateResponse.FinalUri, cancellationToken: cancellationToken).ConfigureAwait(false);
if (challengeResponse?.Content == null) {
return null;
@ -151,14 +151,14 @@ internal static class ArchiNet {
data.Add(nonceContent, "nonce");
// Accept OpenID request presented and follow redirection back to the data we initially expected
BasicResponse? loginResponse = await bot.ArchiWebHandler.WebBrowser.UrlPost(loginRequest, data: data, requestOptions: WebBrowser.ERequestOptions.ReturnRedirections).ConfigureAwait(false);
BasicResponse? loginResponse = await bot.ArchiWebHandler.WebBrowser.UrlPost(loginRequest, data: data, requestOptions: WebBrowser.ERequestOptions.ReturnRedirections, cancellationToken: cancellationToken).ConfigureAwait(false);
if (loginResponse == null) {
return null;
}
// We've got a final redirection, follow it and complete login procedure
authenticateResponse = await webBrowser.UrlGetToJsonObject<GenericResponse<ulong>>(loginResponse.FinalUri, requestOptions: WebBrowser.ERequestOptions.ReturnClientErrors | WebBrowser.ERequestOptions.AllowInvalidBodyOnErrors).ConfigureAwait(false);
authenticateResponse = await webBrowser.UrlGetToJsonObject<GenericResponse<ulong>>(loginResponse.FinalUri, requestOptions: WebBrowser.ERequestOptions.ReturnClientErrors | WebBrowser.ERequestOptions.AllowInvalidBodyOnErrors, cancellationToken: cancellationToken).ConfigureAwait(false);
if (authenticateResponse == null) {
return null;