using System.Linq; using Newtonsoft.Json; using Newtonsoft.Json.Converters; using StardewModdingAPI.Toolkit.Framework.Clients.Wiki; using StardewModdingAPI.Toolkit.Framework.ModData; namespace StardewModdingAPI.Toolkit.Framework.Clients.WebApi { /// Extended metadata about a mod. public class ModExtendedMetadataModel { /********* ** Accessors *********/ /// The mod's unique ID. A mod may have multiple current IDs in rare cases (e.g. due to parallel releases or unofficial updates). public string[] ID { get; set; } = new string[0]; /// The mod's display name. public string Name { get; set; } /// The mod ID on Nexus. public int? NexusID { get; set; } /// The mod ID in the Chucklefish mod repo. public int? ChucklefishID { get; set; } /// The GitHub repository in the form 'owner/repo'. public string GitHubRepo { get; set; } /// The URL to a non-GitHub source repo. public string CustomSourceUrl { get; set; } /// The custom mod page URL (if applicable). public string CustomUrl { get; set; } /// The compatibility status. [JsonConverter(typeof(StringEnumConverter))] public WikiCompatibilityStatus? CompatibilityStatus { get; set; } /// The human-readable summary of the compatibility status or workaround, without HTML formatitng. public string CompatibilitySummary { get; set; } /********* ** Public methods *********/ /// Construct an instance. public ModExtendedMetadataModel() { } /// Construct an instance. /// The mod metadata from the wiki (if available). /// The mod metadata from SMAPI's internal DB (if available). public ModExtendedMetadataModel(WikiCompatibilityEntry wiki, ModDataRecord db) { // wiki data if (wiki != null) { this.ID = wiki.ID; this.Name = wiki.Name; this.NexusID = wiki.NexusID; this.ChucklefishID = wiki.ChucklefishID; this.GitHubRepo = wiki.GitHubRepo; this.CustomSourceUrl = wiki.CustomSourceUrl; this.CustomUrl = wiki.CustomUrl; this.CompatibilityStatus = wiki.Status; this.CompatibilitySummary = wiki.Summary; } // internal DB data if (db != null) { this.ID = this.ID.Union(db.FormerIDs).ToArray(); this.Name = this.Name ?? db.DisplayName; } } } }