Minecraft-Console-Client/MinecraftClient/Logger/FilteredLogger.cs
2022-10-06 18:12:32 +08:00

90 lines
2.9 KiB
C#

using System.Text.RegularExpressions;
using static MinecraftClient.Settings;
namespace MinecraftClient.Logger
{
public class FilteredLogger : LoggerBase
{
protected enum FilterChannel { Debug, Chat }
protected bool ShouldDisplay(FilterChannel channel, string msg)
{
if (Config.Logging.FilterMode == LoggingConfigHealper.LoggingConfig.FilterModeEnum.disable)
return true;
Regex? regexToUse = null;
// Convert to bool for XOR later. Whitelist = 0, Blacklist = 1
switch (channel)
{
case FilterChannel.Chat:
string chat = Config.Logging.ChatFilterRegex;
if (string.IsNullOrEmpty(chat))
regexToUse = null;
else
regexToUse = new(chat);
break;
case FilterChannel.Debug:
string debug = Config.Logging.DebugFilterRegex;
if (string.IsNullOrEmpty(debug))
regexToUse = null;
else
regexToUse = new(debug);
break;
}
if (regexToUse != null)
{
// IsMatch and white/blacklist result can be represented using XOR
// e.g. matched(true) ^ blacklist(true) => shouldn't log(false)
if (Config.Logging.FilterMode == LoggingConfigHealper.LoggingConfig.FilterModeEnum.blacklist)
return !regexToUse.IsMatch(msg);
else if (Config.Logging.FilterMode == LoggingConfigHealper.LoggingConfig.FilterModeEnum.whitelist)
return regexToUse.IsMatch(msg);
else
return true;
}
else return true;
}
public override void Debug(string msg)
{
if (DebugEnabled)
{
if (ShouldDisplay(FilterChannel.Debug, msg))
{
Log("§8[DEBUG] " + msg);
}
// Don't write debug lines here as it could cause a stack overflow
}
}
public override void Info(string msg)
{
if (InfoEnabled)
ConsoleIO.WriteLogLine(msg);
}
public override void Warn(string msg)
{
if (WarnEnabled)
Log("§6[WARN] " + msg);
}
public override void Error(string msg)
{
if (ErrorEnabled)
Log("§c[ERROR] " + msg);
}
public override void Chat(string msg)
{
if (ChatEnabled)
{
if (ShouldDisplay(FilterChannel.Chat, msg))
{
Log(msg);
}
else Debug("[Logger] One Chat message filtered: " + msg);
}
}
}
}