From 32e0de5a706af7e41e6cc5bef3e4560fdc1036b7 Mon Sep 17 00:00:00 2001 From: JustArchi Date: Sun, 30 Jun 2019 23:33:50 +0200 Subject: [PATCH] Implement basic logic for #1299 --- ArchiSteamFarm/Bot.cs | 60 ++++++++++---------------------- ArchiSteamFarm/CardsFarmer.cs | 6 ++-- ArchiSteamFarm/GlobalDatabase.cs | 20 ++++++++--- 3 files changed, 39 insertions(+), 47 deletions(-) diff --git a/ArchiSteamFarm/Bot.cs b/ArchiSteamFarm/Bot.cs index 504591dbb..23e086a8d 100755 --- a/ArchiSteamFarm/Bot.cs +++ b/ArchiSteamFarm/Bot.cs @@ -547,32 +547,30 @@ namespace ArchiSteamFarm { return (0, DateTime.MaxValue); } + HashSet packageIDs = ASF.GlobalDatabase.GetPackageIDs(appID, OwnedPackageIDs.Keys); + + if ((packageIDs == null) || (packageIDs.Count == 0)) { + return (0, DateTime.MaxValue); + } + if ((hoursPlayed < CardsFarmer.HoursForRefund) && !BotConfig.IdleRefundableGames) { - HashSet packageIDs = ASF.GlobalDatabase.GetPackageIDs(appID); + DateTime mostRecent = DateTime.MinValue; - if (packageIDs == null) { - return (0, DateTime.MaxValue); - } - - if (packageIDs.Count > 0) { - DateTime mostRecent = DateTime.MinValue; - - foreach (uint packageID in packageIDs) { - if (!OwnedPackageIDs.TryGetValue(packageID, out (EPaymentMethod PaymentMethod, DateTime TimeCreated) packageData)) { - continue; - } - - if (IsRefundable(packageData.PaymentMethod) && (packageData.TimeCreated > mostRecent)) { - mostRecent = packageData.TimeCreated; - } + foreach (uint packageID in packageIDs) { + if (!OwnedPackageIDs.TryGetValue(packageID, out (EPaymentMethod PaymentMethod, DateTime TimeCreated) packageData)) { + continue; } - if (mostRecent > DateTime.MinValue) { - DateTime playableIn = mostRecent.AddDays(CardsFarmer.DaysForRefund); + if (IsRefundable(packageData.PaymentMethod) && (packageData.TimeCreated > mostRecent)) { + mostRecent = packageData.TimeCreated; + } + } - if (playableIn > DateTime.UtcNow) { - return (0, playableIn); - } + if (mostRecent > DateTime.MinValue) { + DateTime playableIn = mostRecent.AddDays(CardsFarmer.DaysForRefund); + + if (playableIn > DateTime.UtcNow) { + return (0, playableIn); } } } @@ -2242,30 +2240,14 @@ namespace ArchiSteamFarm { return; } - // Return early if this update doesn't bring anything new - if (callback.LicenseList.Count == OwnedPackageIDs.Count) { - if (callback.LicenseList.All(license => OwnedPackageIDs.ContainsKey(license.PackageID))) { - if (!await CardsFarmer.Resume(false).ConfigureAwait(false)) { - await ResetGamesPlayed().ConfigureAwait(false); - } - - return; - } - } - Commands.OnNewLicenseList(); OwnedPackageIDs.Clear(); - 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)) { OwnedPackageIDs[license.PackageID] = (license.PaymentMethod, license.TimeCreated); - if (!refreshData) { - continue; - } - if (!ASF.GlobalDatabase.PackagesData.TryGetValue(license.PackageID, out (uint ChangeNumber, HashSet _) packageData) || (packageData.ChangeNumber < license.LastChangeNumber)) { packagesToRefresh[license.PackageID] = (uint) license.LastChangeNumber; } @@ -2277,10 +2259,6 @@ namespace ArchiSteamFarm { ArchiLogger.LogGenericInfo(Strings.Done); } - if (CardsFarmer.Paused) { - await ResetGamesPlayed().ConfigureAwait(false); - } - await CardsFarmer.OnNewGameAdded().ConfigureAwait(false); } diff --git a/ArchiSteamFarm/CardsFarmer.cs b/ArchiSteamFarm/CardsFarmer.cs index e3d9d361c..d525a9e5f 100755 --- a/ArchiSteamFarm/CardsFarmer.cs +++ b/ArchiSteamFarm/CardsFarmer.cs @@ -1136,12 +1136,14 @@ namespace ArchiSteamFarm { foreach (Game game in GamesToFarm) { DateTime redeemDate = DateTime.MinValue; - HashSet packageIDs = ASF.GlobalDatabase.GetPackageIDs(game.AppID); + HashSet packageIDs = ASF.GlobalDatabase.GetPackageIDs(game.AppID, Bot.OwnedPackageIDs.Keys); if (packageIDs != null) { foreach (uint packageID in packageIDs) { if (!Bot.OwnedPackageIDs.TryGetValue(packageID, out (EPaymentMethod PaymentMethod, DateTime TimeCreated) packageData)) { - continue; + Bot.ArchiLogger.LogNullError(nameof(packageData)); + + return; } if (packageData.TimeCreated > redeemDate) { diff --git a/ArchiSteamFarm/GlobalDatabase.cs b/ArchiSteamFarm/GlobalDatabase.cs index 687af28f6..dcce4ec25 100644 --- a/ArchiSteamFarm/GlobalDatabase.cs +++ b/ArchiSteamFarm/GlobalDatabase.cs @@ -111,14 +111,24 @@ namespace ArchiSteamFarm { return globalDatabase; } - internal HashSet GetPackageIDs(uint appID) { - if (appID == 0) { - ASF.ArchiLogger.LogNullError(nameof(appID)); + internal HashSet GetPackageIDs(uint appID, ICollection packageIDs) { + if ((appID == 0) || (packageIDs == null) || (packageIDs.Count == 0)) { + ASF.ArchiLogger.LogNullError(nameof(appID) + " || " + nameof(packageIDs)); return null; } - return PackagesData.Where(package => package.Value.AppIDs?.Contains(appID) == true).Select(package => package.Key).ToHashSet(); + HashSet result = new HashSet(); + + foreach (uint packageID in packageIDs.Where(packageID => packageID != 0)) { + if (!PackagesData.TryGetValue(packageID, out (uint _, HashSet AppIDs) packagesData) || (packagesData.AppIDs?.Contains(appID) != true)) { + continue; + } + + result.Add(packageID); + } + + return result; } internal async Task RefreshPackages(Bot bot, IReadOnlyDictionary packages) { @@ -140,6 +150,8 @@ namespace ArchiSteamFarm { Dictionary AppIDs)> packagesData = await bot.GetPackagesData(packageIDs).ConfigureAwait(false); if ((packagesData == null) || (packagesData.Count == 0)) { + bot.ArchiLogger.LogGenericWarning(Strings.WarningFailed); + return; }