From ff6df97ae8ca12f45aaba1776472f1dc10234b91 Mon Sep 17 00:00:00 2001
From: Jesse Plamondon-Willard
Date: Thu, 15 Mar 2018 21:26:03 -0400
Subject: fix error handling in update check API (#457)
---
src/SMAPI.Web/Controllers/ModsApiController.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
(limited to 'src/SMAPI.Web/Controllers')
diff --git a/src/SMAPI.Web/Controllers/ModsApiController.cs b/src/SMAPI.Web/Controllers/ModsApiController.cs
index abae7db7..c99c87fb 100644
--- a/src/SMAPI.Web/Controllers/ModsApiController.cs
+++ b/src/SMAPI.Web/Controllers/ModsApiController.cs
@@ -115,9 +115,9 @@ namespace StardewModdingAPI.Web.Controllers
if (info.Error == null)
{
if (info.Version == null)
- info = new ModInfoModel(info.Name, info.Version, info.Url, "Mod has no version number.");
+ info = new ModInfoModel(name: info.Name, version: info.Version, url: info.Url, error: "Mod has no version number.");
if (!allowInvalidVersions && !Regex.IsMatch(info.Version, this.VersionRegex, RegexOptions.CultureInvariant | RegexOptions.IgnoreCase))
- info = new ModInfoModel(info.Name, info.Version, info.Url, $"Mod has invalid semantic version '{info.Version}'.");
+ info = new ModInfoModel(name: info.Name, version: info.Version, url: info.Url, error: $"Mod has invalid semantic version '{info.Version}'.");
}
// cache & return
--
cgit
From 594d176d39691ff46b2c99fdfaa4299a4ea43616 Mon Sep 17 00:00:00 2001
From: Jesse Plamondon-Willard
Date: Thu, 15 Mar 2018 23:36:16 -0400
Subject: prepare home page for upcoming beta (#457)
---
src/SMAPI.Web/Controllers/IndexController.cs | 53 +++++++++++++++++++++++----
src/SMAPI.Web/ViewModels/IndexModel.cs | 28 +++++---------
src/SMAPI.Web/ViewModels/IndexVersionModel.cs | 41 +++++++++++++++++++++
src/SMAPI.Web/Views/Index/Index.cshtml | 35 ++++++++++++++----
4 files changed, 124 insertions(+), 33 deletions(-)
create mode 100644 src/SMAPI.Web/ViewModels/IndexVersionModel.cs
(limited to 'src/SMAPI.Web/Controllers')
diff --git a/src/SMAPI.Web/Controllers/IndexController.cs b/src/SMAPI.Web/Controllers/IndexController.cs
index 5d45118f..0464e50a 100644
--- a/src/SMAPI.Web/Controllers/IndexController.cs
+++ b/src/SMAPI.Web/Controllers/IndexController.cs
@@ -3,6 +3,7 @@ using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Memory;
+using StardewModdingAPI.Common;
using StardewModdingAPI.Web.Framework.Clients.GitHub;
using StardewModdingAPI.Web.ViewModels;
@@ -23,7 +24,10 @@ namespace StardewModdingAPI.Web.Controllers
private readonly IGitHubClient GitHub;
/// The cache time for release info.
- private readonly TimeSpan CacheTime = TimeSpan.FromMinutes(5);
+ private readonly TimeSpan CacheTime = TimeSpan.FromSeconds(1);
+
+ /// The GitHub repository name to check for update.
+ private readonly string RepositoryName = "Pathoschild/SMAPI";
/*********
@@ -42,17 +46,24 @@ namespace StardewModdingAPI.Web.Controllers
[HttpGet]
public async Task Index()
{
- // fetch latest SMAPI release
- GitRelease release = await this.Cache.GetOrCreateAsync("latest-smapi-release", async entry =>
+ // fetch SMAPI releases
+ IndexVersionModel stableVersion = await this.Cache.GetOrCreateAsync("stable-version", async entry =>
+ {
+ entry.AbsoluteExpiration = DateTimeOffset.UtcNow.Add(this.CacheTime);
+ GitRelease release = await this.GitHub.GetLatestReleaseAsync(this.RepositoryName, includePrerelease: false);
+ return new IndexVersionModel(release.Name, release.Body, this.GetMainDownloadUrl(release), this.GetDevDownloadUrl(release));
+ });
+ IndexVersionModel betaVersion = await this.Cache.GetOrCreateAsync("beta-version", async entry =>
{
entry.AbsoluteExpiration = DateTimeOffset.UtcNow.Add(this.CacheTime);
- return await this.GitHub.GetLatestReleaseAsync("Pathoschild/SMAPI");
+ GitRelease release = await this.GitHub.GetLatestReleaseAsync(this.RepositoryName, includePrerelease: true);
+ return release.IsPrerelease
+ ? this.GetBetaDownload(release)
+ : null;
});
- string downloadUrl = this.GetMainDownloadUrl(release);
- string devDownloadUrl = this.GetDevDownloadUrl(release);
// render view
- var model = new IndexModel(release.Name, release.Body, downloadUrl, devDownloadUrl);
+ var model = new IndexModel(stableVersion, betaVersion);
return this.View(model);
}
@@ -89,5 +100,33 @@ namespace StardewModdingAPI.Web.Controllers
// fallback just in case
return "https://github.com/pathoschild/SMAPI/releases";
}
+
+ /// Get the latest beta download for a SMAPI release.
+ /// The SMAPI release.
+ private IndexVersionModel GetBetaDownload(GitRelease release)
+ {
+ // get download with the latest version
+ SemanticVersionImpl latestVersion = null;
+ string latestUrl = null;
+ foreach (GitAsset asset in release.Assets ?? new GitAsset[0])
+ {
+ // parse version
+ Match versionMatch = Regex.Match(asset.FileName, @"SMAPI-([\d\.]+(?:-.+)?)-installer.zip");
+ if (!versionMatch.Success || !SemanticVersionImpl.TryParse(versionMatch.Groups[1].Value, out SemanticVersionImpl version))
+ continue;
+
+ // save latest version
+ if (latestVersion == null || latestVersion.CompareTo(version) < 0)
+ {
+ latestVersion = version;
+ latestUrl = asset.DownloadUrl;
+ }
+ }
+
+ // return if prerelease
+ return latestVersion?.Tag != null
+ ? new IndexVersionModel(latestVersion.ToString(), release.Body, latestUrl, null)
+ : null;
+ }
}
}
diff --git a/src/SMAPI.Web/ViewModels/IndexModel.cs b/src/SMAPI.Web/ViewModels/IndexModel.cs
index 6d3da91e..4268c878 100644
--- a/src/SMAPI.Web/ViewModels/IndexModel.cs
+++ b/src/SMAPI.Web/ViewModels/IndexModel.cs
@@ -6,17 +6,11 @@ namespace StardewModdingAPI.Web.ViewModels
/*********
** Accessors
*********/
- /// The latest SMAPI version.
- public string LatestVersion { get; set; }
+ /// The latest stable SMAPI version.
+ public IndexVersionModel StableVersion { get; set; }
- /// The Markdown description for the release.
- public string Description { get; set; }
-
- /// The main download URL.
- public string DownloadUrl { get; set; }
-
- /// The for-developers download URL.
- public string DevDownloadUrl { get; set; }
+ /// The latest prerelease SMAPI version (if newer than ).
+ public IndexVersionModel BetaVersion { get; set; }
/*********
@@ -26,16 +20,12 @@ namespace StardewModdingAPI.Web.ViewModels
public IndexModel() { }
/// Construct an instance.
- /// The latest SMAPI version.
- /// The Markdown description for the release.
- /// The main download URL.
- /// The for-developers download URL.
- internal IndexModel(string latestVersion, string description, string downloadUrl, string devDownloadUrl)
+ /// The latest stable SMAPI version.
+ /// The latest prerelease SMAPI version (if newer than ).
+ internal IndexModel(IndexVersionModel stableVersion, IndexVersionModel betaVersion)
{
- this.LatestVersion = latestVersion;
- this.Description = description;
- this.DownloadUrl = downloadUrl;
- this.DevDownloadUrl = devDownloadUrl;
+ this.StableVersion = stableVersion;
+ this.BetaVersion = betaVersion;
}
}
}
diff --git a/src/SMAPI.Web/ViewModels/IndexVersionModel.cs b/src/SMAPI.Web/ViewModels/IndexVersionModel.cs
new file mode 100644
index 00000000..4f63b979
--- /dev/null
+++ b/src/SMAPI.Web/ViewModels/IndexVersionModel.cs
@@ -0,0 +1,41 @@
+namespace StardewModdingAPI.Web.ViewModels
+{
+ /// The fields for a SMAPI version.
+ public class IndexVersionModel
+ {
+ /*********
+ ** Accessors
+ *********/
+ /// The release version.
+ public string Version { get; set; }
+
+ /// The Markdown description for the release.
+ public string Description { get; set; }
+
+ /// The main download URL.
+ public string DownloadUrl { get; set; }
+
+ /// The for-developers download URL (not applicable for prerelease versions).
+ public string DevDownloadUrl { get; set; }
+
+
+ /*********
+ ** Public methods
+ *********/
+ /// Construct an instance.
+ public IndexVersionModel() { }
+
+ /// Construct an instance.
+ /// The release number.
+ /// The Markdown description for the release.
+ /// The main download URL.
+ /// The for-developers download URL (not applicable for prerelease versions).
+ internal IndexVersionModel(string version, string description, string downloadUrl, string devDownloadUrl)
+ {
+ this.Version = version;
+ 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
index ad58898e..4efb9f8a 100644
--- a/src/SMAPI.Web/Views/Index/Index.cshtml
+++ b/src/SMAPI.Web/Views/Index/Index.cshtml
@@ -13,7 +13,11 @@
-
Download SMAPI @Model.LatestVersion
+
Download SMAPI @Model.StableVersion.Version
+ @if (Model.BetaVersion != null)
+ {
+
Download SMAPI @Model.BetaVersion.Version
for Stardew Valley 1.3 beta
+ }
Install guide
FAQs

@@ -25,12 +29,29 @@
Get help on Discord or in the forums
-
What's new in SMAPI @Model.LatestVersion?
-
- @Html.Raw(Markdig.Markdown.ToHtml(Model.Description))
-
+@if (Model.BetaVersion == null)
+{
+
What's new in SMAPI @Model.StableVersion.Version?
+
+ @Html.Raw(Markdig.Markdown.ToHtml(Model.StableVersion.Description))
+
+
See the release notes and mod compatibility list for more info.
+}
+else
+{
+
What's new in...
+
SMAPI @Model.StableVersion.Version?
+
+ @Html.Raw(Markdig.Markdown.ToHtml(Model.StableVersion.Description))
+
+
See the release notes and mod compatibility list for more info.
-
See the release notes and mod compatibility list for more info.
+
SMAPI @Model.BetaVersion.Version?
+
+ @Html.Raw(Markdig.Markdown.ToHtml(Model.BetaVersion.Description))
+
+
See the release notes and mod compatibility list for more info.
+}
Donate to support SMAPI ♥
@@ -62,7 +83,7 @@
For mod creators
--
cgit
From ada351b163d928b5c01787e3ac3ad25ee6fe1ce4 Mon Sep 17 00:00:00 2001
From: Jesse Plamondon-Willard
Date: Fri, 16 Mar 2018 20:28:16 -0400
Subject: reduce cache time for failed update checks to 5 minutes (#454)
---
docs/release-notes.md | 1 +
src/SMAPI.Web/Controllers/ModsApiController.cs | 12 ++++++++----
src/SMAPI.Web/Framework/ConfigModels/ModUpdateCheckConfig.cs | 7 +++++--
src/SMAPI.Web/appsettings.json | 3 ++-
4 files changed, 16 insertions(+), 7 deletions(-)
(limited to 'src/SMAPI.Web/Controllers')
diff --git a/docs/release-notes.md b/docs/release-notes.md
index 393090f2..9d654133 100644
--- a/docs/release-notes.md
+++ b/docs/release-notes.md
@@ -21,6 +21,7 @@
* Fixed rare crash with some combinations of manifest fields and internal mod data.
* Fixed update checks failing for Nexus Mods due to a change in their API.
* Fixed update checks failing for some older mods with non-standard versions.
+ * Fixed failed update checks being cached for an hour (now cached 5 minutes).
* Fixed error when a content pack needs a mod that couldn't be loaded.
* Fixed Linux ["magic number is wrong" errors](https://github.com/mono/mono/issues/6752) by changing default terminal order.
* Updated compatibility list and added update checks for more mods.
diff --git a/src/SMAPI.Web/Controllers/ModsApiController.cs b/src/SMAPI.Web/Controllers/ModsApiController.cs
index c99c87fb..24517263 100644
--- a/src/SMAPI.Web/Controllers/ModsApiController.cs
+++ b/src/SMAPI.Web/Controllers/ModsApiController.cs
@@ -29,8 +29,11 @@ namespace StardewModdingAPI.Web.Controllers
/// The cache in which to store mod metadata.
private readonly IMemoryCache Cache;
- /// The number of minutes update checks should be cached before refetching them.
- private readonly int CacheMinutes;
+ /// The number of minutes successful update checks should be cached before refetching them.
+ private readonly int SuccessCacheMinutes;
+
+ /// The number of minutes failed update checks should be cached before refetching them.
+ private readonly int ErrorCacheMinutes;
/// A regex which matches SMAPI-style semantic version.
private readonly string VersionRegex;
@@ -50,7 +53,8 @@ namespace StardewModdingAPI.Web.Controllers
ModUpdateCheckConfig config = configProvider.Value;
this.Cache = cache;
- this.CacheMinutes = config.CacheMinutes;
+ this.SuccessCacheMinutes = config.SuccessCacheMinutes;
+ this.ErrorCacheMinutes = config.ErrorCacheMinutes;
this.VersionRegex = config.SemanticVersionRegex;
this.Repositories =
new IModRepository[]
@@ -121,7 +125,7 @@ namespace StardewModdingAPI.Web.Controllers
}
// cache & return
- entry.AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes(this.CacheMinutes);
+ entry.AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes(info.Error == null ? this.SuccessCacheMinutes : this.ErrorCacheMinutes);
return info;
});
}
diff --git a/src/SMAPI.Web/Framework/ConfigModels/ModUpdateCheckConfig.cs b/src/SMAPI.Web/Framework/ConfigModels/ModUpdateCheckConfig.cs
index 58c3a100..fc3b7dc2 100644
--- a/src/SMAPI.Web/Framework/ConfigModels/ModUpdateCheckConfig.cs
+++ b/src/SMAPI.Web/Framework/ConfigModels/ModUpdateCheckConfig.cs
@@ -6,8 +6,11 @@ namespace StardewModdingAPI.Web.Framework.ConfigModels
/*********
** Accessors
*********/
- /// The number of minutes update checks should be cached before refetching them.
- public int CacheMinutes { get; set; }
+ /// The number of minutes successful update checks should be cached before refetching them.
+ public int SuccessCacheMinutes { get; set; }
+
+ /// The number of minutes failed update checks should be cached before refetching them.
+ public int ErrorCacheMinutes { get; set; }
/// A regex which matches SMAPI-style semantic version.
/// Derived from SMAPI's SemanticVersion implementation.
diff --git a/src/SMAPI.Web/appsettings.json b/src/SMAPI.Web/appsettings.json
index bfe827fa..03ca31ed 100644
--- a/src/SMAPI.Web/appsettings.json
+++ b/src/SMAPI.Web/appsettings.json
@@ -40,7 +40,8 @@
},
"ModUpdateCheck": {
- "CacheMinutes": 60,
+ "SuccessCacheMinutes": 60,
+ "ErrorCacheMinutes": 5,
"SemanticVersionRegex": "^(?>(?0|[1-9]\\d*))\\.(?>(?0|[1-9]\\d*))(?>(?:\\.(?0|[1-9]\\d*))?)(?:-(?(?>[a-z0-9]+[\\-\\.]?)+))?$",
"ChucklefishKey": "Chucklefish",
--
cgit