summaryrefslogtreecommitdiff
path: root/src/SMAPI.Web/Framework/Clients/ModDrop
diff options
context:
space:
mode:
authorJesse Plamondon-Willard <Pathoschild@users.noreply.github.com>2022-04-12 19:15:39 -0400
committerJesse Plamondon-Willard <Pathoschild@users.noreply.github.com>2022-04-12 19:15:39 -0400
commit0b48c1748b354458059c7607415288de072b01e9 (patch)
treef63fd950f565d363414eb692be9024895cdea174 /src/SMAPI.Web/Framework/Clients/ModDrop
parent9fbed0fa1f28a9b0fe0b952a78b10e2d475adb03 (diff)
downloadSMAPI-0b48c1748b354458059c7607415288de072b01e9.tar.gz
SMAPI-0b48c1748b354458059c7607415288de072b01e9.tar.bz2
SMAPI-0b48c1748b354458059c7607415288de072b01e9.zip
enable nullable annotations in the web project & related code (#837)
Diffstat (limited to 'src/SMAPI.Web/Framework/Clients/ModDrop')
-rw-r--r--src/SMAPI.Web/Framework/Clients/ModDrop/ModDropClient.cs20
-rw-r--r--src/SMAPI.Web/Framework/Clients/ModDrop/ResponseModels/FileDataModel.cs42
-rw-r--r--src/SMAPI.Web/Framework/Clients/ModDrop/ResponseModels/ModDataModel.cs24
-rw-r--r--src/SMAPI.Web/Framework/Clients/ModDrop/ResponseModels/ModListModel.cs7
-rw-r--r--src/SMAPI.Web/Framework/Clients/ModDrop/ResponseModels/ModModel.cs22
5 files changed, 86 insertions, 29 deletions
diff --git a/src/SMAPI.Web/Framework/Clients/ModDrop/ModDropClient.cs b/src/SMAPI.Web/Framework/Clients/ModDrop/ModDropClient.cs
index 1a11a606..c60b2c90 100644
--- a/src/SMAPI.Web/Framework/Clients/ModDrop/ModDropClient.cs
+++ b/src/SMAPI.Web/Framework/Clients/ModDrop/ModDropClient.cs
@@ -1,6 +1,5 @@
-#nullable disable
-
using System.Collections.Generic;
+using System.Diagnostics.CodeAnalysis;
using System.Threading.Tasks;
using Pathoschild.Http.Client;
using StardewModdingAPI.Toolkit.Framework.UpdateData;
@@ -43,9 +42,10 @@ namespace StardewModdingAPI.Web.Framework.Clients.ModDrop
/// <summary>Get update check info about a mod.</summary>
/// <param name="id">The mod ID.</param>
- public async Task<IModPage> GetModData(string id)
+ [SuppressMessage("ReSharper", "ConstantConditionalAccessQualifier", Justification = "The nullability is validated in this method.")]
+ public async Task<IModPage?> GetModData(string id)
{
- var page = new GenericModPage(this.SiteKey, id);
+ IModPage page = new GenericModPage(this.SiteKey, id);
if (!long.TryParse(id, out long parsedId))
return page.SetError(RemoteModStatus.DoesNotExist, $"The value '{id}' isn't a valid ModDrop mod ID, must be an integer ID.");
@@ -60,9 +60,11 @@ namespace StardewModdingAPI.Web.Framework.Clients.ModDrop
Mods = true
})
.As<ModListModel>();
- ModModel mod = response.Mods[parsedId];
- if (mod.Mod?.Title == null || mod.Mod.ErrorCode.HasValue)
- return null;
+
+ if (!response.Mods.TryGetValue(parsedId, out ModModel? mod) || mod?.Mod is null)
+ return page.SetError(RemoteModStatus.DoesNotExist, "Found no ModDrop page with this ID.");
+ if (mod.Mod.ErrorCode is not null)
+ return page.SetError(RemoteModStatus.InvalidData, $"ModDrop returned error code {mod.Mod.ErrorCode} for mod ID '{id}'.");
// get files
var downloads = new List<IModDownload>();
@@ -77,7 +79,7 @@ namespace StardewModdingAPI.Web.Framework.Clients.ModDrop
}
// return info
- string name = mod.Mod?.Title;
+ string name = mod.Mod.Title;
string url = string.Format(this.ModUrlFormat, id);
return page.SetInfo(name: name, version: null, url: url, downloads: downloads);
}
@@ -85,7 +87,7 @@ namespace StardewModdingAPI.Web.Framework.Clients.ModDrop
/// <summary>Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.</summary>
public void Dispose()
{
- this.Client?.Dispose();
+ this.Client.Dispose();
}
}
}
diff --git a/src/SMAPI.Web/Framework/Clients/ModDrop/ResponseModels/FileDataModel.cs b/src/SMAPI.Web/Framework/Clients/ModDrop/ResponseModels/FileDataModel.cs
index dd6a95e0..31905338 100644
--- a/src/SMAPI.Web/Framework/Clients/ModDrop/ResponseModels/FileDataModel.cs
+++ b/src/SMAPI.Web/Framework/Clients/ModDrop/ResponseModels/FileDataModel.cs
@@ -1,5 +1,3 @@
-#nullable disable
-
using Newtonsoft.Json;
namespace StardewModdingAPI.Web.Framework.Clients.ModDrop.ResponseModels
@@ -7,27 +5,53 @@ namespace StardewModdingAPI.Web.Framework.Clients.ModDrop.ResponseModels
/// <summary>Metadata from the ModDrop API about a mod file.</summary>
public class FileDataModel
{
+ /*********
+ ** Accessors
+ *********/
/// <summary>The file title.</summary>
[JsonProperty("title")]
- public string Name { get; set; }
+ public string Name { get; }
/// <summary>The file description.</summary>
[JsonProperty("desc")]
- public string Description { get; set; }
+ public string Description { get; }
/// <summary>The file version.</summary>
- public string Version { get; set; }
+ public string Version { get; }
/// <summary>Whether the file is deleted.</summary>
- public bool IsDeleted { get; set; }
+ public bool IsDeleted { get; }
/// <summary>Whether the file is hidden from users.</summary>
- public bool IsHidden { get; set; }
+ public bool IsHidden { get; }
/// <summary>Whether this is the default file for the mod.</summary>
- public bool IsDefault { get; set; }
+ public bool IsDefault { get; }
/// <summary>Whether this is an archived file.</summary>
- public bool IsOld { get; set; }
+ public bool IsOld { get; }
+
+
+ /*********
+ ** Public methods
+ *********/
+ /// <summary>Construct an instance.</summary>
+ /// <param name="name">The file title.</param>
+ /// <param name="description">The file description.</param>
+ /// <param name="version">The file version.</param>
+ /// <param name="isDeleted">Whether the file is deleted.</param>
+ /// <param name="isHidden">Whether the file is hidden from users.</param>
+ /// <param name="isDefault">Whether this is the default file for the mod.</param>
+ /// <param name="isOld">Whether this is an archived file.</param>
+ public FileDataModel(string name, string description, string version, bool isDeleted, bool isHidden, bool isDefault, bool isOld)
+ {
+ this.Name = name;
+ this.Description = description;
+ this.Version = version;
+ this.IsDeleted = isDeleted;
+ this.IsHidden = isHidden;
+ this.IsDefault = isDefault;
+ this.IsOld = isOld;
+ }
}
}
diff --git a/src/SMAPI.Web/Framework/Clients/ModDrop/ResponseModels/ModDataModel.cs b/src/SMAPI.Web/Framework/Clients/ModDrop/ResponseModels/ModDataModel.cs
index 6cae16d9..0654b576 100644
--- a/src/SMAPI.Web/Framework/Clients/ModDrop/ResponseModels/ModDataModel.cs
+++ b/src/SMAPI.Web/Framework/Clients/ModDrop/ResponseModels/ModDataModel.cs
@@ -1,17 +1,33 @@
-#nullable disable
-
namespace StardewModdingAPI.Web.Framework.Clients.ModDrop.ResponseModels
{
/// <summary>Metadata about a mod from the ModDrop API.</summary>
public class ModDataModel
{
+ /*********
+ ** Accessors
+ *********/
/// <summary>The mod's unique ID on ModDrop.</summary>
public int ID { get; set; }
+ /// <summary>The mod name.</summary>
+ public string Title { get; set; }
+
/// <summary>The error code, if any.</summary>
public int? ErrorCode { get; set; }
- /// <summary>The mod name.</summary>
- public string Title { get; set; }
+
+ /*********
+ ** Public methods
+ *********/
+ /// <summary>Construct an instance.</summary>
+ /// <param name="id">The mod's unique ID on ModDrop.</param>
+ /// <param name="title">The mod name.</param>
+ /// <param name="errorCode">The error code, if any.</param>
+ public ModDataModel(int id, string title, int? errorCode)
+ {
+ this.ID = id;
+ this.Title = title;
+ this.ErrorCode = errorCode;
+ }
}
}
diff --git a/src/SMAPI.Web/Framework/Clients/ModDrop/ResponseModels/ModListModel.cs b/src/SMAPI.Web/Framework/Clients/ModDrop/ResponseModels/ModListModel.cs
index 445e25cb..cb4be35c 100644
--- a/src/SMAPI.Web/Framework/Clients/ModDrop/ResponseModels/ModListModel.cs
+++ b/src/SMAPI.Web/Framework/Clients/ModDrop/ResponseModels/ModListModel.cs
@@ -1,5 +1,3 @@
-#nullable disable
-
using System.Collections.Generic;
namespace StardewModdingAPI.Web.Framework.Clients.ModDrop.ResponseModels
@@ -7,7 +5,10 @@ namespace StardewModdingAPI.Web.Framework.Clients.ModDrop.ResponseModels
/// <summary>A list of mods from the ModDrop API.</summary>
public class ModListModel
{
+ /*********
+ ** Accessors
+ *********/
/// <summary>The mod data.</summary>
- public IDictionary<long, ModModel> Mods { get; set; }
+ public IDictionary<long, ModModel> Mods { get; } = new Dictionary<long, ModModel>();
}
}
diff --git a/src/SMAPI.Web/Framework/Clients/ModDrop/ResponseModels/ModModel.cs b/src/SMAPI.Web/Framework/Clients/ModDrop/ResponseModels/ModModel.cs
index 8869193e..60b818d6 100644
--- a/src/SMAPI.Web/Framework/Clients/ModDrop/ResponseModels/ModModel.cs
+++ b/src/SMAPI.Web/Framework/Clients/ModDrop/ResponseModels/ModModel.cs
@@ -1,14 +1,28 @@
-#nullable disable
-
namespace StardewModdingAPI.Web.Framework.Clients.ModDrop.ResponseModels
{
/// <summary>An entry in a mod list from the ModDrop API.</summary>
public class ModModel
{
+ /*********
+ ** Accessors
+ *********/
/// <summary>The available file downloads.</summary>
- public FileDataModel[] Files { get; set; }
+ public FileDataModel[] Files { get; }
/// <summary>The mod metadata.</summary>
- public ModDataModel Mod { get; set; }
+ public ModDataModel Mod { get; }
+
+
+ /*********
+ ** Public methods
+ *********/
+ /// <summary>Construct an instance.</summary>
+ /// <param name="files">The available file downloads.</param>
+ /// <param name="mod">The mod metadata.</param>
+ public ModModel(FileDataModel[] files, ModDataModel mod)
+ {
+ this.Files = files;
+ this.Mod = mod;
+ }
}
}