diff options
| author | Jesse Plamondon-Willard <Pathoschild@users.noreply.github.com> | 2018-11-19 13:48:19 -0500 | 
|---|---|---|
| committer | Jesse Plamondon-Willard <Pathoschild@users.noreply.github.com> | 2018-11-19 13:48:19 -0500 | 
| commit | 593723b7940ba72a786fc4c7366c56f9813d977b (patch) | |
| tree | 4d23fbef5bc5a20115f10ca04ae3379df78cc8e1 /src/SMAPI.Web/ViewModels/ModModel.cs | |
| parent | 4f28ea33bd7cc65485402c5e85259083e86b49e1 (diff) | |
| parent | 3dc27a5681dcfc4ae30e95570d9966f2e14a4dd7 (diff) | |
| download | SMAPI-593723b7940ba72a786fc4c7366c56f9813d977b.tar.gz SMAPI-593723b7940ba72a786fc4c7366c56f9813d977b.tar.bz2 SMAPI-593723b7940ba72a786fc4c7366c56f9813d977b.zip | |
Merge branch 'develop' into stable
Diffstat (limited to 'src/SMAPI.Web/ViewModels/ModModel.cs')
| -rw-r--r-- | src/SMAPI.Web/ViewModels/ModModel.cs | 110 | 
1 files changed, 110 insertions, 0 deletions
| diff --git a/src/SMAPI.Web/ViewModels/ModModel.cs b/src/SMAPI.Web/ViewModels/ModModel.cs new file mode 100644 index 00000000..0e7d2076 --- /dev/null +++ b/src/SMAPI.Web/ViewModels/ModModel.cs @@ -0,0 +1,110 @@ +using System.Collections.Generic; +using System.Linq; +using StardewModdingAPI.Toolkit.Framework.Clients.Wiki; + +namespace StardewModdingAPI.Web.ViewModels +{ +    /// <summary>Metadata about a mod.</summary> +    public class ModModel +    { +        /********* +        ** Accessors +        *********/ +        /// <summary>The mod name.</summary> +        public string Name { get; set; } + +        /// <summary>The mod's alternative names, if any.</summary> +        public string AlternateNames { get; set; } + +        /// <summary>The mod author's name.</summary> +        public string Author { get; set; } + +        /// <summary>The mod author's alternative names, if any.</summary> +        public string AlternateAuthors { get; set; } + +        /// <summary>The URL to the mod's source code, if any.</summary> +        public string SourceUrl { get; set; } + +        /// <summary>The compatibility status for the stable version of the game.</summary> +        public ModCompatibilityModel Compatibility { get; set; } + +        /// <summary>The compatibility status for the beta version of the game.</summary> +        public ModCompatibilityModel BetaCompatibility { get; set; } + +        /// <summary>Links to the available mod pages.</summary> +        public ModLinkModel[] ModPages { get; set; } + +        /// <summary>The human-readable warnings for players about this mod.</summary> +        public string[] Warnings { get; set; } + +        /// <summary>A unique identifier for the mod that can be used in an anchor URL.</summary> +        public string Slug { get; set; } + +        /// <summary>The sites where the mod can be downloaded.</summary> +        public string[] ModPageSites => this.ModPages.Select(p => p.Text).ToArray(); + + +        /********* +        ** Public methods +        *********/ +        /// <summary>Construct an instance.</summary> +        /// <param name="entry">The mod metadata.</param> +        public ModModel(WikiModEntry entry) +        { +            // basic info +            this.Name = entry.Name.FirstOrDefault(); +            this.AlternateNames = string.Join(", ", entry.Name.Skip(1).ToArray()); +            this.Author = entry.Author.FirstOrDefault(); +            this.AlternateAuthors = string.Join(", ", entry.Author.Skip(1).ToArray()); +            this.SourceUrl = this.GetSourceUrl(entry); +            this.Compatibility = new ModCompatibilityModel(entry.Compatibility); +            this.BetaCompatibility = entry.BetaCompatibility != null ? new ModCompatibilityModel(entry.BetaCompatibility) : null; +            this.ModPages = this.GetModPageUrls(entry).ToArray(); +            this.Warnings = entry.Warnings; +            this.Slug = entry.Anchor; +        } + + +        /********* +        ** Private methods +        *********/ +        /// <summary>Get the web URL for the mod's source code repository, if any.</summary> +        /// <param name="entry">The mod metadata.</param> +        private string GetSourceUrl(WikiModEntry entry) +        { +            if (!string.IsNullOrWhiteSpace(entry.GitHubRepo)) +                return $"https://github.com/{entry.GitHubRepo}"; +            if (!string.IsNullOrWhiteSpace(entry.CustomSourceUrl)) +                return entry.CustomSourceUrl; +            return null; +        } + +        /// <summary>Get the web URLs for the mod pages, if any.</summary> +        /// <param name="entry">The mod metadata.</param> +        private IEnumerable<ModLinkModel> GetModPageUrls(WikiModEntry entry) +        { +            bool anyFound = false; + +            // normal mod pages +            if (entry.NexusID.HasValue) +            { +                anyFound = true; +                yield return new ModLinkModel($"https://www.nexusmods.com/stardewvalley/mods/{entry.NexusID}", "Nexus"); +            } +            if (entry.ChucklefishID.HasValue) +            { +                anyFound = true; +                yield return new ModLinkModel($"https://community.playstarbound.com/resources/{entry.ChucklefishID}", "Chucklefish"); +            } + +            // fallback +            if (!anyFound && !string.IsNullOrWhiteSpace(entry.CustomUrl)) +            { +                anyFound = true; +                yield return new ModLinkModel(entry.CustomUrl, "custom"); +            } +            if (!anyFound && !string.IsNullOrWhiteSpace(entry.GitHubRepo)) +                yield return new ModLinkModel($"https://github.com/{entry.GitHubRepo}/releases", "GitHub"); +        } +    } +} | 
