Client LuaCsForBarotrauma
BarotraumaShared/SharedSource/LuaCs/LuaCsLogger.cs
1 using System;
3 using Microsoft.Xna.Framework;
4 using MoonSharp.Interpreter;
5 
6 namespace Barotrauma
7 {
8  internal enum LuaCsMessageOrigin
9  {
10  LuaCs,
11  Unknown,
12  LuaMod,
13  CSharpMod,
14  }
15 
16  partial class LuaCsLogger
17  {
18  public static bool HideUserNames = true;
19 
20 #if SERVER
21  private const string LogPrefix = "SV";
22  private const int NetMaxLength = 1024;
23  private const int NetMaxMessages = 60;
24 
25  // This is used so its possible to call logging functions inside the serverLog
26  // hook without creating an infinite loop
27  private static bool lockLog = false;
28 #else
29  private const string LogPrefix = "CL";
30 #endif
31 
32  public static LuaCsMessageLogger MessageLogger;
33  public static LuaCsExceptionHandler ExceptionHandler;
34 
35  public static void HandleException(Exception ex, LuaCsMessageOrigin origin)
36  {
37  string errorString = "";
38  switch (ex)
39  {
40  case NetRuntimeException netRuntimeException:
41  if (netRuntimeException.DecoratedMessage == null)
42  {
43  errorString = netRuntimeException.ToString();
44  }
45  else
46  {
47  // FIXME: netRuntimeException.ToString() doesn't print the InnerException's stack trace...
48  errorString = $"{netRuntimeException.DecoratedMessage}: {netRuntimeException}";
49  }
50  break;
51  case InterpreterException interpreterException:
52  if (interpreterException.DecoratedMessage == null)
53  {
54  errorString = interpreterException.ToString();
55  }
56  else
57  {
58  errorString = interpreterException.DecoratedMessage;
59  }
60  break;
61  default:
62  errorString = ex.StackTrace != null
63  ? ex.ToString()
64  : $"{ex}\n{Environment.StackTrace}";
65  break;
66  }
67 
68  LogError(Environment.UserName + " " + errorString, origin);
69  }
70 
71  public static void LogError(string message, LuaCsMessageOrigin origin)
72  {
73  if (HideUserNames && !Environment.UserName.IsNullOrEmpty())
74  {
75  message = message.Replace(Environment.UserName, "USERNAME");
76  }
77 
78  switch (origin)
79  {
80  case LuaCsMessageOrigin.LuaCs:
81  case LuaCsMessageOrigin.Unknown:
82  LogError($"[{LogPrefix} ERROR] {message}");
83  break;
84  case LuaCsMessageOrigin.LuaMod:
85  LogError($"[{LogPrefix} LUA ERROR] {message}");
86  break;
87  case LuaCsMessageOrigin.CSharpMod:
88  LogError($"[{LogPrefix} CS ERROR] {message}");
89  break;
90  }
91  }
92 
93  public static void LogError(string message)
94  {
95  Log($"{message}", Color.Red, ServerLog.MessageType.Error);
96  }
97 
98  public static void LogMessage(string message, Color? serverColor = null, Color? clientColor = null)
99  {
100  if (serverColor == null) { serverColor = Color.MediumPurple; }
101  if (clientColor == null) { clientColor = Color.Purple; }
102 
103 #if SERVER
104  Log(message, serverColor);
105 #else
106  Log(message, clientColor);
107 #endif
108  }
109 
110  public static void Log(string message, Color? color = null, ServerLog.MessageType messageType = ServerLog.MessageType.ServerMessage)
111  {
112  MessageLogger?.Invoke(message);
113 
114  DebugConsole.NewMessage(message, color);
115 
116 #if SERVER
117  void broadcastMessage(string m)
118  {
119  foreach (var client in GameMain.Server.ConnectedClients)
120  {
121  //if (client.ChatMsgQueue.Count > NetMaxMessages)
122  //{
123  // If there's an error or message happening many times per second (inside Update loop for example)
124  // we will need to discart some messages so the client doesn't get overloaded by all
125  // those net messages.
126  // continue;
127  //}
128 
129  ChatMessage consoleMessage = ChatMessage.Create("", m, ChatMessageType.Console, null, textColor: color);
130  GameMain.Server.SendDirectChatMessage(consoleMessage, client);
131 
132  if (!GameMain.Server.ServerSettings.SaveServerLogs || !client.HasPermission(ClientPermissions.ServerLog))
133  {
134  continue;
135  }
136 
137  ChatMessage logMessage = ChatMessage.Create(messageType.ToString(), "[LuaCs] " + m, ChatMessageType.ServerLog, null);
138  GameMain.Server.SendDirectChatMessage(logMessage, client);
139  }
140  }
141 
142  if (GameMain.Server != null)
143  {
144  if (GameMain.Server.ServerSettings.SaveServerLogs)
145  {
146  string logMessage = "[LuaCs] " + message;
147  GameMain.Server.ServerSettings.ServerLog.WriteLine(logMessage, messageType, false);
148 
149  if (!lockLog)
150  {
151  lockLog = true;
152  GameMain.LuaCs?.Hook?.Call("serverLog", logMessage, messageType);
153  lockLog = false;
154  }
155  }
156 
157  for (int i = 0; i < message.Length; i += NetMaxLength)
158  {
159  string subStr = message.Substring(i, Math.Min(1024, message.Length - i));
160 
161  broadcastMessage(subStr);
162  }
163  }
164 #endif
165  }
166  }
167 
168  partial class LuaCsSetup
169  {
170  // Compatibility with cs mods that use this method.
171  public static void PrintLuaError(object message) => LuaCsLogger.LogError($"{message}", LuaCsMessageOrigin.LuaMod);
172  public static void PrintCsError(object message) => LuaCsLogger.LogError($"{message}", LuaCsMessageOrigin.CSharpMod);
173  public static void PrintGenericError(object message) => LuaCsLogger.LogError($"{message}", LuaCsMessageOrigin.LuaCs);
174 
175  internal void PrintMessage(object message) => LuaCsLogger.LogMessage($"{message}");
176 
177  public static void PrintCsMessage(object message) => LuaCsLogger.LogMessage($"{message}");
178 
179  internal void HandleException(Exception ex, LuaCsMessageOrigin origin) => LuaCsLogger.HandleException(ex, origin);
180  }
181 }
static LuaCsSetup LuaCs
Definition: GameMain.cs:26
object Call(string name, params object[] args)
static void LogError(string message, LuaCsMessageOrigin origin)
static void LogMessage(string message, Color? serverColor=null, Color? clientColor=null)
static void Log(string message, Color? color=null, ServerLog.MessageType messageType=ServerLog.MessageType.ServerMessage)
static void HandleException(Exception ex, LuaCsMessageOrigin origin)
static void PrintCsMessage(object message)
static void PrintGenericError(object message)
static void PrintLuaError(object message)
static void PrintCsError(object message)
static ChatMessage Create(string senderName, string text, ChatMessageType type, Entity sender, Client client=null, PlayerConnectionChangeType changeType=PlayerConnectionChangeType.None, Color? textColor=null)