From dd4be5b91f92f4b6b93d684fa5e8063674d6dad5 Mon Sep 17 00:00:00 2001 From: pointfeev Date: Mon, 2 May 2022 14:12:50 -0400 Subject: [PATCH] v3.4.3.0 - Minor refactoring - Steam games now wait on store api queries, so no DLC will ever be missed from the steam store now - Steam DLC store queries will now only be performed after ALL Steam games have completed their respective store queries, to make sure the steam store api limit isn't hit before all games have queried successfully --- CreamInstaller/CreamInstaller.csproj | 2 +- CreamInstaller/Forms/SelectForm.cs | 32 ++++++++++++++++------------ CreamInstaller/Steam/SteamLibrary.cs | 19 ++++++++--------- CreamInstaller/Steam/SteamStore.cs | 8 ++++++- 4 files changed, 35 insertions(+), 26 deletions(-) diff --git a/CreamInstaller/CreamInstaller.csproj b/CreamInstaller/CreamInstaller.csproj index b92928d..71b5d20 100644 --- a/CreamInstaller/CreamInstaller.csproj +++ b/CreamInstaller/CreamInstaller.csproj @@ -5,7 +5,7 @@ True Resources\ini.ico true - 3.4.2.2 + 3.4.3.0 Resources\ini.ico LICENSE 2021, pointfeev (https://github.com/pointfeev) diff --git a/CreamInstaller/Forms/SelectForm.cs b/CreamInstaller/Forms/SelectForm.cs index 03c1eae..74fa8b9 100644 --- a/CreamInstaller/Forms/SelectForm.cs +++ b/CreamInstaller/Forms/SelectForm.cs @@ -126,29 +126,32 @@ internal partial class SelectForm : CustomForm } if (Directory.Exists(SteamLibrary.InstallPath) && ProgramsToScan.Any(c => c.platform == "Steam")) { - List> steamGames = await SteamLibrary.GetGames(); - foreach (Tuple program in steamGames) + List<(string appId, string name, string branch, int buildId, string gameDirectory)> steamGames = await SteamLibrary.GetGames(); + int totalGames = steamGames.Count; + int gamesChecked = 0; + foreach ((string appId, string name, string branch, int buildId, string gameDirectory) in steamGames) { - string appId = program.Item1; - string name = program.Item2; - string branch = program.Item3; - int buildId = program.Item4; - string directory = program.Item5; if (Program.Canceled) return; Thread.Sleep(0); - if (Program.IsGameBlocked(name, directory) || !ProgramsToScan.Any(c => c.id == appId)) continue; + if (Program.IsGameBlocked(name, gameDirectory) || !ProgramsToScan.Any(c => c.id == appId)) + { + gamesChecked++; + continue; + } AddToRemainingGames(name); Task task = Task.Run(async () => { if (Program.Canceled) return; Thread.Sleep(0); - List dllDirectories = await SteamLibrary.GetDllDirectoriesFromGameDirectory(directory); + List dllDirectories = await SteamLibrary.GetDllDirectoriesFromGameDirectory(gameDirectory); if (dllDirectories is null) { + gamesChecked++; RemoveFromRemainingGames(name); return; } AppData appData = await SteamStore.QueryStoreAPI(appId); + gamesChecked++; VProperty appInfo = await SteamCMD.GetAppInfo(appId, branch, buildId); if (appData is null && appInfo is null) { @@ -171,7 +174,8 @@ internal partial class SelectForm : CustomForm Task task = Task.Run(async () => { if (Program.Canceled) return; - Thread.Sleep(0); + do Thread.Sleep(10); while (!Program.Canceled && gamesChecked < totalGames); // give games steam store api limit priority + if (Program.Canceled) return; string dlcName = null; string dlcIcon = null; AppData dlcAppData = await SteamStore.QueryStoreAPI(dlcAppId, true); @@ -218,7 +222,7 @@ internal partial class SelectForm : CustomForm selection.Enabled = allCheckBox.Checked || selection.SelectedDlc.Any() || selection.ExtraDlc.Any(); selection.Id = appId; selection.Name = appData?.name ?? name; - selection.RootDirectory = directory; + selection.RootDirectory = gameDirectory; selection.DllDirectories = dllDirectories; selection.IsSteam = true; selection.ProductUrl = "https://store.steampowered.com/app/" + appId; @@ -413,9 +417,9 @@ internal partial class SelectForm : CustomForm if (Directory.Exists(ParadoxLauncher.InstallPath)) gameChoices.Add(("Paradox", "ParadoxLauncher", "Paradox Launcher", ProgramsToScan is not null && ProgramsToScan.Any(p => p.id == "ParadoxLauncher"))); if (Directory.Exists(SteamLibrary.InstallPath)) - foreach (Tuple program in await SteamLibrary.GetGames()) - if (!Program.IsGameBlocked(program.Item2, program.Item5)) - gameChoices.Add(("Steam", program.Item1, program.Item2, ProgramsToScan is not null && ProgramsToScan.Any(p => p.id == program.Item1))); + foreach ((string appId, string name, string branch, int buildId, string gameDirectory) in await SteamLibrary.GetGames()) + if (!Program.IsGameBlocked(name, gameDirectory)) + gameChoices.Add(("Steam", appId, name, ProgramsToScan is not null && ProgramsToScan.Any(p => p.id == appId))); if (Directory.Exists(EpicLibrary.EpicManifestsPath)) foreach (Manifest manifest in await EpicLibrary.GetGames()) if (!Program.IsGameBlocked(manifest.DisplayName, manifest.InstallLocation)) diff --git a/CreamInstaller/Steam/SteamLibrary.cs b/CreamInstaller/Steam/SteamLibrary.cs index bdb6c53..01e577b 100644 --- a/CreamInstaller/Steam/SteamLibrary.cs +++ b/CreamInstaller/Steam/SteamLibrary.cs @@ -1,5 +1,4 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; @@ -25,18 +24,18 @@ internal static class SteamLibrary } } - internal static async Task>> GetGames() => await Task.Run(async () => + internal static async Task> GetGames() => await Task.Run(async () => { - List> games = new(); + List<(string appId, string name, string branch, int buildId, string gameDirectory)> games = new(); List gameLibraryDirectories = await GetLibraryDirectories(); foreach (string libraryDirectory in gameLibraryDirectories) { if (Program.Canceled) return games; Thread.Sleep(0); - List> directoryGames = await GetGamesFromLibraryDirectory(libraryDirectory); + List<(string appId, string name, string branch, int buildId, string gameDirectory)> directoryGames = await GetGamesFromLibraryDirectory(libraryDirectory); if (directoryGames is not null) - foreach (Tuple game in directoryGames) - if (!games.Any(_game => _game.Item1 == game.Item1)) + foreach ((string appId, string name, string branch, int buildId, string gameDirectory) game in directoryGames) + if (!games.Any(_game => _game.appId == game.appId)) games.Add(game); } return games; @@ -68,9 +67,9 @@ internal static class SteamLibrary return !dllDirectories.Any() ? null : dllDirectories; }); - internal static async Task>> GetGamesFromLibraryDirectory(string libraryDirectory) => await Task.Run(() => + internal static async Task> GetGamesFromLibraryDirectory(string libraryDirectory) => await Task.Run(() => { - List> games = new(); + List<(string appId, string name, string branch, int buildId, string gameDirectory)> games = new(); if (Program.Canceled || !Directory.Exists(libraryDirectory)) return null; string[] files = Directory.GetFiles(libraryDirectory, "*.acf"); foreach (string file in files) @@ -93,7 +92,7 @@ internal static class SteamLibrary string gameDirectory = libraryDirectory + @"\common\" + installdir; if (!int.TryParse(appId, out int appIdInt)) continue; if (!int.TryParse(buildId, out int buildIdInt)) continue; - games.Add(new(appId, name, branch, buildIdInt, gameDirectory)); + games.Add((appId, name, branch, buildIdInt, gameDirectory)); } } return !games.Any() ? null : games; diff --git a/CreamInstaller/Steam/SteamStore.cs b/CreamInstaller/Steam/SteamStore.cs index 9b06e4b..8976266 100644 --- a/CreamInstaller/Steam/SteamStore.cs +++ b/CreamInstaller/Steam/SteamStore.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.IO; +using System.Threading; using System.Threading.Tasks; using CreamInstaller.Utility; @@ -33,7 +34,7 @@ internal static class SteamStore string response = await HttpClientManager.EnsureGet($"https://store.steampowered.com/api/appdetails?appids={appId}"); if (response is not null) { - IDictionary apps = (dynamic)JsonConvert.DeserializeObject(response); + IDictionary apps = JsonConvert.DeserializeObject(response) as dynamic; foreach (KeyValuePair app in apps) { try @@ -72,6 +73,11 @@ internal static class SteamStore File.Delete(cacheFile); } } + if (!isDlc) + { + Thread.Sleep(1000); + return await QueryStoreAPI(appId); + } return null; } }