Move logging stuff to a separate file

This commit is contained in:
EvilFactory
2022-10-28 13:19:23 -03:00
parent 9502d70290
commit d88a6b5ef0
2 changed files with 149 additions and 143 deletions

View File

@@ -0,0 +1,146 @@
using System;
using Barotrauma.Networking;
using Microsoft.Xna.Framework;
using MoonSharp.Interpreter;
namespace Barotrauma
{
internal enum LuaCsMessageOrigin
{
LuaCs,
Unknown,
LuaMod,
CSharpMod,
}
internal delegate void LuaCsMessageLogger(string prefix, object o);
internal delegate void LuaCsExceptionHandler(Exception ex, LuaCsMessageOrigin origin);
// TODO: make it a separate class
partial class LuaCsSetup
{
#if SERVER
private const string LOG_PREFIX = "SV";
#else
private const string LOG_PREFIX = "CL";
#endif
public static void PrintLuaError(object o) => PrintErrorBase($"[{LOG_PREFIX} LUA ERROR] ", o, "nil");
public static void PrintCsError(object o) => PrintErrorBase($"[{LOG_PREFIX} CS ERROR] ", o, "Null");
public static void PrintGenericError(object o) => PrintErrorBase($"[{LOG_PREFIX} ERROR] ", o, "Null");
private static void PrintErrorBase(string prefix, object message, string empty)
{
message ??= empty;
var str = message.ToString();
for (int i = 0; i < str.Length; i += 1024)
{
var subStr = str.Substring(i, Math.Min(1024, str.Length - i));
var errorMsg = subStr;
if (i == 0) errorMsg = prefix + errorMsg;
DebugConsole.ThrowError(errorMsg);
#if SERVER
if (GameMain.Server != null)
{
foreach (var c in GameMain.Server.ConnectedClients)
{
GameMain.Server.SendDirectChatMessage(ChatMessage.Create("", errorMsg, ChatMessageType.Console, null, textColor: Color.Red), c);
}
GameServer.Log(errorMsg, ServerLog.MessageType.Error);
}
#endif
}
}
// TODO: deprecate this (in an effort to get rid of as much global state as possible)
public void PrintError(object o, LuaCsMessageOrigin origin)
{
switch (origin)
{
case LuaCsMessageOrigin.LuaCs:
PrintGenericError(o);
break;
case LuaCsMessageOrigin.LuaMod:
PrintLuaError(o);
break;
case LuaCsMessageOrigin.CSharpMod:
PrintCsError(o);
break;
}
}
private void DefaultExceptionHandler(Exception ex, LuaCsMessageOrigin origin)
{
switch (ex)
{
case NetRuntimeException netRuntimeException:
if (netRuntimeException.DecoratedMessage == null)
{
PrintError(netRuntimeException, origin);
}
else
{
// FIXME: netRuntimeException.ToString() doesn't print the InnerException's stack trace...
PrintError($"{netRuntimeException.DecoratedMessage}: {netRuntimeException}", origin);
}
break;
case InterpreterException interpreterException:
if (interpreterException.DecoratedMessage == null)
{
PrintError(interpreterException, origin);
}
else
{
PrintError(interpreterException.DecoratedMessage, origin);
}
break;
default:
var msg = ex.StackTrace != null
? ex.ToString()
: $"{ex}\n{Environment.StackTrace}";
PrintError(msg, origin);
break;
}
}
private static void DefaultMessageLogger(string prefix, object o)
{
var message = o.ToString();
for (int i = 0; i < message.Length; i += 1024)
{
var subStr = message.Substring(i, Math.Min(1024, message.Length - i));
#if SERVER
if (GameMain.Server != null)
{
foreach (var c in GameMain.Server.ConnectedClients)
{
GameMain.Server.SendDirectChatMessage(ChatMessage.Create("", subStr, ChatMessageType.Console, null, textColor: Color.MediumPurple), c);
}
GameServer.Log(prefix + subStr, ServerLog.MessageType.ServerMessage);
}
#endif
}
#if SERVER
DebugConsole.NewMessage(message.ToString(), Color.MediumPurple);
#else
DebugConsole.NewMessage(message.ToString(), Color.Purple);
#endif
}
private void PrintMessageBase(string prefix, object message, string empty) => MessageLogger?.Invoke(prefix, message ?? empty);
internal void PrintMessage(object message) => PrintMessageBase("[LuaCs] ", message, "nil");
// TODO: deprecate this (in an effort to get rid of as much global state as possible)
public static void PrintCsMessage(object message) => GameMain.LuaCs.PrintMessage(message);
}
}

View File

@@ -20,18 +20,6 @@ namespace Barotrauma
public LuaCsSetupConfig() { }
}
internal delegate void LuaCsMessageLogger(string prefix, object o);
internal delegate void LuaCsExceptionHandler(Exception ex, LuaCsMessageOrigin origin);
internal enum LuaCsMessageOrigin
{
LuaCs,
Unknown,
LuaMod,
CSharpMod,
}
partial class LuaCsSetup
{
public const string LuaSetupFile = "Lua/LuaSetup.lua";
@@ -70,6 +58,9 @@ namespace Barotrauma
public CsScriptLoader CsScriptLoader { get; private set; }
public LuaCsSetupConfig Config { get; private set; }
internal LuaCsExceptionHandler ExceptionHandler { get; set; }
internal LuaCsMessageLogger MessageLogger { get; set; }
public LuaCsSetup()
{
MessageLogger = DefaultMessageLogger;
@@ -144,142 +135,11 @@ namespace Barotrauma
return null;
}
private void DefaultExceptionHandler(Exception ex, LuaCsMessageOrigin origin)
{
switch (ex)
{
case NetRuntimeException netRuntimeException:
if (netRuntimeException.DecoratedMessage == null)
{
PrintError(netRuntimeException, origin);
}
else
{
// FIXME: netRuntimeException.ToString() doesn't print the InnerException's stack trace...
PrintError($"{netRuntimeException.DecoratedMessage}: {netRuntimeException}", origin);
}
break;
case InterpreterException interpreterException:
if (interpreterException.DecoratedMessage == null)
{
PrintError(interpreterException, origin);
}
else
{
PrintError(interpreterException.DecoratedMessage, origin);
}
break;
default:
var msg = ex.StackTrace != null
? ex.ToString()
: $"{ex}\n{Environment.StackTrace}";
PrintError(msg, origin);
break;
}
}
internal LuaCsExceptionHandler ExceptionHandler { get; set; }
internal void HandleException(Exception ex, LuaCsMessageOrigin origin)
{
this.ExceptionHandler?.Invoke(ex, origin);
}
private static void PrintErrorBase(string prefix, object message, string empty)
{
message ??= empty;
var str = message.ToString();
for (int i = 0; i < str.Length; i += 1024)
{
var subStr = str.Substring(i, Math.Min(1024, str.Length - i));
var errorMsg = subStr;
if (i == 0) errorMsg = prefix + errorMsg;
DebugConsole.ThrowError(errorMsg);
#if SERVER
if (GameMain.Server != null)
{
foreach (var c in GameMain.Server.ConnectedClients)
{
GameMain.Server.SendDirectChatMessage(ChatMessage.Create("", errorMsg, ChatMessageType.Console, null, textColor: Color.Red), c);
}
GameServer.Log(errorMsg, ServerLog.MessageType.Error);
}
#endif
}
}
#if SERVER
private const string LOG_PREFIX = "SV";
#else
private const string LOG_PREFIX = "CL";
#endif
// TODO: deprecate this (in an effort to get rid of as much global state as possible)
public void PrintError(object o, LuaCsMessageOrigin origin)
{
switch (origin)
{
case LuaCsMessageOrigin.LuaCs:
PrintGenericError(o);
break;
case LuaCsMessageOrigin.LuaMod:
PrintLuaError(o);
break;
case LuaCsMessageOrigin.CSharpMod:
PrintCsError(o);
break;
}
}
private static void PrintLuaError(object o) => PrintErrorBase($"[{LOG_PREFIX} LUA ERROR] ", o, "nil");
// TODO: deprecate this
// XXX: this is only public so that we don't break backward compat with C# mods
public static void PrintCsError(object o) => PrintErrorBase($"[{LOG_PREFIX} CS ERROR] ", o, "Null");
private static void PrintGenericError(object o) => PrintErrorBase($"[{LOG_PREFIX} ERROR] ", o, "Null");
internal LuaCsMessageLogger MessageLogger { get; set; }
private static void DefaultMessageLogger(string prefix, object o)
{
var message = o.ToString();
for (int i = 0; i < message.Length; i += 1024)
{
var subStr = message.Substring(i, Math.Min(1024, message.Length - i));
#if SERVER
if (GameMain.Server != null)
{
foreach (var c in GameMain.Server.ConnectedClients)
{
GameMain.Server.SendDirectChatMessage(ChatMessage.Create("", subStr, ChatMessageType.Console, null, textColor: Color.MediumPurple), c);
}
GameServer.Log(prefix + subStr, ServerLog.MessageType.ServerMessage);
}
#endif
}
#if SERVER
DebugConsole.NewMessage(message.ToString(), Color.MediumPurple);
#else
DebugConsole.NewMessage(message.ToString(), Color.Purple);
#endif
}
private void PrintMessageBase(string prefix, object message, string empty) => MessageLogger?.Invoke(prefix, message ?? empty);
internal void PrintMessage(object message) => PrintMessageBase("[LuaCs] ", message, "nil");
// TODO: deprecate this (in an effort to get rid of as much global state as possible)
public static void PrintCsMessage(object message) => GameMain.LuaCs.PrintMessage(message);
private DynValue DoFile(string file, Table globalContext = null, string codeStringFriendly = null)
{
if (!LuaCsFile.CanReadFromPath(file))