using System;
using System.Threading;
using StardewModdingAPI.Framework;
using Monitor = StardewModdingAPI.Framework.Monitor;
namespace StardewModdingAPI
{
/// A singleton which logs messages to the SMAPI console and log file.
[Obsolete("Use " + nameof(Mod) + "." + nameof(Mod.Monitor))]
public static class Log
{
/*********
** Accessors
*********/
/// The underlying logger.
internal static Monitor Monitor;
/// Tracks the installed mods.
internal static ModRegistry ModRegistry;
/// A temporary field to avoid infinite loops (since we use a deprecated interface to warn about the deprecated interface).
private static bool WarnedDeprecated;
/*********
** Public methods
*********/
/****
** Exceptions
****/
/// Log an exception event.
/// The event sender.
/// The event arguments.
public static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
Log.WarnDeprecated();
Log.Monitor.Log($"Critical app domain exception: {e.ExceptionObject}", LogLevel.Error);
}
/// Log a thread exception event.
/// The event sender.
/// The event arguments.
public static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
{
Log.WarnDeprecated();
Log.Monitor.Log($"Critical thread exception: {e.Exception}", LogLevel.Error);
}
/****
** Synchronous logging
****/
/// Synchronously log a message to the console. NOTE: synchronous logging is discouraged; use asynchronous methods instead.
/// The message to log.
/// The message color.
public static void SyncColour(object message, ConsoleColor color)
{
Log.WarnDeprecated();
Log.Monitor.LegacyLog(Log.GetModName(), message?.ToString(), color);
}
/****
** Asynchronous logging
****/
/// Asynchronously log a message to the console with the specified color.
/// The message to log.
/// The message color.
public static void AsyncColour(object message, ConsoleColor color)
{
Log.WarnDeprecated();
Log.Monitor.LegacyLog(Log.GetModName(), message?.ToString(), color);
}
/// Asynchronously log a message to the console.
/// The message to log.
public static void Async(object message)
{
Log.WarnDeprecated();
Log.Monitor.LegacyLog(Log.GetModName(), message?.ToString(), ConsoleColor.Gray);
}
/// Asynchronously log a red message to the console.
/// The message to log.
public static void AsyncR(object message)
{
Log.WarnDeprecated();
Log.Monitor.LegacyLog(Log.GetModName(), message?.ToString(), ConsoleColor.Red);
}
/// Asynchronously log an orange message to the console.
/// The message to log.
public static void AsyncO(object message)
{
Log.WarnDeprecated();
Log.Monitor.LegacyLog(Log.GetModName(), message?.ToString(), ConsoleColor.DarkYellow);
}
/// Asynchronously log a yellow message to the console.
/// The message to log.
public static void AsyncY(object message)
{
Log.WarnDeprecated();
Log.Monitor.LegacyLog(Log.GetModName(), message?.ToString(), ConsoleColor.Yellow);
}
/// Asynchronously log a green message to the console.
/// The message to log.
public static void AsyncG(object message)
{
Log.WarnDeprecated();
Log.Monitor.LegacyLog(Log.GetModName(), message?.ToString(), ConsoleColor.Green);
}
/// Asynchronously log a cyan message to the console.
/// The message to log.
public static void AsyncC(object message)
{
Log.WarnDeprecated();
Log.Monitor.LegacyLog(Log.GetModName(), message?.ToString(), ConsoleColor.Cyan);
}
/// Asynchronously log a magenta message to the console.
/// The message to log.
public static void AsyncM(object message)
{
Log.WarnDeprecated();
Log.Monitor.LegacyLog(Log.GetModName(), message?.ToString(), ConsoleColor.Magenta);
}
/// Asynchronously log a warning to the console.
/// The message to log.
public static void Warning(object message)
{
Log.WarnDeprecated();
Log.Monitor.LegacyLog(Log.GetModName(), message?.ToString(), ConsoleColor.Yellow, LogLevel.Warn);
}
/// Asynchronously log an error to the console.
/// The message to log.
public static void Error(object message)
{
Log.WarnDeprecated();
Log.Monitor.LegacyLog(Log.GetModName(), message?.ToString(), ConsoleColor.Red, LogLevel.Error);
}
/// Asynchronously log a success message to the console.
/// The message to log.
public static void Success(object message)
{
Log.WarnDeprecated();
Log.AsyncG(message);
}
/// Asynchronously log an info message to the console.
/// The message to log.
public static void Info(object message)
{
Log.WarnDeprecated();
Log.Monitor.LegacyLog(Log.GetModName(), message?.ToString(), ConsoleColor.White, LogLevel.Info);
}
/// Asynchronously log a debug message to the console.
/// The message to log.
public static void Debug(object message)
{
Log.WarnDeprecated();
Log.Monitor.LegacyLog(Log.GetModName(), message?.ToString(), ConsoleColor.DarkGray);
}
/// Asynchronously log a message to the file that's not shown in the console.
/// The message to log.
internal static void LogToFile(string message)
{
Log.WarnDeprecated();
Log.Monitor.LegacyLog(Log.GetModName(), message, ConsoleColor.DarkGray, LogLevel.Trace);
}
/*********
** Private methods
*********/
/// Raise a deprecation warning.
private static void WarnDeprecated()
{
if (!Log.WarnedDeprecated)
{
Log.WarnedDeprecated = true;
Program.DeprecationManager.Warn($"the {nameof(Log)} class", "1.1", DeprecationLevel.Notice);
}
}
/// Get the name of the mod logging a message from the stack.
private static string GetModName()
{
return Log.ModRegistry.GetModFromStack() ?? "";
}
}
}