PSO2SERVER/Server/Logger.cs
2024-09-11 17:13:00 +08:00

155 lines
5.0 KiB
C#

using System;
using System.IO;
using PSO2SERVER.Packets.PSOPackets;
namespace PSO2SERVER
{
/// <summary>
/// Wrapper for Console's Write and WriteLine functions to add coloring as well as integrate it into the Console System
/// and add dumping to a log file.
/// </summary>
public static class Logger
{
private static readonly StreamWriter Writer = new StreamWriter("SERVER.log", true);
public static bool VerbosePackets = false;
private static void AddLine(ConsoleColor color, string text)
{
// Return if we don't have a ConsoleSystem created yet
if (ServerApp.ConsoleSystem == null) return;
ServerApp.ConsoleSystem.AddLine(color, text);
}
public static void Write(string text, params object[] args)
{
AddLine(ConsoleColor.White, string.Format(text, args));
WriteFile(text, args);
}
public static void WriteInternal(string text, params object[] args)
{
AddLine(ConsoleColor.Cyan, string.Format(text, args));
WriteFile(text, args);
}
public static void WriteCommand(Client client, string text, params object[] args)
{
if (client == null)
{
AddLine(ConsoleColor.Green, string.Format(text, args));
WriteFile(text, args);
}
else
WriteClient(client, text, args);
}
public static void WriteClient(Client client, string text, params object[] args)
{
var message = string.Format(text, args).Replace('\\', '/');
var packet = new SystemMessagePacket(message, SystemMessagePacket.MessageType.SystemMessage);
client.SendPacket(packet);
}
public static void WriteWarning(string text, params object[] args)
{
AddLine(ConsoleColor.Yellow, string.Format(text, args));
WriteFile(text, args);
}
public static void WriteError(string text, params object[] args)
{
AddLine(ConsoleColor.Red, string.Format(text, args));
WriteFile(text, args);
}
public static void WriteException(string message, Exception ex)
{
var text = string.Empty;
text += string.Format("[ERR] {0} - {1}: {2}", message, ex.GetType(), ex);
if (ex.InnerException != null)
text += string.Format("\n[ERR] Inner Exception: {0}", ex.InnerException);
WriteFile(text);
AddLine(ConsoleColor.Red, text);
}
public static void WriteHex(string text, byte[] array)
{
AddLine(ConsoleColor.DarkCyan, text);
// Calculate lines
var lines = 0;
for (var i = 0; i < array.Length; i++)
if ((i % 16) == 0)
lines++;
for (var i = 0; i < lines; i++)
{
var hexString = string.Empty;
// Address
hexString += string.Format("{0:X8} ", i * 16);
// Bytes
for (var j = 0; j < 16; j++)
{
if (j + (i * 16) >= array.Length)
break;
hexString += string.Format("{0:X2} ", array[j + (i * 16)]);
}
// Spacing
while (hexString.Length < 16 * 4)
hexString += ' ';
// ASCII
for (var j = 0; j < 16; j++)
{
if (j + (i * 16) >= array.Length)
break;
var asciiChar = (char)array[j + (i * 16)];
if (asciiChar == (char)0x00)
asciiChar = '.';
hexString += asciiChar;
}
// Strip off unnecessary stuff
hexString = hexString.Replace('\a', ' '); // Alert beeps
hexString = hexString.Replace('\n', ' '); // Newlines
hexString = hexString.Replace('\r', ' '); // Carriage returns
hexString = hexString.Replace('\\', ' '); // Escape break
AddLine(ConsoleColor.White, hexString);
WriteFile(hexString);
}
}
public static void WriteFile(string text, params object[] args)
{
if (args.Length > 0)
Writer.WriteLine(DateTime.Now + " - " + text, args);
else
Writer.WriteLine(DateTime.Now + " - " + text);
// Later we should probably only flush once every PosX amount of lines or on some other condition
Writer.Flush();
}
public static void WriteHeader()
{
Writer.WriteLine();
Writer.WriteLine("--------------------------------------------------");
Writer.WriteLine("\t\t" + DateTime.Now);
Writer.WriteLine("--------------------------------------------------");
}
}
}