Server LuaCsForBarotrauma
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 GameServer Server
Definition: GameMain.cs:39
static LuaCsSetup LuaCs
Definition: GameMain.cs:37
object Call(string name, params object[] args)
static void LogError(string message, LuaCsMessageOrigin origin)
Definition: LuaCsLogger.cs:71
static void LogError(string message)
Definition: LuaCsLogger.cs:93
static LuaCsExceptionHandler ExceptionHandler
Definition: LuaCsLogger.cs:33
static LuaCsMessageLogger MessageLogger
Definition: LuaCsLogger.cs:32
static void LogMessage(string message, Color? serverColor=null, Color? clientColor=null)
Definition: LuaCsLogger.cs:98
static bool HideUserNames
Definition: LuaCsLogger.cs:18
static void Log(string message, Color? color=null, ServerLog.MessageType messageType=ServerLog.MessageType.ServerMessage)
Definition: LuaCsLogger.cs:110
static void HandleException(Exception ex, LuaCsMessageOrigin origin)
Definition: LuaCsLogger.cs:35
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)
override IReadOnlyList< Client > ConnectedClients
Definition: GameServer.cs:117
void SendDirectChatMessage(string txt, Client recipient, ChatMessageType messageType=ChatMessageType.Server)
Definition: GameServer.cs:3653