From 1ed06fb79dd0a27ac52076f478383a70c90fa2db Mon Sep 17 00:00:00 2001
From: Timothy Baldridge <tbaldridge@gmail.com>
Date: Fri, 8 Jan 2021 06:42:58 -0700
Subject: [PATCH] DA2/DAI support

---
 CHANGELOG.md                                  |  2 +-
 Wabbajack.Common/GameMetaData.cs              | 36 ++++++++++++-
 .../StoreHandlers/OriginHandler.cs            | 53 +++++++++++++++----
 3 files changed, 78 insertions(+), 13 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index e525548e..986b7509 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,7 +3,7 @@
 #### Version - 2.4.0.0 - ???
 * Wabbajack is now based on .NET 5.0 (does not require a runtime download by users)
 * Origin is now supported as a game source
-* Basic (mostly untested) support for Dragon Age : Origins
+* Basic (mostly untested) support for Dragon Age : Origins, Dragon Age 2, and Dragon Age: Inquisition 
 * Replace RocksDB with SQLite should result in less process contention when running the UI and the CLI at the same time
 * Fixed Regression with CloudFront IPS4 sites not requesting logins before installation
 * Fixed regression that caused us to spam the Nexus with verify calls
diff --git a/Wabbajack.Common/GameMetaData.cs b/Wabbajack.Common/GameMetaData.cs
index 5e81f98f..0b16bef7 100644
--- a/Wabbajack.Common/GameMetaData.cs
+++ b/Wabbajack.Common/GameMetaData.cs
@@ -42,7 +42,9 @@ namespace Wabbajack.Common
         KingdomComeDeliverance,
         MechWarrior5Mercenaries,
         NoMansSky,
-        DragonAgeOrigins
+        DragonAgeOrigins,
+        DragonAge2,
+        DragonAgeInquisition
     }
 
     public static class GameExtensions
@@ -579,6 +581,38 @@ namespace Wabbajack.Common
                     },
                     MainExecutable = @"bin_ship\daorigins.exe"	
                 }
+            },
+            {	
+                Game.DragonAge2, new GameMetaData	
+                {	
+                    Game = Game.DragonAge2,
+                    NexusName = "dragonage2",	
+                    NexusGameId = 141,
+                    MO2Name = "Dragon Age 2", // Probably wrong
+                    SteamIDs = new List<int>{1238040},
+                    OriginIDs = new List<string>{"OFB-EAST:59474"},
+                    RequiredFiles = new List<string>	
+                    {	
+                        @"bin_ship\DragonAge2.exe"	
+                    },
+                    MainExecutable = @"bin_ship\DragonAge2.exe"	
+                }
+            },
+            {	
+                Game.DragonAgeInquisition, new GameMetaData	
+                {	
+                    Game = Game.DragonAgeInquisition,
+                    NexusName = "dragonageinquisition",	
+                    NexusGameId = 728,
+                    MO2Name = "Dragon Age: Inquisition", // Probably wrong
+                    SteamIDs = new List<int>{1222690},
+                    OriginIDs = new List<string>{"OFB-EAST:51937"},
+                    RequiredFiles = new List<string>	
+                    {	
+                        @"DragonAgeInquisition.exe"	
+                    },
+                    MainExecutable = @"DragonAgeInquisition.exe"	
+                }
             }
         };
 
diff --git a/Wabbajack.Common/StoreHandlers/OriginHandler.cs b/Wabbajack.Common/StoreHandlers/OriginHandler.cs
index e5ebc3f7..9620818c 100644
--- a/Wabbajack.Common/StoreHandlers/OriginHandler.cs
+++ b/Wabbajack.Common/StoreHandlers/OriginHandler.cs
@@ -14,6 +14,8 @@ namespace Wabbajack.Common.StoreHandlers
         private HashSet<string> KnownMFSTs = new();
 
         public override StoreType Type { get; internal set; } = StoreType.Origin;
+
+        private static Regex SplitRegex = new Regex("[0-9]+");
         public override bool Init()
         {
             try
@@ -24,8 +26,35 @@ namespace Wabbajack.Common.StoreHandlers
                 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 = f.Substring(0, result.Index);
+                        var b = f.Substring(result.Index);
+                        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<OriginGame.GameLocalDataResponse>();
+                        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;
@@ -41,6 +70,8 @@ namespace Wabbajack.Common.StoreHandlers
         {
             try
             {
+                
+                
                 foreach (var game in GameRegistry.Games)
                 {
                     var mfst = game.Value.OriginIDs.FirstOrDefault(g => KnownMFSTs.Contains(g.Replace(":", "")));
@@ -48,7 +79,6 @@ namespace Wabbajack.Common.StoreHandlers
                         continue;
 
                     var ogame = new OriginGame(mfst, game.Key, game.Value);
-                    ogame.GetAndCacheManifestResponse();
                     Games.Add(ogame);
                 }
 
@@ -91,7 +121,7 @@ namespace Wabbajack.Common.StoreHandlers
 
         private AbsolutePath GetGamePath()
         {
-            var manifestData = GetAndCacheManifestResponse().FromJsonString<GameLocalDataResponse>();
+            var manifestData = GetAndCacheManifestResponse(this._mfst).FromJsonString<GameLocalDataResponse>();
             var platform = manifestData!.publishing!.softwareList!.software!.FirstOrDefault(a => a.softwarePlatform == "PCWIN");
             
             var installPath = GetPathFromPlatformPath(platform!.fulfillmentAttributes!.installCheckOverride!);
@@ -151,21 +181,22 @@ namespace Wabbajack.Common.StoreHandlers
             return resultPath;
         }
 
-        private AbsolutePath ManifestCacheLocation =>
-            Consts.LocalAppDataPath.Combine("OriginManifestCache", _mfst.Replace(":", ""));
+        private static AbsolutePath ManifestCacheLocation(string mfst) =>
+            Consts.LocalAppDataPath.Combine("OriginManifestCache", mfst.Replace(":", ""));
 
-        internal string GetAndCacheManifestResponse()
+        internal static string GetAndCacheManifestResponse(string mfst)
         {
-            if (ManifestCacheLocation.Exists)
+            var location = ManifestCacheLocation(mfst);
+            if (location.Exists)
             {
-                return ManifestCacheLocation.ReadAllText();
+                return location.ReadAllText();
             }
 
-            Utils.Log($"Getting Origin Manifest info for {_mfst}");
+            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;
-            ManifestCacheLocation.Parent.CreateDirectory();
-            ManifestCacheLocation.WriteAllTextAsync(data).Wait();
+            var data = client.GetStringAsync($"https://api1.origin.com/ecommerce2/public/{mfst}/en_US").Result;
+            location.Parent.CreateDirectory();
+            location.WriteAllTextAsync(data).Wait();
             return data;
         }