Skip to content

Commit

Permalink
Merge pull request #2688 from erri120/fix/smapi-version-recommendation
Browse files Browse the repository at this point in the history
Recommend latest supported SMAPI version for game version
  • Loading branch information
erri120 authored Feb 20, 2025
2 parents d7b7e3c + 7e1e5a8 commit 4c8a8c4
Showing 1 changed file with 37 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
using NexusMods.Abstractions.Diagnostics.References;
using NexusMods.Abstractions.Games;
using NexusMods.Abstractions.Loadouts;
using NexusMods.Extensions.BCL;
using NexusMods.Games.StardewValley.Models;
using StardewModdingAPI;
using StardewModdingAPI.Toolkit;
Expand Down Expand Up @@ -41,6 +42,7 @@ public async IAsyncEnumerable<Diagnostic> Diagnose(Loadout.ReadOnly loadout, [En
if (gameToSMAPIMappings is null) yield break;

var gameVersion = new SemanticVersion((loadout.InstallationInstance.Game as AGame)!.GetLocalVersion(loadout.Installation));
// var gameVersion = new SemanticVersion("1.6.12");

if (!Helpers.TryGetSMAPI(loadout, out var smapi))
{
Expand All @@ -64,14 +66,14 @@ public async IAsyncEnumerable<Diagnostic> Diagnose(Loadout.ReadOnly loadout, [En
_logger.LogError("Unable to get the version of the SMAPI mod");
yield break;
}

if (!SemanticVersion.TryParse(smapiVersionString, out var smapiVersion))
{
_logger.LogError("Unable to parse `{Version}` as a semantic version", smapiVersionString);
yield break;
}

// var smapiVersion = SimplifyVersion(new Version("4.0.6.1254"));
// var smapiVersion = new SemanticVersion("4.1.10");

if (!TryGetValue(smapiToGameMappings, smapiVersion, useEquals: true, out var supportedGameVersions))
{
Expand Down Expand Up @@ -127,8 +129,11 @@ public async IAsyncEnumerable<Diagnostic> Diagnose(Loadout.ReadOnly loadout, [En

if (!TryGetValue(gameToSMAPIMappings, gameVersion, useEquals: false, out var supportedSMAPIVersion))
{
_logger.LogWarning("Found details for game version {GameVersion}", gameVersion);
return null;
if (!TryGetLastSupportedSMAPIVersion(gameToSMAPIMappings, gameVersion, out supportedSMAPIVersion))
{
_logger.LogWarning("No data to recommend latest supported SMAPI version for `{GameVersion}`", gameVersion);
return null;
}
}

return Diagnostics.CreateGameVersionNewerThanMaximumGameVersion(
Expand Down Expand Up @@ -157,8 +162,11 @@ public async IAsyncEnumerable<Diagnostic> Diagnose(Loadout.ReadOnly loadout, [En

if (!TryGetValue(gameToSMAPIMappings, gameVersion, useEquals: true, out var supportedSMAPIVersion))
{
_logger.LogWarning("Found details for game version {GameVersion}", gameVersion);
return null;
if (!TryGetLastSupportedSMAPIVersion(gameToSMAPIMappings, gameVersion, out supportedSMAPIVersion))
{
_logger.LogWarning("No data to recommend latest supported SMAPI version for `{GameVersion}`", gameVersion);
return null;
}
}

return Diagnostics.CreateGameVersionOlderThanMinimumGameVersion(
Expand All @@ -171,6 +179,29 @@ public async IAsyncEnumerable<Diagnostic> Diagnose(Loadout.ReadOnly loadout, [En
);
}

/// <summary>
/// Returns the latest supported SMAPI version for <paramref name="gameVersion"/>.
/// </summary>
private static bool TryGetLastSupportedSMAPIVersion(
GameToSMAPIMapping gameToSmapiMappings,
ISemanticVersion gameVersion,
[NotNullWhen(true)] out ISemanticVersion? supportedSMAPIVersion)
{
var found = gameToSmapiMappings
.OrderByDescending(static kv => kv.Key)
.SkipWhile(current => current.Key.CompareTo(gameVersion) >= 0)
.TryGetFirst(out var mapping);

if (!found)
{
supportedSMAPIVersion = null;
return false;
}

supportedSMAPIVersion = mapping.Value;
return true;
}

private static bool TryGetValue<T>(
ImmutableDictionary<ISemanticVersion, T> dictionary,
ISemanticVersion input,
Expand Down

0 comments on commit 4c8a8c4

Please sign in to comment.