diff options
Diffstat (limited to 'src/SMAPI.Toolkit/Framework/Clients')
| -rw-r--r-- | src/SMAPI.Toolkit/Framework/Clients/WebApi/ModEntryModel.cs | 18 | ||||
| -rw-r--r-- | src/SMAPI.Toolkit/Framework/Clients/WebApi/ModExtendedMetadataModel.cs | 24 | ||||
| -rw-r--r-- | src/SMAPI.Toolkit/Framework/Clients/WebApi/ModSearchEntryModel.cs | 11 | ||||
| -rw-r--r-- | src/SMAPI.Toolkit/Framework/Clients/WebApi/ModSearchModel.cs (renamed from src/SMAPI.Toolkit/Framework/Clients/WebApi/ModSeachModel.cs) | 18 | ||||
| -rw-r--r-- | src/SMAPI.Toolkit/Framework/Clients/WebApi/WebApiClient.cs | 8 | ||||
| -rw-r--r-- | src/SMAPI.Toolkit/Framework/Clients/Wiki/WikiClient.cs | 26 | ||||
| -rw-r--r-- | src/SMAPI.Toolkit/Framework/Clients/Wiki/WikiModEntry.cs | 7 | 
7 files changed, 102 insertions, 10 deletions
diff --git a/src/SMAPI.Toolkit/Framework/Clients/WebApi/ModEntryModel.cs b/src/SMAPI.Toolkit/Framework/Clients/WebApi/ModEntryModel.cs index 8a9c0a25..f1bcfccc 100644 --- a/src/SMAPI.Toolkit/Framework/Clients/WebApi/ModEntryModel.cs +++ b/src/SMAPI.Toolkit/Framework/Clients/WebApi/ModEntryModel.cs @@ -1,3 +1,5 @@ +using System; +  namespace StardewModdingAPI.Toolkit.Framework.Clients.WebApi  {      /// <summary>Metadata about a mod.</summary> @@ -9,23 +11,31 @@ namespace StardewModdingAPI.Toolkit.Framework.Clients.WebApi          /// <summary>The mod's unique ID (if known).</summary>          public string ID { get; set; } +        /// <summary>The update version recommended by the web API based on its version update and mapping rules.</summary> +        public ModEntryVersionModel SuggestedUpdate { get; set; } + +        /// <summary>Optional extended data which isn't needed for update checks.</summary> +        public ModExtendedMetadataModel Metadata { get; set; } +          /// <summary>The main version.</summary> +        [Obsolete]          public ModEntryVersionModel Main { get; set; }          /// <summary>The latest optional version, if newer than <see cref="Main"/>.</summary> +        [Obsolete]          public ModEntryVersionModel Optional { get; set; }          /// <summary>The latest unofficial version, if newer than <see cref="Main"/> and <see cref="Optional"/>.</summary> +        [Obsolete]          public ModEntryVersionModel Unofficial { get; set; }          /// <summary>The latest unofficial version for the current Stardew Valley or SMAPI beta, if any (see <see cref="HasBetaInfo"/>).</summary> +        [Obsolete]          public ModEntryVersionModel UnofficialForBeta { get; set; } -        /// <summary>Optional extended data which isn't needed for update checks.</summary> -        public ModExtendedMetadataModel Metadata { get; set; } -          /// <summary>Whether a Stardew Valley or SMAPI beta which affects mod compatibility is in progress. If this is true, <see cref="UnofficialForBeta"/> should be used for beta versions of SMAPI instead of <see cref="Unofficial"/>.</summary> -        public bool HasBetaInfo { get; set; } +        [Obsolete] +        public bool? HasBetaInfo { get; set; }          /// <summary>The errors that occurred while fetching update data.</summary>          public string[] Errors { get; set; } = new string[0]; diff --git a/src/SMAPI.Toolkit/Framework/Clients/WebApi/ModExtendedMetadataModel.cs b/src/SMAPI.Toolkit/Framework/Clients/WebApi/ModExtendedMetadataModel.cs index 8074210c..4a697585 100644 --- a/src/SMAPI.Toolkit/Framework/Clients/WebApi/ModExtendedMetadataModel.cs +++ b/src/SMAPI.Toolkit/Framework/Clients/WebApi/ModExtendedMetadataModel.cs @@ -46,6 +46,17 @@ namespace StardewModdingAPI.Toolkit.Framework.Clients.WebApi          /// <summary>The custom mod page URL (if applicable).</summary>          public string CustomUrl { get; set; } +        /// <summary>The main version.</summary> +        public ModEntryVersionModel Main { get; set; } + +        /// <summary>The latest optional version, if newer than <see cref="Main"/>.</summary> +        public ModEntryVersionModel Optional { get; set; } + +        /// <summary>The latest unofficial version, if newer than <see cref="Main"/> and <see cref="Optional"/>.</summary> +        public ModEntryVersionModel Unofficial { get; set; } + +        /// <summary>The latest unofficial version for the current Stardew Valley or SMAPI beta, if any (see <see cref="HasBetaInfo"/>).</summary> +        public ModEntryVersionModel UnofficialForBeta { get; set; }          /****          ** Stable compatibility @@ -60,7 +71,6 @@ namespace StardewModdingAPI.Toolkit.Framework.Clients.WebApi          /// <summary>The game or SMAPI version which broke this mod, if applicable.</summary>          public string BrokeIn { get; set; } -          /****          ** Beta compatibility          ****/ @@ -84,8 +94,18 @@ namespace StardewModdingAPI.Toolkit.Framework.Clients.WebApi          /// <summary>Construct an instance.</summary>          /// <param name="wiki">The mod metadata from the wiki (if available).</param>          /// <param name="db">The mod metadata from SMAPI's internal DB (if available).</param> -        public ModExtendedMetadataModel(WikiModEntry wiki, ModDataRecord db) +        /// <param name="main">The main version.</param> +        /// <param name="optional">The latest optional version, if newer than <paramref name="main"/>.</param> +        /// <param name="unofficial">The latest unofficial version, if newer than <paramref name="main"/> and <paramref name="optional"/>.</param> +        /// <param name="unofficialForBeta">The latest unofficial version for the current Stardew Valley or SMAPI beta, if any.</param> +        public ModExtendedMetadataModel(WikiModEntry wiki, ModDataRecord db, ModEntryVersionModel main, ModEntryVersionModel optional, ModEntryVersionModel unofficial, ModEntryVersionModel unofficialForBeta)          { +            // versions +            this.Main = main; +            this.Optional = optional; +            this.Unofficial = unofficial; +            this.UnofficialForBeta = unofficialForBeta; +              // wiki data              if (wiki != null)              { diff --git a/src/SMAPI.Toolkit/Framework/Clients/WebApi/ModSearchEntryModel.cs b/src/SMAPI.Toolkit/Framework/Clients/WebApi/ModSearchEntryModel.cs index 886cd5a1..bf81e102 100644 --- a/src/SMAPI.Toolkit/Framework/Clients/WebApi/ModSearchEntryModel.cs +++ b/src/SMAPI.Toolkit/Framework/Clients/WebApi/ModSearchEntryModel.cs @@ -12,6 +12,12 @@ namespace StardewModdingAPI.Toolkit.Framework.Clients.WebApi          /// <summary>The namespaced mod update keys (if available).</summary>          public string[] UpdateKeys { get; set; } +        /// <summary>The mod version installed by the local player. This is used for version mapping in some cases.</summary> +        public ISemanticVersion InstalledVersion { get; set; } + +        /// <summary>Whether the installed version is broken or could not be loaded.</summary> +        public bool IsBroken { get; set; } +          /*********          ** Public methods @@ -24,10 +30,13 @@ namespace StardewModdingAPI.Toolkit.Framework.Clients.WebApi          /// <summary>Construct an instance.</summary>          /// <param name="id">The unique mod ID.</param> +        /// <param name="installedVersion">The version installed by the local player. This is used for version mapping in some cases.</param>          /// <param name="updateKeys">The namespaced mod update keys (if available).</param> -        public ModSearchEntryModel(string id, string[] updateKeys) +        /// <param name="isBroken">Whether the installed version is broken or could not be loaded.</param> +        public ModSearchEntryModel(string id, ISemanticVersion installedVersion, string[] updateKeys, bool isBroken = false)          {              this.ID = id; +            this.InstalledVersion = installedVersion;              this.UpdateKeys = updateKeys ?? new string[0];          }      } diff --git a/src/SMAPI.Toolkit/Framework/Clients/WebApi/ModSeachModel.cs b/src/SMAPI.Toolkit/Framework/Clients/WebApi/ModSearchModel.cs index a2eaad16..73698173 100644 --- a/src/SMAPI.Toolkit/Framework/Clients/WebApi/ModSeachModel.cs +++ b/src/SMAPI.Toolkit/Framework/Clients/WebApi/ModSearchModel.cs @@ -1,4 +1,5 @@  using System.Linq; +using StardewModdingAPI.Toolkit.Utilities;  namespace StardewModdingAPI.Toolkit.Framework.Clients.WebApi  { @@ -14,6 +15,15 @@ namespace StardewModdingAPI.Toolkit.Framework.Clients.WebApi          /// <summary>Whether to include extended metadata for each mod.</summary>          public bool IncludeExtendedMetadata { get; set; } +        /// <summary>The SMAPI version installed by the player. This is used for version mapping in some cases.</summary> +        public ISemanticVersion ApiVersion { get; set; } + +        /// <summary>The Stardew Valley version installed by the player.</summary> +        public ISemanticVersion GameVersion { get; set; } + +        /// <summary>The OS on which the player plays.</summary> +        public Platform? Platform { get; set; } +          /*********          ** Public methods @@ -26,10 +36,16 @@ namespace StardewModdingAPI.Toolkit.Framework.Clients.WebApi          /// <summary>Construct an instance.</summary>          /// <param name="mods">The mods to search.</param> +        /// <param name="apiVersion">The SMAPI version installed by the player. If this is null, the API won't provide a recommended update.</param> +        /// <param name="gameVersion">The Stardew Valley version installed by the player.</param> +        /// <param name="platform">The OS on which the player plays.</param>          /// <param name="includeExtendedMetadata">Whether to include extended metadata for each mod.</param> -        public ModSearchModel(ModSearchEntryModel[] mods, bool includeExtendedMetadata) +        public ModSearchModel(ModSearchEntryModel[] mods, ISemanticVersion apiVersion, ISemanticVersion gameVersion, Platform platform, bool includeExtendedMetadata)          {              this.Mods = mods.ToArray(); +            this.ApiVersion = apiVersion; +            this.GameVersion = gameVersion; +            this.Platform = platform;              this.IncludeExtendedMetadata = includeExtendedMetadata;          }      } diff --git a/src/SMAPI.Toolkit/Framework/Clients/WebApi/WebApiClient.cs b/src/SMAPI.Toolkit/Framework/Clients/WebApi/WebApiClient.cs index 80c8f62b..f0a7c82a 100644 --- a/src/SMAPI.Toolkit/Framework/Clients/WebApi/WebApiClient.cs +++ b/src/SMAPI.Toolkit/Framework/Clients/WebApi/WebApiClient.cs @@ -4,6 +4,7 @@ using System.Linq;  using System.Net;  using Newtonsoft.Json;  using StardewModdingAPI.Toolkit.Serialization; +using StardewModdingAPI.Toolkit.Utilities;  namespace StardewModdingAPI.Toolkit.Framework.Clients.WebApi  { @@ -37,12 +38,15 @@ namespace StardewModdingAPI.Toolkit.Framework.Clients.WebApi          /// <summary>Get metadata about a set of mods from the web API.</summary>          /// <param name="mods">The mod keys for which to fetch the latest version.</param> +        /// <param name="apiVersion">The SMAPI version installed by the player. If this is null, the API won't provide a recommended update.</param> +        /// <param name="gameVersion">The Stardew Valley version installed by the player.</param> +        /// <param name="platform">The OS on which the player plays.</param>          /// <param name="includeExtendedMetadata">Whether to include extended metadata for each mod.</param> -        public IDictionary<string, ModEntryModel> GetModInfo(ModSearchEntryModel[] mods, bool includeExtendedMetadata = false) +        public IDictionary<string, ModEntryModel> GetModInfo(ModSearchEntryModel[] mods, ISemanticVersion apiVersion, ISemanticVersion gameVersion, Platform platform, bool includeExtendedMetadata = false)          {              return this.Post<ModSearchModel, ModEntryModel[]>(                  $"v{this.Version}/mods", -                new ModSearchModel(mods, includeExtendedMetadata) +                new ModSearchModel(mods, apiVersion, gameVersion, platform, includeExtendedMetadata)              ).ToDictionary(p => p.ID);          } diff --git a/src/SMAPI.Toolkit/Framework/Clients/Wiki/WikiClient.cs b/src/SMAPI.Toolkit/Framework/Clients/Wiki/WikiClient.cs index 610e14f1..384f23fc 100644 --- a/src/SMAPI.Toolkit/Framework/Clients/Wiki/WikiClient.cs +++ b/src/SMAPI.Toolkit/Framework/Clients/Wiki/WikiClient.cs @@ -102,6 +102,8 @@ namespace StardewModdingAPI.Toolkit.Framework.Clients.Wiki                  string anchor = this.GetAttribute(node, "id");                  string contentPackFor = this.GetAttribute(node, "data-content-pack-for");                  string devNote = this.GetAttribute(node, "data-dev-note"); +                IDictionary<string, string> mapLocalVersions = this.GetAttributeAsVersionMapping(node, "data-map-local-versions"); +                IDictionary<string, string> mapRemoteVersions = this.GetAttributeAsVersionMapping(node, "data-map-remote-versions");                  // parse stable compatibility                  WikiCompatibilityInfo compatibility = new WikiCompatibilityInfo @@ -159,6 +161,8 @@ namespace StardewModdingAPI.Toolkit.Framework.Clients.Wiki                      Warnings = warnings,                      MetadataLinks = metadataLinks.ToArray(),                      DevNote = devNote, +                    MapLocalVersions = mapLocalVersions, +                    MapRemoteVersions = mapRemoteVersions,                      Anchor = anchor                  };              } @@ -223,6 +227,28 @@ namespace StardewModdingAPI.Toolkit.Framework.Clients.Wiki              return null;          } +        /// <summary>Get an attribute value and parse it as a version mapping.</summary> +        /// <param name="element">The element whose attributes to read.</param> +        /// <param name="name">The attribute name.</param> +        private IDictionary<string, string> GetAttributeAsVersionMapping(HtmlNode element, string name) +        { +            // get raw value +            string raw = this.GetAttribute(element, name); +            if (raw?.Contains("→") != true) +                return null; + +            // parse +            // Specified on the wiki in the form "remote version → mapped version; another remote version → mapped version" +            IDictionary<string, string> map = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase); +            foreach (string pair in raw.Split(';')) +            { +                string[] versions = pair.Split('→'); +                if (versions.Length == 2 && !string.IsNullOrWhiteSpace(versions[0]) && !string.IsNullOrWhiteSpace(versions[1])) +                    map[versions[0].Trim()] = versions[1].Trim(); +            } +            return map; +        } +          /// <summary>Get the text of an element with the given class name.</summary>          /// <param name="container">The metadata container.</param>          /// <param name="className">The field name.</param> diff --git a/src/SMAPI.Toolkit/Framework/Clients/Wiki/WikiModEntry.cs b/src/SMAPI.Toolkit/Framework/Clients/Wiki/WikiModEntry.cs index 51bb2336..931dcd43 100644 --- a/src/SMAPI.Toolkit/Framework/Clients/Wiki/WikiModEntry.cs +++ b/src/SMAPI.Toolkit/Framework/Clients/Wiki/WikiModEntry.cs @@ -1,4 +1,5 @@  using System; +using System.Collections.Generic;  namespace StardewModdingAPI.Toolkit.Framework.Clients.Wiki  { @@ -62,6 +63,12 @@ namespace StardewModdingAPI.Toolkit.Framework.Clients.Wiki          /// <summary>Special notes intended for developers who maintain unofficial updates or submit pull requests. </summary>          public string DevNote { get; set; } +        /// <summary>Maps local versions to a semantic version for update checks.</summary> +        public IDictionary<string, string> MapLocalVersions { get; set; } + +        /// <summary>Maps remote versions to a semantic version for update checks.</summary> +        public IDictionary<string, string> MapRemoteVersions { get; set; } +          /// <summary>The link anchor for the mod entry in the wiki compatibility list.</summary>          public string Anchor { get; set; }      }  | 
