-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathEpicGameFactory.cs
129 lines (111 loc) · 4.48 KB
/
EpicGameFactory.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
using Gamelib.Core.Util;
using GameLib.Core;
using GameLib.Plugin.Epic.Model;
using Microsoft.Win32;
using Newtonsoft.Json;
namespace GameLib.Plugin.Epic;
internal static class EpicGameFactory
{
public static IEnumerable<EpicGame> GetGames(ILauncher launcher, CancellationToken cancellationToken = default)
{
var metaDataDir = GetMetadataDir();
if (string.IsNullOrEmpty(metaDataDir))
{
return Enumerable.Empty<EpicGame>();
}
return Directory.GetFiles(metaDataDir, "*.item")
.AsParallel()
.WithCancellation(cancellationToken)
.Select(DeserializeManifest)
.Where(game => game is not null)
.Select(game => AddLauncherId(launcher, game!))
.Select(game => AddExecutables(launcher, game!))
.ToList()!;
}
/// <summary>
/// Add launcher ID to Game
/// </summary>
private static EpicGame AddLauncherId(ILauncher launcher, EpicGame game)
{
game.LauncherId = launcher.Id;
return game;
}
/// <summary>
/// Find executables within the install directory
/// </summary>
private static EpicGame AddExecutables(ILauncher launcher, EpicGame game)
{
if (launcher.LauncherOptions.SearchExecutables)
{
var executables = PathUtil.GetExecutables(game.InstallDir);
executables.AddRange(game.Executables);
game.Executables = executables.Distinct(StringComparer.OrdinalIgnoreCase).ToList();
}
return game;
}
/// <summary>
/// Get the meta data directory from registry; if not found try to locate in Common Application data
/// </summary>
private static string? GetMetadataDir()
{
string? metadataDir = null;
metadataDir ??= RegistryUtil.GetValue(RegistryHive.CurrentUser, @"Software\Epic Games\EOS", "ModSdkMetadataDir");
metadataDir ??= RegistryUtil.GetValue(RegistryHive.LocalMachine, @"Software\Epic Games\EpicGamesLauncher", "AppDataPath");
metadataDir ??= Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "Epic", "EpicGamesLauncher", "Data");
metadataDir = PathUtil.Sanitize(metadataDir);
if (string.IsNullOrEmpty(metadataDir))
{
return null;
}
if (!metadataDir.EndsWith("Manifests", StringComparison.OrdinalIgnoreCase))
{
metadataDir = Path.Combine(metadataDir, "Manifests");
}
if (!Directory.Exists(metadataDir))
{
return null;
}
return metadataDir;
}
/// <summary>
/// Deserialize the Epic game manifest file into a <see cref="EpicGame"/> object
/// </summary>
private static EpicGame? DeserializeManifest(string manifestFile)
{
DeserializedEpicGame? deserializedEpicGame;
try
{
var manifestJson = File.ReadAllText(manifestFile);
deserializedEpicGame = JsonConvert.DeserializeObject<DeserializedEpicGame>(manifestJson);
if (deserializedEpicGame is null)
{
throw new ApplicationException("Cannot deserialize JSON stream");
}
}
catch { return null; }
var game = new EpicGame()
{
Id = deserializedEpicGame.AppName,
Name = deserializedEpicGame.DisplayName,
InstallDir = PathUtil.Sanitize(deserializedEpicGame.InstallLocation) ?? string.Empty,
WorkingDir = deserializedEpicGame.InstallLocation,
InstallSize = deserializedEpicGame.InstallSize,
Version = deserializedEpicGame.AppVersionString,
};
if (PathUtil.IsExecutable(deserializedEpicGame.MainWindowProcessName))
{
game.Executable = Path.Combine(game.InstallDir, deserializedEpicGame.MainWindowProcessName);
if (PathUtil.IsExecutable(deserializedEpicGame.MainWindowProcessName))
{
game.Executables = new List<string>() { Path.Combine(game.InstallDir, deserializedEpicGame.LaunchExecutable) };
}
}
else if (PathUtil.IsExecutable(deserializedEpicGame.LaunchExecutable))
{
game.Executable = Path.Combine(game.InstallDir, deserializedEpicGame.LaunchExecutable);
}
game.LaunchString = $"com.epicgames.launcher://apps/{game.Id}?action=launch&silent=true";
game.InstallDate = PathUtil.GetCreationTime(game.InstallDir) ?? DateTime.MinValue;
return game;
}
}