summaryrefslogtreecommitdiff
path: root/StardewModdingAPI/Config.cs
diff options
context:
space:
mode:
Diffstat (limited to 'StardewModdingAPI/Config.cs')
-rw-r--r--StardewModdingAPI/Config.cs124
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