From 20c256bc3bb596a7834b196293d66805e5fda1cb Mon Sep 17 00:00:00 2001 From: erri120 Date: Sun, 11 Jul 2021 12:05:16 +0200 Subject: [PATCH 1/2] Add fix for NETSDK1151 --- Wabbajack.App.Test/Wabbajack.App.Test.csproj | 3 +++ Wabbajack.Server.Test/Wabbajack.Server.Test.csproj | 3 +++ 2 files changed, 6 insertions(+) diff --git a/Wabbajack.App.Test/Wabbajack.App.Test.csproj b/Wabbajack.App.Test/Wabbajack.App.Test.csproj index d8b2af7e..233eae56 100644 --- a/Wabbajack.App.Test/Wabbajack.App.Test.csproj +++ b/Wabbajack.App.Test/Wabbajack.App.Test.csproj @@ -4,6 +4,9 @@ net5.0-windows x64 false + + + false diff --git a/Wabbajack.Server.Test/Wabbajack.Server.Test.csproj b/Wabbajack.Server.Test/Wabbajack.Server.Test.csproj index 322e853c..10770860 100644 --- a/Wabbajack.Server.Test/Wabbajack.Server.Test.csproj +++ b/Wabbajack.Server.Test/Wabbajack.Server.Test.csproj @@ -4,6 +4,9 @@ net5.0-windows win10-x64 false + + + false From 09b44ccac4d7306dd7b45c0c79547505c8d9d73e Mon Sep 17 00:00:00 2001 From: erri120 Date: Sun, 11 Jul 2021 12:13:33 +0200 Subject: [PATCH 2/2] Update GameFinder to 1.6.1 --- .../StoreHandlers/OriginHandler.cs | 238 ------------------ .../StoreHandlers/StoreHandler.cs | 71 +++--- Wabbajack.Common/Wabbajack.Common.csproj | 9 +- 3 files changed, 35 insertions(+), 283 deletions(-) delete mode 100644 Wabbajack.Common/StoreHandlers/OriginHandler.cs diff --git a/Wabbajack.Common/StoreHandlers/OriginHandler.cs b/Wabbajack.Common/StoreHandlers/OriginHandler.cs deleted file mode 100644 index 3945f487..00000000 --- a/Wabbajack.Common/StoreHandlers/OriginHandler.cs +++ /dev/null @@ -1,238 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net.Http; -using System.Text.RegularExpressions; -using Microsoft.Win32; - -namespace Wabbajack.Common.StoreHandlers -{ - public class OriginHandler - { - private AbsolutePath OriginDataPath = (AbsolutePath)@"C:\ProgramData\Origin\LocalContent"; - private Extension MFSTExtension = new Extension(".mfst"); - private HashSet KnownMFSTs = new(); - - public List Games = new(); - - private static Regex SplitRegex = new Regex("(.*)([0-9]+)(@subscription)?", RegexOptions.RightToLeft); - public bool Init() - { - try - { - if (!OriginDataPath.Exists) - return false; - - KnownMFSTs = OriginDataPath.EnumerateFiles() - .Where(f => f.Extension == MFSTExtension) - .Select(f => f.FileNameWithoutExtension.ToString()) - .Select(f => - { - var result = SplitRegex.Match(f); - if (result == null) return default; - var a = result.Groups[1]; - var b = result.Groups[2]; - return a + ":" + b; - }) - .Where(t => t != default) - .Select(t => t!) - .Where(t => !t.Contains(".")) - .ToHashSet(); - - foreach (var known in KnownMFSTs) - { - try - { - var resp = OriginGame.GetAndCacheManifestResponse(known) - .FromJsonString(); - Utils.Log($"Found Origin Content {resp.localizableAttributes!.displayName} ({known})"); - } - catch (Exception ex) - { - Utils.Log($"Origin got {ex.Message} when loading info for {known}"); - continue; - } - - } - - Utils.Log($"Found MFSTs from Origin: {string.Join(", ", KnownMFSTs)}"); - - return true; - - } - catch (Exception) - { - return false; - } - } - - public bool LoadAllGames() - { - try - { - foreach (var game in GameRegistry.Games) - { - var mfst = game.Value.OriginIDs.FirstOrDefault(g => KnownMFSTs.Contains(g)); - if (mfst == null) - continue; - - var ogame = new OriginGame(mfst, game.Key, game.Value); - Games.Add(ogame); - } - - return true; - } - catch (Exception ex) - { - Utils.Log(ex.ToString()); - return false; - } - } - } - - public sealed class OriginGame - { - private string _mfst; - private GameMetaData _metaData; - - public OriginGame(string mfst, Game game, GameMetaData metaData) - { - _mfst = mfst; - Game = game; - _metaData = metaData; - } - public Game Game { get; internal set; } - - public AbsolutePath Path - { - get - { - return GetGamePath(); - - } - internal set - { - throw new NotImplementedException(); - } - } - - private AbsolutePath GetGamePath() - { - var manifestData = GetAndCacheManifestResponse(this._mfst).FromJsonString(); - var platform = manifestData!.publishing!.softwareList!.software!.FirstOrDefault(a => a.softwarePlatform == "PCWIN"); - - var installPath = GetPathFromPlatformPath(platform!.fulfillmentAttributes!.installCheckOverride!); - return installPath; - - } - - internal AbsolutePath GetPathFromPlatformPath(string path, RegistryView platformView) - { - if (!path.StartsWith("[")) - { - return (AbsolutePath)path; - } - - var matchPath = Regex.Match(path, @"\[(.*?)\\(.*)\\(.*)\](.*)"); - if (!matchPath.Success) - { - Utils.Log("Unknown path format " + path); - return default; - } - - var root = matchPath.Groups[1].Value; - - RegistryKey rootKey = root switch - { - "HKEY_LOCAL_MACHINE" => RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, platformView), - "HKEY_CURRENT_USER" => RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, platformView), - _ => throw new Exception("Unknown registry root entry " + root) - }; - - var subPath = matchPath.Groups[2].Value.Trim('\\'); - var key = matchPath.Groups[3].Value; - var executable = matchPath.Groups[4].Value.Trim('\\'); - var subKey = rootKey.OpenSubKey(subPath); - if (subKey == null) - { - return default; - } - - var keyValue = rootKey!.OpenSubKey(subPath)!.GetValue(key); - if (keyValue == null) - { - return default; - } - - return (AbsolutePath)keyValue!.ToString()!; - } - - internal AbsolutePath GetPathFromPlatformPath(string path) - { - var resultPath = GetPathFromPlatformPath(path, RegistryView.Registry64); - if (resultPath == default) - { - resultPath = GetPathFromPlatformPath(path, RegistryView.Registry32); - } - - return resultPath; - } - - private static AbsolutePath ManifestCacheLocation(string mfst) => - Consts.LocalAppDataPath.Combine("OriginManifestCache", mfst.Replace(":", "")); - - internal static string GetAndCacheManifestResponse(string mfst) - { - var location = ManifestCacheLocation(mfst); - if (location.Exists) - { - return location.ReadAllText(); - } - - Utils.Log($"Getting Origin Manifest info for {mfst}"); - var client = new HttpClient(); - var data = client.GetStringAsync($"https://api1.origin.com/ecommerce2/public/{mfst}/en_US").Result; - location.Parent.CreateDirectory(); - location.WriteAllTextAsync(data).Wait(); - return data; - } - - public class GameLocalDataResponse - { - public class LocalizableAttributes - { - public string? longDescription; - public string? displayName; - } - - public class Publishing - { - public class Software - { - public class FulfillmentAttributes - { - public string? executePathOverride; - public string? installationDirectory; - public string? installCheckOverride; - } - - public string? softwareId; - public string? softwarePlatform; - public FulfillmentAttributes? fulfillmentAttributes; - } - - public class SoftwareList - { - public List? software; - } - - public SoftwareList? softwareList; - } - - public string? offerId; - public string? offerType; - public Publishing? publishing; - public LocalizableAttributes? localizableAttributes; - } - } -} diff --git a/Wabbajack.Common/StoreHandlers/StoreHandler.cs b/Wabbajack.Common/StoreHandlers/StoreHandler.cs index b2e2ccfd..ae4a26c4 100644 --- a/Wabbajack.Common/StoreHandlers/StoreHandler.cs +++ b/Wabbajack.Common/StoreHandlers/StoreHandler.cs @@ -6,32 +6,26 @@ using GameFinder; using GameFinder.StoreHandlers.BethNet; using GameFinder.StoreHandlers.EGS; using GameFinder.StoreHandlers.GOG; +using GameFinder.StoreHandlers.Origin; using GameFinder.StoreHandlers.Steam; +using Microsoft.Extensions.Logging; namespace Wabbajack.Common.StoreHandlers { public class StoreHandler { + private static readonly StoreHandlerLogger Logger = new(); + private static readonly Lazy _instance = new(() => new StoreHandler(), isThreadSafe: true); public static StoreHandler Instance => _instance.Value; - private static readonly Lazy _steamHandler = new(() => new SteamHandler()); - public SteamHandler SteamHandler = _steamHandler.Value; - - private static readonly Lazy _gogHandler = new(() => new GOGHandler()); - public GOGHandler GOGHandler = _gogHandler.Value; - - private static readonly Lazy _bethNetHandler = new(() => new BethNetHandler()); - public BethNetHandler BethNetHandler = _bethNetHandler.Value; - - private static readonly Lazy _epicGameStoreHandler = new(() => new EGSHandler()); - public EGSHandler EpicGameStoreHandler = _epicGameStoreHandler.Value; - - private static readonly Lazy _originHandler = new(() => new OriginHandler()); - public OriginHandler OriginHandler = _originHandler.Value; - - private List _storeGames; + private static readonly Lazy SteamHandler = new(() => new SteamHandler(Logger)); + private static readonly Lazy GogHandler = new(() => new GOGHandler(Logger)); + private static readonly Lazy BethNetHandler = new(() => new BethNetHandler(Logger)); + private static readonly Lazy EpicGameStoreHandler = new(() => new EGSHandler(Logger)); + private static readonly Lazy OriginHandler = new(() => new OriginHandler(true, true, Logger)); + private readonly List _storeGames; public Dictionary Games = new(); private void FindGames(Lazy lazyHandler, string name) @@ -42,11 +36,7 @@ namespace Wabbajack.Common.StoreHandlers { var handler = lazyHandler.Value; var res = handler.FindAllGames(); - - if (res.HasErrors) - { - Utils.Error($"Errors while finding Games from {name}\n{res.ErrorsToString()}"); - } + if (!res) return; foreach (var game in handler.Games) { @@ -64,20 +54,11 @@ namespace Wabbajack.Common.StoreHandlers { _storeGames = new List(); - FindGames(_steamHandler, "SteamHandler"); - FindGames(_gogHandler, "GOGHandler"); - FindGames(_bethNetHandler, "BethNetHandler"); - FindGames(_epicGameStoreHandler, "EGSHandler"); - - if (OriginHandler.Init()) - { - if (!OriginHandler.LoadAllGames()) - Utils.Error(new StoreException("Could not load all Games from the OriginHandler, check previous error messages!")); - } - else - { - Utils.Error(new StoreException("Could not Init the OriginHandler, check previous error messages!")); - } + FindGames(SteamHandler, "SteamHandler"); + FindGames(GogHandler, "GOGHandler"); + FindGames(BethNetHandler, "BethNetHandler"); + FindGames(EpicGameStoreHandler, "EGSHandler"); + FindGames(OriginHandler, "OriginHandler"); foreach (var storeGame in _storeGames) { @@ -87,6 +68,7 @@ namespace Wabbajack.Common.StoreHandlers GOGGame gogGame => GameRegistry.Games.Where(y => y.Value.GOGIDs?.Contains(gogGame.GameID) ?? false), BethNetGame bethNetGame => GameRegistry.Games.Where(y => y.Value.BethNetID.Equals((int)bethNetGame.ID)), EGSGame egsGame => GameRegistry.Games.Where(y => y.Value.EpicGameStoreIDs.Contains(egsGame.CatalogItemId ?? string.Empty)), + OriginGame originGame => GameRegistry.Games.Where(y => y.Value.OriginIDs.Contains(originGame.Id ?? string.Empty)), _ => null }; @@ -106,7 +88,7 @@ namespace Wabbajack.Common.StoreHandlers { if (Games.TryGetValue(game, out var storeGame)) return (AbsolutePath) storeGame.Path; - return OriginHandler.Games.FirstOrDefault(x => x.Game == game)?.Path; + return null; } public static void Warmup() @@ -114,12 +96,19 @@ namespace Wabbajack.Common.StoreHandlers Task.Run(() => _instance.Value).FireAndForget(); } } - - public class StoreException : Exception - { - public StoreException(string msg) : base(msg) - { + internal class StoreHandlerLogger : ILogger + { + public void Log(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func formatter) + { + Utils.Log(formatter(state, exception)); + } + + public bool IsEnabled(LogLevel logLevel) => true; + + public IDisposable BeginScope(TState state) + { + throw new NotImplementedException(); } } } diff --git a/Wabbajack.Common/Wabbajack.Common.csproj b/Wabbajack.Common/Wabbajack.Common.csproj index b583dcbe..d21cb503 100644 --- a/Wabbajack.Common/Wabbajack.Common.csproj +++ b/Wabbajack.Common/Wabbajack.Common.csproj @@ -48,10 +48,11 @@ - - - - + + + + +