diff --git a/ArchiSteamFarm/IPC/Controllers/Api/CommandController.cs b/ArchiSteamFarm/IPC/Controllers/Api/CommandController.cs index 31c2a5b8e..0ed186635 100644 --- a/ArchiSteamFarm/IPC/Controllers/Api/CommandController.cs +++ b/ArchiSteamFarm/IPC/Controllers/Api/CommandController.cs @@ -21,7 +21,6 @@ using System; using System.Globalization; -using System.Linq; using System.Net; using System.Threading.Tasks; using ArchiSteamFarm.Core; @@ -54,7 +53,7 @@ public sealed class CommandController : ArchiController { return BadRequest(new GenericResponse(false, string.Format(CultureInfo.CurrentCulture, Strings.ErrorIsEmpty, nameof(request.Command)))); } - Bot? targetBot = Bot.Bots?.OrderBy(static bot => bot.Key, Bot.BotsComparer).Select(static bot => bot.Value).FirstOrDefault(); + Bot? targetBot = Bot.GetDefaultBot(); if (targetBot == null) { return BadRequest(new GenericResponse(false, Strings.ErrorNoBotsDefined)); diff --git a/ArchiSteamFarm/NLog/Logging.cs b/ArchiSteamFarm/NLog/Logging.cs index d8d76217d..efc25a572 100644 --- a/ArchiSteamFarm/NLog/Logging.cs +++ b/ArchiSteamFarm/NLog/Logging.cs @@ -384,7 +384,7 @@ internal static class Logging { command = command[commandPrefix.Length..]; } - Bot? targetBot = Bot.Bots?.OrderBy(static bot => bot.Key, Bot.BotsComparer).Select(static bot => bot.Value).FirstOrDefault(); + Bot? targetBot = Bot.GetDefaultBot(); if (targetBot == null) { Console.WriteLine($@"<< {Strings.ErrorNoBotsDefined}"); diff --git a/ArchiSteamFarm/Steam/Bot.cs b/ArchiSteamFarm/Steam/Bot.cs index da11e655c..5bb6adedb 100644 --- a/ArchiSteamFarm/Steam/Bot.cs +++ b/ArchiSteamFarm/Steam/Bot.cs @@ -1205,6 +1205,19 @@ public sealed class Bot : IAsyncDisposable, IDisposable { return (productInfoResultSet is { Complete: true, Failed: false } || optimisticDiscovery ? appID : 0, DateTime.MinValue, true); } + internal static Bot? GetDefaultBot() { + if ((Bots == null) || Bots.IsEmpty) { + return null; + } + + // ReSharper disable once RedundantSuppressNullableWarningExpression - required for .NET Framework + if (!string.IsNullOrEmpty(ASF.GlobalConfig?.DefaultBot) && Bots.TryGetValue(ASF.GlobalConfig!.DefaultBot!, out Bot? targetBot)) { + return targetBot; + } + + return Bots.OrderBy(static bot => bot.Key, BotsComparer).Select(static bot => bot.Value).FirstOrDefault(); + } + internal Task?> GetMarketableAppIDs() => ArchiWebHandler.GetAppList(); internal async Task?> GetPackagesData(IReadOnlyCollection packageIDs) { diff --git a/ArchiSteamFarm/Storage/GlobalConfig.cs b/ArchiSteamFarm/Storage/GlobalConfig.cs index 166297e34..0107e8e61 100644 --- a/ArchiSteamFarm/Storage/GlobalConfig.cs +++ b/ArchiSteamFarm/Storage/GlobalConfig.cs @@ -60,6 +60,9 @@ public sealed class GlobalConfig { [PublicAPI] public const bool DefaultDebug = false; + [PublicAPI] + public const string? DefaultDefaultBot = null; + [PublicAPI] public const byte DefaultFarmingDelay = 15; @@ -208,6 +211,9 @@ public sealed class GlobalConfig { [JsonProperty(Required = Required.DisallowNull)] public bool Debug { get; private set; } = DefaultDebug; + [JsonProperty] + public string? DefaultBot { get; private set; } = DefaultDefaultBot; + [JsonProperty(Required = Required.DisallowNull)] [Range(1, byte.MaxValue)] public byte FarmingDelay { get; private set; } = DefaultFarmingDelay; @@ -363,6 +369,9 @@ public sealed class GlobalConfig { [UsedImplicitly] public bool ShouldSerializeDebug() => !Saving || (Debug != DefaultDebug); + [UsedImplicitly] + public bool ShouldSerializeDefaultBot() => !Saving || (DefaultBot != DefaultDefaultBot); + [UsedImplicitly] public bool ShouldSerializeFarmingDelay() => !Saving || (FarmingDelay != DefaultFarmingDelay); diff --git a/Directory.Build.props b/Directory.Build.props index fad7b644b..5bfe1a3dd 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,6 +1,6 @@ - 5.4.11.5 + 5.4.12.0