diff options
-rw-r--r-- | src/SMAPI.Web/Controllers/IndexController.cs | 79 | ||||
-rw-r--r-- | src/SMAPI.Web/Controllers/LogParserController.cs | 1 | ||||
-rw-r--r-- | src/SMAPI.Web/Framework/Clients/GitHub/GitAsset.cs | 20 | ||||
-rw-r--r-- | src/SMAPI.Web/Framework/Clients/GitHub/GitRelease.cs | 6 | ||||
-rw-r--r-- | src/SMAPI.Web/Properties/launchSettings.json | 2 | ||||
-rw-r--r-- | src/SMAPI.Web/StardewModdingAPI.Web.csproj | 1 | ||||
-rw-r--r-- | src/SMAPI.Web/Startup.cs | 1 | ||||
-rw-r--r-- | src/SMAPI.Web/ViewModels/IndexModel.cs | 41 | ||||
-rw-r--r-- | src/SMAPI.Web/Views/Index/Index.cshtml | 73 |
9 files changed, 221 insertions, 3 deletions
diff --git a/src/SMAPI.Web/Controllers/IndexController.cs b/src/SMAPI.Web/Controllers/IndexController.cs new file mode 100644 index 00000000..c2c5f2fe --- /dev/null +++ b/src/SMAPI.Web/Controllers/IndexController.cs @@ -0,0 +1,79 @@ +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using StardewModdingAPI.Web.Framework.Clients.GitHub; +using StardewModdingAPI.Web.ViewModels; + +namespace StardewModdingAPI.Web.Controllers +{ + /// <summary>Provides an info/download page about SMAPI.</summary> + [Route("")] + [Route("install")] + internal class IndexController : Controller + { + /********* + ** Properties + *********/ + /// <summary>The GitHub API client.</summary> + private readonly IGitHubClient GitHub; + + + /********* + ** Public methods + *********/ + /// <summary>Construct an instance.</summary> + /// <param name="github">The GitHub API client.</param> + public IndexController(IGitHubClient github) + { + this.GitHub = github; + } + + /// <summary>Display the index page.</summary> + [HttpGet] + public async Task<ViewResult> Index() + { + // fetch latest SMAPI release + GitRelease release = await this.GitHub.GetLatestReleaseAsync("Pathoschild/SMAPI"); + string downloadUrl = this.GetMainDownloadUrl(release); + string devDownloadUrl = this.GetDevDownloadUrl(release); + + // render view + var model = new IndexModel(release.Name, release.Body, downloadUrl, devDownloadUrl); + return this.View(model); + } + + + /********* + ** Private methods + *********/ + /// <summary>Get the main download URL for a SMAPI release.</summary> + /// <param name="release">The SMAPI release.</param> + private string GetMainDownloadUrl(GitRelease release) + { + // get main download URL + foreach (GitAsset asset in release.Assets ?? new GitAsset[0]) + { + if (Regex.IsMatch(asset.FileName, @"SMAPI-[\d\.]+-installer.zip")) + return asset.DownloadUrl; + } + + // fallback just in case + return "https://github.com/pathoschild/SMAPI/releases"; + } + + /// <summary>Get the for-developers download URL for a SMAPI release.</summary> + /// <param name="release">The SMAPI release.</param> + private string GetDevDownloadUrl(GitRelease release) + { + // get dev download URL + foreach (GitAsset asset in release.Assets ?? new GitAsset[0]) + { + if (Regex.IsMatch(asset.FileName, @"SMAPI-[\d\.]+-installer-for-developers.zip")) + return asset.DownloadUrl; + } + + // fallback just in case + return "https://github.com/pathoschild/SMAPI/releases"; + } + } +} diff --git a/src/SMAPI.Web/Controllers/LogParserController.cs b/src/SMAPI.Web/Controllers/LogParserController.cs index b9227a2f..ad979397 100644 --- a/src/SMAPI.Web/Controllers/LogParserController.cs +++ b/src/SMAPI.Web/Controllers/LogParserController.cs @@ -50,7 +50,6 @@ namespace StardewModdingAPI.Web.Controllers /// <summary>Render the log parser UI.</summary> /// <param name="id">The paste ID.</param> [HttpGet] - [Route("")] [Route("log")] [Route("log/{id}")] public ViewResult Index(string id = null) diff --git a/src/SMAPI.Web/Framework/Clients/GitHub/GitAsset.cs b/src/SMAPI.Web/Framework/Clients/GitHub/GitAsset.cs new file mode 100644 index 00000000..73ce4025 --- /dev/null +++ b/src/SMAPI.Web/Framework/Clients/GitHub/GitAsset.cs @@ -0,0 +1,20 @@ +using Newtonsoft.Json; + +namespace StardewModdingAPI.Web.Framework.Clients.GitHub +{ + /// <summary>A GitHub download attached to a release.</summary> + internal class GitAsset + { + /// <summary>The file name.</summary> + [JsonProperty("name")] + public string FileName { get; set; } + + /// <summary>The file content type.</summary> + [JsonProperty("content_type")] + public string ContentType { get; set; } + + /// <summary>The download URL.</summary> + [JsonProperty("browser_download_url")] + public string DownloadUrl { get; set; } + } +} diff --git a/src/SMAPI.Web/Framework/Clients/GitHub/GitRelease.cs b/src/SMAPI.Web/Framework/Clients/GitHub/GitRelease.cs index 0a47f3b4..b944088d 100644 --- a/src/SMAPI.Web/Framework/Clients/GitHub/GitRelease.cs +++ b/src/SMAPI.Web/Framework/Clients/GitHub/GitRelease.cs @@ -15,5 +15,11 @@ namespace StardewModdingAPI.Web.Framework.Clients.GitHub /// <summary>The semantic version string.</summary> [JsonProperty("tag_name")] public string Tag { get; set; } + + /// <summary>The Markdown description for the release.</summary> + public string Body { get; set; } + + /// <summary>The attached files.</summary> + public GitAsset[] Assets { get; set; } } } diff --git a/src/SMAPI.Web/Properties/launchSettings.json b/src/SMAPI.Web/Properties/launchSettings.json index e485e4e3..88179044 100644 --- a/src/SMAPI.Web/Properties/launchSettings.json +++ b/src/SMAPI.Web/Properties/launchSettings.json @@ -11,7 +11,7 @@ "IIS Express": { "commandName": "IISExpress", "launchBrowser": true, - "launchUrl": "log", + "launchUrl": "", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } diff --git a/src/SMAPI.Web/StardewModdingAPI.Web.csproj b/src/SMAPI.Web/StardewModdingAPI.Web.csproj index b5b0ff07..19198503 100644 --- a/src/SMAPI.Web/StardewModdingAPI.Web.csproj +++ b/src/SMAPI.Web/StardewModdingAPI.Web.csproj @@ -11,6 +11,7 @@ <ItemGroup> <PackageReference Include="HtmlAgilityPack" Version="1.6.0" /> + <PackageReference Include="Markdig" Version="0.14.8" /> <PackageReference Include="Microsoft.AspNetCore" Version="2.0.0" /> <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.0.0" /> <PackageReference Include="Microsoft.AspNetCore.Rewrite" Version="2.0.0" /> diff --git a/src/SMAPI.Web/Startup.cs b/src/SMAPI.Web/Startup.cs index 307c4ae9..c6e3f85d 100644 --- a/src/SMAPI.Web/Startup.cs +++ b/src/SMAPI.Web/Startup.cs @@ -134,7 +134,6 @@ namespace StardewModdingAPI.Web // shortcut redirects .Add(new RedirectToUrlRule("^/docs$", "https://stardewvalleywiki.com/Modding:Index")) - .Add(new RedirectToUrlRule("^/install$", "https://stardewvalleywiki.com/Modding:Installing_SMAPI")) ) .UseStaticFiles() // wwwroot folder .UseMvc(); diff --git a/src/SMAPI.Web/ViewModels/IndexModel.cs b/src/SMAPI.Web/ViewModels/IndexModel.cs new file mode 100644 index 00000000..6d3da91e --- /dev/null +++ b/src/SMAPI.Web/ViewModels/IndexModel.cs @@ -0,0 +1,41 @@ +namespace StardewModdingAPI.Web.ViewModels +{ + /// <summary>The view model for the index page.</summary> + public class IndexModel + { + /********* + ** Accessors + *********/ + /// <summary>The latest SMAPI version.</summary> + public string LatestVersion { get; set; } + + /// <summary>The Markdown description for the release.</summary> + public string Description { get; set; } + + /// <summary>The main download URL.</summary> + public string DownloadUrl { get; set; } + + /// <summary>The for-developers download URL.</summary> + public string DevDownloadUrl { get; set; } + + + /********* + ** Public methods + *********/ + /// <summary>Construct an instance.</summary> + public IndexModel() { } + + /// <summary>Construct an instance.</summary> + /// <param name="latestVersion">The latest SMAPI version.</param> + /// <param name="description">The Markdown description for the release.</param> + /// <param name="downloadUrl">The main download URL.</param> + /// <param name="devDownloadUrl">The for-developers download URL.</param> + internal IndexModel(string latestVersion, string description, string downloadUrl, string devDownloadUrl) + { + this.LatestVersion = latestVersion; + this.Description = description; + this.DownloadUrl = downloadUrl; + this.DevDownloadUrl = devDownloadUrl; + } + } +} diff --git a/src/SMAPI.Web/Views/Index/Index.cshtml b/src/SMAPI.Web/Views/Index/Index.cshtml new file mode 100644 index 00000000..b2b8c0dd --- /dev/null +++ b/src/SMAPI.Web/Views/Index/Index.cshtml @@ -0,0 +1,73 @@ +@{ + ViewData["Title"] = "SMAPI"; +} +@model StardewModdingAPI.Web.ViewModels.IndexModel + +<style> + li.main-download * { + font-size: 1.2em; + font-weight: bold; + } + + li.main-download img { + height: 1em; + } + + .github-description .noinclude { + display: none; + } + + li small { + display: block; + width: 50em; + } +</style> + +<p> + SMAPI is the modding API for Stardew Valley. It works fine with Steam achievements and the + overlay, you can uninstall it anytime, and there's a friendly community if you need help. It's + a cool boy. +</p> + +<h2>Download and links</h2> +<ul> + <li class="main-download"><a href="@Model.DownloadUrl">Download SMAPI @Model.LatestVersion</a> <img src="favicon.ico" /></li> + <li><a href="https://stardewvalleywiki.com/Modding:Installing_SMAPI">Install guide</a></li> + <li><a href="https://stardewvalleywiki.com/Modding:Player_FAQs">FAQs</a></li> + <li><a href="https://stardewvalleywiki.com/Modding:SMAPI_compatibility">Mod compatibility list</a></li> + <li>Get help <a href="https://stardewvalleywiki.com/Modding:Community#Discord">on Discord</a> or <a href="https://community.playstarbound.com/threads/smapi-stardew-modding-api.108375/">in the forums</a></li> +</ul> + +<h2>What's new in SMAPI @Model.LatestVersion?</h2> +<div class="github-description"> + @Html.Raw(Markdig.Markdown.ToHtml(Model.Description)) +</div> + +<h2>Support SMAPI ♥</h2> +<ul> + <li><a href="https://www.paypal.me/pathoschild">Donate once</a></li> + <li> + <a href="https://www.patreon.com/pathoschild">Donate $1+/month</a><br /> + <small>You'll have access to all private posts about behind-the-scenes info, upcoming features, and early previews of SMAPI updates. You can optionally provide early feedback on SMAPI features to influence development.</small> + </li> + <li><a href="https://github.com/Pathoschild/SMAPI">Contribute to the code</a></li> + <li><a href="https://community.playstarbound.com/threads/108375">Discuss, give feedback, or report bugs in the forums</a></li> +</ul> + +<p> + Special thanks to + acerbicon, + <a href="https://www.nexusmods.com/stardewvalley/users/31393530">ChefRude</a>, + jwdred, + <a href="http://community.playstarbound.com/members/karmylla.637910/">Karmylla</a>, + OfficialPiAddict, + Robby LaFarge, + and a few anonymous users for supporting SMAPI; you're awesome! +</p> + +<h2>For mod creators</h2> +<ul> + <li><a href="@Model.DevDownloadUrl">SMAPI 2.2 for developers</a> (includes <a href="https://docs.microsoft.com/en-us/visualstudio/ide/using-intellisense">intellisense</a> and full console output)</li> + <li><a href="https://stardewvalleywiki.com/Modding:Index">Modding documentation</a></li> + <li>Need help? Come <a href="https://stardewvalleywiki.com/Modding:Community#Discord">chat on Discord</a>.</li> +</ul> |