Implement more dynamic parser stuff

This commit is contained in:
RaidMax 2019-01-27 16:40:08 -06:00
parent 7a6dccc26a
commit e6154822f6
5 changed files with 153 additions and 45 deletions

View File

@ -5,10 +5,20 @@ namespace IW4MAdmin.Application.EventParsers
class DynamicEventParserConfiguration : IEventParserConfiguration class DynamicEventParserConfiguration : IEventParserConfiguration
{ {
public string GameDirectory { get; set; } public string GameDirectory { get; set; }
public string SayRegex { get; set; }
public string JoinRegex { get; set; } public ParserRegex Say { get; set; }
public string QuitRegex { get; set; } public ParserRegex Join { get; set; }
public string KillRegex { get; set; } public ParserRegex Quit { get; set; }
public string DamageRegex { get; set; } public ParserRegex Kill { get; set; }
public ParserRegex Damage { get; set; }
public DynamicEventParserConfiguration()
{
Say = new ParserRegex();
Join = new ParserRegex();
Quit = new ParserRegex();
Kill = new ParserRegex();
Damage = new ParserRegex();
}
} }
} }

View File

@ -16,11 +16,56 @@ namespace IW4MAdmin.Application.EventParsers
_configuration = new DynamicEventParserConfiguration() _configuration = new DynamicEventParserConfiguration()
{ {
GameDirectory = "userraw", GameDirectory = "userraw",
SayRegex = "(say|sayteam);(.{1,32});([0-9]+)(.*);(.*)",
QuitRegex = @"^(Q;)(.{1,32});([0-9]+);(.*)$",
JoinRegex = @"^(J;)(.{1,32});([0-9]+);(.*)$",
DamageRegex = @"^(D);((?:bot[0-9]+)|(?:[A-Z]|[0-9])+);([0-9]+);(axis|allies);(.+);((?:[A-Z]|[0-9])+);([0-9]+);(axis|allies);(.+);((?:[0-9]+|[a-z]+|_)+);([0-9]+);((?:[A-Z]|_)+);((?:[a-z]|_)+)$"
}; };
_configuration.Say.Pattern = @"^(say|sayteam);(.{1,32});([0-9]+)(.*);(.*)$";
_configuration.Say.GroupMapping.Add(ParserRegex.GroupType.EventType, 1);
_configuration.Say.GroupMapping.Add(ParserRegex.GroupType.OriginNetworkId, 2);
_configuration.Say.GroupMapping.Add(ParserRegex.GroupType.OriginClientNumber, 3);
_configuration.Say.GroupMapping.Add(ParserRegex.GroupType.OriginName, 4);
_configuration.Say.GroupMapping.Add(ParserRegex.GroupType.Message, 5);
_configuration.Quit.Pattern = @"^(Q);(.{16,32}|bot[0-9]+);([0-9]+);(.*)$";
_configuration.Quit.GroupMapping.Add(ParserRegex.GroupType.EventType, 1);
_configuration.Quit.GroupMapping.Add(ParserRegex.GroupType.OriginNetworkId, 2);
_configuration.Quit.GroupMapping.Add(ParserRegex.GroupType.OriginClientNumber, 3);
_configuration.Quit.GroupMapping.Add(ParserRegex.GroupType.OriginName, 4);
_configuration.Join.Pattern = @"^(J);(.{16,32}|bot[0-9]+);([0-9]+);(.*)$";
_configuration.Join.GroupMapping.Add(ParserRegex.GroupType.EventType, 1);
_configuration.Join.GroupMapping.Add(ParserRegex.GroupType.OriginNetworkId, 2);
_configuration.Join.GroupMapping.Add(ParserRegex.GroupType.OriginClientNumber, 3);
_configuration.Join.GroupMapping.Add(ParserRegex.GroupType.OriginName, 4);
_configuration.Damage.Pattern = @"^(D);([A-Fa-f0-9_]{16,32}|bot[0-9]+);(-?[0-9]+);(axis|allies|world);(.{1,24});([A-Fa-f0-9_]{16,32}|bot[0-9]+)?;-?([0-9]+);(axis|allies|world);(.{1,24})?;((?:[0-9]+|[a-z]+|_)+);([0-9]+);((?:[A-Z]|_)+);((?:[a-z]|_)+)$";
_configuration.Damage.GroupMapping.Add(ParserRegex.GroupType.EventType, 1);
_configuration.Damage.GroupMapping.Add(ParserRegex.GroupType.TargetNetworkId, 2);
_configuration.Damage.GroupMapping.Add(ParserRegex.GroupType.TargetClientNumber, 3);
_configuration.Damage.GroupMapping.Add(ParserRegex.GroupType.TargetTeam, 4);
_configuration.Damage.GroupMapping.Add(ParserRegex.GroupType.TargetName, 5);
_configuration.Damage.GroupMapping.Add(ParserRegex.GroupType.OriginNetworkId, 6);
_configuration.Damage.GroupMapping.Add(ParserRegex.GroupType.OriginClientNumber, 7);
_configuration.Damage.GroupMapping.Add(ParserRegex.GroupType.OriginTeam, 8);
_configuration.Damage.GroupMapping.Add(ParserRegex.GroupType.OriginName, 9);
_configuration.Damage.GroupMapping.Add(ParserRegex.GroupType.Weapon, 10);
_configuration.Damage.GroupMapping.Add(ParserRegex.GroupType.Damage, 11);
_configuration.Damage.GroupMapping.Add(ParserRegex.GroupType.MeansOfDeath, 12);
_configuration.Damage.GroupMapping.Add(ParserRegex.GroupType.HitLocation, 13);
_configuration.Kill.Pattern = @"^(K);([A-Fa-f0-9_]{16,32}|bot[0-9]+);(-?[0-9]+);(axis|allies|world);(.{1,24});([A-Fa-f0-9_]{16,32}|bot[0-9]+)?;-?([0-9]+);(axis|allies|world);(.{1,24})?;((?:[0-9]+|[a-z]+|_)+);([0-9]+);((?:[A-Z]|_)+);((?:[a-z]|_)+)$";
_configuration.Kill.GroupMapping.Add(ParserRegex.GroupType.EventType, 1);
_configuration.Kill.GroupMapping.Add(ParserRegex.GroupType.TargetNetworkId, 2);
_configuration.Kill.GroupMapping.Add(ParserRegex.GroupType.TargetClientNumber, 3);
_configuration.Kill.GroupMapping.Add(ParserRegex.GroupType.TargetTeam, 4);
_configuration.Kill.GroupMapping.Add(ParserRegex.GroupType.TargetName, 5);
_configuration.Kill.GroupMapping.Add(ParserRegex.GroupType.OriginNetworkId, 6);
_configuration.Kill.GroupMapping.Add(ParserRegex.GroupType.OriginClientNumber, 7);
_configuration.Kill.GroupMapping.Add(ParserRegex.GroupType.OriginTeam, 8);
_configuration.Kill.GroupMapping.Add(ParserRegex.GroupType.OriginName, 9);
_configuration.Kill.GroupMapping.Add(ParserRegex.GroupType.Weapon, 10);
_configuration.Kill.GroupMapping.Add(ParserRegex.GroupType.Damage, 11);
_configuration.Kill.GroupMapping.Add(ParserRegex.GroupType.MeansOfDeath, 12);
_configuration.Kill.GroupMapping.Add(ParserRegex.GroupType.HitLocation, 13);
} }
public IEventParserConfiguration Configuration { get => _configuration; set => _configuration = value; } public IEventParserConfiguration Configuration { get => _configuration; set => _configuration = value; }
@ -33,7 +78,8 @@ namespace IW4MAdmin.Application.EventParsers
if (eventType == "JoinTeam") if (eventType == "JoinTeam")
{ {
var origin = server.GetClientsAsList().FirstOrDefault(c => c.NetworkId == lineSplit[1].ConvertLong()); var origin = server.GetClientsAsList()
.FirstOrDefault(c => c.NetworkId == lineSplit[1].ConvertLong());
return new GameEvent() return new GameEvent()
{ {
@ -46,15 +92,18 @@ namespace IW4MAdmin.Application.EventParsers
if (eventType == "say" || eventType == "sayteam") if (eventType == "say" || eventType == "sayteam")
{ {
var matchResult = Regex.Match(logLine, _configuration.SayRegex); var matchResult = Regex.Match(logLine, _configuration.Say.Pattern);
if (matchResult.Success) if (matchResult.Success)
{ {
string message = matchResult.Groups[5].ToString() string message = matchResult
.Groups[_configuration.Say.GroupMapping[ParserRegex.GroupType.Message]]
.ToString()
.Replace("\x15", "") .Replace("\x15", "")
.Trim(); .Trim();
var origin = server.GetClientsAsList().First(c => c.ClientNumber == Utilities.ClientIdFromString(lineSplit, 2)); var origin = server.GetClientsAsList()
.First(c => c.NetworkId == matchResult.Groups[_configuration.Say.GroupMapping[ParserRegex.GroupType.OriginNetworkId]].ToString().ConvertLong());
if (message[0] == '!' || message[0] == '@') if (message[0] == '!' || message[0] == '@')
{ {
@ -83,17 +132,25 @@ namespace IW4MAdmin.Application.EventParsers
{ {
if (!server.CustomCallback) if (!server.CustomCallback)
{ {
var origin = server.GetClientsAsList().First(c => c.ClientNumber == Utilities.ClientIdFromString(lineSplit, 6)); var match = Regex.Match(logLine, _configuration.Kill.Pattern);
var target = server.GetClientsAsList().First(c => c.ClientNumber == Utilities.ClientIdFromString(lineSplit, 2));
return new GameEvent() if (match.Success)
{ {
Type = GameEvent.EventType.Kill, var origin = server.GetClientsAsList()
Data = logLine, .First(c => c.NetworkId == match.Groups[_configuration.Kill.GroupMapping[ParserRegex.GroupType.OriginNetworkId]].ToString().ConvertLong());
Origin = origin, var target = server.GetClientsAsList()
Target = target, .First(c => c.NetworkId == match.Groups[_configuration.Kill.GroupMapping[ParserRegex.GroupType.TargetNetworkId]].ToString().ConvertLong());
Owner = server
};
return new GameEvent()
{
Type = GameEvent.EventType.Kill,
Data = logLine,
Origin = origin,
Target = target,
Owner = server
};
}
} }
} }
@ -129,12 +186,16 @@ namespace IW4MAdmin.Application.EventParsers
// damage // damage
if (eventType == "D") if (eventType == "D")
{ {
if (!server.CustomCallback) // if (!server.CustomCallback)
{ {
if (Regex.Match(eventType, _configuration.DamageRegex).Success) var regexMatch = Regex.Match(logLine, _configuration.Damage.Pattern);
if (regexMatch.Success)
{ {
var origin = server.GetClientsAsList().First(c => c.NetworkId == lineSplit[5].ConvertLong()); var origin = server.GetClientsAsList()
var target = server.GetClientsAsList().First(c => c.NetworkId == lineSplit[1].ConvertLong()); .First(c => c.NetworkId == regexMatch.Groups[_configuration.Damage.GroupMapping[ParserRegex.GroupType.OriginNetworkId]].ToString().ConvertLong());
var target = server.GetClientsAsList()
.First(c => c.NetworkId == regexMatch.Groups[_configuration.Damage.GroupMapping[ParserRegex.GroupType.TargetNetworkId]].ToString().ConvertLong());
return new GameEvent() return new GameEvent()
{ {
@ -151,7 +212,7 @@ namespace IW4MAdmin.Application.EventParsers
// join // join
if (eventType == "J") if (eventType == "J")
{ {
var regexMatch = Regex.Match(logLine, _configuration.JoinRegex); var regexMatch = Regex.Match(logLine, _configuration.Join.Pattern);
if (regexMatch.Success) if (regexMatch.Success)
{ {
return new GameEvent() return new GameEvent()
@ -164,10 +225,10 @@ namespace IW4MAdmin.Application.EventParsers
CurrentAlias = new EFAlias() CurrentAlias = new EFAlias()
{ {
Active = false, Active = false,
Name = regexMatch.Groups[4].ToString().StripColors(), Name = regexMatch.Groups[_configuration.Join.GroupMapping[ParserRegex.GroupType.OriginName]].ToString().StripColors(),
}, },
NetworkId = regexMatch.Groups[2].ToString().ConvertLong(), NetworkId = regexMatch.Groups[_configuration.Join.GroupMapping[ParserRegex.GroupType.OriginNetworkId]].ToString().ConvertLong(),
ClientNumber = Convert.ToInt32(regexMatch.Groups[3].ToString()), ClientNumber = Convert.ToInt32(regexMatch.Groups[_configuration.Join.GroupMapping[ParserRegex.GroupType.OriginClientNumber]].ToString()),
State = EFClient.ClientState.Connecting, State = EFClient.ClientState.Connecting,
CurrentServer = server CurrentServer = server
} }
@ -177,7 +238,7 @@ namespace IW4MAdmin.Application.EventParsers
if (eventType == "Q") if (eventType == "Q")
{ {
var regexMatch = Regex.Match(logLine, _configuration.QuitRegex); var regexMatch = Regex.Match(logLine, _configuration.Quit.Pattern);
if (regexMatch.Success) if (regexMatch.Success)
{ {
return new GameEvent() return new GameEvent()
@ -190,10 +251,10 @@ namespace IW4MAdmin.Application.EventParsers
CurrentAlias = new EFAlias() CurrentAlias = new EFAlias()
{ {
Active = false, Active = false,
Name = regexMatch.Groups[4].ToString().StripColors() Name = regexMatch.Groups[_configuration.Quit.GroupMapping[ParserRegex.GroupType.OriginName]].ToString().StripColors()
}, },
NetworkId = regexMatch.Groups[2].ToString().ConvertLong(), NetworkId = regexMatch.Groups[_configuration.Quit.GroupMapping[ParserRegex.GroupType.OriginNetworkId]].ToString().ConvertLong(),
ClientNumber = Convert.ToInt32(regexMatch.Groups[3].ToString()), ClientNumber = Convert.ToInt32(regexMatch.Groups[_configuration.Quit.GroupMapping[ParserRegex.GroupType.OriginClientNumber]].ToString()),
State = EFClient.ClientState.Disconnecting State = EFClient.ClientState.Disconnecting
} }
}; };

View File

@ -671,7 +671,7 @@ namespace IW4MAdmin
var version = await this.GetDvarAsync<string>("version"); var version = await this.GetDvarAsync<string>("version");
Version = version.Value; Version = version.Value;
//GameName = Utilities.GetGame(version.Value); GameName = Utilities.GetGame(version.Value);
if (GameName == Game.IW4) if (GameName == Game.IW4)
{ {

View File

@ -0,0 +1,41 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace SharedLibraryCore.Interfaces
{
public sealed class ParserRegex
{
public enum GroupType
{
EventType,
OriginNetworkId,
TargetNetworkId,
OriginClientNumber,
TargetClientNumber,
OriginName,
TargetName,
OriginTeam,
TargetTeam,
Weapon,
Damage,
MeansOfDeath,
HitLocation,
Message,
RConClientNumber = 100,
RConScore = 101,
RConPing = 102,
RConNetworkId = 103,
RConName = 104,
RConIpAddress = 105,
AdditionalGroup = 200
}
public string Pattern { get; set; }
public Dictionary<GroupType, int> GroupMapping { get; private set; }
public ParserRegex()
{
GroupMapping = new Dictionary<GroupType, int>();
}
}
}

View File

@ -1,16 +1,12 @@
using System; namespace SharedLibraryCore.Interfaces
using System.Collections.Generic;
using System.Text;
namespace SharedLibraryCore.Interfaces
{ {
public interface IEventParserConfiguration public interface IEventParserConfiguration
{ {
string GameDirectory { get; set; } string GameDirectory { get; set; }
string SayRegex { get; set; } ParserRegex Say { get; set; }
string JoinRegex { get; set; } ParserRegex Join { get; set; }
string QuitRegex { get; set; } ParserRegex Quit { get; set; }
string KillRegex { get; set; } ParserRegex Kill { get; set; }
string DamageRegex { get; set; } ParserRegex Damage { get; set; }
} }
} }