using System; using System.Collections.Generic; using System.Runtime.CompilerServices; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; namespace GamecraftModdingAPI.Utility { /// /// Utility class to access Gamecraft's built-in logging capabilities. /// The log is saved to %APPDATA%\..\LocalLow\FreeJam\Gamecraft\Player.Log /// public static class Logging { [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void Log(string msg) { Svelto.Console.Log(msg); } /// /// Write a regular message to Gamecraft's log /// /// The object to log [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void Log(object obj) { Svelto.Console.Log(obj.ToString()); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void LogDebug(string msg) { Svelto.Console.LogDebug(msg); } /// /// Write a debug message to Gamecraft's log /// /// The object to log [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void LogDebug(object obj) { Svelto.Console.LogDebug(obj.ToString()); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void LogDebug(string msg, T extraDebug) { Svelto.Console.LogDebug(msg, extraDebug); } /// /// Write a debug message and object to Gamecraft's log /// The reason this method exists in Svelto.Console is beyond my understanding /// /// The type of the extra debug object /// The object to log /// The extra object to log [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void LogDebug(object obj, T extraDebug) { Svelto.Console.LogDebug(obj.ToString(), extraDebug); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void LogError(string msg, Dictionary extraData = null) { Svelto.Console.LogError(msg, extraData); } /// /// Write an error message to Gamecraft's log /// /// The object to log /// The extra data to pass to the ILogger [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void LogError(object obj, Dictionary extraData = null) { Svelto.Console.LogError(obj.ToString(), extraData); } /// /// Write an exception to Gamecraft's log /// /// The exception to log /// The extra data to pass to the ILogger. /// This is automatically populated with "OuterException#" and "OuterStacktrace#" entries [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void LogException(Exception e, Dictionary extraData = null) { Svelto.Console.LogException(e, extraData); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void LogException(string msg, Exception e, Dictionary extraData = null) { Svelto.Console.LogException(msg, e, extraData); } /// /// Write an exception message to Gamecraft's log /// /// The object to log /// The exception to log /// The extra data to pass to the ILogger. /// This is implemented similar to LogException(Exception e, Dictionary extraData)'s extraData [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void LogException(object obj, Exception e, Dictionary extraData = null) { Svelto.Console.LogException(obj.ToString(), e, extraData); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void LogWarning(string msg) { Svelto.Console.LogWarning(msg); } /// /// Write a warning message to Gamecraft's log /// /// The object to log [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void LogWarning(object obj) { Svelto.Console.LogWarning(obj.ToString()); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void SystemLog(string msg) { Svelto.Console.SystemLog(msg); } /// /// Write a message to stdout (ie the terminal, like Command Prompt or PowerShell) /// /// The object to log [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void SystemLog(object obj) { Svelto.Console.SystemLog(obj.ToString()); } // descriptive logging /// /// Write a descriptive message to Gamecraft's log only when the API is a Debug build /// /// The object to log [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void MetaDebugLog(object obj) { #if DEBUG MetaLog($"[MetaDebug]{obj.ToString()}"); #endif } /// /// Write a descriptive message to Gamecraft's log including the current time and the calling method's name /// /// The object to log [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void MetaLog(object obj) { var method = (new StackTrace()).GetFrame(1).GetMethod(); Log($"[{DateTime.Now.ToString()}][{method.DeclaringType.FullName}.{method.Name}]{obj.ToString()}"); } // CLI logging /// /// Write a message to Gamecraft's command line /// /// The object to log [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void CommandLog(object obj) { CommandLog(obj.ToString()); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void CommandLog(string msg) { uREPL.Log.Output(msg); } /// /// Write an error message to Gamecraft's command line /// /// The object to log [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void CommandLogError(object obj) { CommandLogError(obj.ToString()); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void CommandLogError(string msg) { uREPL.Log.Error(msg); } /// /// Write a warning message to Gamecraft's command line /// /// The object to log [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void CommandLogWarning(object obj) { CommandLogWarning(obj.ToString()); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void CommandLogWarning(string msg) { uREPL.Log.Warn(msg); } } }