diff --git a/ArchiSteamFarm/GlobalDatabase.cs b/ArchiSteamFarm/GlobalDatabase.cs index e28c8ff35..2992c0ad4 100644 --- a/ArchiSteamFarm/GlobalDatabase.cs +++ b/ArchiSteamFarm/GlobalDatabase.cs @@ -72,9 +72,25 @@ namespace ArchiSteamFarm { } } + internal uint LastChangeNumber { + get => BackingLastChangeNumber; + + set { + if (BackingLastChangeNumber == value) { + return; + } + + BackingLastChangeNumber = value; + Utilities.InBackground(Save); + } + } + [JsonProperty(PropertyName = "_" + nameof(CellID), Required = Required.DisallowNull)] private uint BackingCellID; + [JsonProperty(PropertyName = "_" + nameof(LastChangeNumber), Required = Required.DisallowNull)] + private uint BackingLastChangeNumber; + private GlobalDatabase(string filePath) : this() { if (string.IsNullOrEmpty(filePath)) { throw new ArgumentNullException(nameof(filePath)); @@ -162,21 +178,31 @@ namespace ArchiSteamFarm { return result; } - internal void OnPICSChangesRestart() { - bool save = false; + internal async Task OnPICSChangesRestart([NotNull] Bot bot, uint currentChangeNumber) { + if (bot == null) { + throw new ArgumentNullException(nameof(bot)); + } + + if (currentChangeNumber == 0) { + throw new ArgumentOutOfRangeException(nameof(currentChangeNumber)); + } + + if (currentChangeNumber <= LastChangeNumber) { + return; + } if (!PackagesData.IsEmpty) { PackagesData.Clear(); - save = true; } if (!PackagesAccessTokens.IsEmpty) { PackagesAccessTokens.Clear(); - save = true; } - if (save) { - Utilities.InBackground(Save); + LastChangeNumber = currentChangeNumber; + + if (bot.OwnedPackageIDs.Count > 0) { + await RefreshPackages(bot, bot.OwnedPackageIDs.Keys.ToDictionary(packageID => packageID, _ => uint.MinValue)).ConfigureAwait(false); } } diff --git a/ArchiSteamFarm/Plugins/PluginsCore.cs b/ArchiSteamFarm/Plugins/PluginsCore.cs index b77ba5c33..c05622093 100644 --- a/ArchiSteamFarm/Plugins/PluginsCore.cs +++ b/ArchiSteamFarm/Plugins/PluginsCore.cs @@ -64,8 +64,10 @@ namespace ArchiSteamFarm.Plugins { } internal static async Task GetChangeNumberToStartFrom() { + uint lastChangeNumber = ASF.GlobalDatabase?.LastChangeNumber ?? 0; + if (ActivePlugins == null) { - return 0; + return lastChangeNumber; } IList results; @@ -75,16 +77,14 @@ namespace ArchiSteamFarm.Plugins { } catch (Exception e) { ASF.ArchiLogger.LogGenericException(e); - return 0; + return lastChangeNumber; } - uint changeNumberToStartFrom = uint.MaxValue; - - foreach (uint result in results.Where(result => (result > 0) && (result < changeNumberToStartFrom))) { - changeNumberToStartFrom = result; + foreach (uint result in results.Where(result => (result > 0) && (result < lastChangeNumber))) { + lastChangeNumber = result; } - return changeNumberToStartFrom == uint.MaxValue ? 0 : changeNumberToStartFrom; + return lastChangeNumber; } internal static async Task GetCrossProcessSemaphore(string objectName) { diff --git a/ArchiSteamFarm/SteamPICSChanges.cs b/ArchiSteamFarm/SteamPICSChanges.cs index 267b5b739..ad8377332 100644 --- a/ArchiSteamFarm/SteamPICSChanges.cs +++ b/ArchiSteamFarm/SteamPICSChanges.cs @@ -90,11 +90,7 @@ namespace ArchiSteamFarm { if (picsChanges.RequiresFullAppUpdate || picsChanges.RequiresFullPackageUpdate || ((picsChanges.AppChanges.Count == 0) && (picsChanges.PackageChanges.Count == 0))) { if (ASF.GlobalDatabase != null) { - ASF.GlobalDatabase.OnPICSChangesRestart(); - - if (refreshBot.OwnedPackageIDs.Count > 0) { - await ASF.GlobalDatabase.RefreshPackages(refreshBot, refreshBot.OwnedPackageIDs.Keys.ToDictionary(packageID => packageID, _ => uint.MinValue)).ConfigureAwait(false); - } + await ASF.GlobalDatabase.OnPICSChangesRestart(refreshBot, picsChanges.CurrentChangeNumber).ConfigureAwait(false); } await PluginsCore.OnPICSChangesRestart(picsChanges.CurrentChangeNumber).ConfigureAwait(false);