summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJesse Plamondon-Willard <Pathoschild@users.noreply.github.com>2022-10-08 21:32:10 -0400
committerJesse Plamondon-Willard <Pathoschild@users.noreply.github.com>2022-10-08 21:32:10 -0400
commitab66266b4bc4d7b1a7ae76d05693e9dd30c03989 (patch)
tree6e2aeb6d019508a4766bd69defae2e1247aa6da4
parentc6b3446e9cb1d1e02db9db86f143ecfe75e9908c (diff)
downloadSMAPI-ab66266b4bc4d7b1a7ae76d05693e9dd30c03989.tar.gz
SMAPI-ab66266b4bc4d7b1a7ae76d05693e9dd30c03989.tar.bz2
SMAPI-ab66266b4bc4d7b1a7ae76d05693e9dd30c03989.zip
update installer for VdfConverter & rework avoid custom models
-rw-r--r--build/windows/prepare-install-package.ps12
-rw-r--r--src/SMAPI.Toolkit/Framework/GameScanning/GameScanner.cs44
-rw-r--r--src/SMAPI.Toolkit/Framework/GameScanning/SteamLibraryCollection.cs47
-rw-r--r--src/SMAPI.Toolkit/SMAPI.Toolkit.csproj2
4 files changed, 30 insertions, 65 deletions
diff --git a/build/windows/prepare-install-package.ps1 b/build/windows/prepare-install-package.ps1
index 87a4fe01..002bcbca 100644
--- a/build/windows/prepare-install-package.ps1
+++ b/build/windows/prepare-install-package.ps1
@@ -154,7 +154,7 @@ foreach ($folder in $folders) {
cp -Recurse "$smapiBin/i18n" "$bundlePath/smapi-internal"
# bundle smapi-internal
- foreach ($name in @("0Harmony.dll", "0Harmony.xml", "Mono.Cecil.dll", "Mono.Cecil.Mdb.dll", "Mono.Cecil.Pdb.dll", "MonoMod.Common.dll", "Newtonsoft.Json.dll", "Pathoschild.Http.Client.dll", "Pintail.dll", "TMXTile.dll", "SMAPI.Toolkit.dll", "SMAPI.Toolkit.pdb", "SMAPI.Toolkit.xml", "SMAPI.Toolkit.CoreInterfaces.dll", "SMAPI.Toolkit.CoreInterfaces.pdb", "SMAPI.Toolkit.CoreInterfaces.xml", "System.Net.Http.Formatting.dll")) {
+ foreach ($name in @("0Harmony.dll", "0Harmony.xml", "Mono.Cecil.dll", "Mono.Cecil.Mdb.dll", "Mono.Cecil.Pdb.dll", "MonoMod.Common.dll", "Newtonsoft.Json.dll", "Pathoschild.Http.Client.dll", "Pintail.dll", "TMXTile.dll", "SMAPI.Toolkit.dll", "SMAPI.Toolkit.pdb", "SMAPI.Toolkit.xml", "SMAPI.Toolkit.CoreInterfaces.dll", "SMAPI.Toolkit.CoreInterfaces.pdb", "SMAPI.Toolkit.CoreInterfaces.xml", "System.Net.Http.Formatting.dll", "VdfConverter.dll")) {
cp "$smapiBin/$name" "$bundlePath/smapi-internal"
}
diff --git a/src/SMAPI.Toolkit/Framework/GameScanning/GameScanner.cs b/src/SMAPI.Toolkit/Framework/GameScanning/GameScanner.cs
index 8e24dcdf..66465ffe 100644
--- a/src/SMAPI.Toolkit/Framework/GameScanning/GameScanner.cs
+++ b/src/SMAPI.Toolkit/Framework/GameScanning/GameScanner.cs
@@ -24,6 +24,9 @@ namespace StardewModdingAPI.Toolkit.Framework.GameScanning
/// <summary>The current OS.</summary>
private readonly Platform Platform;
+ /// <summary>The Steam app ID for Stardew Valley.</summary>
+ private const string SteamAppId = "413150";
+
/*********
** Public methods
@@ -146,7 +149,7 @@ namespace StardewModdingAPI.Toolkit.Framework.GameScanning
#if SMAPI_FOR_WINDOWS
IDictionary<string, string> registryKeys = new Dictionary<string, string>
{
- [@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Steam App 413150"] = "InstallLocation", // Steam
+ [@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Steam App " + GameScanner.SteamAppId] = "InstallLocation", // Steam
[@"SOFTWARE\WOW6432Node\GOG.com\Games\1453375253"] = "PATH", // GOG on 64-bit Windows
};
foreach (var pair in registryKeys)
@@ -160,9 +163,10 @@ namespace StardewModdingAPI.Toolkit.Framework.GameScanning
string? steamPath = this.GetCurrentUserRegistryValue(@"Software\Valve\Steam", "SteamPath");
if (steamPath != null)
{
+ // conventional path
yield return Path.Combine(steamPath.Replace('/', '\\'), @"steamapps\common\Stardew Valley");
- // Check for Steam libraries in other locations
+ // from Steam's .vdf file
string? path = this.GetPathFromSteamLibrary(steamPath);
if (!string.IsNullOrWhiteSpace(path))
yield return path;
@@ -257,26 +261,34 @@ namespace StardewModdingAPI.Toolkit.Framework.GameScanning
/// <returns>The game directory, if found.</returns>
private string? GetPathFromSteamLibrary(string? steamPath)
{
- string stardewAppId = "413150";
- if (steamPath != null)
+ if (steamPath == null)
+ return null;
+
+ // get raw .vdf data
+ string libraryFoldersPath = Path.Combine(steamPath.Replace('/', '\\'), "steamapps\\libraryfolders.vdf");
+ using FileStream fileStream = File.OpenRead(libraryFoldersPath);
+ VdfDeserializer deserializer = new();
+ dynamic libraries = deserializer.Deserialize(fileStream);
+ if (libraries?.libraryfolders is null)
+ return null;
+
+ // get path from Stardew Valley app (if any)
+ foreach (dynamic pair in libraries.libraryfolders)
{
- string? libraryFoldersPath = Path.Combine(steamPath.Replace('/', '\\'), "steamapps\\libraryfolders.vdf");
- using FileStream fs = File.OpenRead(libraryFoldersPath);
- VdfDeserializer deserializer = new VdfDeserializer();
- SteamLibraryCollection libraries = deserializer.Deserialize<SteamLibraryCollection>(fs);
- if (libraries.libraryfolders != null)
+ dynamic library = pair.Value;
+
+ foreach (dynamic app in library.apps)
{
- var stardewLibrary = libraries.libraryfolders.FirstOrDefault(f =>
- {
- var apps = f.Value?.apps;
- return apps != null && apps.Any(a => a.Key.Equals(stardewAppId));
- });
- if (stardewLibrary.Value?.path != null)
+ string key = app.Key;
+ if (key == GameScanner.SteamAppId)
{
- return Path.Combine(stardewLibrary.Value.path.Replace("\\\\", "\\"), @"steamapps\common\Stardew Valley");
+ string path = library.path;
+
+ return Path.Combine(path.Replace("\\\\", "\\"), "steamapps", "common", "Stardew Valley");
}
}
}
+
return null;
}
#endif
diff --git a/src/SMAPI.Toolkit/Framework/GameScanning/SteamLibraryCollection.cs b/src/SMAPI.Toolkit/Framework/GameScanning/SteamLibraryCollection.cs
deleted file mode 100644
index 7a186f69..00000000
--- a/src/SMAPI.Toolkit/Framework/GameScanning/SteamLibraryCollection.cs
+++ /dev/null
@@ -1,47 +0,0 @@
-#if SMAPI_FOR_WINDOWS
-using System.Collections.Generic;
-
-namespace StardewModdingAPI.Toolkit.Framework.GameScanning
-{
-#pragma warning disable IDE1006 // Model requires lowercase naming.
-#pragma warning disable CS8618 // Required for model.
- /// <summary>Model for Steam's libraryfolders.vdf.</summary>
- public class SteamLibraryCollection
- {
- /// <summary>Each entry identifies a different location that part of the Steam games library is installed to.</summary>
- public LibraryFolders<int, LibraryFolder> libraryfolders { get; set; }
- }
-
- /// <summary>A collection of LibraryFolders. Like a dictionary, but has contentstatsid used as an index also.</summary>
- /// <typeparam name="TKey"></typeparam>
- /// <typeparam name="TValue"></typeparam>
-#pragma warning disable CS8714 // Required for model.
- public class LibraryFolders<TKey, TValue> : Dictionary<TKey, TValue>
-#pragma warning restore CS8714
- {
- /// <summary>Index of the library, starting from "0".</summary>
- public string contentstatsid { get; set; }
- }
-
- /// <summary>A Steam library folder, containing information on the location and size of games installed there.</summary>
- public class LibraryFolder
- {
- /// <summary>The escaped path to this Steam library folder. There will be a steam.exe here, but this may not be the one the player generally launches.</summary>
- public string path { get; set; }
- /// <summary>Label for the library, or ""</summary>
- public string label { get; set; }
- /// <summary>~19-digit identifier.</summary>
- public string contentid { get; set; }
- /// <summary>Size of the library in bytes. May show 0 when size is non-zero.</summary>
- public string totalsize { get; set; }
- /// <summary>Used for downloads.</summary>
- public string update_clean_bytes_tally { get; set; }
- /// <summary>Normally "0".</summary>
- public string time_last_update_corruption { get; set; }
- /// <summary>List of Steam app IDs, and their current size in bytes.</summary>
- public Dictionary<string, string> apps { get; set; }
- }
-#pragma warning restore IDE1006
-#pragma warning restore CS8618
-}
-#endif
diff --git a/src/SMAPI.Toolkit/SMAPI.Toolkit.csproj b/src/SMAPI.Toolkit/SMAPI.Toolkit.csproj
index 411fd469..6080a85e 100644
--- a/src/SMAPI.Toolkit/SMAPI.Toolkit.csproj
+++ b/src/SMAPI.Toolkit/SMAPI.Toolkit.csproj
@@ -14,7 +14,7 @@
<PackageReference Include="Pathoschild.Http.FluentClient" Version="4.1.1" />
<PackageReference Include="System.Management" Version="5.0.0" Condition="'$(OS)' == 'Windows_NT'" />
<PackageReference Include="Microsoft.Win32.Registry" Version="5.0.0" Condition="'$(OS)' == 'Windows_NT'" />
- <PackageReference Include="VdfConverter" Version="1.0.3" />
+ <PackageReference Include="VdfConverter" Version="1.0.3" Condition="'$(OS)' == 'Windows_NT'" />
</ItemGroup>
<ItemGroup>