summaryrefslogtreecommitdiff
path: root/src/StardewModdingAPI/Program.cs
diff options
context:
space:
mode:
authorJesse Plamondon-Willard <github@jplamondonw.com>2016-11-22 00:03:14 -0500
committerJesse Plamondon-Willard <github@jplamondonw.com>2016-11-26 13:14:26 -0500
commit08d5ee293ffc001dff3e866bd45954ef306e81ac (patch)
treeba7ef436d1634bb2f372db4e015acde176905947 /src/StardewModdingAPI/Program.cs
parent517a9d82fc1234b6c6ae6f1e45ef7c0f160ee6c5 (diff)
downloadSMAPI-08d5ee293ffc001dff3e866bd45954ef306e81ac.tar.gz
SMAPI-08d5ee293ffc001dff3e866bd45954ef306e81ac.tar.bz2
SMAPI-08d5ee293ffc001dff3e866bd45954ef306e81ac.zip
simplify manifest.json path check
Diffstat (limited to 'src/StardewModdingAPI/Program.cs')
-rw-r--r--src/StardewModdingAPI/Program.cs223
1 files changed, 111 insertions, 112 deletions
diff --git a/src/StardewModdingAPI/Program.cs b/src/StardewModdingAPI/Program.cs
index 12b6cad4..255ad365 100644
--- a/src/StardewModdingAPI/Program.cs
+++ b/src/StardewModdingAPI/Program.cs
@@ -301,152 +301,151 @@ namespace StardewModdingAPI
ModAssemblyLoader modAssemblyLoader = new ModAssemblyLoader(Program.CachePath);
foreach (string directory in Directory.GetDirectories(Program.ModPath))
{
- foreach (string manifestPath in Directory.GetFiles(directory, "manifest.json"))
+ // check for cancellation
+ if (Program.CancellationTokenSource.IsCancellationRequested)
{
- // check for cancellation
- if (Program.CancellationTokenSource.IsCancellationRequested)
- {
- Program.Monitor.Log("Shutdown requested; interrupting mod loading.", LogLevel.Error);
- return;
- }
+ Program.Monitor.Log("Shutdown requested; interrupting mod loading.", LogLevel.Error);
+ return;
+ }
- IModHelper helper = new ModHelper(directory);
- string errorPrefix = $"Couldn't load mod for manifest '{manifestPath}'";
+ // get helper
+ IModHelper helper = new ModHelper(directory);
- // read manifest
- Manifest manifest;
- try
+ // get manifest path
+ string manifestPath = Path.Combine(directory, "manifest.json");
+ string errorPrefix = $"Couldn't load mod for manifest '{manifestPath}'";
+ Manifest manifest;
+ try
+ {
+ // read manifest text
+ string json = File.ReadAllText(manifestPath);
+ if (string.IsNullOrEmpty(json))
{
- // read manifest text
- string json = File.ReadAllText(manifestPath);
- if (string.IsNullOrEmpty(json))
- {
- Program.Monitor.Log($"{errorPrefix}: manifest is empty.", LogLevel.Error);
- continue;
- }
-
- // deserialise manifest
- manifest = helper.ReadJsonFile<Manifest>("manifest.json");
- if (manifest == null)
- {
- Program.Monitor.Log($"{errorPrefix}: the manifest file does not exist.", LogLevel.Error);
- continue;
- }
- if (string.IsNullOrEmpty(manifest.EntryDll))
- {
- Program.Monitor.Log($"{errorPrefix}: manifest doesn't specify an entry DLL.", LogLevel.Error);
- continue;
- }
+ Program.Monitor.Log($"{errorPrefix}: manifest is empty.", LogLevel.Error);
+ continue;
+ }
- // log deprecated fields
- if (manifest.UsedAuthourField)
- Program.DeprecationManager.Warn(manifest.Name, $"{nameof(Manifest)}.{nameof(Manifest.Authour)}", "1.0", DeprecationLevel.Notice);
+ // deserialise manifest
+ manifest = helper.ReadJsonFile<Manifest>("manifest.json");
+ if (manifest == null)
+ {
+ Program.Monitor.Log($"{errorPrefix}: the manifest file does not exist.", LogLevel.Error);
+ continue;
}
- catch (Exception ex)
+ if (string.IsNullOrEmpty(manifest.EntryDll))
{
- Program.Monitor.Log($"{errorPrefix}: manifest parsing failed.\n{ex.GetLogSummary()}", LogLevel.Error);
+ Program.Monitor.Log($"{errorPrefix}: manifest doesn't specify an entry DLL.", LogLevel.Error);
continue;
}
- // validate version
- if (!string.IsNullOrWhiteSpace(manifest.MinimumApiVersion))
+ // log deprecated fields
+ if (manifest.UsedAuthourField)
+ Program.DeprecationManager.Warn(manifest.Name, $"{nameof(Manifest)}.{nameof(Manifest.Authour)}", "1.0", DeprecationLevel.Notice);
+ }
+ catch (Exception ex)
+ {
+ Program.Monitor.Log($"{errorPrefix}: manifest parsing failed.\n{ex.GetLogSummary()}", LogLevel.Error);
+ continue;
+ }
+
+ // validate version
+ if (!string.IsNullOrWhiteSpace(manifest.MinimumApiVersion))
+ {
+ try
{
- try
+ Version minVersion = new Version(manifest.MinimumApiVersion);
+ if (minVersion.IsNewerThan(Constants.Version))
{
- Version minVersion = new Version(manifest.MinimumApiVersion);
- if (minVersion.IsNewerThan(Constants.Version))
- {
- Program.Monitor.Log($"{errorPrefix}: this mod requires SMAPI {minVersion} or later. Please update SMAPI to the latest version to use this mod.", LogLevel.Error);
- continue;
- }
- }
- catch (FormatException ex) when (ex.Message.Contains("not a semantic version"))
- {
- Program.Monitor.Log($"{errorPrefix}: the mod specified an invalid minimum SMAPI version '{manifest.MinimumApiVersion}'. This should be a semantic version number like {Constants.Version}.", LogLevel.Error);
+ Program.Monitor.Log($"{errorPrefix}: this mod requires SMAPI {minVersion} or later. Please update SMAPI to the latest version to use this mod.", LogLevel.Error);
continue;
}
}
-
- // create per-save directory
- if (manifest.PerSaveConfigs)
+ catch (FormatException ex) when (ex.Message.Contains("not a semantic version"))
{
- Program.DeprecationManager.Warn(manifest.Name, $"{nameof(Manifest)}.{nameof(Manifest.PerSaveConfigs)}", "1.0", DeprecationLevel.Notice);
- try
- {
- string psDir = Path.Combine(directory, "psconfigs");
- Directory.CreateDirectory(psDir);
- if (!Directory.Exists(psDir))
- {
- Program.Monitor.Log($"{errorPrefix}: couldn't create the per-save configuration directory ('psconfigs') requested by this mod. The failure reason is unknown.", LogLevel.Error);
- continue;
- }
- }
- catch (Exception ex)
- {
- Program.Monitor.Log($"{errorPrefix}: couldm't create the per-save configuration directory ('psconfigs') requested by this mod.\n{ex.GetLogSummary()}", LogLevel.Error);
- continue;
- }
+ Program.Monitor.Log($"{errorPrefix}: the mod specified an invalid minimum SMAPI version '{manifest.MinimumApiVersion}'. This should be a semantic version number like {Constants.Version}.", LogLevel.Error);
+ continue;
}
+ }
- // load assembly
- Assembly modAssembly;
+ // create per-save directory
+ if (manifest.PerSaveConfigs)
+ {
+ Program.DeprecationManager.Warn(manifest.Name, $"{nameof(Manifest)}.{nameof(Manifest.PerSaveConfigs)}", "1.0", DeprecationLevel.Notice);
try
{
- // get assembly path
- string assemblyPath = Path.Combine(directory, manifest.EntryDll);
- if (!File.Exists(assemblyPath))
+ string psDir = Path.Combine(directory, "psconfigs");
+ Directory.CreateDirectory(psDir);
+ if (!Directory.Exists(psDir))
{
- Program.Monitor.Log($"{errorPrefix}: target DLL '{assemblyPath}' does not exist.", LogLevel.Error);
- continue;
- }
-
- // read assembly
- modAssembly = modAssemblyLoader.ProcessAssembly(assemblyPath);
- if (modAssembly.DefinedTypes.Count(x => x.BaseType == typeof(Mod)) == 0)
- {
- Program.Monitor.Log($"{errorPrefix}: the mod DLL does not contain an implementation of the 'Mod' class.", LogLevel.Error);
+ Program.Monitor.Log($"{errorPrefix}: couldn't create the per-save configuration directory ('psconfigs') requested by this mod. The failure reason is unknown.", LogLevel.Error);
continue;
}
}
catch (Exception ex)
{
- Program.Monitor.Log($"{errorPrefix}: an error occurred while optimising the target DLL.\n{ex}", LogLevel.Error);
+ Program.Monitor.Log($"{errorPrefix}: couldm't create the per-save configuration directory ('psconfigs') requested by this mod.\n{ex.GetLogSummary()}", LogLevel.Error);
continue;
}
+ }
- // hook up mod
- try
+ // load assembly
+ Assembly modAssembly;
+ try
+ {
+ // get assembly path
+ string assemblyPath = Path.Combine(directory, manifest.EntryDll);
+ if (!File.Exists(assemblyPath))
{
- TypeInfo modEntryType = modAssembly.DefinedTypes.First(x => x.BaseType == typeof(Mod));
- Mod modEntry = (Mod)modAssembly.CreateInstance(modEntryType.ToString());
- if (modEntry != null)
- {
- // track mod
- Program.ModRegistry.Add(manifest, modAssembly);
-
- // hook up mod
- modEntry.Manifest = manifest;
- modEntry.Helper = helper;
- modEntry.Monitor = new Monitor(manifest.Name, Program.LogFile) { ShowTraceInConsole = Program.DeveloperMode };
- modEntry.PathOnDisk = directory;
- Program.Monitor.Log($"Loaded mod: {modEntry.Manifest.Name} by {modEntry.Manifest.Author}, v{modEntry.Manifest.Version} | {modEntry.Manifest.Description}", LogLevel.Info);
- Program.ModsLoaded += 1;
- modEntry.Entry(); // deprecated since 1.0
- modEntry.Entry((ModHelper)modEntry.Helper); // deprecated since 1.1
- modEntry.Entry(modEntry.Helper); // deprecated since 1.1
-
- // raise deprecation warning for old Entry() method
- if (Program.DeprecationManager.IsVirtualMethodImplemented(modEntryType, typeof(Mod), nameof(Mod.Entry), new[] { typeof(object[]) }))
- Program.DeprecationManager.Warn(manifest.Name, $"an old version of {nameof(Mod)}.{nameof(Mod.Entry)}", "1.0", DeprecationLevel.Notice);
- if (Program.DeprecationManager.IsVirtualMethodImplemented(modEntryType, typeof(Mod), nameof(Mod.Entry), new[] { typeof(ModHelper) }))
- Program.DeprecationManager.Warn(manifest.Name, $"an old version of {nameof(Mod)}.{nameof(Mod.Entry)}", "1.1", DeprecationLevel.Notice);
- }
+ Program.Monitor.Log($"{errorPrefix}: target DLL '{assemblyPath}' does not exist.", LogLevel.Error);
+ continue;
}
- catch (Exception ex)
+
+ // read assembly
+ modAssembly = modAssemblyLoader.ProcessAssembly(assemblyPath);
+ if (modAssembly.DefinedTypes.Count(x => x.BaseType == typeof(Mod)) == 0)
+ {
+ Program.Monitor.Log($"{errorPrefix}: the mod DLL does not contain an implementation of the 'Mod' class.", LogLevel.Error);
+ continue;
+ }
+ }
+ catch (Exception ex)
+ {
+ Program.Monitor.Log($"{errorPrefix}: an error occurred while optimising the target DLL.\n{ex}", LogLevel.Error);
+ continue;
+ }
+
+ // hook up mod
+ try
+ {
+ TypeInfo modEntryType = modAssembly.DefinedTypes.First(x => x.BaseType == typeof(Mod));
+ Mod modEntry = (Mod)modAssembly.CreateInstance(modEntryType.ToString());
+ if (modEntry != null)
{
- Program.Monitor.Log($"{errorPrefix}: an error occurred while loading the target DLL.\n{ex.GetLogSummary()}", LogLevel.Error);
+ // track mod
+ Program.ModRegistry.Add(manifest, modAssembly);
+
+ // hook up mod
+ modEntry.Manifest = manifest;
+ modEntry.Helper = helper;
+ modEntry.Monitor = new Monitor(manifest.Name, Program.LogFile) { ShowTraceInConsole = Program.DeveloperMode };
+ modEntry.PathOnDisk = directory;
+ Program.Monitor.Log($"Loaded mod: {modEntry.Manifest.Name} by {modEntry.Manifest.Author}, v{modEntry.Manifest.Version} | {modEntry.Manifest.Description}", LogLevel.Info);
+ Program.ModsLoaded += 1;
+ modEntry.Entry(); // deprecated since 1.0
+ modEntry.Entry((ModHelper)modEntry.Helper); // deprecated since 1.1
+ modEntry.Entry(modEntry.Helper); // deprecated since 1.1
+
+ // raise deprecation warning for old Entry() method
+ if (Program.DeprecationManager.IsVirtualMethodImplemented(modEntryType, typeof(Mod), nameof(Mod.Entry), new[] { typeof(object[]) }))
+ Program.DeprecationManager.Warn(manifest.Name, $"an old version of {nameof(Mod)}.{nameof(Mod.Entry)}", "1.0", DeprecationLevel.Notice);
+ if (Program.DeprecationManager.IsVirtualMethodImplemented(modEntryType, typeof(Mod), nameof(Mod.Entry), new[] { typeof(ModHelper) }))
+ Program.DeprecationManager.Warn(manifest.Name, $"an old version of {nameof(Mod)}.{nameof(Mod.Entry)}", "1.1", DeprecationLevel.Notice);
}
}
+ catch (Exception ex)
+ {
+ Program.Monitor.Log($"{errorPrefix}: an error occurred while loading the target DLL.\n{ex.GetLogSummary()}", LogLevel.Error);
+ }
}
// print result