summaryrefslogtreecommitdiff
path: root/src/StardewModdingAPI/Framework
diff options
context:
space:
mode:
authorJesse Plamondon-Willard <github@jplamondonw.com>2017-09-23 20:16:52 -0400
committerJesse Plamondon-Willard <github@jplamondonw.com>2017-09-23 20:16:52 -0400
commit36a04a6e77eac74be660dc9848b6045834479f4f (patch)
tree1176a8920a7656f720e0b36ebc4fe45b26cc202a /src/StardewModdingAPI/Framework
parentf0e2117f70455bd9883321ae5b0bf40562f2d5de (diff)
parent57111a6e8fa6a23bb56f515b50f8b7ea5924d49f (diff)
downloadSMAPI-36a04a6e77eac74be660dc9848b6045834479f4f.tar.gz
SMAPI-36a04a6e77eac74be660dc9848b6045834479f4f.tar.bz2
SMAPI-36a04a6e77eac74be660dc9848b6045834479f4f.zip
Merge branch 'feature/update-check-api' into develop
Diffstat (limited to 'src/StardewModdingAPI/Framework')
-rw-r--r--src/StardewModdingAPI/Framework/Models/GitRelease.cs19
-rw-r--r--src/StardewModdingAPI/Framework/Models/Manifest.cs10
-rw-r--r--src/StardewModdingAPI/Framework/Models/SConfig.cs14
-rw-r--r--src/StardewModdingAPI/Framework/SGame.cs2
-rw-r--r--src/StardewModdingAPI/Framework/UpdateHelper.cs37
-rw-r--r--src/StardewModdingAPI/Framework/WebApiClient.cs70
6 files changed, 90 insertions, 62 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/Manifest.cs b/src/StardewModdingAPI/Framework/Models/Manifest.cs
index 29c3517e..f97cb8ff 100644
--- a/src/StardewModdingAPI/Framework/Models/Manifest.cs
+++ b/src/StardewModdingAPI/Framework/Models/Manifest.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Collections.Generic;
using Newtonsoft.Json;
using StardewModdingAPI.Framework.Serialisation;
@@ -35,6 +35,14 @@ namespace StardewModdingAPI.Framework.Models
[JsonConverter(typeof(SFieldConverter))]
public IManifestDependency[] Dependencies { get; set; }
+#if !SMAPI_1_x
+ /// <summary>The mod's unique ID in Nexus Mods (if any), used for update checks.</summary>
+ public string NexusID { get; set; }
+
+ /// <summary>The mod's organisation and project name on GitHub (if any), used for update checks.</summary>
+ public string GitHubProject { get; set; }
+#endif
+
/// <summary>The unique mod ID.</summary>
public string UniqueID { get; set; }
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/SGame.cs b/src/StardewModdingAPI/Framework/SGame.cs
index 76c106d7..387aeacc 100644
--- a/src/StardewModdingAPI/Framework/SGame.cs
+++ b/src/StardewModdingAPI/Framework/SGame.cs
@@ -297,8 +297,8 @@ namespace StardewModdingAPI.Framework
GameEvents.InvokeInitialize(this.Monitor);
#if SMAPI_1_x
GameEvents.InvokeLoadContent(this.Monitor);
-#endif
GameEvents.InvokeGameLoaded(this.Monitor);
+#endif
}
/*********
diff --git a/src/StardewModdingAPI/Framework/UpdateHelper.cs b/src/StardewModdingAPI/Framework/UpdateHelper.cs
deleted file mode 100644
index e01e55c8..00000000
--- a/src/StardewModdingAPI/Framework/UpdateHelper.cs
+++ /dev/null
@@ -1,37 +0,0 @@
-using System.IO;
-using System.Net;
-using System.Reflection;
-using System.Threading.Tasks;
-using Newtonsoft.Json;
-using StardewModdingAPI.Framework.Models;
-
-namespace StardewModdingAPI.Framework
-{
- /// <summary>Provides utility methods for mod updates.</summary>
- internal class UpdateHelper
- {
- /*********
- ** 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)
- {
- // 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
- 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);
- }
- }
- }
-}
diff --git a/src/StardewModdingAPI/Framework/WebApiClient.cs b/src/StardewModdingAPI/Framework/WebApiClient.cs
new file mode 100644
index 00000000..0ee57648
--- /dev/null
+++ b/src/StardewModdingAPI/Framework/WebApiClient.cs
@@ -0,0 +1,70 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Net;
+using System.Threading.Tasks;
+using Newtonsoft.Json;
+using StardewModdingAPI.Models;
+
+namespace StardewModdingAPI.Framework
+{
+ /// <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>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)
+ {
+ 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<T>(responseText);
+ }
+ }
+ }
+}