summaryrefslogtreecommitdiff
path: root/src/SMAPI.Web/ViewModels/ModModel.cs
diff options
context:
space:
mode:
authorJesse Plamondon-Willard <Pathoschild@users.noreply.github.com>2018-11-19 13:48:19 -0500
committerJesse Plamondon-Willard <Pathoschild@users.noreply.github.com>2018-11-19 13:48:19 -0500
commit593723b7940ba72a786fc4c7366c56f9813d977b (patch)
tree4d23fbef5bc5a20115f10ca04ae3379df78cc8e1 /src/SMAPI.Web/ViewModels/ModModel.cs
parent4f28ea33bd7cc65485402c5e85259083e86b49e1 (diff)
parent3dc27a5681dcfc4ae30e95570d9966f2e14a4dd7 (diff)
downloadSMAPI-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.cs110
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");
+ }
+ }
+}