diff --git a/plugins/EliteAttack/EliteAttack.cs b/plugins/EliteAttack/EliteAttack.cs index 292c223..b190cc9 100644 --- a/plugins/EliteAttack/EliteAttack.cs +++ b/plugins/EliteAttack/EliteAttack.cs @@ -23,7 +23,30 @@ namespace EliteAttack /*================\ | plugin contexts | \================*/ - + + 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_Startup(dynamic vaProxy) { Log.Notice("Starting up …"); @@ -59,12 +82,13 @@ namespace EliteAttack { switch (context) { - // plugin methods case "startup": Context_Startup(vaProxy); break; - // plugin settings - // NYI + // log + case "log.log": + Context_Log(vaProxy); + break; // invalid default: Log.Error($"Invalid plugin context '{vaProxy.Context}'."); diff --git a/plugins/RatAttack/RatAttack.cs b/plugins/RatAttack/RatAttack.cs index d0b9b5b..f7493fc 100644 --- a/plugins/RatAttack/RatAttack.cs +++ b/plugins/RatAttack/RatAttack.cs @@ -205,6 +205,29 @@ namespace RatAttack } } + 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_Startup(dynamic vaProxy) { Log.Notice("Starting up …"); @@ -262,6 +285,10 @@ namespace RatAttack case "edsm.getnearestcmdr": Context_EDSM_GetNearestCMDR(vaProxy); break; + // log + case "log.log": + Context_Log(vaProxy); + break; // invalid default: Log.Error($"Invalid plugin context '{vaProxy.Context}'."); diff --git a/plugins/SpanshAttack/SpanshAttack.cs b/plugins/SpanshAttack/SpanshAttack.cs index 24a954b..eed8421 100644 --- a/plugins/SpanshAttack/SpanshAttack.cs +++ b/plugins/SpanshAttack/SpanshAttack.cs @@ -81,6 +81,29 @@ namespace SpanshAttack 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_Nearestsystem(dynamic vaProxy) { int x = vaProxy.GetInt("~x") ?? throw new ArgumentNullException("~x"); @@ -222,6 +245,10 @@ namespace SpanshAttack case "edts.getcoordinates": Context_EDTS_GetCoordinates(vaProxy); break; + // log + case "log.log": + Context_Log(vaProxy); + break; // Spansh case "spansh.systemexists": Context_Spansh_SytemExists(vaProxy); diff --git a/plugins/VoiceAttack-base/base.cs b/plugins/VoiceAttack-base/base.cs index 25d86c7..c0a85b2 100644 --- a/plugins/VoiceAttack-base/base.cs +++ b/plugins/VoiceAttack-base/base.cs @@ -274,19 +274,18 @@ namespace alterNERDtive private static void Context_Log(dynamic vaProxy) { - string sender = vaProxy.GetText("~sender"); string message = vaProxy.GetText("~message"); string level = vaProxy.GetText("~level"); if (level == null) { - Log.Log(sender, message); + Log.Log(message); } else { try { - Log.Log(sender, message, (LogLevel)Enum.Parse(typeof(LogLevel), level.ToUpper())); + Log.Log(message, (LogLevel)Enum.Parse(typeof(LogLevel), level.ToUpper())); } catch (ArgumentNullException) { throw; } catch (ArgumentException) diff --git a/plugins/VoiceAttack-base/util.cs b/plugins/VoiceAttack-base/util.cs index ca7d99f..73bc707 100644 --- a/plugins/VoiceAttack-base/util.cs +++ b/plugins/VoiceAttack-base/util.cs @@ -476,6 +476,11 @@ namespace alterNERDtive.util private readonly dynamic VA; private readonly string ID; + private static readonly string LogFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "alterNERDtive-logs"); + private static readonly TextWriterTraceListener LogListener = new TextWriterTraceListener(Path.Combine(LogFolder, "VoiceAttack.log"), "error"); + private static readonly TextWriterTraceListener DebugListener = new TextWriterTraceListener(Path.Combine(LogFolder, "VoiceAttack-debug.log"), "debug"); + private readonly TraceSource TraceSource; + private static readonly string[] LogColour = { "red", "yellow", "green", "blue", "gray" }; public LogLevel? CurrentLogLevel { @@ -495,20 +500,67 @@ namespace alterNERDtive.util } private static LogLevel? currentLogLevel; - public VoiceAttackLog(dynamic vaProxy, string id) => (VA, ID) = (vaProxy, id); + static VoiceAttackLog() + { + Directory.CreateDirectory(LogFolder); + string path = Path.Combine(LogFolder, $"VoiceAttack"); + foreach (string name in new String[] { "", "-debug" }) + { + File.Delete($"{path}{name}-5.log"); + for (int i = 4; i > 0; i--) + { + if (File.Exists($"{path}{name}-{i}.log")) + { + File.Move($"{path}{name}-{i}.log", $"{path}{name}-{i + 1}.log"); + } + } + File.Move($"{path}{name}.log", $"{path}{name}-1.log"); + } + + File.Delete(Path.Combine(LogFolder, "VoiceAttack.log")); + File.Delete(Path.Combine(LogFolder, "VoiceAttack-debug.log")); + + DebugListener.TraceOutputOptions = LogListener.TraceOutputOptions = TraceOptions.DateTime; + LogListener.Filter = new EventTypeFilter(SourceLevels.Information); + DebugListener.Filter = new EventTypeFilter(SourceLevels.All); + } + + public VoiceAttackLog(dynamic vaProxy, string id) + { + VA = vaProxy; + ID = id; + + TraceSource = new TraceSource(ID); + TraceSource.Listeners.Add(LogListener); + TraceSource.Listeners.Add(DebugListener); + TraceSource.Switch.Level = SourceLevels.All; + } public void Log(string message, LogLevel level = LogLevel.INFO) { - Log(ID, message, level); - } - - public void Log(string sender, string message, LogLevel level = LogLevel.INFO) - { - _ = sender ?? throw new ArgumentNullException("sender"); _ = message ?? throw new ArgumentNullException("message"); if (level <= CurrentLogLevel) - VA.WriteToLog($"{level} | {sender}: {message}", LogColour[(int)level]); + { + VA.WriteToLog($"{level} | {ID}: {message}", LogColour[(int)level]); + } + switch(level) + { + case LogLevel.ERROR: + TraceSource.TraceEvent(TraceEventType.Error, 0, message); + break; + case LogLevel.WARN: + TraceSource.TraceEvent(TraceEventType.Warning, 1, message); + break; + case LogLevel.NOTICE: + case LogLevel.INFO: + TraceSource.TraceEvent(TraceEventType.Information, 2, message); + break; + case LogLevel.DEBUG: + TraceSource.TraceEvent(TraceEventType.Verbose, 3, message); + break; + } + TraceSource.Flush(); } public void Error(string message) => Log(message, LogLevel.ERROR); diff --git a/profiles/EliteAttack-Profile.vap b/profiles/EliteAttack-Profile.vap index ecfd6b8..2b8474e 100644 Binary files a/profiles/EliteAttack-Profile.vap and b/profiles/EliteAttack-Profile.vap differ diff --git a/profiles/RatAttack-Profile.vap b/profiles/RatAttack-Profile.vap index 977221e..12e4c6d 100755 Binary files a/profiles/RatAttack-Profile.vap and b/profiles/RatAttack-Profile.vap differ diff --git a/profiles/SpanshAttack-Profile.vap b/profiles/SpanshAttack-Profile.vap index d343515..73c1a74 100755 Binary files a/profiles/SpanshAttack-Profile.vap and b/profiles/SpanshAttack-Profile.vap differ diff --git a/profiles/StreamAttack-Profile.vap b/profiles/StreamAttack-Profile.vap index 299a5ba..84aa92c 100755 Binary files a/profiles/StreamAttack-Profile.vap and b/profiles/StreamAttack-Profile.vap differ diff --git a/profiles/alterNERDtive-base-Profile.vap b/profiles/alterNERDtive-base-Profile.vap index d719f01..3a9323a 100644 Binary files a/profiles/alterNERDtive-base-Profile.vap and b/profiles/alterNERDtive-base-Profile.vap differ