using SimpleJSON; using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; namespace IllusionInjector.Updating { /** // JSON format * { * "_updateScript": "0.1", // version * "": { // an entry for your plugin, using its annotated name * "version": "", // required, should be in .NET Version class format * // note: only required if neither newName nor newScript is specified * "newName": "", // optional, defines a new name for the plugin (gets saved under this name) * // (updater will also check this file for this name to get latest) * "newScript": "", // optional, defines a new location for the update script * // updater will look here for latest version too * // note: if both newName and newScript are defined, the updater will only look in newScript * // for newName, and not any other combination * "download": "", // required, defines URL to use for downloading new version * // note: only required if neither newName nor newScript is specified * }, * ... * } */ class UpdateScript { static readonly Version ScriptVersion = new Version(0, 1); public Version Version { get; private set; } private Dictionary info = new Dictionary(); public IReadOnlyDictionary Info { get => info; } public class PluginVersionInfo { public Version Version { get; protected internal set; } public string NewName { get; protected internal set; } public Uri NewScript { get; protected internal set; } public Uri Download { get; protected internal set; } } public static UpdateScript Parse(JSONObject jscript) { var script = new UpdateScript { Version = Version.Parse(jscript["_updateScript"].Value) }; if (script.Version != ScriptVersion) throw new UpdateScriptParseException("Script version mismatch"); jscript.Remove("_updateScript"); foreach (var kvp in jscript) { var obj = kvp.Value.AsObject; var pvi = new PluginVersionInfo { Version = obj.Linq.Any(p => p.Key == "version") ? Version.Parse(obj["version"].Value) : null, Download = obj.Linq.Any(p => p.Key == "download") ? new Uri(obj["download"].Value) : null, NewName = obj.Linq.Any(p => p.Key == "newName") ? obj["newName"] : null, NewScript = obj.Linq.Any(p => p.Key == "newScript") ? new Uri(obj["newScript"]) : null }; if (pvi.NewName == null && pvi.NewScript == null && (pvi.Version == null || pvi.Download == null)) throw new UpdateScriptParseException($"Required fields missing from object {kvp.Key}"); script.info.Add(kvp.Key, pvi); } return script; } [Serializable] private class UpdateScriptParseException : Exception { public UpdateScriptParseException() { } public UpdateScriptParseException(string message) : base(message) { } public UpdateScriptParseException(string message, Exception innerException) : base(message, innerException) { } protected UpdateScriptParseException(SerializationInfo info, StreamingContext context) : base(info, context) { } } } }