diff --git a/Application/RConParsers/BaseRConParser.cs b/Application/RConParsers/BaseRConParser.cs index 1df71cb75..5fee9635c 100644 --- a/Application/RConParsers/BaseRConParser.cs +++ b/Application/RConParsers/BaseRConParser.cs @@ -82,7 +82,7 @@ namespace IW4MAdmin.Application.RConParsers public async Task ExecuteCommandAsync(IRConConnection connection, string command, CancellationToken token = default) { - command = command.FormatMessageForEngine(Configuration?.ColorCodeMapping); + command = command.FormatMessageForEngine(Configuration); var response = await connection.SendQueryAsync(StaticHelpers.QueryType.COMMAND, command, token); return response.Where(item => item != Configuration.CommandPrefixes.RConResponse).ToArray(); } diff --git a/Application/RConParsers/DynamicRConParserConfiguration.cs b/Application/RConParsers/DynamicRConParserConfiguration.cs index 346191fde..a2ba5818a 100644 --- a/Application/RConParsers/DynamicRConParserConfiguration.cs +++ b/Application/RConParsers/DynamicRConParserConfiguration.cs @@ -33,6 +33,7 @@ namespace IW4MAdmin.Application.RConParsers public int? DefaultRConPort { get; set; } public string DefaultInstallationDirectoryHint { get; set; } public short FloodProtectInterval { get; set; } = 750; + public bool ShouldRemoveDiacritics { get; set; } public ColorCodeMapping ColorCodeMapping { get; set; } = new ColorCodeMapping { diff --git a/Plugins/ScriptPlugins/ParserPT6.js b/Plugins/ScriptPlugins/ParserPT6.js index 01e839d71..d73481bc4 100644 --- a/Plugins/ScriptPlugins/ParserPT6.js +++ b/Plugins/ScriptPlugins/ParserPT6.js @@ -3,7 +3,7 @@ var eventParser; var plugin = { author: 'RaidMax, Xerxes', - version: 1.2, + version: 1.3, name: 'Plutonium T6 Parser', isParser: true, @@ -29,6 +29,7 @@ var plugin = { rconParser.Configuration.NoticeLineSeparator = '. '; rconParser.Configuration.DefaultRConPort = 4976; rconParser.Configuration.DefaultInstallationDirectoryHint = '{LocalAppData}/Plutonium/storage/t6'; + rconParser.Configuration.ShouldRemoveDiacritics = true; rconParser.Configuration.StatusHeader.Pattern = 'num +score +bot +ping +guid +name +lastmsg +address +qport +rate *'; rconParser.Configuration.Status.Pattern = '^ *([0-9]+) +([0-9]+) +(?:[0-1]{1}) +([0-9]+) +([A-F0-9]+|0) +(.+?) +(?:[0-9]+) +(\\d+\\.\\d+\\.\\d+\\.\\d+\\:-?\\d{1,5}|0+\\.0+:-?\\d{1,5}|loopback) +(?:-?[0-9]+) +(?:[0-9]+) *$'; diff --git a/SharedLibraryCore/Interfaces/IRConParserConfiguration.cs b/SharedLibraryCore/Interfaces/IRConParserConfiguration.cs index e1b9ec190..f3da4b2c8 100644 --- a/SharedLibraryCore/Interfaces/IRConParserConfiguration.cs +++ b/SharedLibraryCore/Interfaces/IRConParserConfiguration.cs @@ -107,5 +107,9 @@ namespace SharedLibraryCore.Interfaces ColorCodeMapping ColorCodeMapping { get; } short FloodProtectInterval { get; } + /// + /// indicates if diacritics (accented characters) should be normalized + /// + bool ShouldRemoveDiacritics { get; } } } diff --git a/SharedLibraryCore/PartialEntities/EFClient.cs b/SharedLibraryCore/PartialEntities/EFClient.cs index 9815f7314..a4a881e72 100644 --- a/SharedLibraryCore/PartialEntities/EFClient.cs +++ b/SharedLibraryCore/PartialEntities/EFClient.cs @@ -173,7 +173,7 @@ namespace SharedLibraryCore.Database.Models ?.CorrelationId ?? Guid.NewGuid() }; - e.Output.Add(message.FormatMessageForEngine(CurrentServer?.RconParser.Configuration.ColorCodeMapping) + e.Output.Add(message.FormatMessageForEngine(CurrentServer?.RconParser.Configuration) .StripColors()); CurrentServer?.Manager.AddEvent(e); diff --git a/SharedLibraryCore/Server.cs b/SharedLibraryCore/Server.cs index f0dc10dc7..5903bd23e 100644 --- a/SharedLibraryCore/Server.cs +++ b/SharedLibraryCore/Server.cs @@ -225,7 +225,7 @@ namespace SharedLibraryCore var formattedMessage = string.Format(RconParser.Configuration.CommandPrefixes.Say ?? "", $"{(CustomSayEnabled && GameName == Game.IW4 ? $"{CustomSayName}: " : "")}{message}"); ServerLogger.LogDebug("All-> {Message}", - message.FormatMessageForEngine(RconParser.Configuration.ColorCodeMapping).StripColors()); + message.FormatMessageForEngine(RconParser.Configuration).StripColors()); var e = new GameEvent { @@ -289,13 +289,13 @@ namespace SharedLibraryCore else { ServerLogger.LogDebug("Tell[{ClientNumber}]->{Message}", targetClient.ClientNumber, - message.FormatMessageForEngine(RconParser.Configuration.ColorCodeMapping).StripColors()); + message.FormatMessageForEngine(RconParser.Configuration).StripColors()); } if (targetClient.Level == Data.Models.Client.EFClient.Permission.Console) { Console.ForegroundColor = ConsoleColor.Green; - var cleanMessage = message.FormatMessageForEngine(RconParser.Configuration.ColorCodeMapping) + var cleanMessage = message.FormatMessageForEngine(RconParser.Configuration) .StripColors(); using (LogContext.PushProperty("Server", ToString())) { diff --git a/SharedLibraryCore/Utilities.cs b/SharedLibraryCore/Utilities.cs index d8b8d91b0..0bcaf4742 100644 --- a/SharedLibraryCore/Utilities.cs +++ b/SharedLibraryCore/Utilities.cs @@ -170,10 +170,28 @@ namespace SharedLibraryCore { return str.Replace("//", "/ /"); } - - public static string FormatMessageForEngine(this string str, ColorCodeMapping mapping) + + public static string RemoveDiacritics(this string text) { - if (mapping == null || string.IsNullOrEmpty(str)) + var normalizedString = text.Normalize(NormalizationForm.FormD); + var stringBuilder = new StringBuilder(normalizedString.Length); + + foreach (var c in from c in normalizedString + let unicodeCategory = CharUnicodeInfo.GetUnicodeCategory(c) + where unicodeCategory != UnicodeCategory.NonSpacingMark + select c) + { + stringBuilder.Append(c); + } + + return stringBuilder + .ToString() + .Normalize(NormalizationForm.FormC); + } + + public static string FormatMessageForEngine(this string str, IRConParserConfiguration config) + { + if (config == null || string.IsNullOrEmpty(str)) { return str; } @@ -184,7 +202,12 @@ namespace SharedLibraryCore foreach (var match in colorCodeMatches.Where(m => m.Success)) { var key = match.Groups[1].ToString(); - output = output.Replace(match.Value, mapping.TryGetValue(key, out var code) ? code : ""); + output = output.Replace(match.Value, config.ColorCodeMapping.TryGetValue(key, out var code) ? code : ""); + } + + if (config.ShouldRemoveDiacritics) + { + output = output.RemoveDiacritics(); } return output.FixIW4ForwardSlash();