From e4f4859eb48350f8cc13ed5c6ca36585ab0ce2bc Mon Sep 17 00:00:00 2001 From: JustArchi Date: Mon, 30 Jan 2017 22:42:05 +0100 Subject: [PATCH] Closes #445 ASF doesn't really make use of Balanced profile (as opposed to ArchiBoT), remove it leaving only MaxPerformance/MinMemoryUsage --- ArchiSteamFarm/Bot.cs | 18 +++++++++-- ArchiSteamFarm/CardsFarmer.cs | 53 +++++++++++++++++++++++++++------ ArchiSteamFarm/GlobalConfig.cs | 4 +-- ArchiSteamFarm/Trading.cs | 16 +++++++++- ConfigGenerator/GlobalConfig.cs | 3 +- 5 files changed, 77 insertions(+), 17 deletions(-) diff --git a/ArchiSteamFarm/Bot.cs b/ArchiSteamFarm/Bot.cs index 610f1c0d8..d1c438ffe 100755 --- a/ArchiSteamFarm/Bot.cs +++ b/ArchiSteamFarm/Bot.cs @@ -277,9 +277,23 @@ namespace ArchiSteamFarm { continue; } - Steam.ConfirmationDetails[] detailsResults = await Task.WhenAll(confirmations.Select(BotDatabase.MobileAuthenticator.GetConfirmationDetails)).ConfigureAwait(false); + ICollection results; + IEnumerable> tasks = confirmations.Select(BotDatabase.MobileAuthenticator.GetConfirmationDetails); - HashSet ignoredConfirmations = new HashSet(detailsResults.Where(details => (details != null) && (((acceptedSteamID != 0) && (details.OtherSteamID64 != 0) && (acceptedSteamID != details.OtherSteamID64)) || ((acceptedTradeIDs != null) && (details.TradeOfferID != 0) && !acceptedTradeIDs.Contains(details.TradeOfferID)))).Select(details => details.Confirmation)); + switch (Program.GlobalConfig.OptimizationMode) { + case GlobalConfig.EOptimizationMode.MinMemoryUsage: + results = new List(confirmations.Count); + foreach (Task task in tasks) { + results.Add(await task.ConfigureAwait(false)); + } + + break; + default: + results = await Task.WhenAll(tasks).ConfigureAwait(false); + break; + } + + HashSet ignoredConfirmations = new HashSet(results.Where(details => (details != null) && (((acceptedSteamID != 0) && (details.OtherSteamID64 != 0) && (acceptedSteamID != details.OtherSteamID64)) || ((acceptedTradeIDs != null) && (details.TradeOfferID != 0) && !acceptedTradeIDs.Contains(details.TradeOfferID)))).Select(details => details.Confirmation)); if (ignoredConfirmations.Count > 0) { confirmations.ExceptWith(ignoredConfirmations); diff --git a/ArchiSteamFarm/CardsFarmer.cs b/ArchiSteamFarm/CardsFarmer.cs index c7e57460a..986e6bb6d 100755 --- a/ArchiSteamFarm/CardsFarmer.cs +++ b/ArchiSteamFarm/CardsFarmer.cs @@ -320,7 +320,7 @@ namespace ArchiSteamFarm { return; } - HashSet extraTasks = new HashSet(); + HashSet backgroundTasks = new HashSet(); foreach (HtmlNode htmlNode in htmlNodes) { HtmlNode appIDNode = htmlNode.SelectSingleNode(".//div[@class='card_drop_info_dialog']"); @@ -488,12 +488,22 @@ namespace ArchiSteamFarm { if (cardsRemaining > 0) { GamesToFarm.Add(new Game(appID, name, hours, cardsRemaining)); } else { - extraTasks.Add(CheckGame(appID, name, hours)); + Task task = CheckGame(appID, name, hours); + switch (Program.GlobalConfig.OptimizationMode) { + case GlobalConfig.EOptimizationMode.MinMemoryUsage: + await task.ConfigureAwait(false); + break; + default: + backgroundTasks.Add(task); + break; + } } } - // If we have any pending tasks, wait for them - await Task.WhenAll(extraTasks).ConfigureAwait(false); + // If we have any background tasks, wait for them + if (backgroundTasks.Count > 0) { + await Task.WhenAll(backgroundTasks).ConfigureAwait(false); + } } private async Task CheckPage(byte page) { @@ -689,18 +699,43 @@ namespace ArchiSteamFarm { GamesToFarm.ClearAndTrim(); - List tasks = new List(maxPages - 1) { CheckPage(htmlDocument) }; + List backgroundTasks = new List(); + Task task = CheckPage(htmlDocument); + + switch (Program.GlobalConfig.OptimizationMode) { + case GlobalConfig.EOptimizationMode.MinMemoryUsage: + await task.ConfigureAwait(false); + break; + default: + backgroundTasks.Add(task); + break; + } if (maxPages > 1) { Bot.ArchiLogger.LogGenericInfo(Strings.CheckingOtherBadgePages); - for (byte page = 2; page <= maxPages; page++) { - byte currentPage = page; // We need a copy of variable being passed when in for loops, as loop will proceed before task is launched - tasks.Add(CheckPage(currentPage)); + switch (Program.GlobalConfig.OptimizationMode) { + case GlobalConfig.EOptimizationMode.MinMemoryUsage: + for (byte page = 2; page <= maxPages; page++) { + await CheckPage(page).ConfigureAwait(false); + } + + break; + default: + for (byte page = 2; page <= maxPages; page++) { + // We need a copy of variable being passed when in for loops, as loop will proceed before our task is launched + byte currentPage = page; + backgroundTasks.Add(CheckPage(currentPage)); + } + + break; } } - await Task.WhenAll(tasks).ConfigureAwait(false); + if (backgroundTasks.Count > 0) { + await Task.WhenAll(backgroundTasks).ConfigureAwait(false); + } + SortGamesToFarm(); return GamesToFarm.Count > 0; } diff --git a/ArchiSteamFarm/GlobalConfig.cs b/ArchiSteamFarm/GlobalConfig.cs index 3dc4c07da..e0fbef0ab 100644 --- a/ArchiSteamFarm/GlobalConfig.cs +++ b/ArchiSteamFarm/GlobalConfig.cs @@ -88,7 +88,7 @@ namespace ArchiSteamFarm { internal readonly byte MaxTradeHoldDuration = 15; [JsonProperty(Required = Required.DisallowNull)] - internal readonly EOptimizationMode OptimizationMode = EOptimizationMode.Balanced; + internal readonly EOptimizationMode OptimizationMode = EOptimizationMode.MaxPerformance; [JsonProperty(Required = Required.DisallowNull)] internal readonly bool Statistics = true; @@ -171,9 +171,7 @@ namespace ArchiSteamFarm { return null; } - [SuppressMessage("ReSharper", "UnusedMember.Global")] internal enum EOptimizationMode : byte { - Balanced, MaxPerformance, MinMemoryUsage } diff --git a/ArchiSteamFarm/Trading.cs b/ArchiSteamFarm/Trading.cs index 46f890202..594dfd6ba 100644 --- a/ArchiSteamFarm/Trading.cs +++ b/ArchiSteamFarm/Trading.cs @@ -102,7 +102,21 @@ namespace ArchiSteamFarm { } } - ParseTradeResult[] results = await Task.WhenAll(tradeOffers.Select(ParseTrade)).ConfigureAwait(false); + ICollection results; + IEnumerable> tasks = tradeOffers.Select(ParseTrade); + + switch (Program.GlobalConfig.OptimizationMode) { + case GlobalConfig.EOptimizationMode.MinMemoryUsage: + results = new List(tradeOffers.Count); + foreach (Task task in tasks) { + results.Add(await task.ConfigureAwait(false)); + } + + break; + default: + results = await Task.WhenAll(tasks).ConfigureAwait(false); + break; + } if (Bot.HasMobileAuthenticator) { HashSet acceptedWithItemLoseTradeIDs = new HashSet(results.Where(result => (result != null) && (result.Result == ParseTradeResult.EResult.AcceptedWithItemLose)).Select(result => result.TradeID)); diff --git a/ConfigGenerator/GlobalConfig.cs b/ConfigGenerator/GlobalConfig.cs index 7af93063b..cce83d176 100644 --- a/ConfigGenerator/GlobalConfig.cs +++ b/ConfigGenerator/GlobalConfig.cs @@ -100,7 +100,7 @@ namespace ConfigGenerator { [LocalizedCategory("Performance")] [JsonProperty(Required = Required.DisallowNull)] - public EOptimizationMode OptimizationMode { get; set; } = EOptimizationMode.Balanced; + public EOptimizationMode OptimizationMode { get; set; } = EOptimizationMode.MaxPerformance; [JsonProperty(Required = Required.DisallowNull)] public bool Statistics { get; set; } = true; @@ -211,7 +211,6 @@ namespace ConfigGenerator { } internal enum EOptimizationMode : byte { - Balanced, MaxPerformance, MinMemoryUsage }