From 5fe910d2dbd31a64ab75e34089be942c024e21a0 Mon Sep 17 00:00:00 2001 From: Slxdy Date: Wed, 3 Apr 2024 11:52:22 +0200 Subject: [PATCH] Added support for steam shortcuts --- TweaksLauncher.API/Launcher.cs | 22 +++------- TweaksLauncher.API/LauncherContext.cs | 19 +++++--- TweaksLauncher.API/TweaksLauncher.API.csproj | 1 + TweaksLauncher.API/Utility/SteamTools.cs | 46 ++++++++++++++++++++ TweaksLauncher.API/nuget.config | 1 - 5 files changed, 66 insertions(+), 23 deletions(-) create mode 100644 TweaksLauncher.API/Utility/SteamTools.cs diff --git a/TweaksLauncher.API/Launcher.cs b/TweaksLauncher.API/Launcher.cs index 8813246..df9603a 100644 --- a/TweaksLauncher.API/Launcher.cs +++ b/TweaksLauncher.API/Launcher.cs @@ -32,28 +32,16 @@ public static int Main(string[] args) if (gamePath.Equals("createmod", StringComparison.OrdinalIgnoreCase)) return DevTools.CreateMod() ? 0 : -1; - if (File.Exists(gamePath)) + if (InitContext(gamePath)) { - gamePath = Path.GetDirectoryName(gamePath); - } + var gameArgs = new string[args.Length - 1]; + Array.Copy(args, 1, gameArgs, 0, gameArgs.Length); - if (Directory.Exists(gamePath)) - { - if (InitContext(gamePath)) - { - var gameArgs = new string[args.Length - 1]; - Array.Copy(args, 1, gameArgs, 0, gameArgs.Length); - - return StartGame(gameArgs); - } - else - { - logger.Log($"No valid Unity game found at: '{gamePath}'", Color.Red); - } + return StartGame(gameArgs); } else { - logger.Log($"Could not find the game directory at: '{gamePath}'", Color.Red); + logger.Log($"No valid Unity game found at: '{gamePath}'", Color.Red); } } diff --git a/TweaksLauncher.API/LauncherContext.cs b/TweaksLauncher.API/LauncherContext.cs index f0ef385..52707a1 100644 --- a/TweaksLauncher.API/LauncherContext.cs +++ b/TweaksLauncher.API/LauncherContext.cs @@ -1,4 +1,5 @@ using System.Diagnostics; +using TweaksLauncher.Utility; namespace TweaksLauncher; @@ -19,11 +20,19 @@ internal class LauncherContext { if (File.Exists(gameDirectory)) { - var dir = Path.GetDirectoryName(gameDirectory); - if (dir == null) - return null; - - gameDirectory = dir; + var steamPath = SteamTools.GetPathFromShortcut(gameDirectory); + if (steamPath != null) + { + gameDirectory = steamPath; + } + else + { + var dir = Path.GetDirectoryName(gameDirectory); + if (dir == null) + return null; + + gameDirectory = dir; + } } else if (!Directory.Exists(gameDirectory)) return null; diff --git a/TweaksLauncher.API/TweaksLauncher.API.csproj b/TweaksLauncher.API/TweaksLauncher.API.csproj index 5d5b351..07bf122 100644 --- a/TweaksLauncher.API/TweaksLauncher.API.csproj +++ b/TweaksLauncher.API/TweaksLauncher.API.csproj @@ -20,6 +20,7 @@ + diff --git a/TweaksLauncher.API/Utility/SteamTools.cs b/TweaksLauncher.API/Utility/SteamTools.cs new file mode 100644 index 0000000..2fe5816 --- /dev/null +++ b/TweaksLauncher.API/Utility/SteamTools.cs @@ -0,0 +1,46 @@ +using GameFinder.RegistryUtils; +using GameFinder.StoreHandlers.Steam; +using GameFinder.StoreHandlers.Steam.Models.ValueTypes; +using NexusMods.Paths; + +namespace TweaksLauncher.Utility; + +internal static class SteamTools +{ + private static readonly SteamHandler handler = new(FileSystem.Shared, WindowsRegistry.Shared); + + public static string? GetPathFromShortcut(string shortcutPath) + { + if (!shortcutPath.EndsWith(".url", StringComparison.OrdinalIgnoreCase)) + return null; + + string contents; + try + { + contents = File.ReadAllText(shortcutPath); + } + catch + { + return null; + } + + var pattern = "URL=steam://rungameid/"; + var startIdx = contents.IndexOf(pattern); + if (startIdx == -1) + return null; + + startIdx += pattern.Length; + + var endIdx = contents.IndexOf('\r', startIdx); + if (endIdx == -1) + return null; + + var length = endIdx - startIdx; + + if (!uint.TryParse(contents.AsSpan(startIdx, length), out var appId)) + return null; + + var game = handler.FindOneGameById(AppId.From(appId), out _); + return game?.Path.GetFullPath(); + } +} diff --git a/TweaksLauncher.API/nuget.config b/TweaksLauncher.API/nuget.config index 28851e1..f322c73 100644 --- a/TweaksLauncher.API/nuget.config +++ b/TweaksLauncher.API/nuget.config @@ -2,6 +2,5 @@ - \ No newline at end of file