From 88dd86f246db53271b238cec4c68a160abc35bcf Mon Sep 17 00:00:00 2001 From: Splash Date: Sat, 30 Mar 2024 22:51:12 +0800 Subject: [PATCH] Add automatic update support Update ArchiSteamFarm to 6.0.1.21 --- ArchiSteamFarm | 2 +- AutoClaimStickers/AutoClaimStickers.cs | 59 +++++++++++++++++++++++++- Directory.Build.props | 2 +- 3 files changed, 60 insertions(+), 3 deletions(-) diff --git a/ArchiSteamFarm b/ArchiSteamFarm index e43adf4..79fb392 160000 --- a/ArchiSteamFarm +++ b/ArchiSteamFarm @@ -1 +1 @@ -Subproject commit e43adf4de7e3e3e4608589ae7bf05e832e7fdba9 +Subproject commit 79fb392a9a514a9c6671e122d93e5341d663907a diff --git a/AutoClaimStickers/AutoClaimStickers.cs b/AutoClaimStickers/AutoClaimStickers.cs index 9c31e52..6630ce5 100644 --- a/AutoClaimStickers/AutoClaimStickers.cs +++ b/AutoClaimStickers/AutoClaimStickers.cs @@ -2,9 +2,11 @@ using System.Collections.Generic; using System.Collections.Immutable; using System.Composition; +using System.Globalization; using System.Linq; using System.Text.Json; using System.Text.Json.Serialization; +using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; using ArchiSteamFarm.Core; @@ -12,13 +14,16 @@ using ArchiSteamFarm.Plugins.Interfaces; using ArchiSteamFarm.Steam; using ArchiSteamFarm.Steam.Integration; +using ArchiSteamFarm.Web.GitHub; +using ArchiSteamFarm.Web.GitHub.Data; using ArchiSteamFarm.Web.Responses; namespace AutoClaimStickers; [Export(typeof(IPlugin))] -internal sealed class AutoClaimStickers : IPlugin, IASF, IDisposable { +internal sealed partial class AutoClaimStickers : IASF, IGitHubPluginUpdates, IDisposable { public string Name => nameof(AutoClaimStickers); + public string RepositoryName => "DevSplash/ASFAutoClaimStickers"; public Version Version => typeof(AutoClaimStickers).Assembly.GetName().Version ?? throw new InvalidOperationException(nameof(Version)); private static Uri SteamApiURL => new("https://api.steampowered.com"); private static Uri RefererURL => new(ArchiWebHandler.SteamStoreURL, "/category/casual"); @@ -28,6 +33,10 @@ internal sealed class AutoClaimStickers : IPlugin, IASF, IDisposable { private static readonly SemaphoreSlim AutoClaimSemaphore = new(1, 1); private static readonly SemaphoreSlim BotSemaphore = new(3, 3); private static readonly JsonSerializerOptions SerializerOptions = new() { DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull }; + [GeneratedRegex(@"\[ASFMinimumVersion\]:(\d+\.\d+\.\d+\.\d+)")] + private static partial Regex ASFMinimumVersionRegex(); + [GeneratedRegex(@"\[ASFMaximumVersion\]:(\d+\.\d+\.\d+\.\d+)")] + private static partial Regex ASFMaximumVersionRegex(); public Task OnLoaded() { AutoClaimTimer = new(OnAutoClaimTimer); @@ -139,5 +148,53 @@ private static async Task CanClaimItem(Bot bot, string token) { return (!string.IsNullOrWhiteSpace(result?.Response?.CommunityItemId), result?.Response); } private async void OnAutoClaimTimer(object? state = null) => await AutoClaim().ConfigureAwait(false); + public async Task GetTargetReleaseURL(Version asfVersion, string asfVariant, bool asfUpdate, bool stable, bool forced) { + ArgumentNullException.ThrowIfNull(asfVersion); + ArgumentException.ThrowIfNullOrEmpty(asfVariant); + if (string.IsNullOrEmpty(RepositoryName)) { + ASF.ArchiLogger.LogGenericError(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, nameof(RepositoryName))); + return null; + } + ImmutableList? releases = await GitHubService.GetReleases(RepositoryName, 100).ConfigureAwait(false); + if (releases == null) { + return null; + } + foreach (ReleaseResponse release in releases) { + if (!stable || !release.IsPreRelease) { + Version newVersion = new(release.Tag); + if (!forced) { + if (Version >= newVersion) { + continue; + } + Match match = ASFMinimumVersionRegex().Match(release.MarkdownBody); + if (!match.Success || match.Groups.Count != 2) { + continue; + } + Version minimumVersion = new(match.Groups[1].Value); + if (asfVersion < minimumVersion) { + continue; + } + match = ASFMaximumVersionRegex().Match(release.MarkdownBody); + if (match.Success && match.Groups.Count == 2) { + Version maximumVersion = new(match.Groups[1].Value); + if (asfVersion > maximumVersion) { + continue; + } + } + } + if (release.Assets.Count == 0) { + continue; + } + ReleaseAsset? asset = await ((IGitHubPluginUpdates) this).GetTargetReleaseAsset(asfVersion, asfVariant, newVersion, release.Assets).ConfigureAwait(false); + if ((asset == null) || !release.Assets.Contains(asset)) { + continue; + } + ASF.ArchiLogger.LogGenericInfo(string.Format(CultureInfo.CurrentCulture, Strings.PluginUpdateFound, Name, Version, newVersion)); + return asset.DownloadURL; + } + } + ASF.ArchiLogger.LogGenericInfo($"No update available for {Name} plugin"); + return null; + } public void Dispose() => AutoClaimTimer?.Dispose(); } diff --git a/Directory.Build.props b/Directory.Build.props index 5ad9ee1..bab1c91 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -3,7 +3,7 @@ AutoClaimStickers - 1.0.1.5 + 1.0.2.1