summaryrefslogtreecommitdiff
path: root/src/StardewModdingAPI.Toolkit/ModToolkit.cs
diff options
context:
space:
mode:
authorJesse Plamondon-Willard <github@jplamondonw.com>2018-08-01 11:07:29 -0400
committerJesse Plamondon-Willard <github@jplamondonw.com>2018-08-01 11:07:29 -0400
commit60b41195778af33fd609eab66d9ae3f1d1165e8f (patch)
tree7128b906d40e94c56c34ed6058f27bc31c31a08b /src/StardewModdingAPI.Toolkit/ModToolkit.cs
parentb9bc1a6d17cafa0a97b46ffecda432cfc2f23b51 (diff)
parent52cf953f685c65b2b6814e375ec9a5ffa03c440a (diff)
downloadSMAPI-60b41195778af33fd609eab66d9ae3f1d1165e8f.tar.gz
SMAPI-60b41195778af33fd609eab66d9ae3f1d1165e8f.tar.bz2
SMAPI-60b41195778af33fd609eab66d9ae3f1d1165e8f.zip
Merge branch 'develop' into stable
Diffstat (limited to 'src/StardewModdingAPI.Toolkit/ModToolkit.cs')
-rw-r--r--src/StardewModdingAPI.Toolkit/ModToolkit.cs89
1 files changed, 89 insertions, 0 deletions
diff --git a/src/StardewModdingAPI.Toolkit/ModToolkit.cs b/src/StardewModdingAPI.Toolkit/ModToolkit.cs
new file mode 100644
index 00000000..8c78b2f3
--- /dev/null
+++ b/src/StardewModdingAPI.Toolkit/ModToolkit.cs
@@ -0,0 +1,89 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Threading.Tasks;
+using Newtonsoft.Json;
+using StardewModdingAPI.Toolkit.Framework.Clients.Wiki;
+using StardewModdingAPI.Toolkit.Framework.ModData;
+using StardewModdingAPI.Toolkit.Framework.ModScanning;
+using StardewModdingAPI.Toolkit.Serialisation;
+
+namespace StardewModdingAPI.Toolkit
+{
+ /// <summary>A convenience wrapper for the various tools.</summary>
+ public class ModToolkit
+ {
+ /*********
+ ** Properties
+ *********/
+ /// <summary>The default HTTP user agent for the toolkit.</summary>
+ private readonly string UserAgent;
+
+ /// <summary>Maps vendor keys (like <c>Nexus</c>) to their mod URL template (where <c>{0}</c> is the mod ID). This doesn't affect update checks, which defer to the remote web API.</summary>
+ private readonly IDictionary<string, string> VendorModUrls = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase)
+ {
+ ["Chucklefish"] = "https://community.playstarbound.com/resources/{0}",
+ ["GitHub"] = "https://github.com/{0}/releases",
+ ["Nexus"] = "https://www.nexusmods.com/stardewvalley/mods/{0}"
+ };
+
+
+ /*********
+ ** Accessors
+ *********/
+ /// <summary>Encapsulates SMAPI's JSON parsing.</summary>
+ public JsonHelper JsonHelper { get; } = new JsonHelper();
+
+
+ /*********
+ ** Public methods
+ *********/
+ /// <summary>Construct an instance.</summary>
+ public ModToolkit()
+ {
+ ISemanticVersion version = new SemanticVersion(this.GetType().Assembly.GetName().Version);
+ this.UserAgent = $"SMAPI Mod Handler Toolkit/{version}";
+ }
+
+ /// <summary>Extract mod metadata from the wiki compatibility list.</summary>
+ public async Task<WikiCompatibilityEntry[]> GetWikiCompatibilityListAsync()
+ {
+ var client = new WikiCompatibilityClient(this.UserAgent);
+ return await client.FetchAsync();
+ }
+
+ /// <summary>Get SMAPI's internal mod database.</summary>
+ /// <param name="metadataPath">The file path for the SMAPI metadata file.</param>
+ public ModDatabase GetModDatabase(string metadataPath)
+ {
+ MetadataModel metadata = JsonConvert.DeserializeObject<MetadataModel>(File.ReadAllText(metadataPath));
+ ModDataRecord[] records = metadata.ModData.Select(pair => new ModDataRecord(pair.Key, pair.Value)).ToArray();
+ return new ModDatabase(records, this.GetUpdateUrl);
+ }
+
+ /// <summary>Extract information about all mods in the given folder.</summary>
+ /// <param name="rootPath">The root folder containing mods.</param>
+ public IEnumerable<ModFolder> GetModFolders(string rootPath)
+ {
+ return new ModScanner(this.JsonHelper).GetModFolders(rootPath);
+ }
+
+ /// <summary>Get an update URL for an update key (if valid).</summary>
+ /// <param name="updateKey">The update key.</param>
+ public string GetUpdateUrl(string updateKey)
+ {
+ string[] parts = updateKey.Split(new[] { ':' }, 2);
+ if (parts.Length != 2)
+ return null;
+
+ string vendorKey = parts[0].Trim();
+ string modID = parts[1].Trim();
+
+ if (this.VendorModUrls.TryGetValue(vendorKey, out string urlTemplate))
+ return string.Format(urlTemplate, modID);
+
+ return null;
+ }
+ }
+}