summaryrefslogtreecommitdiff
path: root/src/SMAPI.Web/Controllers
diff options
context:
space:
mode:
Diffstat (limited to 'src/SMAPI.Web/Controllers')
-rw-r--r--src/SMAPI.Web/Controllers/IndexController.cs93
-rw-r--r--src/SMAPI.Web/Controllers/LogParserController.cs29
-rw-r--r--src/SMAPI.Web/Controllers/ModsApiController.cs34
3 files changed, 116 insertions, 40 deletions
diff --git a/src/SMAPI.Web/Controllers/IndexController.cs b/src/SMAPI.Web/Controllers/IndexController.cs
new file mode 100644
index 00000000..5d45118f
--- /dev/null
+++ b/src/SMAPI.Web/Controllers/IndexController.cs
@@ -0,0 +1,93 @@
+using System;
+using System.Text.RegularExpressions;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Caching.Memory;
+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 cache in which to store release data.</summary>
+ private readonly IMemoryCache Cache;
+
+ /// <summary>The GitHub API client.</summary>
+ private readonly IGitHubClient GitHub;
+
+ /// <summary>The cache time for release info.</summary>
+ private readonly TimeSpan CacheTime = TimeSpan.FromMinutes(5);
+
+
+ /*********
+ ** Public methods
+ *********/
+ /// <summary>Construct an instance.</summary>
+ /// <param name="cache">The cache in which to store release data.</param>
+ /// <param name="github">The GitHub API client.</param>
+ public IndexController(IMemoryCache cache, IGitHubClient github)
+ {
+ this.Cache = cache;
+ this.GitHub = github;
+ }
+
+ /// <summary>Display the index page.</summary>
+ [HttpGet]
+ public async Task<ViewResult> Index()
+ {
+ // fetch latest SMAPI release
+ GitRelease release = await this.Cache.GetOrCreateAsync("latest-smapi-release", async entry =>
+ {
+ entry.AbsoluteExpiration = DateTimeOffset.UtcNow.Add(this.CacheTime);
+ return 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 454440bb..04a11a82 100644
--- a/src/SMAPI.Web/Controllers/LogParserController.cs
+++ b/src/SMAPI.Web/Controllers/LogParserController.cs
@@ -6,8 +6,8 @@ using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using StardewModdingAPI.Web.Framework;
+using StardewModdingAPI.Web.Framework.Clients.Pastebin;
using StardewModdingAPI.Web.Framework.ConfigModels;
-using StardewModdingAPI.Web.Framework.LogParser;
using StardewModdingAPI.Web.ViewModels;
namespace StardewModdingAPI.Web.Controllers
@@ -19,10 +19,10 @@ namespace StardewModdingAPI.Web.Controllers
** Properties
*********/
/// <summary>The log parser config settings.</summary>
- private readonly LogParserConfig Config;
+ private readonly ContextConfig Config;
/// <summary>The underlying Pastebin client.</summary>
- private readonly PastebinClient PastebinClient;
+ private readonly IPastebinClient Pastebin;
/// <summary>The first bytes in a valid zip file.</summary>
/// <remarks>See <a href="https://en.wikipedia.org/wiki/Zip_(file_format)#File_headers"/>.</remarks>
@@ -36,14 +36,12 @@ namespace StardewModdingAPI.Web.Controllers
** Constructor
***/
/// <summary>Construct an instance.</summary>
- /// <param name="configProvider">The log parser config settings.</param>
- public LogParserController(IOptions<LogParserConfig> configProvider)
+ /// <param name="contextProvider">The context config settings.</param>
+ /// <param name="pastebin">The Pastebin API client.</param>
+ public LogParserController(IOptions<ContextConfig> contextProvider, IPastebinClient pastebin)
{
- // init Pastebin client
- this.Config = configProvider.Value;
- string version = this.GetType().Assembly.GetName().Version.ToString(3);
- string userAgent = string.Format(this.Config.PastebinUserAgent, version);
- this.PastebinClient = new PastebinClient(this.Config.PastebinBaseUrl, userAgent, this.Config.PastebinUserKey, this.Config.PastebinDevKey);
+ this.Config = contextProvider.Value;
+ this.Pastebin = pastebin;
}
/***
@@ -52,12 +50,11 @@ 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)
{
- return this.View("Index", new LogParserModel(this.Config.SectionUrl, id));
+ return this.View("Index", new LogParserModel(this.Config.LogParserUrl, id));
}
/***
@@ -67,9 +64,9 @@ namespace StardewModdingAPI.Web.Controllers
/// <param name="id">The Pastebin paste ID.</param>
[HttpGet, Produces("application/json")]
[Route("log/fetch/{id}")]
- public async Task<GetPasteResponse> GetAsync(string id)
+ public async Task<PasteInfo> GetAsync(string id)
{
- GetPasteResponse response = await this.PastebinClient.GetAsync(id);
+ PasteInfo response = await this.Pastebin.GetAsync(id);
response.Content = this.DecompressString(response.Content);
return response;
}
@@ -78,10 +75,10 @@ namespace StardewModdingAPI.Web.Controllers
/// <param name="content">The log content to save.</param>
[HttpPost, Produces("application/json"), AllowLargePosts]
[Route("log/save")]
- public async Task<SavePasteResponse> PostAsync([FromBody] string content)
+ public async Task<SavePasteResult> PostAsync([FromBody] string content)
{
content = this.CompressString(content);
- return await this.PastebinClient.PostAsync(content);
+ return await this.Pastebin.PostAsync(content);
}
diff --git a/src/SMAPI.Web/Controllers/ModsApiController.cs b/src/SMAPI.Web/Controllers/ModsApiController.cs
index a600662c..dcb4ec52 100644
--- a/src/SMAPI.Web/Controllers/ModsApiController.cs
+++ b/src/SMAPI.Web/Controllers/ModsApiController.cs
@@ -7,6 +7,9 @@ using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Options;
using StardewModdingAPI.Common.Models;
+using StardewModdingAPI.Web.Framework.Clients.Chucklefish;
+using StardewModdingAPI.Web.Framework.Clients.GitHub;
+using StardewModdingAPI.Web.Framework.Clients.Nexus;
using StardewModdingAPI.Web.Framework.ConfigModels;
using StardewModdingAPI.Web.Framework.ModRepositories;
@@ -39,39 +42,22 @@ namespace StardewModdingAPI.Web.Controllers
/// <summary>Construct an instance.</summary>
/// <param name="cache">The cache in which to store mod metadata.</param>
/// <param name="configProvider">The config settings for mod update checks.</param>
- public ModsApiController(IMemoryCache cache, IOptions<ModUpdateCheckConfig> configProvider)
+ /// <param name="chucklefish">The Chucklefish API client.</param>
+ /// <param name="github">The GitHub API client.</param>
+ /// <param name="nexus">The Nexus API client.</param>
+ public ModsApiController(IMemoryCache cache, IOptions<ModUpdateCheckConfig> configProvider, IChucklefishClient chucklefish, IGitHubClient github, INexusClient nexus)
{
ModUpdateCheckConfig config = configProvider.Value;
this.Cache = cache;
this.CacheMinutes = config.CacheMinutes;
this.VersionRegex = config.SemanticVersionRegex;
-
- string version = this.GetType().Assembly.GetName().Version.ToString(3);
this.Repositories =
new IModRepository[]
{
- new ChucklefishRepository(
- vendorKey: config.ChucklefishKey,
- userAgent: string.Format(config.ChucklefishUserAgent, version),
- baseUrl: config.ChucklefishBaseUrl,
- modPageUrlFormat: config.ChucklefishModPageUrlFormat
- ),
- new GitHubRepository(
- vendorKey: config.GitHubKey,
- baseUrl: config.GitHubBaseUrl,
- releaseUrlFormat: config.GitHubReleaseUrlFormat,
- userAgent: string.Format(config.GitHubUserAgent, version),
- acceptHeader: config.GitHubAcceptHeader,
- username: config.GitHubUsername,
- password: config.GitHubPassword
- ),
- new NexusRepository(
- vendorKey: config.NexusKey,
- userAgent: config.NexusUserAgent,
- baseUrl: config.NexusBaseUrl,
- modUrlFormat: config.NexusModUrlFormat
- )
+ new ChucklefishRepository(config.ChucklefishKey, chucklefish),
+ new GitHubRepository(config.GitHubKey, github),
+ new NexusRepository(config.NexusKey, nexus)
}
.ToDictionary(p => p.VendorKey, StringComparer.CurrentCultureIgnoreCase);
}