From 8537ad54e5d95aec313920249e199f1b59907a00 Mon Sep 17 00:00:00 2001 From: JustArchi Date: Wed, 4 Jul 2018 23:43:18 +0200 Subject: [PATCH] FarmingOrder -> FarmingOrders --- ArchiSteamFarm/Bot.cs | 2 +- ArchiSteamFarm/BotConfig.cs | 24 +++- ArchiSteamFarm/CardsFarmer.cs | 178 +++++++++++++++-------------- ArchiSteamFarm/config/example.json | 2 +- WebConfigGenerator/src/schema.js | 17 ++- 5 files changed, 119 insertions(+), 104 deletions(-) diff --git a/ArchiSteamFarm/Bot.cs b/ArchiSteamFarm/Bot.cs index 98ee4d470..2f8def104 100755 --- a/ArchiSteamFarm/Bot.cs +++ b/ArchiSteamFarm/Bot.cs @@ -1985,7 +1985,7 @@ namespace ArchiSteamFarm { OwnedPackageIDs.Clear(); - bool refreshData = !BotConfig.IdleRefundableGames || (BotConfig.FarmingOrder == BotConfig.EFarmingOrder.RedeemDateTimesAscending) || (BotConfig.FarmingOrder == BotConfig.EFarmingOrder.RedeemDateTimesDescending); + bool refreshData = !BotConfig.IdleRefundableGames || BotConfig.FarmingOrders.Contains(BotConfig.EFarmingOrder.RedeemDateTimesAscending) || BotConfig.FarmingOrders.Contains(BotConfig.EFarmingOrder.RedeemDateTimesDescending); Dictionary packagesToRefresh = new Dictionary(); foreach (SteamApps.LicenseListCallback.License license in callback.LicenseList.Where(license => license.PackageID != 0)) { diff --git a/ArchiSteamFarm/BotConfig.cs b/ArchiSteamFarm/BotConfig.cs index 7fc58efe1..419c08db7 100644 --- a/ArchiSteamFarm/BotConfig.cs +++ b/ArchiSteamFarm/BotConfig.cs @@ -51,7 +51,7 @@ namespace ArchiSteamFarm { internal readonly bool Enabled; [JsonProperty(Required = Required.DisallowNull)] - internal readonly EFarmingOrder FarmingOrder = EFarmingOrder.Unordered; + internal readonly HashSet FarmingOrders = new HashSet(); [JsonProperty(Required = Required.DisallowNull)] internal readonly HashSet GamesPlayedWhileIdle = new HashSet(); @@ -139,6 +139,20 @@ namespace ArchiSteamFarm { } } + [JsonProperty(Required = Required.DisallowNull)] + private EFarmingOrder FarmingOrder { + set { + ASF.ArchiLogger.LogGenericWarning(string.Format(Strings.WarningDeprecated, nameof(FarmingOrder), nameof(FarmingOrders))); + + if (!Enum.IsDefined(typeof(EFarmingOrder), value)) { + ASF.ArchiLogger.LogGenericError(string.Format(Strings.ErrorConfigPropertyInvalid, nameof(FarmingOrder), value)); + return; + } + + FarmingOrders.Add(value); + } + } + [JsonProperty(PropertyName = SharedInfo.UlongCompatibilityStringPrefix + nameof(SteamMasterClanID), Required = Required.DisallowNull)] private string SSteamMasterClanID { get => SteamMasterClanID.ToString(); @@ -185,9 +199,11 @@ namespace ArchiSteamFarm { return null; } - if (!Enum.IsDefined(typeof(EFarmingOrder), botConfig.FarmingOrder)) { - ASF.ArchiLogger.LogGenericError(string.Format(Strings.ErrorConfigPropertyInvalid, nameof(botConfig.FarmingOrder), botConfig.FarmingOrder)); - return null; + foreach (EFarmingOrder farmingOrder in botConfig.FarmingOrders) { + if (!Enum.IsDefined(typeof(EFarmingOrder), farmingOrder)) { + ASF.ArchiLogger.LogGenericError(string.Format(Strings.ErrorConfigPropertyInvalid, nameof(botConfig.FarmingOrders), farmingOrder)); + return null; + } } if (botConfig.GamesPlayedWhileIdle.Count > ArchiHandler.MaxGamesPlayedConcurrently) { diff --git a/ArchiSteamFarm/CardsFarmer.cs b/ArchiSteamFarm/CardsFarmer.cs index 8fac2aa4f..1365175dd 100755 --- a/ArchiSteamFarm/CardsFarmer.cs +++ b/ArchiSteamFarm/CardsFarmer.cs @@ -932,100 +932,102 @@ namespace ArchiSteamFarm { // Put priority idling appIDs on top IOrderedEnumerable gamesToFarm = GamesToFarm.OrderByDescending(game => Bot.IsPriorityIdling(game.AppID)); - switch (Bot.BotConfig.FarmingOrder) { - case BotConfig.EFarmingOrder.Unordered: - break; - case BotConfig.EFarmingOrder.AppIDsAscending: - gamesToFarm = gamesToFarm.ThenBy(game => game.AppID); - break; - case BotConfig.EFarmingOrder.AppIDsDescending: - gamesToFarm = gamesToFarm.ThenByDescending(game => game.AppID); - break; - case BotConfig.EFarmingOrder.BadgeLevelsAscending: - gamesToFarm = gamesToFarm.ThenBy(game => game.BadgeLevel); - break; - case BotConfig.EFarmingOrder.BadgeLevelsDescending: - gamesToFarm = gamesToFarm.ThenByDescending(game => game.BadgeLevel); - break; - case BotConfig.EFarmingOrder.CardDropsAscending: - gamesToFarm = gamesToFarm.ThenBy(game => game.CardsRemaining); - break; - case BotConfig.EFarmingOrder.CardDropsDescending: - gamesToFarm = gamesToFarm.ThenByDescending(game => game.CardsRemaining); - break; - case BotConfig.EFarmingOrder.MarketableAscending: - case BotConfig.EFarmingOrder.MarketableDescending: - HashSet marketableAppIDs = await Bot.GetMarketableAppIDs().ConfigureAwait(false); + foreach (BotConfig.EFarmingOrder farmingOrder in Bot.BotConfig.FarmingOrders) { + switch (farmingOrder) { + case BotConfig.EFarmingOrder.Unordered: + break; + case BotConfig.EFarmingOrder.AppIDsAscending: + gamesToFarm = gamesToFarm.ThenBy(game => game.AppID); + break; + case BotConfig.EFarmingOrder.AppIDsDescending: + gamesToFarm = gamesToFarm.ThenByDescending(game => game.AppID); + break; + case BotConfig.EFarmingOrder.BadgeLevelsAscending: + gamesToFarm = gamesToFarm.ThenBy(game => game.BadgeLevel); + break; + case BotConfig.EFarmingOrder.BadgeLevelsDescending: + gamesToFarm = gamesToFarm.ThenByDescending(game => game.BadgeLevel); + break; + case BotConfig.EFarmingOrder.CardDropsAscending: + gamesToFarm = gamesToFarm.ThenBy(game => game.CardsRemaining); + break; + case BotConfig.EFarmingOrder.CardDropsDescending: + gamesToFarm = gamesToFarm.ThenByDescending(game => game.CardsRemaining); + break; + case BotConfig.EFarmingOrder.MarketableAscending: + case BotConfig.EFarmingOrder.MarketableDescending: + HashSet marketableAppIDs = await Bot.GetMarketableAppIDs().ConfigureAwait(false); - if ((marketableAppIDs != null) && (marketableAppIDs.Count > 0)) { - switch (Bot.BotConfig.FarmingOrder) { - case BotConfig.EFarmingOrder.MarketableAscending: - gamesToFarm = gamesToFarm.ThenBy(game => marketableAppIDs.Contains(game.AppID)); - break; - case BotConfig.EFarmingOrder.MarketableDescending: - gamesToFarm = gamesToFarm.ThenByDescending(game => marketableAppIDs.Contains(game.AppID)); - break; - default: - Bot.ArchiLogger.LogGenericError(string.Format(Strings.WarningUnknownValuePleaseReport, nameof(Bot.BotConfig.FarmingOrder), Bot.BotConfig.FarmingOrder)); - return; - } - } - - break; - case BotConfig.EFarmingOrder.HoursAscending: - gamesToFarm = gamesToFarm.ThenBy(game => game.HoursPlayed); - break; - case BotConfig.EFarmingOrder.HoursDescending: - gamesToFarm = gamesToFarm.ThenByDescending(game => game.HoursPlayed); - break; - case BotConfig.EFarmingOrder.NamesAscending: - gamesToFarm = gamesToFarm.ThenBy(game => game.GameName); - break; - case BotConfig.EFarmingOrder.NamesDescending: - gamesToFarm = gamesToFarm.ThenByDescending(game => game.GameName); - break; - case BotConfig.EFarmingOrder.Random: - gamesToFarm = gamesToFarm.ThenBy(game => Utilities.RandomNext()); - break; - case BotConfig.EFarmingOrder.RedeemDateTimesAscending: - case BotConfig.EFarmingOrder.RedeemDateTimesDescending: - Dictionary redeemDates = new Dictionary(GamesToFarm.Count); - - foreach (Game game in GamesToFarm) { - DateTime redeemDate = DateTime.MinValue; - HashSet packageIDs = Program.GlobalDatabase.GetPackageIDs(game.AppID); - - if (packageIDs != null) { - foreach (uint packageID in packageIDs) { - if (!Bot.OwnedPackageIDs.TryGetValue(packageID, out (EPaymentMethod PaymentMethod, DateTime TimeCreated) packageData)) { - continue; - } - - if (packageData.TimeCreated > redeemDate) { - redeemDate = packageData.TimeCreated; - } + if ((marketableAppIDs != null) && (marketableAppIDs.Count > 0)) { + switch (farmingOrder) { + case BotConfig.EFarmingOrder.MarketableAscending: + gamesToFarm = gamesToFarm.ThenBy(game => marketableAppIDs.Contains(game.AppID)); + break; + case BotConfig.EFarmingOrder.MarketableDescending: + gamesToFarm = gamesToFarm.ThenByDescending(game => marketableAppIDs.Contains(game.AppID)); + break; + default: + Bot.ArchiLogger.LogGenericError(string.Format(Strings.WarningUnknownValuePleaseReport, nameof(farmingOrder), farmingOrder)); + return; } } - redeemDates[game.AppID] = redeemDate; - } + break; + case BotConfig.EFarmingOrder.HoursAscending: + gamesToFarm = gamesToFarm.ThenBy(game => game.HoursPlayed); + break; + case BotConfig.EFarmingOrder.HoursDescending: + gamesToFarm = gamesToFarm.ThenByDescending(game => game.HoursPlayed); + break; + case BotConfig.EFarmingOrder.NamesAscending: + gamesToFarm = gamesToFarm.ThenBy(game => game.GameName); + break; + case BotConfig.EFarmingOrder.NamesDescending: + gamesToFarm = gamesToFarm.ThenByDescending(game => game.GameName); + break; + case BotConfig.EFarmingOrder.Random: + gamesToFarm = gamesToFarm.ThenBy(game => Utilities.RandomNext()); + break; + case BotConfig.EFarmingOrder.RedeemDateTimesAscending: + case BotConfig.EFarmingOrder.RedeemDateTimesDescending: + Dictionary redeemDates = new Dictionary(GamesToFarm.Count); - switch (Bot.BotConfig.FarmingOrder) { - case BotConfig.EFarmingOrder.RedeemDateTimesAscending: - gamesToFarm = gamesToFarm.ThenBy(game => redeemDates[game.AppID]); - break; - case BotConfig.EFarmingOrder.RedeemDateTimesDescending: - gamesToFarm = gamesToFarm.ThenByDescending(game => redeemDates[game.AppID]); - break; - default: - Bot.ArchiLogger.LogGenericError(string.Format(Strings.WarningUnknownValuePleaseReport, nameof(Bot.BotConfig.FarmingOrder), Bot.BotConfig.FarmingOrder)); - return; - } + foreach (Game game in GamesToFarm) { + DateTime redeemDate = DateTime.MinValue; + HashSet packageIDs = Program.GlobalDatabase.GetPackageIDs(game.AppID); - break; - default: - Bot.ArchiLogger.LogGenericError(string.Format(Strings.WarningUnknownValuePleaseReport, nameof(Bot.BotConfig.FarmingOrder), Bot.BotConfig.FarmingOrder)); - return; + if (packageIDs != null) { + foreach (uint packageID in packageIDs) { + if (!Bot.OwnedPackageIDs.TryGetValue(packageID, out (EPaymentMethod PaymentMethod, DateTime TimeCreated) packageData)) { + continue; + } + + if (packageData.TimeCreated > redeemDate) { + redeemDate = packageData.TimeCreated; + } + } + } + + redeemDates[game.AppID] = redeemDate; + } + + switch (farmingOrder) { + case BotConfig.EFarmingOrder.RedeemDateTimesAscending: + gamesToFarm = gamesToFarm.ThenBy(game => redeemDates[game.AppID]); + break; + case BotConfig.EFarmingOrder.RedeemDateTimesDescending: + gamesToFarm = gamesToFarm.ThenByDescending(game => redeemDates[game.AppID]); + break; + default: + Bot.ArchiLogger.LogGenericError(string.Format(Strings.WarningUnknownValuePleaseReport, nameof(farmingOrder), farmingOrder)); + return; + } + + break; + default: + Bot.ArchiLogger.LogGenericError(string.Format(Strings.WarningUnknownValuePleaseReport, nameof(farmingOrder), farmingOrder)); + return; + } } // We must call ToList() here as we can't replace items while enumerating diff --git a/ArchiSteamFarm/config/example.json b/ArchiSteamFarm/config/example.json index 82e810266..f6c5d7a51 100644 --- a/ArchiSteamFarm/config/example.json +++ b/ArchiSteamFarm/config/example.json @@ -5,7 +5,7 @@ "CustomGamePlayedWhileFarming": null, "CustomGamePlayedWhileIdle": null, "Enabled": false, - "FarmingOrder": 0, + "FarmingOrders": [], "GamesPlayedWhileIdle": [], "HandleOfflineMessages": false, "HoursUntilCardDrops": 3, diff --git a/WebConfigGenerator/src/schema.js b/WebConfigGenerator/src/schema.js index 9227d58d3..803b1f443 100644 --- a/WebConfigGenerator/src/schema.js +++ b/WebConfigGenerator/src/schema.js @@ -374,8 +374,7 @@ export default { { value: 4, name: 'ProfileBackground' }, { value: 5, name: 'TradingCard' }, { value: 6, name: 'SteamGems' } - ], - defaultValue: 0 + ] }, { type: 'InputSet', @@ -389,8 +388,7 @@ export default { { value: 4, name: 'ProfileBackground' }, { value: 5, name: 'TradingCard' }, { value: 6, name: 'SteamGems' } - ], - defaultValue: 0 + ] } ] }, @@ -406,10 +404,10 @@ export default { validator: Validators.byte }, { - type: 'InputSelect', - label: 'FarmingOrder', - field: 'FarmingOrder', - options: [ + type: 'InputSet', + label: 'FarmingOrders', + field: 'FarmingOrders', + values: [ { value: 0, name: 'Unordered' }, { value: 1, name: 'AppIDsAscending' }, { value: 2, name: 'AppIDsDescending' }, @@ -424,8 +422,7 @@ export default { { value: 11, name: 'BadgeLevelsDescending' }, { value: 12, name: 'RedeemDateTimesAscending' }, { value: 13, name: 'RedeemDateTimesDescending' } - ], - defaultValue: 0 + ] }, { type: 'InputNumber',