diff --git a/LineHandlers/AbstractLineHandler.cs b/LineHandlers/AbstractLineHandler.cs index 46ed1bf..c251f30 100644 --- a/LineHandlers/AbstractLineHandler.cs +++ b/LineHandlers/AbstractLineHandler.cs @@ -10,7 +10,7 @@ public interface ILineHandler bool HandleLine(string line); - void LogColor( string color ); + void LogOutputColor( string color ); } @@ -19,9 +19,9 @@ public abstract class AbstractLineHandler: ILineHandler protected string Pattern { get; } protected Regex regex; public List Actions = new List(); - protected bool LogOutput { get; set; } = true; - protected string LogColor = "37m"; // Default to white - public string COLOR_PREFIX => $"\u001b[{LogColor}"; + public bool LogOutput { get; set; } = true; + public string LogOutputColor { get; set; } = "37m"; // Default to white + public string COLOR_PREFIX => $"\u001b[{LogOutputColor}"; public static readonly string COLOR_RESET = "\u001b[0m"; public static Logger logger = LogManager.GetCurrentClassLogger(); @@ -30,8 +30,6 @@ protected AbstractLineHandler(string matchPattern) { Pattern = matchPattern; regex = new Regex(Pattern); - logger.Info($"Initialized Regular Expression: {Pattern}"); - } public abstract bool HandleLine(string line); @@ -49,9 +47,9 @@ protected void ExecuteActions() } } - void ILineHandler.LogColor(string color) + void ILineHandler.LogOutputColor(string color) { - LogColor = color; + LogOutputColor = color; } } diff --git a/LineHandlers/AvatarChangeHandler.cs b/LineHandlers/AvatarChangeHandler.cs index 45b5710..fc2fbe3 100644 --- a/LineHandlers/AvatarChangeHandler.cs +++ b/LineHandlers/AvatarChangeHandler.cs @@ -15,6 +15,7 @@ public class AvatarChangeHandler : AbstractLineHandler public AvatarChangeHandler(string matchPattern) : base(matchPattern) { + logger.Info($"** AvatarChange Handler: Regular Expression: {Pattern}"); } public override bool HandleLine(string line) diff --git a/LineHandlers/AvatarUnpackHandler.cs b/LineHandlers/AvatarUnpackHandler.cs index 00c3e4c..ee70604 100644 --- a/LineHandlers/AvatarUnpackHandler.cs +++ b/LineHandlers/AvatarUnpackHandler.cs @@ -14,6 +14,7 @@ public class AvatarUnpackHandler : AbstractLineHandler public AvatarUnpackHandler(string matchPattern) : base(matchPattern) { + logger.Info($"** AvatarUnpack Handler: Regular Expression: {Pattern}"); } public override bool HandleLine(string line) diff --git a/LineHandlers/LoggingLineHandler.cs b/LineHandlers/LoggingLineHandler.cs index 784ff76..282f9e6 100644 --- a/LineHandlers/LoggingLineHandler.cs +++ b/LineHandlers/LoggingLineHandler.cs @@ -12,7 +12,6 @@ public override bool HandleLine(string line) if( LogOutput ) { logger.Info($"{COLOR_PREFIX}{line}{COLOR_RESET}"); - //Console.WriteLine(line); } return true; } diff --git a/LineHandlers/OnPlayerJoinHandler.cs b/LineHandlers/OnPlayerJoinHandler.cs index 8bb460d..79ffb29 100644 --- a/LineHandlers/OnPlayerJoinHandler.cs +++ b/LineHandlers/OnPlayerJoinHandler.cs @@ -16,6 +16,7 @@ public class OnPlayerJoinHandler : AbstractLineHandler public OnPlayerJoinHandler(string matchPattern) : base(matchPattern) { + logger.Info($"** OnPlayer Join/Leave Handler: Regular Expression: {Pattern}"); } public override bool HandleLine(string line) @@ -31,11 +32,11 @@ public override bool HandleLine(string line) if( action.Equals("Joined") ) { - PlayerManager.PlayerJoined(userId, userName); + PlayerManager.PlayerJoined(userId, userName, this ); } else if( action.Equals("Left") ) { - PlayerManager.PlayerLeft(userName); + PlayerManager.PlayerLeft(userName, this); } return true; diff --git a/LineHandlers/OnPlayerNetworkHandler.cs b/LineHandlers/OnPlayerNetworkHandler.cs index af15060..0a39536 100644 --- a/LineHandlers/OnPlayerNetworkHandler.cs +++ b/LineHandlers/OnPlayerNetworkHandler.cs @@ -15,6 +15,7 @@ public class OnPlayerNetworkHandler : AbstractLineHandler public OnPlayerNetworkHandler(string matchPattern) : base(matchPattern) { + logger.Info($"** OnPlayer Network ID Handler: Regular Expression: {Pattern}"); } public override bool HandleLine(string line) @@ -28,7 +29,6 @@ public override bool HandleLine(string line) if( LogOutput ) { logger.Info($"{COLOR_PREFIX}Network_ID : {userName} ({networkId}){COLOR_RESET}"); - //Console.WriteLine($"{timestamp} - Network_ID : {userName} ({networkId})"); } ExecuteActions(); diff --git a/LineHandlers/PenNetworkIdHandler.cs b/LineHandlers/PenNetworkIdHandler.cs index 8fe058f..d1fb505 100644 --- a/LineHandlers/PenNetworkIdHandler.cs +++ b/LineHandlers/PenNetworkIdHandler.cs @@ -18,6 +18,9 @@ public class PenNetworkHandler : AbstractLineHandler public PenNetworkHandler(string matchPattern) : base(matchPattern) { + + logger.Info($"** Pen Network Id Handler: Regular Expression: {Pattern}"); + using (FileStream fs = new FileStream("./pen-network-id.csv", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) using (StreamReader sr = new StreamReader(fs, Encoding.UTF8)) { @@ -34,7 +37,7 @@ public PenNetworkHandler(string matchPattern) : base(matchPattern) int networkId = int.Parse(parts[0]); string penColor = parts[1]; penNetworkMap[networkId] = penColor; - logger.Debug($"Mapped Pen Color '{penColor}' to Network ID {networkId}"); + logger.Debug($"Mapped Pen Color '{penColor}' to Network ID: {networkId}"); } } } diff --git a/LineHandlers/PrintHandler.cs b/LineHandlers/PrintHandler.cs index 0833998..174343a 100644 --- a/LineHandlers/PrintHandler.cs +++ b/LineHandlers/PrintHandler.cs @@ -13,6 +13,7 @@ public class PrintHandler : AbstractLineHandler public PrintHandler(string matchPattern) : base(matchPattern) { + logger.Info($"** Print Handler: Regular Expression: {Pattern}"); } public override bool HandleLine(string line) diff --git a/LineHandlers/QuitHandler.cs b/LineHandlers/QuitHandler.cs index f946a19..27309ba 100644 --- a/LineHandlers/QuitHandler.cs +++ b/LineHandlers/QuitHandler.cs @@ -14,6 +14,7 @@ public class QuitHandler : AbstractLineHandler public QuitHandler(string matchPattern) : base(matchPattern) { + logger.Info($"** VRC Quit Handler: Regular Expression: {Pattern}"); } public override bool HandleLine(string line) @@ -28,7 +29,7 @@ public override bool HandleLine(string line) logger.Info($"{COLOR_PREFIX}Application Stop : {totalTime} seconds{COLOR_RESET}"); } - PlayerManager.ClearAllPlayers(); + PlayerManager.ClearAllPlayers(this); ExecuteActions(); return true; diff --git a/LineHandlers/StickerHandler.cs b/LineHandlers/StickerHandler.cs index 3429240..94d3244 100644 --- a/LineHandlers/StickerHandler.cs +++ b/LineHandlers/StickerHandler.cs @@ -16,6 +16,7 @@ public class StickerHandler : AbstractLineHandler public StickerHandler(string matchPattern) : base(matchPattern) { + logger.Info($"** Sticker Handler: Regular Expression: {Pattern}"); } public override bool HandleLine(string line) diff --git a/LineHandlers/VTKHandler.cs b/LineHandlers/VTKHandler.cs index f282188..0dc2bbc 100644 --- a/LineHandlers/VTKHandler.cs +++ b/LineHandlers/VTKHandler.cs @@ -14,6 +14,7 @@ public class VTKHandler : AbstractLineHandler public VTKHandler(string matchPattern) : base(matchPattern) { + logger.Info($"** Vote to Kick Handler: Regular Expression: {Pattern}"); } public override bool HandleLine(string line) diff --git a/LineHandlers/WarnKickHandler.cs b/LineHandlers/WarnKickHandler.cs index 5e7cb3c..617e5b2 100644 --- a/LineHandlers/WarnKickHandler.cs +++ b/LineHandlers/WarnKickHandler.cs @@ -15,6 +15,7 @@ public class WarnKickHandler : AbstractLineHandler public WarnKickHandler(string matchPattern) : base(matchPattern) { + logger.Info($"** Moderation Warn/Kick Handler: Regular Expression: {Pattern}"); } public override bool HandleLine(string line) diff --git a/PlayerManagement/PlayerManagement.cs b/PlayerManagement/PlayerManagement.cs index 367758c..25bfdf9 100644 --- a/PlayerManagement/PlayerManagement.cs +++ b/PlayerManagement/PlayerManagement.cs @@ -1,4 +1,5 @@ using NLog; +using Tailgrab.LineHandler; namespace Tailgrab.PlayerManagement { @@ -58,24 +59,30 @@ public static class PlayerManager public static readonly string COLOR_RESET = "\u001b[0m"; public static Logger logger = LogManager.GetCurrentClassLogger(); - public static void PlayerJoined(string userId, string displayName) + public static void PlayerJoined(string userId, string displayName, AbstractLineHandler handler) { if (!playersByUserId.ContainsKey(userId)) { Player newPlayer = new Player(userId, displayName); playersByUserId[userId] = newPlayer; playersByDisplayName[displayName] = newPlayer; - logger.Info($"{COLOR_PREFIX_GREEN}Player Joined: {displayName} (ID: {userId}){COLOR_RESET}"); + if( handler.LogOutput ) + { + logger.Info($"{COLOR_PREFIX_GREEN}Player Joined: {displayName} (ID: {userId}){COLOR_RESET}"); + } if( avatarByDisplayName.TryGetValue(displayName, out string? avatarName)) { AddPlayerEventByDisplayName(displayName, PlayerEvent.EventType.AvatarChange, $"Joined with Avatar: {avatarName}"); - logger.Info($"{COLOR_PREFIX_GREEN}\tAvatar on Join: {avatarName}{COLOR_RESET}"); + if( handler.LogOutput ) + { + logger.Info($"{COLOR_PREFIX_GREEN}\tAvatar on Join: {avatarName}{COLOR_RESET}"); + } } } } - public static void PlayerLeft(string displayName) + public static void PlayerLeft(string displayName, AbstractLineHandler handler ) { if (playersByDisplayName.TryGetValue(displayName, out Player? player)) { @@ -83,7 +90,10 @@ public static void PlayerLeft(string displayName) playersByDisplayName.Remove(displayName); playersByNetworkId.Remove(player.NetworkId); playersByUserId.Remove(player.UserId); - PrintPlayerInfo(player); + if( handler.LogOutput ) + { + PrintPlayerInfo(player); + } } } @@ -121,12 +131,16 @@ public static IEnumerable GetAllPlayers() return playersByUserId.Values; } - public static void ClearAllPlayers() + public static void ClearAllPlayers(AbstractLineHandler handler) { + foreach( var player in playersByUserId.Values ) { player.InstanceEndTime = DateTime.Now; - PrintPlayerInfo(player); + if( handler.LogOutput ) + { + PrintPlayerInfo(player); + } } playersByNetworkId.Clear(); @@ -139,11 +153,14 @@ public static int GetPlayerCount() return playersByUserId.Count; } - public static void LogAllPlayers() + public static void LogAllPlayers(AbstractLineHandler handler) { - foreach( var player in playersByUserId.Values ) + if( handler.LogOutput ) { - PrintPlayerInfo(player); + foreach( var player in playersByUserId.Values ) + { + PrintPlayerInfo(player); + } } } diff --git a/Program.cs b/Program.cs index 0488c6b..a12f032 100644 --- a/Program.cs +++ b/Program.cs @@ -116,7 +116,7 @@ public static async Task Main(string[] args) string filePath = VRChatAppDataPath + Path.DirectorySeparatorChar; if (args.Length == 0) { - logger.Warn("No path argument provided, defaulting to VRChat log directory: {filePath}"); + logger.Warn($"No path argument provided, defaulting to VRChat log directory: {filePath}"); } else { diff --git a/config.json b/config.json index dace6a9..29c7ab3 100644 --- a/config.json +++ b/config.json @@ -5,7 +5,7 @@ "enabled": true, "patternTypeValue": "Default", "pattern": "([\\d]{4}.[\\d]{2}.[\\d]{2}\\W[\\d]{2}:[\\d]{2}:[\\d]{2})\\W(Log[\\W]{8}|Debug[\\W]{6})-\\W\\W\\[Behaviour\\]\\WSwitching\\W([\\S\\W]+)\\Wto\\Wavatar\\W([\\S\\W]+)", - "logOutput": false, + "logOutput": true, "logOutputColor": "Default", "actions": [ ] @@ -15,7 +15,7 @@ "enabled": true, "patternTypeValue": "Default", "pattern": "([\\d]{4}.[\\d]{2}.[\\d]{2}\\W[\\d]{2}:[\\d]{2}:[\\d]{2})\\W(Log[\\W]{8}|Debug[\\W]{6})-\\W\\W\\[AssetBundleDownloadManager\\]\\W\\[\\d+\\] Unpacking Avatar \\(([\\S\\W]+) by ([\\S\\W]+)\\)", - "logOutput": false, + "logOutput": true, "logOutputColor": "Default", "actions": [ ] @@ -25,7 +25,7 @@ "enabled": true, "patternTypeValue": "Default", "pattern": "([\\d]{4}.[\\d]{2}.[\\d]{2}\\W[\\d]{2}:[\\d]{2}:[\\d]{2})\\W(Log[\\W]{8}|Debug[\\W]{6})-\\W\\W\\[Behaviour\\]\\WOnPlayer([\\d\\w]+)\\W([\\d\\w\\W]+)\\W\\((usr_[\\d\\w\\W]+)\\)", - "logOutput": false, + "logOutput": true, "logOutputColor": "Default", "actions": [ ] @@ -35,7 +35,7 @@ "enabled": true, "patternTypeValue": "Default", "pattern": "([\\d]{4}.[\\d]{2}.[\\d]{2}\\W[\\d]{2}:[\\d]{2}:[\\d]{2})\\W(Log[\\W]{8}|Debug[\\W]{6})-\\W\\W\\[AP\\]\\WPlayer\\W\\W([\\d\\w\\W]+)\\W joined with ID ([\\d]+)", - "logOutput": false, + "logOutput": true, "logOutputColor": "Default", "actions": [ ] @@ -45,7 +45,7 @@ "enabled": true, "patternTypeValue": "Default", "pattern": "([\\d]{4}.[\\d]{2}.[\\d]{2}\\W[\\d]{2}:[\\d]{2}:[\\d]{2})\\W(Log[\\W]{8}|Debug[\\W]{6})-\\W\\W\\[NetworkProcessing\\] Received ownership transfer of ([\\d]+) from ([\\d]+) to ([\\d]+)", - "logOutput": false, + "logOutput": true, "logOutputColor": "Default", "actions": [ ] @@ -55,7 +55,7 @@ "enabled": true, "patternTypeValue": "Default", "pattern": "([\\d]{4}.[\\d]{2}.[\\d]{2}\\W[\\d]{2}:[\\d]{2}:[\\d]{2})\\W(Log[\\W]{8}|Debug[\\W]{6})-\\W\\W\\[API\\]\\WRequesting\\WGet\\Wprints/(prnt_[\\d\\w\\W]+)\\W\\{\\{\\}\\}", - "logOutput": false, + "logOutput": true, "logOutputColor": "Default", "actions": [ ] @@ -65,7 +65,7 @@ "enabled": true, "patternTypeValue": "Default", "pattern": "([\\d]{4}.[\\d]{2}.[\\d]{2}\\W[\\d]{2}:[\\d]{2}:[\\d]{2})\\W(Log[\\W]{8}|Debug[\\W]{6})-\\W\\W(?:[\\[Always\\]\\W]*)\\[StickersManager\\]\\WUser\\W(usr_[\\d\\w\\W]+)\\W\\(([\\d\\w\\W]+)\\)\\Wspawned\\Wsticker\\W(file_[\\d\\w\\W]+)", - "logOutput": false, + "logOutput": true, "logOutputColor": "Default", "actions": [ ] @@ -75,7 +75,7 @@ "enabled": true, "patternTypeValue": "Default", "pattern": "([\\d]{4}.[\\d]{2}.[\\d]{2}\\W[\\d]{2}:[\\d]{2}:[\\d]{2})\\W(Log[\\W]{8}|Debug[\\W]{6})-\\W\\W\\[ModerationManager\\] A vote kick has been initiated against ([\\S\\W]+), do you agree", - "logOutput": false, + "logOutput": true, "logOutputColor": "Default", "actions": [ { @@ -101,7 +101,7 @@ "enabled": true, "patternTypeValue": "Default", "pattern": "([\\d]{4}.[\\d]{2}.[\\d]{2}\\W[\\d]{2}:[\\d]{2}:[\\d]{2})\\W(Log[\\W]{8}|Debug[\\W]{6})-\\W\\W\\[ModerationManager\\]\\W([\\S\\W]+)\\Whas\\Wbeen\\W(warned|kicked)", - "logOutput": false, + "logOutput": true, "logOutputColor": "Default", "actions": [ ] @@ -111,7 +111,7 @@ "enabled": true, "patternTypeValue": "Default", "pattern": "([\\d]{4}.[\\d]{2}.[\\d]{2}\\W[\\d]{2}:[\\d]{2}:[\\d]{2})\\W(Log[\\W]{8}|Debug[\\W]{6})-\\W\\WVRCApplication: HandleApplicationQuit at ([\\d\\W]+)", - "logOutput": false, + "logOutput": true, "logOutputColor": "Default", "actions": [ ] diff --git a/configuration/ConfigurationManager.cs b/configuration/ConfigurationManager.cs index 9774add..cccbbe7 100644 --- a/configuration/ConfigurationManager.cs +++ b/configuration/ConfigurationManager.cs @@ -38,6 +38,12 @@ public static List LoadLineHandlersFromConfig( List continue; } + if( configItem.Enabled == false ) + { + logger.Warn($"Line handler of type {configItem.HandlerTypeValue} is disabled in configuration, skipping this handler."); + continue; + } + string? pattern = null; if (configItem.PatternTypeValue == PatternType.Default || configItem.Pattern == null) { @@ -48,6 +54,17 @@ public static List LoadLineHandlersFromConfig( List pattern = configItem.Pattern; } + + string? logOutputColor = null; + if (configItem.LogOutputColor == "Default" || configItem.LogOutputColor == null) + { + logOutputColor = "37m"; + } + else + { + logOutputColor = configItem.LogOutputColor; + } + List actions = ParseActionsFromConfig(configItem.Actions); @@ -148,6 +165,8 @@ public static List LoadLineHandlersFromConfig( List logger.Warn($"Unsupported line handler type in configuration: {configItem.HandlerTypeValue}, skipping this handler."); continue; } + handler.LogOutputColor = logOutputColor!; + handler.LogOutput = configItem.LogOutput; handler.Actions = actions; handlers.Add(handler); } @@ -220,6 +239,7 @@ public enum PatternType public class LineHandlerConfig { public LineHandlerType HandlerTypeValue { get; set; } + public bool Enabled { get; set; } = true; public PatternType PatternTypeValue { get; set; } public string? Pattern { get; set; } public bool LogOutput { get; set; } = true; diff --git a/tailgrab.csproj b/tailgrab.csproj index 265ca94..d342ce7 100644 --- a/tailgrab.csproj +++ b/tailgrab.csproj @@ -5,9 +5,9 @@ net9.0 enable enable - 1.0.2.1005 - 1.0.2.1005 - 1.0.2.1005-beta + 1.0.3.1012 + 1.0.3.1012 + 1.0.3.1012-beta