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 { /// <summary> /// Utility class to access Gamecraft's built-in logging capabilities. /// The log is saved to %APPDATA%\..\LocalLow\FreeJam\Gamecraft\Player.Log /// </summary> public static class Logging { [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void Log(string msg) { Svelto.Console.Log(msg); } /// <summary> /// Write a regular message to Gamecraft's log /// </summary> /// <param name="obj">The object to log</param> [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); } /// <summary> /// Write a debug message to Gamecraft's log /// </summary> /// <param name="obj">The object to log</param> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void LogDebug(object obj) { Svelto.Console.LogDebug(obj.ToString()); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void LogDebug<T>(string msg, T extraDebug) { Svelto.Console.LogDebug<T>(msg, extraDebug); } /// <summary> /// Write a debug message and object to Gamecraft's log /// The reason this method exists in Svelto.Console is beyond my understanding /// </summary> /// <typeparam name="T">The type of the extra debug object</typeparam> /// <param name="obj">The object to log</param> /// <param name="extraDebug">The extra object to log</param> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void LogDebug<T>(object obj, T extraDebug) { Svelto.Console.LogDebug<T>(obj.ToString(), extraDebug); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void LogError(string msg, Dictionary<string, string> extraData = null) { Svelto.Console.LogError(msg, extraData); } /// <summary> /// Write an error message to Gamecraft's log /// </summary> /// <param name="obj">The object to log</param> /// <param name="extraData">The extra data to pass to the ILogger</param> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void LogError(object obj, Dictionary<string, string> extraData = null) { Svelto.Console.LogError(obj.ToString(), extraData); } /// <summary> /// Write an exception to Gamecraft's log and to the screen and exit game /// </summary> /// <param name="e">The exception to log</param> /// <param name="extraData">The extra data to pass to the ILogger. /// This is automatically populated with "OuterException#" and "OuterStacktrace#" entries</param> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void LogException(Exception e, string msg = null, Dictionary<string, string> extraData = null) { Svelto.Console.LogException(e, msg, extraData); } /// <summary> /// Write an exception message to Gamecraft's log and to the screen and exit game /// </summary> /// <param name="obj">The object to log</param> /// <param name="e">The exception to log</param> /// <param name="extraData">The extra data to pass to the ILogger. /// This is implemented similar to LogException(Exception e, Dictionary extraData)'s extraData</param> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void LogException(Exception e, object obj, Dictionary<string, string> extraData = null) { Svelto.Console.LogException(e, obj.ToString(), extraData); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void LogWarning(string msg) { Svelto.Console.LogWarning(msg); } /// <summary> /// Write a warning message to Gamecraft's log /// </summary> /// <param name="obj">The object to log</param> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void LogWarning(object obj) { Svelto.Console.LogWarning(obj.ToString()); } [Obsolete("SystemLog was removed from Svelto.Common")] [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void SystemLog(string msg) { Svelto.Console.Log(msg); } /// <summary> /// Write a message to stdout (ie the terminal, like Command Prompt or PowerShell) /// </summary> /// <param name="obj">The object to log</param> [Obsolete("SystemLog was removed from Svelto.Common")] [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void SystemLog(object obj) { Svelto.Console.Log(obj.ToString()); } // descriptive logging /// <summary> /// Write a descriptive message to Gamecraft's log only when the API is a Debug build /// </summary> /// <param name="obj">The object to log</param> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void MetaDebugLog(object obj) { #if DEBUG MetaLog($"[MetaDebug]{obj.ToString()}"); #endif } /// <summary> /// Write a descriptive message to Gamecraft's log including the current time and the calling method's name /// </summary> /// <param name="obj">The object to log</param> [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 /// <summary> /// Write a message to Gamecraft's command line /// </summary> /// <param name="obj">The object to log</param> [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); } /// <summary> /// Write an error message to Gamecraft's command line /// </summary> /// <param name="obj">The object to log</param> [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); } /// <summary> /// Write a warning message to Gamecraft's command line /// </summary> /// <param name="obj">The object to log</param> [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); } } }