You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

98 lines
4.0 KiB

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
* "<pluginName>": { // an entry for your plugin, using its annotated name
* "version": "<version>", // required, should be in .NET Version class format
* // note: only required if neither newName nor newScript is specified
* "newName": "<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": "<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": "<url>", // 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<string, PluginVersionInfo> info = new Dictionary<string, PluginVersionInfo>();
public IReadOnlyDictionary<string, PluginVersionInfo> 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)
{
}
}
}
}