summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Volchek <volchek2@illinois.edu>2018-06-10 15:05:59 -0700
committerDan Volchek <volchek2@illinois.edu>2018-06-10 15:05:59 -0700
commit0b2e46d55cb09a169c7bb64ade37c82fc8233cb3 (patch)
tree63baa56fd371e92eec6b509241c0037c3b68df59
parent1fa2632289134c39f268c374bb290549f28751d5 (diff)
downloadSMAPI-0b2e46d55cb09a169c7bb64ade37c82fc8233cb3.tar.gz
SMAPI-0b2e46d55cb09a169c7bb64ade37c82fc8233cb3.tar.bz2
SMAPI-0b2e46d55cb09a169c7bb64ade37c82fc8233cb3.zip
refactor IModMetadata update info
-rw-r--r--src/SMAPI/Framework/IModMetadata.cs28
-rw-r--r--src/SMAPI/Framework/ModLoading/ModMetadata.cs36
-rw-r--r--src/SMAPI/Framework/ModUpdateChecking/ModUpdateStatus.cs32
-rw-r--r--src/SMAPI/Program.cs39
-rw-r--r--src/SMAPI/StardewModdingAPI.csproj1
5 files changed, 77 insertions, 59 deletions
diff --git a/src/SMAPI/Framework/IModMetadata.cs b/src/SMAPI/Framework/IModMetadata.cs
index 7bf7d98c..b71c8056 100644
--- a/src/SMAPI/Framework/IModMetadata.cs
+++ b/src/SMAPI/Framework/IModMetadata.cs
@@ -1,5 +1,6 @@
using StardewModdingAPI.Framework.ModData;
using StardewModdingAPI.Framework.ModLoading;
+using StardewModdingAPI.Framework.ModUpdateChecking;
namespace StardewModdingAPI.Framework
{
@@ -45,14 +46,11 @@ namespace StardewModdingAPI.Framework
/// <summary>Whether the mod is a content pack.</summary>
bool IsContentPack { get; }
- /// <summary>The latest version of the mod.</summary>
- ISemanticVersion LatestVersion { get; }
+ /// <summary>The update status of this mod (if any).</summary>
+ ModUpdateStatus UpdateStatus { get; }
- /// <summary>The latest preview version of the mod, if any.</summary>
- ISemanticVersion LatestPreviewVersion { get; }
-
- /// <summary>The error checking for updates for this mod, if any.</summary>
- string UpdateCheckError { get; }
+ /// <summary>The preview update status of this mod (if any).</summary>
+ ModUpdateStatus PreviewUpdateStatus { get; }
/*********
** Public methods
@@ -80,17 +78,13 @@ namespace StardewModdingAPI.Framework
/// <param name="api">The mod-provided API.</param>
IModMetadata SetApi(object api);
- /// <summary>Set the update version.</summary>
- /// <param name="latestVersion">The latest version.</param>
- IModMetadata SetUpdateVersion(ISemanticVersion latestVersion);
-
- /// <summary>Set the preview update version.</summary>
- /// <param name="latestPreviewVersion">The latest preview version.</param>
- IModMetadata SetPreviewUpdateVersion(ISemanticVersion latestPreviewVersion);
+ /// <summary>Set the update status.</summary>
+ /// <param name="updateStatus">The mod update status.</param>
+ IModMetadata SetUpdateStatus(ModUpdateStatus updateStatus);
- /// <summary>Set the error that occured while checking for updates.</summary>
- /// <param name="updateCheckError">The error checking for updates.</param>
- IModMetadata SetUpdateError(string updateCheckError);
+ /// <summary>Set the preview update status.</summary>
+ /// <param name="previewUpdateStatus">The mod preview update status.</param>
+ IModMetadata SetPreviewUpdateStatus(ModUpdateStatus previewUpdateStatus);
/// <summary>Whether the mod manifest was loaded (regardless of whether the mod itself was loaded).</summary>
bool HasManifest();
diff --git a/src/SMAPI/Framework/ModLoading/ModMetadata.cs b/src/SMAPI/Framework/ModLoading/ModMetadata.cs
index 1ead1387..88d2770c 100644
--- a/src/SMAPI/Framework/ModLoading/ModMetadata.cs
+++ b/src/SMAPI/Framework/ModLoading/ModMetadata.cs
@@ -1,6 +1,7 @@
using System;
using System.Linq;
using StardewModdingAPI.Framework.ModData;
+using StardewModdingAPI.Framework.ModUpdateChecking;
namespace StardewModdingAPI.Framework.ModLoading
{
@@ -43,14 +44,11 @@ namespace StardewModdingAPI.Framework.ModLoading
/// <summary>The mod-provided API (if any).</summary>
public object Api { get; private set; }
- /// <summary>The latest version of the mod.</summary>
- public ISemanticVersion LatestVersion { get; private set; }
+ /// <summary>The update status of this mod (if any).</summary>
+ public ModUpdateStatus UpdateStatus { get; private set; }
- /// <summary>The latest preview version of the mod, if any.</summary>
- public ISemanticVersion LatestPreviewVersion { get; private set; }
-
- /// <summary>The error checking for updates for this mod, if any.</summary>
- public string UpdateCheckError { get; private set; }
+ /// <summary>The preview update status of this mod (if any).</summary>
+ public ModUpdateStatus PreviewUpdateStatus { get; private set; }
/// <summary>Whether the mod is a content pack.</summary>
public bool IsContentPack => this.Manifest?.ContentPackFor != null;
@@ -124,27 +122,19 @@ namespace StardewModdingAPI.Framework.ModLoading
return this;
}
- /// <summary>Set the update version.</summary>
- /// <param name="latestVersion">The latest version.</param>
- public IModMetadata SetUpdateVersion(ISemanticVersion latestVersion)
- {
- this.LatestVersion = latestVersion;
- return this;
- }
-
- /// <summary>Set the preview update version.</summary>
- /// <param name="latestPreviewVersion">The latest preview version.</param>
- public IModMetadata SetPreviewUpdateVersion(ISemanticVersion latestPreviewVersion)
+ /// <summary>Set the update status.</summary>
+ /// <param name="updateStatus">The mod update status.</param>
+ public IModMetadata SetUpdateStatus(ModUpdateStatus updateStatus)
{
- this.LatestPreviewVersion = latestPreviewVersion;
+ this.UpdateStatus = updateStatus;
return this;
}
- /// <summary>Set the error that occured while checking for updates.</summary>
- /// <param name="updateCheckError">The error checking for updates.</param>
- public IModMetadata SetUpdateError(string updateCheckError)
+ /// <summary>Set the preview update status.</summary>
+ /// <param name="previewUpdateStatus">The mod preview update status.</param>
+ public IModMetadata SetPreviewUpdateStatus(ModUpdateStatus previewUpdateStatus)
{
- this.UpdateCheckError = updateCheckError;
+ this.PreviewUpdateStatus = previewUpdateStatus;
return this;
}
diff --git a/src/SMAPI/Framework/ModUpdateChecking/ModUpdateStatus.cs b/src/SMAPI/Framework/ModUpdateChecking/ModUpdateStatus.cs
new file mode 100644
index 00000000..7f588b66
--- /dev/null
+++ b/src/SMAPI/Framework/ModUpdateChecking/ModUpdateStatus.cs
@@ -0,0 +1,32 @@
+namespace StardewModdingAPI.Framework.ModUpdateChecking
+{
+ /// <summary>Update status for a mod.</summary>
+ internal class ModUpdateStatus
+ {
+ /*********
+ ** Accessors
+ *********/
+ /// <summary>The version that this mod can be updated to (if any).</summary>
+ public ISemanticVersion Version { get; }
+
+ /// <summary>The error checking for updates of this mod (if any).</summary>
+ public string Error { get; }
+
+ /*********
+ ** Public methods
+ *********/
+ /// <summary>Construct an instance.</summary>
+ /// <param name="version">The version that this mod can be update to.</param>
+ public ModUpdateStatus(ISemanticVersion version)
+ {
+ this.Version = version;
+ }
+
+ /// <summary>Construct an instance.</summary>
+ /// <param name="error">The error checking for updates of this mod.</param>
+ public ModUpdateStatus(string error)
+ {
+ this.Error = error;
+ }
+ }
+}
diff --git a/src/SMAPI/Program.cs b/src/SMAPI/Program.cs
index e6aafb2d..96061b2a 100644
--- a/src/SMAPI/Program.cs
+++ b/src/SMAPI/Program.cs
@@ -24,6 +24,7 @@ using StardewModdingAPI.Framework.ModData;
using StardewModdingAPI.Framework.Models;
using StardewModdingAPI.Framework.ModHelpers;
using StardewModdingAPI.Framework.ModLoading;
+using StardewModdingAPI.Framework.ModUpdateChecking;
using StardewModdingAPI.Framework.Patching;
using StardewModdingAPI.Framework.Reflection;
using StardewModdingAPI.Framework.Serialisation;
@@ -671,46 +672,46 @@ namespace StardewModdingAPI
// handle error
if (remoteInfo.Error != null)
{
- if(mod.LatestVersion == null && mod.LatestPreviewVersion == null)
- mod.SetUpdateError(remoteInfo.Error);
+ if (mod.UpdateStatus?.Version == null)
+ mod.SetUpdateStatus(new ModUpdateStatus(remoteInfo.Error));
+ if (mod.PreviewUpdateStatus?.Version == null)
+ mod.SetUpdateStatus(new ModUpdateStatus(remoteInfo.Error));
+
this.Monitor.Log($" {mod.DisplayName} ({result.Key}): update error: {remoteInfo.Error}", LogLevel.Trace);
continue;
}
// normalise versions
ISemanticVersion localVersion = mod.DataRecord?.GetLocalVersionForUpdateChecks(mod.Manifest.Version) ?? mod.Manifest.Version;
-
bool validVersion = SemanticVersion.TryParse(mod.DataRecord?.GetRemoteVersionForUpdateChecks(remoteInfo.Version) ?? remoteInfo.Version, out ISemanticVersion remoteVersion);
bool validPreviewVersion = SemanticVersion.TryParse(remoteInfo.PreviewVersion, out ISemanticVersion remotePreviewVersion);
+ if (!validVersion && mod.UpdateStatus?.Version == null)
+ mod.SetUpdateStatus(new ModUpdateStatus($"Version is invalid: {remoteInfo.Version}"));
+ if (!validPreviewVersion && mod.PreviewUpdateStatus?.Version == null)
+ mod.SetPreviewUpdateStatus(new ModUpdateStatus($"Version is invalid: {remoteInfo.PreviewVersion}"));
+
if (!validVersion && !validPreviewVersion)
{
- string errorInfo = $"Mod has invalid versions. version: {remoteInfo.Version}, preview version: {remoteInfo.PreviewVersion}";
-
- if (mod.LatestVersion == null && mod.LatestPreviewVersion == null)
- mod.SetUpdateError(errorInfo);
- this.Monitor.Log($" {mod.DisplayName} ({result.Key}): update error: {errorInfo}", LogLevel.Trace);
+ this.Monitor.Log($" {mod.DisplayName} ({result.Key}): update error: Mod has invalid versions. version: {remoteInfo.Version}, preview version: {remoteInfo.PreviewVersion}", LogLevel.Trace);
continue;
}
// compare versions
- bool isNonPreviewUpdate = validVersion && remoteVersion.IsNewerThan(localVersion);
+ bool isPreviewUpdate = validPreviewVersion && localVersion.IsNewerThan(remoteVersion) && remotePreviewVersion.IsNewerThan(localVersion);
+ bool isUpdate = (validVersion && remoteVersion.IsNewerThan(localVersion)) || isPreviewUpdate;
- bool isUpdate = isNonPreviewUpdate ||
- (validPreviewVersion && localVersion.IsNewerThan(remoteVersion) && remotePreviewVersion.IsNewerThan(localVersion));
- this.VerboseLog($" {mod.DisplayName} ({result.Key}): {(isUpdate ? $"{mod.Manifest.Version}{(!localVersion.Equals(mod.Manifest.Version) ? $" [{localVersion}]" : "")} => {(isNonPreviewUpdate ? remoteInfo.Version : remoteInfo.PreviewVersion)}" : "okay")}.");
+ this.VerboseLog($" {mod.DisplayName} ({result.Key}): {(isUpdate ? $"{mod.Manifest.Version}{(!localVersion.Equals(mod.Manifest.Version) ? $" [{localVersion}]" : "")} => {(isPreviewUpdate ? remoteInfo.PreviewVersion : remoteInfo.Version)}" : "okay")}.");
if (isUpdate)
{
- if (!updatesByMod.TryGetValue(mod, out Tuple<ModInfoModel, bool> other) || (isNonPreviewUpdate ? remoteVersion : remotePreviewVersion).IsNewerThan(other.Item2 ? other.Item1.PreviewVersion : other.Item1.Version))
+ if (!updatesByMod.TryGetValue(mod, out Tuple<ModInfoModel, bool> other) || (isPreviewUpdate ? remotePreviewVersion : remoteVersion).IsNewerThan(other.Item2 ? other.Item1.PreviewVersion : other.Item1.Version))
{
- updatesByMod[mod] = new Tuple<ModInfoModel, bool>(remoteInfo, !isNonPreviewUpdate);
+ updatesByMod[mod] = new Tuple<ModInfoModel, bool>(remoteInfo, isPreviewUpdate);
- if (isNonPreviewUpdate)
- mod.SetUpdateVersion(remoteVersion);
+ if (isPreviewUpdate)
+ mod.SetPreviewUpdateStatus(new ModUpdateStatus(remotePreviewVersion));
else
- mod.SetPreviewUpdateVersion(remotePreviewVersion);
-
- mod.SetUpdateError(null);
+ mod.SetUpdateStatus(new ModUpdateStatus(remoteVersion));
}
}
}
diff --git a/src/SMAPI/StardewModdingAPI.csproj b/src/SMAPI/StardewModdingAPI.csproj
index 67c48a57..beaad8e0 100644
--- a/src/SMAPI/StardewModdingAPI.csproj
+++ b/src/SMAPI/StardewModdingAPI.csproj
@@ -108,6 +108,7 @@
<Compile Include="Framework\ContentManagers\IContentManager.cs" />
<Compile Include="Framework\ContentManagers\ModContentManager.cs" />
<Compile Include="Framework\Models\ModFolderExport.cs" />
+ <Compile Include="Framework\ModUpdateChecking\ModUpdateStatus.cs" />
<Compile Include="Framework\Patching\GamePatcher.cs" />
<Compile Include="Framework\Patching\IHarmonyPatch.cs" />
<Compile Include="Framework\Serialisation\ColorConverter.cs" />