From a1ddb987e0a37696d4a8c4efa60bffbeb0fba713 Mon Sep 17 00:00:00 2001 From: alterNERDtive Date: Wed, 26 May 2021 17:17:15 +0200 Subject: [PATCH] =?UTF-8?q?RatAttack:=20No=20longer=20trying=20to=20get=20?= =?UTF-8?q?nearest=20CMDR=20for=20the=20new=20=E2=80=9CUnconfirmed?= =?UTF-8?q?=E2=80=9D=20system=20info.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 10 + plugins/RatAttack/RatAttack.cs | 2 +- plugins/VoiceAttack-base/base.cs | 1122 +++++++++++++++--------------- profiles/RatAttack-Profile.vap | Bin 33148 -> 33168 bytes 4 files changed, 572 insertions(+), 562 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d97296..3959b46 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,13 @@ +# devel + +## RatAttack 6.2.3 + +### Fixed + +* No longer trying to get nearest CMDR for the new “Unconfirmed” system info. + +----- + # 4.2.3 (2021-05-23) Updated included bindED plugin to version 4.1 that fixes Odyssey compatibility. diff --git a/plugins/RatAttack/RatAttack.cs b/plugins/RatAttack/RatAttack.cs index 788a2da..d97aba2 100644 --- a/plugins/RatAttack/RatAttack.cs +++ b/plugins/RatAttack/RatAttack.cs @@ -259,7 +259,7 @@ namespace RatAttack | required VoiceAttack plugin shenanigans | \========================================*/ - static readonly Version VERSION = new Version("6.2.2"); + static readonly Version VERSION = new Version("6.2.3"); public static Guid VA_Id() => new Guid("{F2ADF0AE-4837-4E4A-9C87-8A7E2FA63E5F}"); diff --git a/plugins/VoiceAttack-base/base.cs b/plugins/VoiceAttack-base/base.cs index e93ec61..e766751 100644 --- a/plugins/VoiceAttack-base/base.cs +++ b/plugins/VoiceAttack-base/base.cs @@ -1,562 +1,562 @@ -#nullable enable - -using alterNERDtive.util; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Net; -using System.Text.RegularExpressions; - -namespace alterNERDtive -{ - public class BasePlugin - { - private static dynamic? VA { get; set; } - private static readonly Dictionary Profiles = new Dictionary { - { new Guid("{F7F59CFD-1AE2-4A7E-8F62-C62372418BAC}"), "alterNERDtive-base" }, - { new Guid("{f31b575b-6ce4-44eb-91fc-7459e55013cf}"), "EliteAttack" }, - { new Guid("{87276668-2a6e-4d80-af77-80651daa58b7}"), "RatAttack" }, - { new Guid("{e722b29d-898e-47dd-a843-a409c87e0bd8}"), "SpanshAttack" }, - { new Guid("{05580e6c-442c-46cd-b36f-f5a1f967ec59}"), "StreamAttack" } - }; - private static readonly List ActiveProfiles = new List(); - private static readonly List InstalledProfiles = new List(); - - private static readonly Regex ConfigurationVariableRegex = new Regex(@$"(?({String.Join("|", Profiles.Values)}))\.(?.+)#"); - - private static VoiceAttackLog Log => log ??= new VoiceAttackLog(VA, "alterNERDtive-base"); - private static VoiceAttackLog? log; - - private static VoiceAttackCommands Commands => commands ??= new VoiceAttackCommands(VA, Log); - private static VoiceAttackCommands? commands; - - private static Configuration Config => config ??= new Configuration(VA, Log, Commands, "alterNERDtive-base"); - private static Configuration? config; - - private static void CheckProfiles(dynamic vaProxy) - { - ActiveProfiles.Clear(); - InstalledProfiles.Clear(); - - foreach (KeyValuePair profile in Profiles) - { - if (vaProxy.Command.Exists($"(({profile.Value}.startup))")) - // Sadly there is no way to find _active_ profiles, so we have to check the one command that always is in them. - { - ActiveProfiles.Add(profile.Value); - } - if (vaProxy.Profile.Exists(profile.Key)) - { - InstalledProfiles.Add(profile.Value); - } - } - Log.Debug($"Profiles found: {string.Join(", ", ActiveProfiles)}"); - } - - private static void ConfigurationChanged(string option, dynamic? from, dynamic? to, Guid? guid = null) - { - try - { - Match match = ConfigurationVariableRegex.Match(option); - if (match.Success) - { - string id = match.Groups["id"].Value; - string name = match.Groups["name"].Value; - Log.Debug($"Configuration has changed, '{id}.{name}': '{from}' → '{to}'"); - - dynamic o = Config.GetOption(id, name); - // When loaded from profile but not explicitly set, will be null. - // Then load default. - // Same applies to resetting a saved option (= saving null to the profile). - if (to == null) - { - _ = to ?? Config.ApplyDefault(id, name); - } - else - { - // When not null, check if there’s a constraint on valid values. - if (o.ValidValues != null) - { - if (!o.ValidValues.Contains(to)) - { - // Handle “arrays” of values - bool valid = false; - if (to is string && ((string)to).Contains(";")) - { - valid = true; - foreach (string value in ((string)to).Split(';')) - { - if (!o.ValidValues.Contains(value)) - { - valid = false; - } - } - } - - if (!valid) - { - Log.Error($@"Invalid value ""{to}"" for option ""{id}.{option}"", reverting to default …"); - Config.ApplyDefault(id, name); - } - } - } - - if (option == "alterNERDtive-base.eddi.quietMode#" && VA!.GetText("EDDI version") != null) // if null, EDDI isn’t up yet - { - Log.Debug($"Resetting speech responder ({(to ?? false ? "off" : "on")}) …"); - Commands.Run("alterNERDtive-base.setEDDISpeechResponder"); - } - else if (option == "alterNERDtive-base.log.logLevel#") - { - Log.SetCurrentLogLevel(to); - } - } - } - } - catch (Exception e) - { - Log.Error($"Unhandled exception while handling changed variable '{option}'. ({e.Message})"); - } - } - - private static void UpdateCheck() - { - Version latestVersion; - try - { - latestVersion = new Version(new WebClient().DownloadString("https://raw.githubusercontent.com/alterNERDtive/VoiceAttack-profiles/release/VERSION")); - } - catch (Exception) - { - throw new Exception("Error fetching latest profiles version from Github."); - } - - Log.Notice($"Local version: {VERSION}, latest release: {latestVersion}."); - - Commands.TriggerEvent("alterNERDtive-base.updateCheck", - parameters: new dynamic[] { new string[] { VERSION.ToString(), latestVersion.ToString() }, new bool[] { VERSION.CompareTo(latestVersion) < 0 } }); - } - - /*================\ - | plugin contexts | - \================*/ - - private static void Context_Config_Dump(dynamic vaProxy) - { - Config.DumpConfig(); - } - - private static void Context_Config_List(dynamic vaProxy) - { - Config.ListConfig(); - } - - private static void Context_Config_Setup(dynamic vaProxy) - { - Log.Debug("Loading default configuration …"); - Config.ApplyAllDefaults(); - foreach (System.Type type in new List { typeof(bool), typeof(DateTime), typeof(decimal), typeof(int), typeof(short), typeof(string) }) - { - Config.SetVoiceTriggers(type); - } - Config.LoadFromProfile(); - Log.Debug("Finished loading configuration."); - } - - private static void Context_Config_SetVariables(dynamic vaProxy) - { - string trigger = vaProxy.GetText("~trigger") ?? throw new ArgumentNullException("~trigger"); - Log.Debug($"Loading variables for trigger '{trigger}' …"); - Config.SetVariablesForTrigger(vaProxy, trigger); - } - - private static void Context_Config_VersionMigration(dynamic vaProxy) - { - // =========== - // === 4.2 === - // =========== - - // SpanshAttack - string edtsPath = $@"{vaProxy.SessionState["VA_SOUNDS"]}\scripts\edts.exe"; - if (File.Exists(edtsPath)) - { - File.Delete(edtsPath); - } - - // =========== - // === 4.0 === - // =========== - - // EliteAttack - string prefix = "EliteAttack"; - string oldPrefix = "EliteDangerous"; - foreach (string option in new string[] { "announceEdsmSystemStatus", "announceMappingCandidates", "announceOutdatedStationData", "announceR2RMappingCandidates", "autoRestock", "flightAssistOff", "hyperspaceDethrottle" }) - { - string name = $"{prefix}.{option}"; - string oldName = $"{oldPrefix}.{option}"; - Commands.Run("alterNERDtive-base.loadVariableFromProfile", wait: true, parameters: new dynamic[] { new string[] { $"{oldName}", "boolean" } }); - bool? value = VA!.GetBoolean(oldName); - if (value != null) - { - Log.Info($"Migrating option {oldName} …"); - Commands.Run("alterNERDtive-base.saveVariableToProfile", wait: true, parameters: new dynamic[] { new string[] { $"{name}#" }, new bool[] { (bool)value } }); - Commands.Run("alterNERDtive-base.unsetVariableFromProfile", wait: true, parameters: new dynamic[] { new string[] { $"{oldName}", "boolean" } }); - } - } - - // RatAttack - prefix = "RatAttack"; - foreach (string option in new string[] { "autoCloseCase", "announceNearestCMDR", "announcePlatform", "confirmCalls", "onDuty" }) - { - string name = $"{prefix}.{option}"; - Commands.Run("alterNERDtive-base.loadVariableFromProfile", wait: true, parameters: new dynamic[] { new string[] { $"{name}", "boolean" } }); - bool? value = VA!.GetBoolean(name); - if (value != null) - { - Log.Info($"Migrating option {name} …"); - Commands.Run("alterNERDtive-base.saveVariableToProfile", wait: true, parameters: new dynamic[] { new string[] { $"{name}#" }, new bool[] { (bool)value } }); - Commands.Run("alterNERDtive-base.unsetVariableFromProfile", wait: true, parameters: new dynamic[] { new string[] { $"{name}", "boolean" } }); - } - } - foreach (string option in new string[] { "CMDRs", "platforms" }) - { - string name = $"{prefix}.{option}"; - Commands.Run("alterNERDtive-base.loadVariableFromProfile", wait: true, parameters: new dynamic[] { new string[] { $"{name}", "text" } }); - string value = VA!.GetText(name); - if (!string.IsNullOrEmpty(value)) - { - Log.Info($"Migrating option {name} …"); - Commands.Run("alterNERDtive-base.saveVariableToProfile", wait: true, parameters: new dynamic[] { new string[] { $"{name}#", value } }); - Commands.Run("alterNERDtive-base.unsetVariableFromProfile", wait: true, parameters: new dynamic[] { new string[] { $"{name}", "text" } }); - } - } - - // SpanshAttack - prefix = "SpanshAttack"; - foreach (string option in new string[] { "announceWaypoints", "autoJumpAfterScooping", "autoPlot", "clearOnShutdown", "copyWaypointToClipboard", "defaultToLadenRange", "timeTrip" }) - { - string name = $"{prefix}.{option}"; - Commands.Run("alterNERDtive-base.loadVariableFromProfile", wait: true, parameters: new dynamic[] { new string[] { $"{name}", "boolean" } }); - bool? value = VA!.GetBoolean(name); - if (value != null) - { - Log.Info($"Migrating option {name} …"); - Commands.Run("alterNERDtive-base.saveVariableToProfile", wait: true, parameters: new dynamic[] { new string[] { $"{name}#" }, new bool[] { (bool)value } }); - Commands.Run("alterNERDtive-base.unsetVariableFromProfile", wait: true, parameters: new dynamic[] { new string[] { $"{name}", "boolean" } }); - } - } - foreach (string option in new string[] { "announceJumpsLeft" }) - { - string name = $"{prefix}.{option}"; - Commands.Run("alterNERDtive-base.loadVariableFromProfile", wait: true, parameters: new dynamic[] { new string[] { $"{name}", "text" } }); - string value = VA!.GetText(name); - if (!string.IsNullOrEmpty(value)) - { - Log.Info($"Migrating option {name} …"); - Commands.Run("alterNERDtive-base.saveVariableToProfile", wait: true, parameters: new dynamic[] { new string[] { $"{name}#", value } }); - Commands.Run("alterNERDtive-base.unsetVariableFromProfile", wait: true, parameters: new dynamic[] { new string[] { $"{name}", "text" } }); - } - } - - // StreamAttack - prefix = "StreamAttack"; - foreach (string option in new string[] { "outputDir" }) - { - string name = $"{prefix}.{option}"; - Commands.Run("alterNERDtive-base.loadVariableFromProfile", wait: true, parameters: new dynamic[] { new string[] { $"{name}", "text" } }); - string value = VA!.GetText(name); - if (!string.IsNullOrEmpty(value)) - { - Log.Info($"Migrating option {name} …"); - Commands.Run("alterNERDtive-base.saveVariableToProfile", wait: true, parameters: new dynamic[] { new string[] { $"{name}#", value } }); - Commands.Run("alterNERDtive-base.unsetVariableFromProfile", wait: true, parameters: new dynamic[] { new string[] { $"{name}", "text" } }); - } - } - } - - private static void Context_Eddi_Event(dynamic vaProxy) - { - string eddiEvent = vaProxy.Command.Name(); - string command = eddiEvent.Substring(2, eddiEvent.Length - 4); - Log.Debug($"Running EDDI event '{command}' …"); - Commands.RunAll(ActiveProfiles, command, logMissing: false, subcommand: true); // FIXXME: a) triggerAll or something, b) change all profiles to use "((.))" over "." - } - - private static void Context_EDSM_BodyCount(dynamic vaProxy) - { - string system = vaProxy.GetText("~system") ?? throw new ArgumentNullException("~system"); - - string path = $@"{vaProxy.SessionState["VA_SOUNDS"]}\scripts\explorationtools.exe"; - string arguments = $@"bodycount ""{system}"""; - - Process p = PythonProxy.SetupPythonScript(path, arguments); - - int bodyCount = 0; - bool error = false; - string errorMessage = ""; - - p.Start(); - string stdout = p.StandardOutput.ReadToEnd(); - string stderr = p.StandardError.ReadToEnd(); - p.WaitForExit(); - switch (p.ExitCode) - { - case 0: - bodyCount = int.Parse(stdout); - Log.Info($"EDSM body count for {system}: {bodyCount}"); - break; - case 1: - error = true; - Log.Error(stdout); - errorMessage = stdout; - break; - case 2: - error = true; - Log.Notice($@"System ""{system}"" not found on EDSM"); - errorMessage = stdout; - break; - default: - error = true; - Log.Error(stderr); - errorMessage = "Unrecoverable error in plugin."; - break; - } - - vaProxy.SetInt("~bodyCount", bodyCount); - vaProxy.SetBoolean("~error", error); - vaProxy.SetText("~errorMessage", errorMessage); - vaProxy.SetInt("~exitCode", p.ExitCode); - } - - private static void Context_EDSM_DistanceBetween(dynamic vaProxy) - { - string fromSystem = vaProxy.GetText("~fromSystem") ?? throw new ArgumentNullException("~fromSystem"); - string toSystem = vaProxy.GetText("~toSystem") ?? throw new ArgumentNullException("~toSystem"); - int roundTo = vaProxy.GetInt("~roundTo") ?? 2; - - string path = $@"{vaProxy.SessionState["VA_SOUNDS"]}\Scripts\explorationtools.exe"; - string arguments = $@"distancebetween --roundto {roundTo} ""{fromSystem}"" ""{toSystem}"""; - - Process p = PythonProxy.SetupPythonScript(path, arguments); - - decimal distance = 0; - bool error = false; - string errorMessage = ""; - - p.Start(); - string stdout = p.StandardOutput.ReadToEnd(); - string stderr = p.StandardError.ReadToEnd(); - p.WaitForExit(); - switch (p.ExitCode) - { - case 0: - distance = decimal.Parse(stdout); - Log.Info($"{fromSystem} → {toSystem}: {distance} ly"); - break; - case 1: - case 2: - error = true; - Log.Error(stdout); - errorMessage = stdout; - break; - default: - error = true; - Log.Error(stderr); - errorMessage = "Unrecoverable error in plugin."; - break; - - } - - vaProxy.SetDecimal("~distance", distance); - vaProxy.SetBoolean("~error", error); - vaProxy.SetText("~errorMessage", errorMessage); - vaProxy.SetInt("~exitCode", p.ExitCode); - } - - private static void Context_Log(dynamic vaProxy) - { - string message = vaProxy.GetText("~message"); - string level = vaProxy.GetText("~level"); - - if (level == null) - { - Log.Log(message); - } - else - { - try - { - Log.Log(message, (LogLevel)Enum.Parse(typeof(LogLevel), level.ToUpper())); - } - catch (ArgumentNullException) { throw; } - catch (ArgumentException) - { - Log.Error($"Invalid log level '{level}'."); - } - } - } - - private static void Context_Spansh_OutdatedStations(dynamic vaProxy) - { - string system = vaProxy.GetText("~system") ?? throw new ArgumentNullException("~system"); - int minage = vaProxy.GetInt("~minage") ?? throw new ArgumentNullException("~minage"); - - string path = $@"{vaProxy.SessionState["VA_SOUNDS"]}\Scripts\spansh.exe"; - string arguments = $@"oldstations --system ""{system}"" --minage {minage}"; - - Process p = PythonProxy.SetupPythonScript(path, arguments); - - - p.Start(); - string stdout = p.StandardOutput.ReadToEnd(); - string stderr = p.StandardError.ReadToEnd(); - p.WaitForExit(); - - string message = stdout; - string? errorMessage = null; - bool error = true; - - switch (p.ExitCode) - { - case 0: - error = false; - Log.Notice($"Outdated stations for {system}: {message}"); - break; - case 1: - error = true; - Log.Error(message); - break; - case 3: - error = true; - Log.Info($@"No outdated stations found for ""{system}"""); - break; - default: - error = true; - Log.Error(stderr); - errorMessage = "Unrecoverable error in plugin."; - break; - - } - - vaProxy.SetText("~message", message); - vaProxy.SetBoolean("~error", error); - vaProxy.SetText("~errorMessage", errorMessage); - vaProxy.SetInt("~exitCode", p.ExitCode); - } - - private static void Context_Startup(dynamic vaProxy) - { - Log.Notice("Starting up …"); - CheckProfiles(VA); - Log.Notice($"Active profiles: {string.Join(", ", ActiveProfiles)}"); - Commands.TriggerEventAll(ActiveProfiles, "startup", logMissing: false); - Log.Notice("Finished startup."); - } - - private static void Context_Update_Check(dynamic vaProxy) - { - UpdateCheck(); - } - - /*========================================\ - | required VoiceAttack plugin shenanigans | - \========================================*/ - - static readonly Version VERSION = new Version("4.2.3"); - - public static Guid VA_Id() - => new Guid("{F7F59CFD-1AE2-4A7E-8F62-C62372418BAC}"); - public static string VA_DisplayName() - => $"alterNERDtive-base {VERSION}"; - public static string VA_DisplayInfo() - => "The alterNERDtive plugin to manage all the alterNERDtive profiles!"; - - public static void VA_Init1(dynamic vaProxy) - { - VA = vaProxy; - Log.Notice("Initializing …"); - VA.SetText("alterNERDtive-base.version", VERSION.ToString()); - vaProxy.BooleanVariableChanged += new Action((name, from, to, id) => { ConfigurationChanged(name, from, to, id); }); - vaProxy.DateVariableChanged += new Action((name, from, to, id) => { ConfigurationChanged(name, from, to, id); }); - vaProxy.DecimalVariableChanged += new Action((name, from, to, id) => { ConfigurationChanged(name, from, to, id); }); - vaProxy.IntegerVariableChanged += new Action((name, from, to, id) => { ConfigurationChanged(name, from, to, id); }); - vaProxy.TextVariableChanged += new Action((name, from, to, id) => { ConfigurationChanged(name, from, to, id); }); - VA.SetBoolean("alterNERDtive-base.initialized", true); - Commands.TriggerEvent("alterNERDtive-base.initialized", wait: false, logMissing: false); - Log.Notice("Init successful."); - } - - public static void VA_Invoke1(dynamic vaProxy) - { - VA = vaProxy; - - string context = vaProxy.Context.ToLower(); - Log.Debug($"Running context '{context}' …"); - try - { - switch (context) - { - case "startup": - Context_Startup(vaProxy); - break; - // config - case "config.dump": - Context_Config_Dump(vaProxy); - break; - case "config.getvariables": - Context_Config_SetVariables(vaProxy); - break; - case "config.list": - Context_Config_List(vaProxy); - break; - case "config.setup": - Context_Config_Setup(vaProxy); - break; - case "config.versionmigration": - Context_Config_VersionMigration(vaProxy); - break; - // EDSM - case "edsm.bodycount": - Context_EDSM_BodyCount(vaProxy); - break; - case "edsm.distancebetween": - Context_EDSM_DistanceBetween(vaProxy); - break; - // EDDI - case "eddi.event": - Context_Eddi_Event(vaProxy); - break; - // Spansh - case "spansh.outdatedstations": - Context_Spansh_OutdatedStations(vaProxy); - break; - // log - case "log.log": - Context_Log(vaProxy); - break; - // update - case "update.check": - Context_Update_Check(vaProxy); - break; - // invalid - default: - Log.Error($"Invalid plugin context '{vaProxy.Context}'."); - break; - } - } - catch (ArgumentNullException e) - { - Log.Error($"Missing parameter '{e.ParamName}' for context '{context}'"); - } - catch (Exception e) - { - Log.Error($"Unhandled exception while executing plugin context '{context}'. ({e.Message})"); - } - } - - public static void VA_Exit1(dynamic vaProxy) { } - - public static void VA_StopCommand() { } - } +#nullable enable + +using alterNERDtive.util; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Net; +using System.Text.RegularExpressions; + +namespace alterNERDtive +{ + public class BasePlugin + { + private static dynamic? VA { get; set; } + private static readonly Dictionary Profiles = new Dictionary { + { new Guid("{F7F59CFD-1AE2-4A7E-8F62-C62372418BAC}"), "alterNERDtive-base" }, + { new Guid("{f31b575b-6ce4-44eb-91fc-7459e55013cf}"), "EliteAttack" }, + { new Guid("{87276668-2a6e-4d80-af77-80651daa58b7}"), "RatAttack" }, + { new Guid("{e722b29d-898e-47dd-a843-a409c87e0bd8}"), "SpanshAttack" }, + { new Guid("{05580e6c-442c-46cd-b36f-f5a1f967ec59}"), "StreamAttack" } + }; + private static readonly List ActiveProfiles = new List(); + private static readonly List InstalledProfiles = new List(); + + private static readonly Regex ConfigurationVariableRegex = new Regex(@$"(?({String.Join("|", Profiles.Values)}))\.(?.+)#"); + + private static VoiceAttackLog Log => log ??= new VoiceAttackLog(VA, "alterNERDtive-base"); + private static VoiceAttackLog? log; + + private static VoiceAttackCommands Commands => commands ??= new VoiceAttackCommands(VA, Log); + private static VoiceAttackCommands? commands; + + private static Configuration Config => config ??= new Configuration(VA, Log, Commands, "alterNERDtive-base"); + private static Configuration? config; + + private static void CheckProfiles(dynamic vaProxy) + { + ActiveProfiles.Clear(); + InstalledProfiles.Clear(); + + foreach (KeyValuePair profile in Profiles) + { + if (vaProxy.Command.Exists($"(({profile.Value}.startup))")) + // Sadly there is no way to find _active_ profiles, so we have to check the one command that always is in them. + { + ActiveProfiles.Add(profile.Value); + } + if (vaProxy.Profile.Exists(profile.Key)) + { + InstalledProfiles.Add(profile.Value); + } + } + Log.Debug($"Profiles found: {string.Join(", ", ActiveProfiles)}"); + } + + private static void ConfigurationChanged(string option, dynamic? from, dynamic? to, Guid? guid = null) + { + try + { + Match match = ConfigurationVariableRegex.Match(option); + if (match.Success) + { + string id = match.Groups["id"].Value; + string name = match.Groups["name"].Value; + Log.Debug($"Configuration has changed, '{id}.{name}': '{from}' → '{to}'"); + + dynamic o = Config.GetOption(id, name); + // When loaded from profile but not explicitly set, will be null. + // Then load default. + // Same applies to resetting a saved option (= saving null to the profile). + if (to == null) + { + _ = to ?? Config.ApplyDefault(id, name); + } + else + { + // When not null, check if there’s a constraint on valid values. + if (o.ValidValues != null) + { + if (!o.ValidValues.Contains(to)) + { + // Handle “arrays” of values + bool valid = false; + if (to is string && ((string)to).Contains(";")) + { + valid = true; + foreach (string value in ((string)to).Split(';')) + { + if (!o.ValidValues.Contains(value)) + { + valid = false; + } + } + } + + if (!valid) + { + Log.Error($@"Invalid value ""{to}"" for option ""{id}.{option}"", reverting to default …"); + Config.ApplyDefault(id, name); + } + } + } + + if (option == "alterNERDtive-base.eddi.quietMode#" && VA!.GetText("EDDI version") != null) // if null, EDDI isn’t up yet + { + Log.Debug($"Resetting speech responder ({(to ?? false ? "off" : "on")}) …"); + Commands.Run("alterNERDtive-base.setEDDISpeechResponder"); + } + else if (option == "alterNERDtive-base.log.logLevel#") + { + Log.SetCurrentLogLevel(to); + } + } + } + } + catch (Exception e) + { + Log.Error($"Unhandled exception while handling changed variable '{option}'. ({e.Message})"); + } + } + + private static void UpdateCheck() + { + Version latestVersion; + try + { + latestVersion = new Version(new WebClient().DownloadString("https://raw.githubusercontent.com/alterNERDtive/VoiceAttack-profiles/release/VERSION")); + } + catch (Exception) + { + throw new Exception("Error fetching latest profiles version from Github."); + } + + Log.Notice($"Local version: {VERSION}, latest release: {latestVersion}."); + + Commands.TriggerEvent("alterNERDtive-base.updateCheck", + parameters: new dynamic[] { new string[] { VERSION.ToString(), latestVersion.ToString() }, new bool[] { VERSION.CompareTo(latestVersion) < 0 } }); + } + + /*================\ + | plugin contexts | + \================*/ + + private static void Context_Config_Dump(dynamic vaProxy) + { + Config.DumpConfig(); + } + + private static void Context_Config_List(dynamic vaProxy) + { + Config.ListConfig(); + } + + private static void Context_Config_Setup(dynamic vaProxy) + { + Log.Debug("Loading default configuration …"); + Config.ApplyAllDefaults(); + foreach (System.Type type in new List { typeof(bool), typeof(DateTime), typeof(decimal), typeof(int), typeof(short), typeof(string) }) + { + Config.SetVoiceTriggers(type); + } + Config.LoadFromProfile(); + Log.Debug("Finished loading configuration."); + } + + private static void Context_Config_SetVariables(dynamic vaProxy) + { + string trigger = vaProxy.GetText("~trigger") ?? throw new ArgumentNullException("~trigger"); + Log.Debug($"Loading variables for trigger '{trigger}' …"); + Config.SetVariablesForTrigger(vaProxy, trigger); + } + + private static void Context_Config_VersionMigration(dynamic vaProxy) + { + // =========== + // === 4.2 === + // =========== + + // SpanshAttack + string edtsPath = $@"{vaProxy.SessionState["VA_SOUNDS"]}\scripts\edts.exe"; + if (File.Exists(edtsPath)) + { + File.Delete(edtsPath); + } + + // =========== + // === 4.0 === + // =========== + + // EliteAttack + string prefix = "EliteAttack"; + string oldPrefix = "EliteDangerous"; + foreach (string option in new string[] { "announceEdsmSystemStatus", "announceMappingCandidates", "announceOutdatedStationData", "announceR2RMappingCandidates", "autoRestock", "flightAssistOff", "hyperspaceDethrottle" }) + { + string name = $"{prefix}.{option}"; + string oldName = $"{oldPrefix}.{option}"; + Commands.Run("alterNERDtive-base.loadVariableFromProfile", wait: true, parameters: new dynamic[] { new string[] { $"{oldName}", "boolean" } }); + bool? value = VA!.GetBoolean(oldName); + if (value != null) + { + Log.Info($"Migrating option {oldName} …"); + Commands.Run("alterNERDtive-base.saveVariableToProfile", wait: true, parameters: new dynamic[] { new string[] { $"{name}#" }, new bool[] { (bool)value } }); + Commands.Run("alterNERDtive-base.unsetVariableFromProfile", wait: true, parameters: new dynamic[] { new string[] { $"{oldName}", "boolean" } }); + } + } + + // RatAttack + prefix = "RatAttack"; + foreach (string option in new string[] { "autoCloseCase", "announceNearestCMDR", "announcePlatform", "confirmCalls", "onDuty" }) + { + string name = $"{prefix}.{option}"; + Commands.Run("alterNERDtive-base.loadVariableFromProfile", wait: true, parameters: new dynamic[] { new string[] { $"{name}", "boolean" } }); + bool? value = VA!.GetBoolean(name); + if (value != null) + { + Log.Info($"Migrating option {name} …"); + Commands.Run("alterNERDtive-base.saveVariableToProfile", wait: true, parameters: new dynamic[] { new string[] { $"{name}#" }, new bool[] { (bool)value } }); + Commands.Run("alterNERDtive-base.unsetVariableFromProfile", wait: true, parameters: new dynamic[] { new string[] { $"{name}", "boolean" } }); + } + } + foreach (string option in new string[] { "CMDRs", "platforms" }) + { + string name = $"{prefix}.{option}"; + Commands.Run("alterNERDtive-base.loadVariableFromProfile", wait: true, parameters: new dynamic[] { new string[] { $"{name}", "text" } }); + string value = VA!.GetText(name); + if (!string.IsNullOrEmpty(value)) + { + Log.Info($"Migrating option {name} …"); + Commands.Run("alterNERDtive-base.saveVariableToProfile", wait: true, parameters: new dynamic[] { new string[] { $"{name}#", value } }); + Commands.Run("alterNERDtive-base.unsetVariableFromProfile", wait: true, parameters: new dynamic[] { new string[] { $"{name}", "text" } }); + } + } + + // SpanshAttack + prefix = "SpanshAttack"; + foreach (string option in new string[] { "announceWaypoints", "autoJumpAfterScooping", "autoPlot", "clearOnShutdown", "copyWaypointToClipboard", "defaultToLadenRange", "timeTrip" }) + { + string name = $"{prefix}.{option}"; + Commands.Run("alterNERDtive-base.loadVariableFromProfile", wait: true, parameters: new dynamic[] { new string[] { $"{name}", "boolean" } }); + bool? value = VA!.GetBoolean(name); + if (value != null) + { + Log.Info($"Migrating option {name} …"); + Commands.Run("alterNERDtive-base.saveVariableToProfile", wait: true, parameters: new dynamic[] { new string[] { $"{name}#" }, new bool[] { (bool)value } }); + Commands.Run("alterNERDtive-base.unsetVariableFromProfile", wait: true, parameters: new dynamic[] { new string[] { $"{name}", "boolean" } }); + } + } + foreach (string option in new string[] { "announceJumpsLeft" }) + { + string name = $"{prefix}.{option}"; + Commands.Run("alterNERDtive-base.loadVariableFromProfile", wait: true, parameters: new dynamic[] { new string[] { $"{name}", "text" } }); + string value = VA!.GetText(name); + if (!string.IsNullOrEmpty(value)) + { + Log.Info($"Migrating option {name} …"); + Commands.Run("alterNERDtive-base.saveVariableToProfile", wait: true, parameters: new dynamic[] { new string[] { $"{name}#", value } }); + Commands.Run("alterNERDtive-base.unsetVariableFromProfile", wait: true, parameters: new dynamic[] { new string[] { $"{name}", "text" } }); + } + } + + // StreamAttack + prefix = "StreamAttack"; + foreach (string option in new string[] { "outputDir" }) + { + string name = $"{prefix}.{option}"; + Commands.Run("alterNERDtive-base.loadVariableFromProfile", wait: true, parameters: new dynamic[] { new string[] { $"{name}", "text" } }); + string value = VA!.GetText(name); + if (!string.IsNullOrEmpty(value)) + { + Log.Info($"Migrating option {name} …"); + Commands.Run("alterNERDtive-base.saveVariableToProfile", wait: true, parameters: new dynamic[] { new string[] { $"{name}#", value } }); + Commands.Run("alterNERDtive-base.unsetVariableFromProfile", wait: true, parameters: new dynamic[] { new string[] { $"{name}", "text" } }); + } + } + } + + private static void Context_Eddi_Event(dynamic vaProxy) + { + string eddiEvent = vaProxy.Command.Name(); + string command = eddiEvent.Substring(2, eddiEvent.Length - 4); + Log.Debug($"Running EDDI event '{command}' …"); + Commands.RunAll(ActiveProfiles, command, logMissing: false, subcommand: true); // FIXXME: a) triggerAll or something, b) change all profiles to use "((.))" over "." + } + + private static void Context_EDSM_BodyCount(dynamic vaProxy) + { + string system = vaProxy.GetText("~system") ?? throw new ArgumentNullException("~system"); + + string path = $@"{vaProxy.SessionState["VA_SOUNDS"]}\scripts\explorationtools.exe"; + string arguments = $@"bodycount ""{system}"""; + + Process p = PythonProxy.SetupPythonScript(path, arguments); + + int bodyCount = 0; + bool error = false; + string errorMessage = ""; + + p.Start(); + string stdout = p.StandardOutput.ReadToEnd(); + string stderr = p.StandardError.ReadToEnd(); + p.WaitForExit(); + switch (p.ExitCode) + { + case 0: + bodyCount = int.Parse(stdout); + Log.Info($"EDSM body count for {system}: {bodyCount}"); + break; + case 1: + error = true; + Log.Error(stdout); + errorMessage = stdout; + break; + case 2: + error = true; + Log.Notice($@"System ""{system}"" not found on EDSM"); + errorMessage = stdout; + break; + default: + error = true; + Log.Error(stderr); + errorMessage = "Unrecoverable error in plugin."; + break; + } + + vaProxy.SetInt("~bodyCount", bodyCount); + vaProxy.SetBoolean("~error", error); + vaProxy.SetText("~errorMessage", errorMessage); + vaProxy.SetInt("~exitCode", p.ExitCode); + } + + private static void Context_EDSM_DistanceBetween(dynamic vaProxy) + { + string fromSystem = vaProxy.GetText("~fromSystem") ?? throw new ArgumentNullException("~fromSystem"); + string toSystem = vaProxy.GetText("~toSystem") ?? throw new ArgumentNullException("~toSystem"); + int roundTo = vaProxy.GetInt("~roundTo") ?? 2; + + string path = $@"{vaProxy.SessionState["VA_SOUNDS"]}\Scripts\explorationtools.exe"; + string arguments = $@"distancebetween --roundto {roundTo} ""{fromSystem}"" ""{toSystem}"""; + + Process p = PythonProxy.SetupPythonScript(path, arguments); + + decimal distance = 0; + bool error = false; + string errorMessage = ""; + + p.Start(); + string stdout = p.StandardOutput.ReadToEnd(); + string stderr = p.StandardError.ReadToEnd(); + p.WaitForExit(); + switch (p.ExitCode) + { + case 0: + distance = decimal.Parse(stdout); + Log.Info($"{fromSystem} → {toSystem}: {distance} ly"); + break; + case 1: + case 2: + error = true; + Log.Error(stdout); + errorMessage = stdout; + break; + default: + error = true; + Log.Error(stderr); + errorMessage = "Unrecoverable error in plugin."; + break; + + } + + vaProxy.SetDecimal("~distance", distance); + vaProxy.SetBoolean("~error", error); + vaProxy.SetText("~errorMessage", errorMessage); + vaProxy.SetInt("~exitCode", p.ExitCode); + } + + private static void Context_Log(dynamic vaProxy) + { + string message = vaProxy.GetText("~message"); + string level = vaProxy.GetText("~level"); + + if (level == null) + { + Log.Log(message); + } + else + { + try + { + Log.Log(message, (LogLevel)Enum.Parse(typeof(LogLevel), level.ToUpper())); + } + catch (ArgumentNullException) { throw; } + catch (ArgumentException) + { + Log.Error($"Invalid log level '{level}'."); + } + } + } + + private static void Context_Spansh_OutdatedStations(dynamic vaProxy) + { + string system = vaProxy.GetText("~system") ?? throw new ArgumentNullException("~system"); + int minage = vaProxy.GetInt("~minage") ?? throw new ArgumentNullException("~minage"); + + string path = $@"{vaProxy.SessionState["VA_SOUNDS"]}\Scripts\spansh.exe"; + string arguments = $@"oldstations --system ""{system}"" --minage {minage}"; + + Process p = PythonProxy.SetupPythonScript(path, arguments); + + + p.Start(); + string stdout = p.StandardOutput.ReadToEnd(); + string stderr = p.StandardError.ReadToEnd(); + p.WaitForExit(); + + string message = stdout; + string? errorMessage = null; + bool error = true; + + switch (p.ExitCode) + { + case 0: + error = false; + Log.Notice($"Outdated stations for {system}: {message}"); + break; + case 1: + error = true; + Log.Error(message); + break; + case 3: + error = true; + Log.Info($@"No outdated stations found for ""{system}"""); + break; + default: + error = true; + Log.Error(stderr); + errorMessage = "Unrecoverable error in plugin."; + break; + + } + + vaProxy.SetText("~message", message); + vaProxy.SetBoolean("~error", error); + vaProxy.SetText("~errorMessage", errorMessage); + vaProxy.SetInt("~exitCode", p.ExitCode); + } + + private static void Context_Startup(dynamic vaProxy) + { + Log.Notice("Starting up …"); + CheckProfiles(VA); + Log.Notice($"Active profiles: {string.Join(", ", ActiveProfiles)}"); + Commands.TriggerEventAll(ActiveProfiles, "startup", logMissing: false); + Log.Notice("Finished startup."); + } + + private static void Context_Update_Check(dynamic vaProxy) + { + UpdateCheck(); + } + + /*========================================\ + | required VoiceAttack plugin shenanigans | + \========================================*/ + + static readonly Version VERSION = new Version("4.2.4"); + + public static Guid VA_Id() + => new Guid("{F7F59CFD-1AE2-4A7E-8F62-C62372418BAC}"); + public static string VA_DisplayName() + => $"alterNERDtive-base {VERSION}"; + public static string VA_DisplayInfo() + => "The alterNERDtive plugin to manage all the alterNERDtive profiles!"; + + public static void VA_Init1(dynamic vaProxy) + { + VA = vaProxy; + Log.Notice("Initializing …"); + VA.SetText("alterNERDtive-base.version", VERSION.ToString()); + vaProxy.BooleanVariableChanged += new Action((name, from, to, id) => { ConfigurationChanged(name, from, to, id); }); + vaProxy.DateVariableChanged += new Action((name, from, to, id) => { ConfigurationChanged(name, from, to, id); }); + vaProxy.DecimalVariableChanged += new Action((name, from, to, id) => { ConfigurationChanged(name, from, to, id); }); + vaProxy.IntegerVariableChanged += new Action((name, from, to, id) => { ConfigurationChanged(name, from, to, id); }); + vaProxy.TextVariableChanged += new Action((name, from, to, id) => { ConfigurationChanged(name, from, to, id); }); + VA.SetBoolean("alterNERDtive-base.initialized", true); + Commands.TriggerEvent("alterNERDtive-base.initialized", wait: false, logMissing: false); + Log.Notice("Init successful."); + } + + public static void VA_Invoke1(dynamic vaProxy) + { + VA = vaProxy; + + string context = vaProxy.Context.ToLower(); + Log.Debug($"Running context '{context}' …"); + try + { + switch (context) + { + case "startup": + Context_Startup(vaProxy); + break; + // config + case "config.dump": + Context_Config_Dump(vaProxy); + break; + case "config.getvariables": + Context_Config_SetVariables(vaProxy); + break; + case "config.list": + Context_Config_List(vaProxy); + break; + case "config.setup": + Context_Config_Setup(vaProxy); + break; + case "config.versionmigration": + Context_Config_VersionMigration(vaProxy); + break; + // EDSM + case "edsm.bodycount": + Context_EDSM_BodyCount(vaProxy); + break; + case "edsm.distancebetween": + Context_EDSM_DistanceBetween(vaProxy); + break; + // EDDI + case "eddi.event": + Context_Eddi_Event(vaProxy); + break; + // Spansh + case "spansh.outdatedstations": + Context_Spansh_OutdatedStations(vaProxy); + break; + // log + case "log.log": + Context_Log(vaProxy); + break; + // update + case "update.check": + Context_Update_Check(vaProxy); + break; + // invalid + default: + Log.Error($"Invalid plugin context '{vaProxy.Context}'."); + break; + } + } + catch (ArgumentNullException e) + { + Log.Error($"Missing parameter '{e.ParamName}' for context '{context}'"); + } + catch (Exception e) + { + Log.Error($"Unhandled exception while executing plugin context '{context}'. ({e.Message})"); + } + } + + public static void VA_Exit1(dynamic vaProxy) { } + + public static void VA_StopCommand() { } + } } diff --git a/profiles/RatAttack-Profile.vap b/profiles/RatAttack-Profile.vap index 207dfc215941287a8f44c4f67f9b90d613049fcd..b8ce0d436db1e4ab0fcb4ef4042ccc895121a1e7 100755 GIT binary patch literal 33168 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

+D~&}2?Q3%0!|AGA$%kr10U!M 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 UXLwc}y;}ShiDU8I_YL%a0JqSYa{vGU