From 0c06b129cadd17ba1e9533319326d8aac8a88ed6 Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Sun, 24 Sep 2017 02:33:33 -0400 Subject: add support for specifying default update fields, migrate mods already in mod list (#361) --- .../Framework/ModLoading/ModResolver.cs | 29 ++++++++++++++++++---- .../Framework/Models/ModDataDefaults.cs | 18 ++++++++++++++ .../Framework/Models/ModDataRecord.cs | 7 ++++-- 3 files changed, 47 insertions(+), 7 deletions(-) create mode 100644 src/StardewModdingAPI/Framework/Models/ModDataDefaults.cs (limited to 'src/StardewModdingAPI/Framework') diff --git a/src/StardewModdingAPI/Framework/ModLoading/ModResolver.cs b/src/StardewModdingAPI/Framework/ModLoading/ModResolver.cs index 31ba5bc5..4d20e7c8 100644 --- a/src/StardewModdingAPI/Framework/ModLoading/ModResolver.cs +++ b/src/StardewModdingAPI/Framework/ModLoading/ModResolver.cs @@ -53,17 +53,22 @@ namespace StardewModdingAPI.Framework.ModLoading error = $"parsing its manifest failed:\n{ex.GetLogSummary()}"; } - // validate metadata + // get internal data record (if any) ModDataRecord dataRecord = null; if (manifest != null) { - // get unique key for lookups string key = !string.IsNullOrWhiteSpace(manifest.UniqueID) ? manifest.UniqueID : manifest.EntryDll; - - // get data record dataRecord = dataRecords.FirstOrDefault(record => record.ID.Matches(key, manifest)); } + // apply defaults + if (dataRecord?.Defaults != null) + { + manifest.ChucklefishID = manifest.ChucklefishID ?? dataRecord.Defaults.ChucklefishID; + manifest.GitHubProject = manifest.GitHubProject ?? dataRecord.Defaults.GitHubProject; + manifest.NexusID = manifest.NexusID ?? dataRecord.Defaults.NexusID; + } + // build metadata string displayName = !string.IsNullOrWhiteSpace(manifest?.Name) ? manifest.Name @@ -100,13 +105,27 @@ namespace StardewModdingAPI.Framework.ModLoading case ModStatus.AssumeBroken: { + // get reason string reasonPhrase = compatibility.ReasonPhrase ?? "it's no longer compatible"; + + // get update URLs + List updateUrls = new List(); + if (!string.IsNullOrWhiteSpace(mod.Manifest.ChucklefishID)) + updateUrls.Add($"https://community.playstarbound.com/resources/{mod.Manifest.ChucklefishID}"); + if (!string.IsNullOrWhiteSpace(mod.Manifest.NexusID)) + updateUrls.Add($"http://nexusmods.com/stardewvalley/mods/{mod.Manifest.NexusID}"); + if (!string.IsNullOrWhiteSpace(mod.Manifest.GitHubProject)) + updateUrls.Add($"https://github.com/{mod.Manifest.GitHubProject}/releases"); + if (mod.DataRecord.AlternativeUrl != null) + updateUrls.Add(mod.DataRecord.AlternativeUrl); + + // build error string error = $"{reasonPhrase}. Please check for a "; if (mod.Manifest.Version.Equals(compatibility.UpperVersion)) error += "newer version"; else error += $"version newer than {compatibility.UpperVersion}"; - error += " at " + string.Join(" or ", mod.DataRecord.UpdateUrls); + error += " at " + string.Join(" or ", updateUrls); mod.SetStatus(ModMetadataStatus.Failed, error); } diff --git a/src/StardewModdingAPI/Framework/Models/ModDataDefaults.cs b/src/StardewModdingAPI/Framework/Models/ModDataDefaults.cs new file mode 100644 index 00000000..e0ab94b8 --- /dev/null +++ b/src/StardewModdingAPI/Framework/Models/ModDataDefaults.cs @@ -0,0 +1,18 @@ +namespace StardewModdingAPI.Framework.Models +{ + /// Default values for support fields to inject into the manifest. + internal class ModDataDefaults + { + /********* + ** Accessors + *********/ + /// The mod's unique ID in the Chucklefish mod site (if any), used for update checks. + public string ChucklefishID { get; set; } + + /// The mod's unique ID in Nexus Mods (if any), used for update checks. + public string NexusID { get; set; } + + /// The mod's organisation and project name on GitHub (if any), used for update checks. + public string GitHubProject { get; set; } + } +} diff --git a/src/StardewModdingAPI/Framework/Models/ModDataRecord.cs b/src/StardewModdingAPI/Framework/Models/ModDataRecord.cs index de219076..9f19d5f0 100644 --- a/src/StardewModdingAPI/Framework/Models/ModDataRecord.cs +++ b/src/StardewModdingAPI/Framework/Models/ModDataRecord.cs @@ -17,8 +17,11 @@ namespace StardewModdingAPI.Framework.Models /// The mod name. public string Name { get; set; } - /// The URLs the user can check for a newer version. - public string[] UpdateUrls { get; set; } + /// Default values for support fields to inject into the manifest. + public ModDataDefaults Defaults { get; set; } + + /// The URL where the player can get an unofficial or alternative version of the mod if the official version isn't compatible. + public string AlternativeUrl { get; set; } /// The compatibility of given mod versions (if any). [JsonConverter(typeof(SFieldConverter))] -- cgit