summaryrefslogtreecommitdiff
path: root/src/SMAPI.Web
diff options
context:
space:
mode:
authorJesse Plamondon-Willard <Pathoschild@users.noreply.github.com>2021-08-25 21:54:00 -0400
committerJesse Plamondon-Willard <Pathoschild@users.noreply.github.com>2021-08-25 21:54:00 -0400
commit211f89821e34bb55a6266384d9bac68ec0c64744 (patch)
treeaa0d9915b01aad436ed6b1a2028602c048666457 /src/SMAPI.Web
parent80d3dd1f786f7e5846f9adb7f7a4d82e5b9b92fd (diff)
parent31ac964a8b19623b0472931403a33d51db6fb271 (diff)
downloadSMAPI-211f89821e34bb55a6266384d9bac68ec0c64744.tar.gz
SMAPI-211f89821e34bb55a6266384d9bac68ec0c64744.tar.bz2
SMAPI-211f89821e34bb55a6266384d9bac68ec0c64744.zip
Merge branch 'develop' into stable
Diffstat (limited to 'src/SMAPI.Web')
-rw-r--r--src/SMAPI.Web/Controllers/ModsApiController.cs6
-rw-r--r--src/SMAPI.Web/Framework/ModSiteManager.cs73
-rw-r--r--src/SMAPI.Web/SMAPI.Web.csproj2
-rw-r--r--src/SMAPI.Web/Views/Mods/Index.cshtml2
4 files changed, 58 insertions, 25 deletions
diff --git a/src/SMAPI.Web/Controllers/ModsApiController.cs b/src/SMAPI.Web/Controllers/ModsApiController.cs
index 1956bf29..c6e9a713 100644
--- a/src/SMAPI.Web/Controllers/ModsApiController.cs
+++ b/src/SMAPI.Web/Controllers/ModsApiController.cs
@@ -123,6 +123,10 @@ namespace StardewModdingAPI.Web.Controllers
ModOverrideConfig overrides = this.Config.Value.ModOverrides.FirstOrDefault(p => p.ID.Equals(search.ID?.Trim(), StringComparison.OrdinalIgnoreCase));
bool allowNonStandardVersions = overrides?.AllowNonStandardVersions ?? false;
+ // SMAPI versions with a '-beta' tag indicate major changes that may need beta mod versions.
+ // This doesn't apply to normal prerelease versions which have an '-alpha' tag.
+ bool isSmapiBeta = apiVersion.IsPrerelease() && apiVersion.PrereleaseTag.StartsWith("beta");
+
// get latest versions
ModEntryModel result = new ModEntryModel { ID = search.ID };
IList<string> errors = new List<string>();
@@ -198,7 +202,7 @@ namespace StardewModdingAPI.Web.Controllers
List<ModEntryVersionModel> updates = new List<ModEntryVersionModel>();
if (this.IsRecommendedUpdate(installedVersion, main?.Version, useBetaChannel: true))
updates.Add(main);
- if (this.IsRecommendedUpdate(installedVersion, optional?.Version, useBetaChannel: installedVersion.IsPrerelease() || search.IsBroken))
+ if (this.IsRecommendedUpdate(installedVersion, optional?.Version, useBetaChannel: isSmapiBeta || installedVersion.IsPrerelease() || search.IsBroken))
updates.Add(optional);
if (this.IsRecommendedUpdate(installedVersion, unofficial?.Version, useBetaChannel: true))
updates.Add(unofficial);
diff --git a/src/SMAPI.Web/Framework/ModSiteManager.cs b/src/SMAPI.Web/Framework/ModSiteManager.cs
index 68b4c6ac..8f21d2f5 100644
--- a/src/SMAPI.Web/Framework/ModSiteManager.cs
+++ b/src/SMAPI.Web/Framework/ModSiteManager.cs
@@ -110,41 +110,70 @@ namespace StardewModdingAPI.Web.Framework
main = null;
preview = null;
- ISemanticVersion ParseVersion(string raw)
+ // parse all versions from the mod page
+ IEnumerable<(string name, string description, ISemanticVersion version)> GetAllVersions()
{
- raw = this.NormalizeVersion(raw);
- return this.GetMappedVersion(raw, mapRemoteVersions, allowNonStandardVersions);
+ if (mod != null)
+ {
+ ISemanticVersion ParseAndMapVersion(string raw)
+ {
+ raw = this.NormalizeVersion(raw);
+ return this.GetMappedVersion(raw, mapRemoteVersions, allowNonStandardVersions);
+ }
+
+ // get mod version
+ ISemanticVersion modVersion = ParseAndMapVersion(mod.Version);
+ if (modVersion != null)
+ yield return (name: null, description: null, version: ParseAndMapVersion(mod.Version));
+
+ // get file versions
+ foreach (IModDownload download in mod.Downloads)
+ {
+ ISemanticVersion cur = ParseAndMapVersion(download.Version);
+ if (cur != null)
+ yield return (download.Name, download.Description, cur);
+ }
+ }
}
+ var versions = GetAllVersions()
+ .OrderByDescending(p => p.version, SemanticVersionComparer.Instance)
+ .ToArray();
- if (mod != null)
+ // get main + preview versions
+ void TryGetVersions(out ISemanticVersion mainVersion, out ISemanticVersion previewVersion, Func<(string name, string description, ISemanticVersion version), bool> filter = null)
{
- // get mod version
- if (subkey == null)
- main = ParseVersion(mod.Version);
+ mainVersion = null;
+ previewVersion = null;
- // get file versions
- foreach (IModDownload download in mod.Downloads)
+ // get latest main + preview version
+ foreach (var entry in versions)
{
- // check for subkey if specified
- if (subkey != null && download.Name?.Contains(subkey, StringComparison.OrdinalIgnoreCase) != true && download.Description?.Contains(subkey, StringComparison.OrdinalIgnoreCase) != true)
+ if (filter?.Invoke(entry) == false)
continue;
- // parse version
- ISemanticVersion cur = ParseVersion(download.Version);
- if (cur == null)
- continue;
+ if (entry.version.IsPrerelease())
+ previewVersion ??= entry.version;
+ else
+ mainVersion ??= entry.version;
- // track highest versions
- if (main == null || cur.IsNewerThan(main))
- main = cur;
- if (cur.IsPrerelease() && (preview == null || cur.IsNewerThan(preview)))
- preview = cur;
+ if (mainVersion != null)
+ break; // any other values will be older
}
- if (preview != null && !preview.IsNewerThan(main))
- preview = null;
+ // normalize values
+ if (previewVersion is not null)
+ {
+ mainVersion ??= previewVersion; // if every version is prerelease, latest one is the main version
+ if (!previewVersion.IsNewerThan(mainVersion))
+ previewVersion = null;
+ }
}
+ if (subkey is not null)
+ TryGetVersions(out main, out preview, entry => entry.name?.Contains(subkey, StringComparison.OrdinalIgnoreCase) == true || entry.description?.Contains(subkey, StringComparison.OrdinalIgnoreCase) == true);
+ if (main is null)
+ TryGetVersions(out main, out preview);
+
return main != null;
}
diff --git a/src/SMAPI.Web/SMAPI.Web.csproj b/src/SMAPI.Web/SMAPI.Web.csproj
index e9d209ec..4c8465a6 100644
--- a/src/SMAPI.Web/SMAPI.Web.csproj
+++ b/src/SMAPI.Web/SMAPI.Web.csproj
@@ -2,7 +2,7 @@
<PropertyGroup>
<AssemblyName>SMAPI.Web</AssemblyName>
<RootNamespace>StardewModdingAPI.Web</RootNamespace>
- <TargetFramework>netcoreapp3.1</TargetFramework>
+ <TargetFramework>net5.0</TargetFramework>
<LangVersion>latest</LangVersion>
</PropertyGroup>
diff --git a/src/SMAPI.Web/Views/Mods/Index.cshtml b/src/SMAPI.Web/Views/Mods/Index.cshtml
index fa77c220..7dcd0718 100644
--- a/src/SMAPI.Web/Views/Mods/Index.cshtml
+++ b/src/SMAPI.Web/Views/Mods/Index.cshtml
@@ -9,7 +9,7 @@
TimeSpan staleAge = DateTimeOffset.UtcNow - Model.LastUpdated;
bool hasBeta = Model.BetaVersion != null;
- string betaLabel = "SDV @Model.BetaVersion only";
+ string betaLabel = $"SDV {Model.BetaVersion} only";
}
@section Head {
<link rel="stylesheet" href="~/Content/css/mods.css?r=20200218" />