GameLocatorService.cs 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. using System;
  2. using System.Diagnostics;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Runtime.InteropServices;
  6. namespace SlamCross.Services;
  7. public static class GameLocatorService
  8. {
  9. public static string? FindSteamAppsPath(string exeName)
  10. {
  11. if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
  12. return FindSteamAppsLinux(exeName);
  13. if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
  14. return FindSteamAppsWindows(exeName);
  15. return null;
  16. }
  17. private static string? FindSteamAppsLinux(string exeName)
  18. {
  19. try
  20. {
  21. var proc = Process.GetProcessesByName(exeName).FirstOrDefault();
  22. if (proc?.MainModule?.FileName is string exe)
  23. {
  24. var dir = Path.GetDirectoryName(exe);
  25. while (dir != null)
  26. {
  27. if (Path.GetFileName(dir) == "steamapps")
  28. return dir;
  29. dir = Path.GetDirectoryName(dir);
  30. }
  31. }
  32. }
  33. catch { }
  34. var home = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
  35. string[] candidates =
  36. [
  37. Path.Combine(home, ".local/share/Steam/steamapps"),
  38. Path.Combine(home, ".steam/steam/steamapps"),
  39. "/usr/local/games/steamapps",
  40. ];
  41. return candidates.FirstOrDefault(Directory.Exists);
  42. }
  43. private static string? FindSteamAppsWindows(string exeName)
  44. {
  45. try
  46. {
  47. var proc = Process.GetProcessesByName(exeName).FirstOrDefault();
  48. if (proc?.MainModule?.FileName is string exe)
  49. {
  50. var gameDir = "common\\" + GetGameFolderName(exeName) + "\\";
  51. var idx = exe.IndexOf(gameDir, StringComparison.OrdinalIgnoreCase);
  52. if (idx >= 0) return exe[..idx];
  53. }
  54. }
  55. catch { }
  56. return null;
  57. }
  58. private static string GetGameFolderName(string exeName) => exeName switch
  59. {
  60. "cs2" => "Counter-Strike Global Offensive",
  61. _ => exeName
  62. };
  63. }