From 0749fdcbe5d991df9e7c1ad91fd48c198fcc1dbb Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Sat, 5 Nov 2016 16:14:38 -0400 Subject: [PATCH] use new helper to read manifest (#159) --- src/StardewModdingAPI/Manifest.cs | 67 ++++--------------------------- src/StardewModdingAPI/Program.cs | 36 +++++++++-------- 2 files changed, 27 insertions(+), 76 deletions(-) diff --git a/src/StardewModdingAPI/Manifest.cs b/src/StardewModdingAPI/Manifest.cs index dc8a2f7b..89ce7904 100644 --- a/src/StardewModdingAPI/Manifest.cs +++ b/src/StardewModdingAPI/Manifest.cs @@ -1,22 +1,19 @@ using System; -using System.IO; -using System.Linq; using Newtonsoft.Json; -using Newtonsoft.Json.Linq; namespace StardewModdingAPI { /// A manifest which describes a mod for SMAPI. - public class Manifest : Config + public class Manifest { /********* ** Accessors *********/ /// The mod name. - public virtual string Name { get; set; } + public virtual string Name { get; set; } = ""; /// The mod author's name. - public virtual string Author { get; set; } + public virtual string Author { get; set; } = ""; /// Obsolete. [Obsolete("Use 'Author'.")] @@ -27,68 +24,18 @@ namespace StardewModdingAPI } /// The mod version. - public virtual Version Version { get; set; } + public virtual Version Version { get; set; } = new Version(0, 0, 0, ""); /// A brief description of the mod. - public virtual string Description { get; set; } + public virtual string Description { get; set; } = ""; /// The unique mod ID. - public virtual string UniqueID { get; set; } + public virtual string UniqueID { get; set; } = Guid.NewGuid().ToString(); /// Whether the mod uses per-save config files. public virtual bool PerSaveConfigs { get; set; } /// The name of the DLL in the directory that has the method. - public virtual string EntryDll { get; set; } - - - /********* - ** Public methods - *********/ - /// Get the default config values. - public override T GenerateDefaultConfig() - { - this.Name = ""; - this.Author = ""; - this.Version = new Version(0, 0, 0, ""); - this.Description = ""; - this.UniqueID = Guid.NewGuid().ToString(); - this.PerSaveConfigs = false; - this.EntryDll = ""; - return this as T; - } - - /// Load the config from the JSON file, saving it to disk if needed. - /// The config class type. - public override T LoadConfig() - { - if (File.Exists(this.ConfigLocation)) - { - try - { - JsonConvert.DeserializeObject(File.ReadAllText(this.ConfigLocation)); - } - catch - { - //Invalid json blob. Try to remove version? - try - { - JObject j = JObject.Parse(File.ReadAllText(this.ConfigLocation)); - if (!j.GetValue("Version").Contains("{")) - { - Log.AsyncC("INVALID JSON VERSION. TRYING TO REMOVE SO A NEW CAN BE AUTO-GENERATED"); - j.Remove("Version"); - File.WriteAllText(this.ConfigLocation, j.ToString()); - } - } - catch (Exception) - { - // ignored - } - } - } - - return base.LoadConfig(); - } + public virtual string EntryDll { get; set; } = ""; } } diff --git a/src/StardewModdingAPI/Program.cs b/src/StardewModdingAPI/Program.cs index dfd8f703..c0129036 100644 --- a/src/StardewModdingAPI/Program.cs +++ b/src/StardewModdingAPI/Program.cs @@ -240,7 +240,7 @@ namespace StardewModdingAPI { foreach (string manifestPath in Directory.GetFiles(directory, "manifest.json")) { - // error format + ModHelper helper = new ModHelper(directory); string errorPrefix = $"Couldn't load mod for manifest '{manifestPath}'"; // read manifest @@ -256,7 +256,12 @@ namespace StardewModdingAPI } // deserialise manifest - manifest = manifest.InitializeConfig(manifestPath); + manifest = helper.ReadJsonFile("manifest.json"); + if (manifest == null) + { + Log.Error($"{errorPrefix}: the manifest file does not exist."); + continue; + } if (string.IsNullOrEmpty(manifest.EntryDll)) { Log.Error($"{errorPrefix}: manifest doesn't specify an entry DLL."); @@ -270,12 +275,11 @@ namespace StardewModdingAPI } // create per-save directory - string targDir = Path.GetDirectoryName(manifestPath); - string psDir = Path.Combine(targDir, "psconfigs"); - try + if (manifest.PerSaveConfigs) { - if (manifest.PerSaveConfigs) + try { + string psDir = Path.Combine(directory, "psconfigs"); Directory.CreateDirectory(psDir); if (!Directory.Exists(psDir)) { @@ -283,18 +287,18 @@ namespace StardewModdingAPI continue; } } - } - catch (Exception ex) - { - Log.Error($"{errorPrefix}: couldm't create the per-save configuration directory ('psconfigs') requested by this mod.\n{ex}"); - continue; + catch (Exception ex) + { + Log.Error($"{errorPrefix}: couldm't create the per-save configuration directory ('psconfigs') requested by this mod.\n{ex}"); + continue; + } } // load DLL & hook up mod string targDll = string.Empty; try { - targDll = Path.Combine(targDir, manifest.EntryDll); + targDll = Path.Combine(directory, manifest.EntryDll); if (!File.Exists(targDll)) { Log.Error($"{errorPrefix}: target DLL '{targDll}' does not exist."); @@ -304,12 +308,12 @@ namespace StardewModdingAPI Assembly modAssembly = Assembly.UnsafeLoadFrom(targDll); if (modAssembly.DefinedTypes.Count(x => x.BaseType == typeof(Mod)) > 0) { - TypeInfo tar = modAssembly.DefinedTypes.First(x => x.BaseType == typeof(Mod)); - Mod modEntry = (Mod)modAssembly.CreateInstance(tar.ToString()); + TypeInfo modEntryType = modAssembly.DefinedTypes.First(x => x.BaseType == typeof(Mod)); + Mod modEntry = (Mod)modAssembly.CreateInstance(modEntryType.ToString()); if (modEntry != null) { - modEntry.Helper = new ModHelper(targDir); - modEntry.PathOnDisk = targDir; + modEntry.Helper = helper; + modEntry.PathOnDisk = directory; modEntry.Manifest = manifest; Log.Info($"Loaded mod: {modEntry.Manifest.Name} by {modEntry.Manifest.Author}, v{modEntry.Manifest.Version} | {modEntry.Manifest.Description}\n@ {targDll}"); Program.ModsLoaded += 1;