diff options
author | Zoryn Aaron <zoryn4163@gmail.com> | 2016-03-21 21:07:37 -0400 |
---|---|---|
committer | Zoryn Aaron <zoryn4163@gmail.com> | 2016-03-21 21:07:37 -0400 |
commit | c73c1a0ec779228015a2f70f8a14a353f32664e2 (patch) | |
tree | 198e2e864a2371530735c2c4506d077a709422c4 /StardewModdingAPI/Config.cs | |
parent | 78609647e9e5ed6310942eaf104f495353e328e3 (diff) | |
parent | 46d21e384e3075b5352e20733f31e61d929d561a (diff) | |
download | SMAPI-c73c1a0ec779228015a2f70f8a14a353f32664e2.tar.gz SMAPI-c73c1a0ec779228015a2f70f8a14a353f32664e2.tar.bz2 SMAPI-c73c1a0ec779228015a2f70f8a14a353f32664e2.zip |
Merge branch 'master'
Diffstat (limited to 'StardewModdingAPI/Config.cs')
-rw-r--r-- | StardewModdingAPI/Config.cs | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/StardewModdingAPI/Config.cs b/StardewModdingAPI/Config.cs new file mode 100644 index 00000000..67c13a14 --- /dev/null +++ b/StardewModdingAPI/Config.cs @@ -0,0 +1,124 @@ +/* + Copyright 2016 Zoey (Zoryn) +*/ + +using System; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; + +namespace StardewModdingAPI +{ + public class Config + { + [JsonIgnore] + public virtual JObject JObject { get; protected set; } + + [JsonIgnore] + public virtual string ConfigLocation { get; protected set; } + + public static Config Instance + { + get { return new Config(); } + } + + public static Config InitializeConfig(string configLocation, Config baseConfig) + { + if (baseConfig == null) + { + Console.WriteLine("A config must be instantiated before being passed to Initialize.\n\t" + configLocation); + return null; + } + + baseConfig.ConfigLocation = configLocation; + return baseConfig.LoadConfig(baseConfig); + } + + public virtual Config GenerateBaseConfig(Config baseConfig) + { + //Must be implemented in sub-class + return null; + } + + public virtual Config LoadConfig(Config baseConfig) + { + if (!File.Exists(baseConfig.ConfigLocation)) + { + var v = (Config)baseConfig.GetType().GetMethod("GenerateBaseConfig", BindingFlags.Public | BindingFlags.Instance).Invoke(baseConfig, new object[] { baseConfig }); + v.WriteConfig(); + } + else + { + var p = baseConfig.ConfigLocation; + + try + { + var j = JObject.Parse(Encoding.UTF8.GetString(File.ReadAllBytes(baseConfig.ConfigLocation))); + baseConfig = (Config)j.ToObject(baseConfig.GetType()); + baseConfig.ConfigLocation = p; + baseConfig.JObject = j; + + baseConfig = UpdateConfig(baseConfig); + baseConfig.ConfigLocation = p; + baseConfig.JObject = j; + + baseConfig.WriteConfig(); + } + catch + { + Console.WriteLine("Invalid JSON Renamed: " + p); + if (File.Exists(p)) + File.Move(p, Path.Combine(Path.GetDirectoryName(p), Path.GetFileNameWithoutExtension(p) + "." + Guid.NewGuid() + ".json")); //Get it out of the way for a new one + var v = (Config)baseConfig.GetType().GetMethod("GenerateBaseConfig", BindingFlags.Public | BindingFlags.Instance).Invoke(baseConfig, new object[] { baseConfig }); + v.WriteConfig(); + } + } + + return baseConfig; + } + + public virtual Config UpdateConfig(Config baseConfig) + { + try + { + //default config with all standard values + var b = JObject.FromObject(baseConfig.GetType().GetMethod("GenerateBaseConfig", BindingFlags.Public | BindingFlags.Instance).Invoke(baseConfig, new object[] { baseConfig })); + //user config with their values + var u = baseConfig.JObject; + + b.Merge(u); + + return (Config)b.ToObject(baseConfig.GetType()); + } + catch (Exception ex) + { + Console.WriteLine(ex.ToString()); + } + return baseConfig; + } + + public static string GetBasePath(Mod theMod) + { + return theMod.PathOnDisk + "\\config.json"; + } + } + + public static class ConfigExtensions + { + public static void WriteConfig(this Config baseConfig) + { + var toWrite = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(baseConfig, baseConfig.GetType(), Formatting.Indented, new JsonSerializerSettings())); + if (!File.Exists(baseConfig.ConfigLocation) || !File.ReadAllBytes(baseConfig.ConfigLocation).SequenceEqual(toWrite)) + File.WriteAllBytes(baseConfig.ConfigLocation, toWrite); + toWrite = null; + } + + public static Config ReloadConfig(this Config baseConfig) + { + return baseConfig.UpdateConfig(baseConfig); + } + } +}
\ No newline at end of file |