summaryrefslogtreecommitdiff
path: root/src/StardewModdingAPI/Framework
diff options
context:
space:
mode:
Diffstat (limited to 'src/StardewModdingAPI/Framework')
-rw-r--r--src/StardewModdingAPI/Framework/Models/GitRelease.cs19
-rw-r--r--src/StardewModdingAPI/Framework/Models/SConfig.cs14
-rw-r--r--src/StardewModdingAPI/Framework/UpdateHelper.cs67
3 files changed, 60 insertions, 40 deletions
diff --git a/src/StardewModdingAPI/Framework/Models/GitRelease.cs b/src/StardewModdingAPI/Framework/Models/GitRelease.cs
deleted file mode 100644
index bc53468f..00000000
--- a/src/StardewModdingAPI/Framework/Models/GitRelease.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-using Newtonsoft.Json;
-
-namespace StardewModdingAPI.Framework.Models
-{
- /// <summary>Metadata about a GitHub release tag.</summary>
- internal class GitRelease
- {
- /*********
- ** Accessors
- *********/
- /// <summary>The display name.</summary>
- [JsonProperty("name")]
- public string Name { get; set; }
-
- /// <summary>The semantic version string.</summary>
- [JsonProperty("tag_name")]
- public string Tag { get; set; }
- }
-} \ No newline at end of file
diff --git a/src/StardewModdingAPI/Framework/Models/SConfig.cs b/src/StardewModdingAPI/Framework/Models/SConfig.cs
index b2ca4113..36799400 100644
--- a/src/StardewModdingAPI/Framework/Models/SConfig.cs
+++ b/src/StardewModdingAPI/Framework/Models/SConfig.cs
@@ -1,4 +1,4 @@
-namespace StardewModdingAPI.Framework.Models
+namespace StardewModdingAPI.Framework.Models
{
/// <summary>The SMAPI configuration settings.</summary>
internal class SConfig
@@ -9,11 +9,17 @@
/// <summary>Whether to enable development features.</summary>
public bool DeveloperMode { get; set; }
- /// <summary>Whether to check if a newer version of SMAPI is available on startup.</summary>
- public bool CheckForUpdates { get; set; } = true;
+ /// <summary>Whether to check for newer versions of SMAPI and mods on startup.</summary>
+ public bool CheckForUpdates { get; set; }
+
+ /// <summary>SMAPI's GitHub project name, used to perform update checks.</summary>
+ public string GitHubProjectName { get; set; }
+
+ /// <summary>The base URL for SMAPI's web API, used to perform update checks.</summary>
+ public string WebApiBaseUrl { get; set; }
/// <summary>Whether SMAPI should log more information about the game context.</summary>
- public bool VerboseLogging { get; set; } = false;
+ public bool VerboseLogging { get; set; }
/// <summary>A list of mod versions which should be considered compatible or incompatible regardless of whether SMAPI detects incompatible code.</summary>
public ModCompatibility[] ModCompatibility { get; set; }
diff --git a/src/StardewModdingAPI/Framework/UpdateHelper.cs b/src/StardewModdingAPI/Framework/UpdateHelper.cs
index e01e55c8..0ee57648 100644
--- a/src/StardewModdingAPI/Framework/UpdateHelper.cs
+++ b/src/StardewModdingAPI/Framework/UpdateHelper.cs
@@ -1,36 +1,69 @@
-using System.IO;
+using System;
+using System.Collections.Generic;
+using System.IO;
using System.Net;
-using System.Reflection;
using System.Threading.Tasks;
using Newtonsoft.Json;
-using StardewModdingAPI.Framework.Models;
+using StardewModdingAPI.Models;
namespace StardewModdingAPI.Framework
{
- /// <summary>Provides utility methods for mod updates.</summary>
- internal class UpdateHelper
+ /// <summary>Provides methods for interacting with the SMAPI web API.</summary>
+ internal class WebApiClient
{
/*********
+ ** Properties
+ *********/
+ /// <summary>The base URL for the web API.</summary>
+ private readonly Uri BaseUrl;
+
+ /// <summary>The API version number.</summary>
+ private readonly ISemanticVersion Version;
+
+
+ /*********
** Public methods
*********/
- /// <summary>Get the latest release from a GitHub repository.</summary>
- /// <param name="repository">The name of the repository from which to fetch releases (like "cjsu/SMAPI").</param>
- public static async Task<GitRelease> GetLatestVersionAsync(string repository)
+ /// <summary>Construct an instance.</summary>
+ /// <param name="baseUrl">The base URL for the web API.</param>
+ /// <param name="version">The web API version.</param>
+ public WebApiClient(string baseUrl, ISemanticVersion version)
+ {
+#if !SMAPI_FOR_WINDOWS
+ baseUrl = baseUrl.Replace("https://", "http://"); // workaround for OpenSSL issues with the game's bundled Mono on Linux/Mac
+#endif
+ this.BaseUrl = new Uri(baseUrl);
+ this.Version = version;
+ }
+
+ /// <summary>Get the latest SMAPI version.</summary>
+ /// <param name="modKeys">The mod keys for which to fetch the latest version.</param>
+ public async Task<IDictionary<string, ModInfoModel>> GetModInfoAsync(params string[] modKeys)
{
- // build request
- // (avoid HttpClient for Mac compatibility)
- HttpWebRequest request = WebRequest.CreateHttp($"https://api.github.com/repos/{repository}/releases/latest");
- AssemblyName assembly = typeof(UpdateHelper).Assembly.GetName();
- request.UserAgent = $"{assembly.Name}/{assembly.Version}";
- request.Accept = "application/vnd.github.v3+json";
-
- // fetch data
+ string url = $"v{this.Version}/mods?modKeys={Uri.EscapeDataString(string.Join(",", modKeys))}";
+ return await this.GetAsync<Dictionary<string, ModInfoModel>>(url);
+ }
+
+
+ /*********
+ ** Private methods
+ *********/
+ /// <summary>Fetch the response from the backend API.</summary>
+ /// <typeparam name="T">The expected response type.</typeparam>
+ /// <param name="url">The request URL, optionally excluding the base URL.</param>
+ private async Task<T> GetAsync<T>(string url)
+ {
+ // build request (avoid HttpClient for Mac compatibility)
+ HttpWebRequest request = WebRequest.CreateHttp(new Uri(this.BaseUrl, url).ToString());
+ request.UserAgent = $"SMAPI/{this.Version}";
+
+ // fetch data
using (WebResponse response = await request.GetResponseAsync())
using (Stream responseStream = response.GetResponseStream())
using (StreamReader reader = new StreamReader(responseStream))
{
string responseText = reader.ReadToEnd();
- return JsonConvert.DeserializeObject<GitRelease>(responseText);
+ return JsonConvert.DeserializeObject<T>(responseText);
}
}
}