From 7b65c1aeb7f605963dca77beea07e23bc92dc4cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Domeradzki?= Date: Mon, 16 Sep 2024 17:58:35 +0200 Subject: [PATCH] Add support for telling plugins if runtime is trimmed --- .../Backend.cs | 2 +- .../MonitoringPlugin.cs | 2 +- ArchiSteamFarm/Core/ASF.cs | 6 +- ArchiSteamFarm/Core/BuildInfo.cs | 68 +++++++++++++++++++ ArchiSteamFarm/Core/OS.cs | 12 ++-- .../IPC/Controllers/Api/ASFController.cs | 2 +- ArchiSteamFarm/Plugins/PluginsCore.cs | 2 +- ArchiSteamFarm/Program.cs | 2 +- ArchiSteamFarm/SharedInfo.cs | 41 +---------- ArchiSteamFarm/Web/WebBrowser.cs | 2 +- Directory.Build.props | 4 ++ 11 files changed, 90 insertions(+), 53 deletions(-) create mode 100644 ArchiSteamFarm/Core/BuildInfo.cs diff --git a/ArchiSteamFarm.OfficialPlugins.ItemsMatcher/Backend.cs b/ArchiSteamFarm.OfficialPlugins.ItemsMatcher/Backend.cs index 8e302b59d..41a70e01b 100644 --- a/ArchiSteamFarm.OfficialPlugins.ItemsMatcher/Backend.cs +++ b/ArchiSteamFarm.OfficialPlugins.ItemsMatcher/Backend.cs @@ -203,7 +203,7 @@ internal static class Backend { ArgumentOutOfRangeException.ThrowIfEqual(requestID, Guid.Empty); - if (SharedInfo.BuildInfo.IsCustomBuild) { + if (BuildInfo.IsCustomBuild) { return null; } diff --git a/ArchiSteamFarm.OfficialPlugins.Monitoring/MonitoringPlugin.cs b/ArchiSteamFarm.OfficialPlugins.Monitoring/MonitoringPlugin.cs index 361c622fb..b1943068d 100644 --- a/ArchiSteamFarm.OfficialPlugins.Monitoring/MonitoringPlugin.cs +++ b/ArchiSteamFarm.OfficialPlugins.Monitoring/MonitoringPlugin.cs @@ -58,7 +58,7 @@ internal sealed class MonitoringPlugin : OfficialPlugin, IDisposable, IOfficialG private static readonly Measurement BuildInfo = new( 1, new KeyValuePair(TagNames.Version, SharedInfo.Version.ToString()), - new KeyValuePair(TagNames.Variant, SharedInfo.BuildInfo.Variant) + new KeyValuePair(TagNames.Variant, Core.BuildInfo.Variant) ); private static readonly Measurement RuntimeInfo = new( diff --git a/ArchiSteamFarm/Core/ASF.cs b/ArchiSteamFarm/Core/ASF.cs index 2092dea94..0e2822526 100644 --- a/ArchiSteamFarm/Core/ASF.cs +++ b/ArchiSteamFarm/Core/ASF.cs @@ -772,7 +772,7 @@ public static class ASF { channel ??= GlobalConfig.UpdateChannel; - if (!SharedInfo.BuildInfo.CanUpdate || (channel == GlobalConfig.EUpdateChannel.None)) { + if (!BuildInfo.CanUpdate || (channel == GlobalConfig.EUpdateChannel.None)) { return (false, null); } @@ -824,7 +824,7 @@ public static class ASF { return (false, newVersion); } - targetFile = $"{SharedInfo.ASF}-{SharedInfo.BuildInfo.Variant}.zip"; + targetFile = $"{SharedInfo.ASF}-{BuildInfo.Variant}.zip"; ReleaseAsset? binaryAsset = releaseResponse.Assets.FirstOrDefault(asset => !string.IsNullOrEmpty(asset.Name) && asset.Name.Equals(targetFile, StringComparison.OrdinalIgnoreCase)); if (binaryAsset == null) { @@ -838,7 +838,7 @@ public static class ASF { // Keep short timeout allowed for this call, as we don't want to hold the flow for too long using CancellationTokenSource archiNetCancellation = new(TimeSpan.FromSeconds(15)); - string? remoteChecksum = await ArchiNet.FetchBuildChecksum(newVersion, SharedInfo.BuildInfo.Variant, archiNetCancellation.Token).ConfigureAwait(false); + string? remoteChecksum = await ArchiNet.FetchBuildChecksum(newVersion, BuildInfo.Variant, archiNetCancellation.Token).ConfigureAwait(false); switch (remoteChecksum) { case null: diff --git a/ArchiSteamFarm/Core/BuildInfo.cs b/ArchiSteamFarm/Core/BuildInfo.cs new file mode 100644 index 000000000..afbe3412e --- /dev/null +++ b/ArchiSteamFarm/Core/BuildInfo.cs @@ -0,0 +1,68 @@ +// ---------------------------------------------------------------------------------------------- +// _ _ _ ____ _ _____ +// / \ _ __ ___ | |__ (_)/ ___| | |_ ___ __ _ _ __ ___ | ___|__ _ _ __ _ __ ___ +// / _ \ | '__|/ __|| '_ \ | |\___ \ | __|/ _ \ / _` || '_ ` _ \ | |_ / _` || '__|| '_ ` _ \ +// / ___ \ | | | (__ | | | || | ___) || |_| __/| (_| || | | | | || _|| (_| || | | | | | | | +// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_| +// ---------------------------------------------------------------------------------------------- +// | +// Copyright 2015-2024 Ɓukasz "JustArchi" Domeradzki +// Contact: JustArchi@JustArchi.net +// | +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// | +// http://www.apache.org/licenses/LICENSE-2.0 +// | +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +namespace ArchiSteamFarm.Core; + +internal static class BuildInfo { +#if ASF_VARIANT_DOCKER + internal static bool CanUpdate => false; + internal static string Variant => "docker"; +#elif ASF_VARIANT_GENERIC + internal static bool CanUpdate => true; + internal static string Variant => "generic"; +#elif ASF_VARIANT_LINUX_ARM + internal static bool CanUpdate => true; + internal static string Variant => "linux-arm"; +#elif ASF_VARIANT_LINUX_ARM64 + internal static bool CanUpdate => true; + internal static string Variant => "linux-arm64"; +#elif ASF_VARIANT_LINUX_X64 + internal static bool CanUpdate => true; + internal static string Variant => "linux-x64"; +#elif ASF_VARIANT_OSX_ARM64 + internal static bool CanUpdate => true; + internal static string Variant => "osx-arm64"; +#elif ASF_VARIANT_OSX_X64 + internal static bool CanUpdate => true; + internal static string Variant => "osx-x64"; +#elif ASF_VARIANT_WIN_ARM64 + internal static bool CanUpdate => true; + internal static string Variant => "win-arm64"; +#elif ASF_VARIANT_WIN_X64 + internal static bool CanUpdate => true; + internal static string Variant => "win-x64"; +#else + internal static bool CanUpdate => false; + internal static string Variant => SourceVariant; +#endif + +#if ASF_RUNTIME_TRIMMED + internal static bool IsRuntimeTrimmed => true; +#else + internal static bool IsRuntimeTrimmed => false; +#endif + + private const string SourceVariant = "source"; + + internal static bool IsCustomBuild => Variant == SourceVariant; +} diff --git a/ArchiSteamFarm/Core/OS.cs b/ArchiSteamFarm/Core/OS.cs index be064f9d1..3bb3de9c8 100644 --- a/ArchiSteamFarm/Core/OS.cs +++ b/ArchiSteamFarm/Core/OS.cs @@ -185,32 +185,32 @@ internal static class OS { internal static bool VerifyEnvironment() { // We're not going to analyze source builds, as we don't know what changes the author has made, assume they have a point - if (SharedInfo.BuildInfo.IsCustomBuild) { + if (BuildInfo.IsCustomBuild) { return true; } - if (SharedInfo.BuildInfo.Variant == "generic") { + if (BuildInfo.Variant == "generic") { // Generic is supported everywhere return true; } - if ((SharedInfo.BuildInfo.Variant == "docker") || SharedInfo.BuildInfo.Variant.StartsWith("linux-", StringComparison.Ordinal)) { + if ((BuildInfo.Variant == "docker") || BuildInfo.Variant.StartsWith("linux-", StringComparison.Ordinal)) { // OS-specific Linux and Docker builds are supported only on Linux return OperatingSystem.IsLinux(); } - if (SharedInfo.BuildInfo.Variant.StartsWith("osx-", StringComparison.Ordinal)) { + if (BuildInfo.Variant.StartsWith("osx-", StringComparison.Ordinal)) { // OS-specific macOS build is supported only on macOS return OperatingSystem.IsMacOS(); } - if (SharedInfo.BuildInfo.Variant.StartsWith("win-", StringComparison.Ordinal)) { + if (BuildInfo.Variant.StartsWith("win-", StringComparison.Ordinal)) { // OS-specific Windows build is supported only on Windows return OperatingSystem.IsWindows(); } // Unknown combination, we intend to cover all of the available ones above, so this results in an error - ASF.ArchiLogger.LogGenericError(Strings.FormatWarningUnknownValuePleaseReport(nameof(SharedInfo.BuildInfo.Variant), SharedInfo.BuildInfo.Variant)); + ASF.ArchiLogger.LogGenericError(Strings.FormatWarningUnknownValuePleaseReport(nameof(BuildInfo.Variant), BuildInfo.Variant)); return false; } diff --git a/ArchiSteamFarm/IPC/Controllers/Api/ASFController.cs b/ArchiSteamFarm/IPC/Controllers/Api/ASFController.cs index 3b4f12f62..6cc6eb02d 100644 --- a/ArchiSteamFarm/IPC/Controllers/Api/ASFController.cs +++ b/ArchiSteamFarm/IPC/Controllers/Api/ASFController.cs @@ -70,7 +70,7 @@ public sealed class ASFController : ArchiController { uint memoryUsage = (uint) GC.GetTotalMemory(false) / 1024; - ASFResponse result = new(SharedInfo.BuildInfo.Variant, SharedInfo.BuildInfo.CanUpdate, ASF.GlobalConfig, memoryUsage, OS.ProcessStartTime, SharedInfo.Version); + ASFResponse result = new(BuildInfo.Variant, BuildInfo.CanUpdate, ASF.GlobalConfig, memoryUsage, OS.ProcessStartTime, SharedInfo.Version); return Ok(new GenericResponse(result)); } diff --git a/ArchiSteamFarm/Plugins/PluginsCore.cs b/ArchiSteamFarm/Plugins/PluginsCore.cs index f1e1eb349..104025dc4 100644 --- a/ArchiSteamFarm/Plugins/PluginsCore.cs +++ b/ArchiSteamFarm/Plugins/PluginsCore.cs @@ -854,7 +854,7 @@ public static class PluginsCore { return false; } - Uri? releaseURL = await plugin.GetTargetReleaseURL(asfVersion, SharedInfo.BuildInfo.Variant, asfUpdate, updateChannel, forced).ConfigureAwait(false); + Uri? releaseURL = await plugin.GetTargetReleaseURL(asfVersion, BuildInfo.Variant, asfUpdate, updateChannel, forced).ConfigureAwait(false); if (releaseURL == null) { return false; diff --git a/ArchiSteamFarm/Program.cs b/ArchiSteamFarm/Program.cs index 0453fb693..9f7f0b237 100644 --- a/ArchiSteamFarm/Program.cs +++ b/ArchiSteamFarm/Program.cs @@ -295,7 +295,7 @@ internal static class Program { ASF.ArchiLogger.LogGenericWarning(Strings.WarningRunningInUnsupportedEnvironment); } else { if (!OS.VerifyEnvironment()) { - ASF.ArchiLogger.LogGenericError(Strings.FormatWarningUnsupportedEnvironment(SharedInfo.BuildInfo.Variant, OS.Version)); + ASF.ArchiLogger.LogGenericError(Strings.FormatWarningUnsupportedEnvironment(BuildInfo.Variant, OS.Version)); await Task.Delay(SharedInfo.InformationDelay).ConfigureAwait(false); return false; diff --git a/ArchiSteamFarm/SharedInfo.cs b/ArchiSteamFarm/SharedInfo.cs index 06d2b8f00..49ae1bc2b 100644 --- a/ArchiSteamFarm/SharedInfo.cs +++ b/ArchiSteamFarm/SharedInfo.cs @@ -85,6 +85,9 @@ public static class SharedInfo { [PublicAPI] public static readonly string[] RangeIndicators = [".."]; + [PublicAPI] + public static bool IsRuntimeTrimmed => BuildInfo.IsRuntimeTrimmed; + internal static string HomeDirectory { get { if (!string.IsNullOrEmpty(CachedHomeDirectory)) { @@ -109,42 +112,4 @@ public static class SharedInfo { private static Guid ModuleVersion => Assembly.GetExecutingAssembly().ManifestModule.ModuleVersionId; private static string? CachedHomeDirectory; - - internal static class BuildInfo { -#if ASF_VARIANT_DOCKER - internal static bool CanUpdate => false; - internal static string Variant => "docker"; -#elif ASF_VARIANT_GENERIC - internal static bool CanUpdate => true; - internal static string Variant => "generic"; -#elif ASF_VARIANT_LINUX_ARM - internal static bool CanUpdate => true; - internal static string Variant => "linux-arm"; -#elif ASF_VARIANT_LINUX_ARM64 - internal static bool CanUpdate => true; - internal static string Variant => "linux-arm64"; -#elif ASF_VARIANT_LINUX_X64 - internal static bool CanUpdate => true; - internal static string Variant => "linux-x64"; -#elif ASF_VARIANT_OSX_ARM64 - internal static bool CanUpdate => true; - internal static string Variant => "osx-arm64"; -#elif ASF_VARIANT_OSX_X64 - internal static bool CanUpdate => true; - internal static string Variant => "osx-x64"; -#elif ASF_VARIANT_WIN_ARM64 - internal static bool CanUpdate => true; - internal static string Variant => "win-arm64"; -#elif ASF_VARIANT_WIN_X64 - internal static bool CanUpdate => true; - internal static string Variant => "win-x64"; -#else - internal static bool CanUpdate => false; - internal static string Variant => SourceVariant; -#endif - - private const string SourceVariant = "source"; - - internal static bool IsCustomBuild => Variant == SourceVariant; - } } diff --git a/ArchiSteamFarm/Web/WebBrowser.cs b/ArchiSteamFarm/Web/WebBrowser.cs index a95be2c6e..d78dfeecb 100644 --- a/ArchiSteamFarm/Web/WebBrowser.cs +++ b/ArchiSteamFarm/Web/WebBrowser.cs @@ -105,7 +105,7 @@ public sealed class WebBrowser : IDisposable { // Most web services expect that UserAgent is set, so we declare it globally // If you by any chance came here with a very "clever" idea of hiding your ass by changing default ASF user-agent then here is a very good advice from me: don't, for your own safety - you've been warned result.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue(SharedInfo.PublicIdentifier, SharedInfo.Version.ToString())); - result.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue($"({SharedInfo.BuildInfo.Variant}; {OS.Version.Replace("(", "", StringComparison.Ordinal).Replace(")", "", StringComparison.Ordinal)}; +{SharedInfo.ProjectURL})")); + result.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue($"({BuildInfo.Variant}; {OS.Version.Replace("(", "", StringComparison.Ordinal).Replace(")", "", StringComparison.Ordinal)}; +{SharedInfo.ProjectURL})")); // Inform websites that we visit about our preference in language, if possible result.DefaultRequestHeaders.AcceptLanguage.Add(new StringWithQualityHeaderValue("en-US", 0.9)); diff --git a/Directory.Build.props b/Directory.Build.props index 8c114e8cb..87670f0b4 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -37,6 +37,10 @@ $(DefineConstants);ASF_VARIANT_$(ASFVariant.Replace('-', '_').ToUpperInvariant()) + + $(DefineConstants);ASF_RUNTIME_TRIMMED + + AllDisabledByDefault