From 79eec08590e10e7707d1ba2fe74ee646365ba059 Mon Sep 17 00:00:00 2001 From: RaidMax Date: Sun, 27 Aug 2023 12:28:00 -0500 Subject: [PATCH 1/8] fix some issues with chat search feature --- Plugins/Stats/Extensions.cs | 66 ------------------- SharedLibraryCore/Utilities.cs | 4 +- .../Client/Legacy/StatsController.cs | 24 +------ WebfrontCore/Views/Client/Message/Find.cshtml | 4 +- .../Shared/Partials/Search/_ChatSearch.cshtml | 4 +- WebfrontCore/wwwroot/js/search.js | 25 ------- 6 files changed, 9 insertions(+), 118 deletions(-) diff --git a/Plugins/Stats/Extensions.cs b/Plugins/Stats/Extensions.cs index 67ee16b1c..993a750d0 100644 --- a/Plugins/Stats/Extensions.cs +++ b/Plugins/Stats/Extensions.cs @@ -13,7 +13,6 @@ namespace IW4MAdmin.Plugins.Stats { private const int ZScoreRange = 3; private const int RankIconDivisions = 24; - private const int MaxMessages = 100; public class LogParams { @@ -127,70 +126,5 @@ namespace IW4MAdmin.Plugins.Stats return 0; } - - /// - /// todo: lets abstract this out to a generic buildable query - /// this is just a dirty PoC - /// - /// - /// - public static ChatSearchQuery ParseSearchInfo(this string query, int count, int offset) - { - string[] filters = query.Split('|'); - var searchRequest = new ChatSearchQuery - { - Filter = query, - Count = count, - Offset = offset - }; - - // sanity checks - searchRequest.Count = Math.Min(searchRequest.Count, MaxMessages); - searchRequest.Count = Math.Max(searchRequest.Count, 0); - searchRequest.Offset = Math.Max(searchRequest.Offset, 0); - - if (filters.Length > 1) - { - if (filters[0].ToLower() != "chat") - { - throw new ArgumentException("Query is not compatible with chat"); - } - - foreach (string filter in filters.Skip(1)) - { - string[] args = filter.Split(' '); - - if (args.Length > 1) - { - string recombinedArgs = string.Join(' ', args.Skip(1)); - switch (args[0].ToLower()) - { - case "before": - searchRequest.SentBefore = DateTime.Parse(recombinedArgs); - break; - case "after": - searchRequest.SentAfter = DateTime.Parse(recombinedArgs); - break; - case "server": - searchRequest.ServerId = args[1]; - break; - case "client": - searchRequest.ClientId = int.Parse(args[1]); - break; - case "contains": - searchRequest.MessageContains = string.Join(' ', args.Skip(1)); - break; - case "sort": - searchRequest.Direction = Enum.Parse(args[1], ignoreCase: true); - break; - } - } - } - - return searchRequest; - } - - throw new ArgumentException("No filters specified for chat search"); - } } } diff --git a/SharedLibraryCore/Utilities.cs b/SharedLibraryCore/Utilities.cs index dde7d502d..6995f2705 100644 --- a/SharedLibraryCore/Utilities.cs +++ b/SharedLibraryCore/Utilities.cs @@ -50,8 +50,8 @@ namespace SharedLibraryCore public static char[] DirectorySeparatorChars = { '\\', '/' }; public static char CommandPrefix { get; set; } = '!'; - public static string ToStandardFormat(this DateTime? time) => time?.ToString("yyyy-MM-dd H:mm:ss UTC"); - public static string ToStandardFormat(this DateTime time) => time.ToString("yyyy-MM-dd H:mm:ss UTC"); + public static string ToStandardFormat(this DateTime? time) => time?.ToString("yyyy-MM-dd HH:mm:ss UTC"); + public static string ToStandardFormat(this DateTime time) => time.ToString("yyyy-MM-dd HH:mm:ss UTC"); public static EFClient IW4MAdminClient(Server server = null) { diff --git a/WebfrontCore/Controllers/Client/Legacy/StatsController.cs b/WebfrontCore/Controllers/Client/Legacy/StatsController.cs index 13528d2ed..24fa04942 100644 --- a/WebfrontCore/Controllers/Client/Legacy/StatsController.cs +++ b/WebfrontCore/Controllers/Client/Legacy/StatsController.cs @@ -137,29 +137,9 @@ namespace IW4MAdmin.Plugins.Web.StatsWeb.Controllers } [HttpGet("Message/FindNext")] - public async Task FindNextMessages([FromQuery] string query, [FromQuery] int count, - [FromQuery] int offset) + public async Task FindNextMessages(ChatResourceRequest query) { - ChatSearchQuery searchRequest; - - try - { - searchRequest = query.ParseSearchInfo(count, offset); - } - - catch (ArgumentException e) - { - _logger.LogWarning(e, "Could not parse chat message search query {query}", query); - throw; - } - - catch (FormatException e) - { - _logger.LogWarning(e, "Could not parse chat message search query filter format {query}", query); - throw; - } - - var result = await _chatResourceQueryHelper.QueryResource(searchRequest); + var result = await _chatResourceQueryHelper.QueryResource(query); return PartialView("~/Views/Client/Message/_Item.cshtml", result.Results); } diff --git a/WebfrontCore/Views/Client/Message/Find.cshtml b/WebfrontCore/Views/Client/Message/Find.cshtml index aa5515c57..74036c9b3 100644 --- a/WebfrontCore/Views/Client/Message/Find.cshtml +++ b/WebfrontCore/Views/Client/Message/Find.cshtml @@ -26,14 +26,14 @@ else -
+
@section scripts { } diff --git a/WebfrontCore/Views/Shared/Partials/Search/_ChatSearch.cshtml b/WebfrontCore/Views/Shared/Partials/Search/_ChatSearch.cshtml index 45546b272..255ba816a 100644 --- a/WebfrontCore/Views/Shared/Partials/Search/_ChatSearch.cshtml +++ b/WebfrontCore/Views/Shared/Partials/Search/_ChatSearch.cshtml @@ -44,7 +44,7 @@ @foreach (var server in manager!.GetServers()) { } @@ -62,6 +62,7 @@ value="@afterDate.ToString("s", CultureInfo.InvariantCulture)"/>
@@ -78,6 +79,7 @@ value="@beforeDate.ToString("s", CultureInfo.InvariantCulture)"/> diff --git a/WebfrontCore/wwwroot/js/search.js b/WebfrontCore/wwwroot/js/search.js index 370142551..c2e6c30be 100644 --- a/WebfrontCore/wwwroot/js/search.js +++ b/WebfrontCore/wwwroot/js/search.js @@ -1,28 +1,4 @@ $(document).ready(function () { - $('.form-inline').submit(function (e) { - const id = $(e.currentTarget).find('input'); - if ($(id).val().length < 3) { - e.preventDefault(); - $(id) - .addClass('input-text-danger') - .delay(25) - .queue(function () { - $(this).addClass('input-border-transition').dequeue(); - }) - .delay(1000) - .queue(function () { - $(this).removeClass('input-text-danger').dequeue(); - }) - .delay(500) - .queue(function () { - $(this).removeClass('input-border-transition').dequeue(); - }); - } else if ($(id).val().startsWith("chat|")) { - e.preventDefault(); - window.location = "/Message/Find?query=" + $(id).val(); - } - }); - $('.date-picker-input').each((index, selector) => { new Datepicker(selector, { buttonClass: 'btn', @@ -33,7 +9,6 @@ }); }); - const clientSearchWrapper = $('*[id^="clientSearchWrapper"]'); const chatSearchWrapper = $('*[id^="chatSearchWrapper"]'); const searchTypeSelector = $('#searchTypeSelectorParent select'); From 2e99db22755d1cb13ae7c65fd465273b973bed6a Mon Sep 17 00:00:00 2001 From: RaidMax Date: Tue, 29 Aug 2023 12:31:00 -0500 Subject: [PATCH 2/8] fix issue with profile chat meta loading --- Plugins/Stats/Dtos/ChatSearchQuery.cs | 9 +++++---- Plugins/Stats/Plugin.cs | 2 ++ 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/Plugins/Stats/Dtos/ChatSearchQuery.cs b/Plugins/Stats/Dtos/ChatSearchQuery.cs index f58f1145f..443389079 100644 --- a/Plugins/Stats/Dtos/ChatSearchQuery.cs +++ b/Plugins/Stats/Dtos/ChatSearchQuery.cs @@ -28,18 +28,19 @@ namespace Stats.Dtos /// /// The time associated with SentAfter date /// - public string SentAfterTime { get; set; } = "00:00"; + public string SentAfterTime { get; set; } - public DateTime? SentAfterDateTime => SentAfter?.Add(TimeSpan.Parse(SentAfterTime)); + public DateTime? SentAfterDateTime => SentAfter?.Add(string.IsNullOrEmpty(SentAfterTime) ? TimeSpan.Zero : TimeSpan.Parse(SentAfterTime)); /// /// only look for messages sent before this date0 /// public DateTime SentBefore { get; set; } = DateTime.UtcNow.Date; - public string SentBeforeTime { get; set; } = DateTime.UtcNow.ToString("HH:mm"); + public string SentBeforeTime { get; set; } - public DateTime? SentBeforeDateTime => SentBefore.Add(TimeSpan.Parse(SentBeforeTime)); + public DateTime? SentBeforeDateTime => + SentBefore.Add(string.IsNullOrEmpty(SentBeforeTime) ? TimeSpan.Zero : TimeSpan.Parse(SentBeforeTime)); public bool IsExactMatch { get; set; } diff --git a/Plugins/Stats/Plugin.cs b/Plugins/Stats/Plugin.cs index ee8ccc7da..fabc6da29 100644 --- a/Plugins/Stats/Plugin.cs +++ b/Plugins/Stats/Plugin.cs @@ -469,6 +469,8 @@ public class Plugin : IPluginV2 ClientId = request.ClientId, Before = request.Before, SentBefore = request.Before ?? DateTime.UtcNow, + SentAfter = request.After, + After = request.After, Count = request.Count, IsProfileMeta = true }; From 5c6ae3146a8c699e9a6353f41b2bd07a17c0d081 Mon Sep 17 00:00:00 2001 From: RaidMax Date: Sat, 2 Sep 2023 13:07:54 -0500 Subject: [PATCH 3/8] fix get Xuid wrapper for T5 game interface --- GameFiles/GameInterface/_integration_t5.gsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GameFiles/GameInterface/_integration_t5.gsc b/GameFiles/GameInterface/_integration_t5.gsc index 962da312e..fa11f1c5a 100644 --- a/GameFiles/GameInterface/_integration_t5.gsc +++ b/GameFiles/GameInterface/_integration_t5.gsc @@ -88,7 +88,7 @@ IsBotWrapper( client ) GetXuidWrapper() { - return self GetXUID(); + return self GetGuid(); } ////////////////////////////////// From c1dace4af611ac09214c5236c8e300537753237e Mon Sep 17 00:00:00 2001 From: RaidMax Date: Sat, 2 Sep 2023 13:11:28 -0500 Subject: [PATCH 4/8] add missing shangri-la to T5 maps --- Application/DefaultSettings.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Application/DefaultSettings.json b/Application/DefaultSettings.json index a454bca99..fcbab4931 100644 --- a/Application/DefaultSettings.json +++ b/Application/DefaultSettings.json @@ -1251,6 +1251,10 @@ "Alias": "Call of the Dead", "Name": "zombie_coast" }, + { + "Alias": "Shangri-La", + "Name": "zombie_temple" + }, { "Alias": "Moon", "Name": "zombie_moon" From 3192fe35e667ebcab8156a6f15fd1e9ca9e39535 Mon Sep 17 00:00:00 2001 From: RaidMax Date: Sat, 2 Sep 2023 13:22:33 -0500 Subject: [PATCH 5/8] update default master url --- Application/Main.cs | 7 ++++++- .../Configuration/ApplicationConfiguration.cs | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Application/Main.cs b/Application/Main.cs index 41eb9901c..2edb79a20 100644 --- a/Application/Main.cs +++ b/Application/Main.cs @@ -432,7 +432,12 @@ namespace IW4MAdmin.Application appConfigHandler.BuildAsync().GetAwaiter().GetResult(); var commandConfigHandler = new BaseConfigurationHandler("CommandConfiguration"); commandConfigHandler.BuildAsync().GetAwaiter().GetResult(); - + + if (appConfigHandler.Configuration()?.MasterUrl == new Uri("http://api.raidmax.org:5000")) + { + appConfigHandler.Configuration().MasterUrl = new ApplicationConfiguration().MasterUrl; + } + var appConfig = appConfigHandler.Configuration(); var masterUri = Utilities.IsDevelopment ? new Uri("http://127.0.0.1:8080") diff --git a/SharedLibraryCore/Configuration/ApplicationConfiguration.cs b/SharedLibraryCore/Configuration/ApplicationConfiguration.cs index da052c9d8..4e5c9c169 100644 --- a/SharedLibraryCore/Configuration/ApplicationConfiguration.cs +++ b/SharedLibraryCore/Configuration/ApplicationConfiguration.cs @@ -206,7 +206,7 @@ namespace SharedLibraryCore.Configuration : ManualWebfrontUrl; [ConfigurationIgnore] public bool IgnoreServerConnectionLost { get; set; } - [ConfigurationIgnore] public Uri MasterUrl { get; set; } = new("http://api.raidmax.org:5000"); + [ConfigurationIgnore] public Uri MasterUrl { get; set; } = new("https://master.iw4.zip"); public IBaseConfiguration Generate() { From 2017eebeba02bd9cb0d9479c7082aee8dcc6981d Mon Sep 17 00:00:00 2001 From: RaidMax Date: Sat, 2 Sep 2023 13:38:56 -0500 Subject: [PATCH 6/8] adjust validation for master url --- .../Validation/ApplicationConfigurationValidator.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SharedLibraryCore/Configuration/Validation/ApplicationConfigurationValidator.cs b/SharedLibraryCore/Configuration/Validation/ApplicationConfigurationValidator.cs index 4841d373d..78864fac3 100644 --- a/SharedLibraryCore/Configuration/Validation/ApplicationConfigurationValidator.cs +++ b/SharedLibraryCore/Configuration/Validation/ApplicationConfigurationValidator.cs @@ -67,7 +67,7 @@ namespace SharedLibraryCore.Configuration.Validation RuleFor(_app => _app.MasterUrl) .NotNull() - .Must(_url => _url != null && _url.Scheme == Uri.UriSchemeHttp); + .Must(_url => _url != null && (_url.Scheme == Uri.UriSchemeHttp || _url.Scheme == Uri.UriSchemeHttps)); RuleFor(_app => _app.CommandPrefix) .NotEmpty(); @@ -80,4 +80,4 @@ namespace SharedLibraryCore.Configuration.Validation .SetValidator(new ServerConfigurationValidator()); } } -} \ No newline at end of file +} From b6c32181b032e0a4dab0161b03b44e2e6c6555f9 Mon Sep 17 00:00:00 2001 From: RaidMax Date: Sat, 2 Sep 2023 15:35:40 -0500 Subject: [PATCH 7/8] add initial support for LFD2 --- Application/RConParsers/BaseRConParser.cs | 8 +- Data/Models/Reference.cs | 3 +- Plugins/ScriptPlugins/ParserLFD2SM.js | 135 ++++++++++++++++++++++ SharedLibraryCore/Server.cs | 3 +- 4 files changed, 145 insertions(+), 4 deletions(-) create mode 100644 Plugins/ScriptPlugins/ParserLFD2SM.js diff --git a/Application/RConParsers/BaseRConParser.cs b/Application/RConParsers/BaseRConParser.cs index a918c552f..cf773dd19 100644 --- a/Application/RConParsers/BaseRConParser.cs +++ b/Application/RConParsers/BaseRConParser.cs @@ -194,10 +194,14 @@ namespace IW4MAdmin.Application.RConParsers foreach (var line in response) { var regex = Regex.Match(line, parserRegex.Pattern); - if (regex.Success && parserRegex.GroupMapping.ContainsKey(groupType)) + + if (!regex.Success || !parserRegex.GroupMapping.ContainsKey(groupType)) { - value = regex.Groups[parserRegex.GroupMapping[groupType]].ToString(); + continue; } + + value = regex.Groups[parserRegex.GroupMapping[groupType]].ToString(); + break; } if (value == null) diff --git a/Data/Models/Reference.cs b/Data/Models/Reference.cs index 095b71b29..cfa68de15 100644 --- a/Data/Models/Reference.cs +++ b/Data/Models/Reference.cs @@ -16,7 +16,8 @@ T7 = 8, SHG1 = 9, CSGO = 10, - H1 = 11 + H1 = 11, + LFD2 = 12, } public enum ConnectionType diff --git a/Plugins/ScriptPlugins/ParserLFD2SM.js b/Plugins/ScriptPlugins/ParserLFD2SM.js new file mode 100644 index 000000000..713caef31 --- /dev/null +++ b/Plugins/ScriptPlugins/ParserLFD2SM.js @@ -0,0 +1,135 @@ +let rconParser; +let eventParser; + +const plugin = { + author: 'RaidMax', + version: 0.1, + name: 'LFD2 (SourceMod) Parser', + engine: 'Source', + isParser: true, + + onEventAsync: function (gameEvent, server) { + }, + + onLoadAsync: function (manager) { + rconParser = manager.GenerateDynamicRConParser(this.name); + eventParser = manager.GenerateDynamicEventParser(this.name); + rconParser.RConEngine = this.engine; + + rconParser.Configuration.StatusHeader.Pattern = '# userid name uniqueid connected ping loss state rate adr'; + + rconParser.Configuration.MapStatus.Pattern = '^map *: +(.+)$'; + rconParser.Configuration.MapStatus.AddMapping(111, 1); + + rconParser.Configuration.HostnameStatus.Pattern = '^hostname: +(.+)$'; + rconParser.Configuration.HostnameStatus.AddMapping(113, 1); + + rconParser.Configuration.MaxPlayersStatus.Pattern = '^players *: +\\d+ humans, \\d+ bots \\((\\d+).+'; + rconParser.Configuration.MaxPlayersStatus.AddMapping(114, 1); + + rconParser.Configuration.Dvar.Pattern = '^\\"(.+)\\" (?:=|is) \\"(.+)\\"(?: (?:\\( def. \\"(.*)\\" \\)))?$'; + rconParser.Configuration.Dvar.AddMapping(106, 1); + rconParser.Configuration.Dvar.AddMapping(107, 2); + rconParser.Configuration.Dvar.AddMapping(108, 3); + rconParser.Configuration.Dvar.AddMapping(109, 3); + + rconParser.Configuration.Status.Pattern = '^#\\s*(\\d+) (\\d+) "(.+)" (\\S+) +(\\d+:\\d+(?::\\d+)?) (\\d+) (\\S+) (\\S+) (\\d+) (\\d+\\.\\d+\\.\\d+\\.\\d+:\\d+)$'; + rconParser.Configuration.Status.AddMapping(100, 2); + rconParser.Configuration.Status.AddMapping(101, -1); + rconParser.Configuration.Status.AddMapping(102, 6); + rconParser.Configuration.Status.AddMapping(103, 4) + rconParser.Configuration.Status.AddMapping(104, 3); + rconParser.Configuration.Status.AddMapping(105, 10); + rconParser.Configuration.Status.AddMapping(200, 1); + + rconParser.Configuration.DefaultDvarValues.Add('sv_running', '1'); + rconParser.Configuration.DefaultDvarValues.Add('bugfix_no_version', this.engine); + rconParser.Configuration.DefaultDvarValues.Add('fs_basepath', ''); + rconParser.Configuration.DefaultDvarValues.Add('fs_basegame', ''); + rconParser.Configuration.DefaultDvarValues.Add('fs_homepath', ''); + rconParser.Configuration.DefaultDvarValues.Add('g_log', ''); + rconParser.Configuration.DefaultDvarValues.Add('net_ip', 'localhost'); + rconParser.Configuration.DefaultDvarValues.Add('g_gametype', ''); + rconParser.Configuration.DefaultDvarValues.Add('fs_game', ''); + + rconParser.Configuration.OverrideDvarNameMapping.Add('sv_hostname', 'hostname'); + rconParser.Configuration.OverrideDvarNameMapping.Add('mapname', 'host_map'); + rconParser.Configuration.OverrideDvarNameMapping.Add('sv_maxclients', 'maxplayers'); + rconParser.Configuration.OverrideDvarNameMapping.Add('g_password', 'sv_password'); + rconParser.Configuration.OverrideDvarNameMapping.Add('version', 'bugfix_no_version'); + + rconParser.Configuration.ColorCodeMapping.Clear(); + rconParser.Configuration.ColorCodeMapping.Add('White', '\x01'); + rconParser.Configuration.ColorCodeMapping.Add('Red', '\x07'); + rconParser.Configuration.ColorCodeMapping.Add('LightRed', '\x0F'); + rconParser.Configuration.ColorCodeMapping.Add('DarkRed', '\x02'); + rconParser.Configuration.ColorCodeMapping.Add('Blue', '\x0B'); + rconParser.Configuration.ColorCodeMapping.Add('DarkBlue', '\x0C'); + rconParser.Configuration.ColorCodeMapping.Add('Purple', '\x03'); + rconParser.Configuration.ColorCodeMapping.Add('Orchid', '\x0E'); + rconParser.Configuration.ColorCodeMapping.Add('Yellow', '\x09'); + rconParser.Configuration.ColorCodeMapping.Add('Gold', '\x10'); + rconParser.Configuration.ColorCodeMapping.Add('LightGreen', '\x05'); + rconParser.Configuration.ColorCodeMapping.Add('Green', '\x04'); + rconParser.Configuration.ColorCodeMapping.Add('Lime', '\x06'); + rconParser.Configuration.ColorCodeMapping.Add('Grey', '\x08'); + rconParser.Configuration.ColorCodeMapping.Add('Grey2', '\x0D'); + // only adding there here for the default accent color + rconParser.Configuration.ColorCodeMapping.Add('Cyan', '\x0B'); + + rconParser.Configuration.NoticeLineSeparator = '. '; + rconParser.Configuration.DefaultRConPort = 27015; + rconParser.CanGenerateLogPath = false; + + rconParser.Configuration.CommandPrefixes.RConGetInfo = undefined; + rconParser.Configuration.CommandPrefixes.Kick = 'sm_kick #{0} {1}'; + rconParser.Configuration.CommandPrefixes.Ban = 'sm_kick #{0} {1}'; + rconParser.Configuration.CommandPrefixes.TempBan = 'sm_kick #{0} {1}'; + rconParser.Configuration.CommandPrefixes.Say = 'sm_say {0}'; + rconParser.Configuration.CommandPrefixes.Tell = 'sm_psay #{0} "{1}"'; + + eventParser.Configuration.Say.Pattern = '^"(.+)<(\\d+)><(.+)><(.*?)>" (?:say|say_team) "(.*)"$'; + eventParser.Configuration.Say.AddMapping(5, 1); + eventParser.Configuration.Say.AddMapping(3, 2); + eventParser.Configuration.Say.AddMapping(1, 3); + eventParser.Configuration.Say.AddMapping(7, 4); + eventParser.Configuration.Say.AddMapping(13, 5); + + eventParser.Configuration.Kill.Pattern = '^"(.+)<(\\d+)><(.+)><(.*)>" \\[-?\\d+ -?\\d+ -?\\d+\\] killed "(.+)<(\\d+)><(.+)><(.*)>" \\[-?\\d+ -?\\d+ -?\\d+\\] with "(\\S*)" *(?:\\((\\w+)((?: ).+)?\\))?$'; + eventParser.Configuration.Kill.AddMapping(5, 1); + eventParser.Configuration.Kill.AddMapping(3, 2); + eventParser.Configuration.Kill.AddMapping(1, 3); + eventParser.Configuration.Kill.AddMapping(7, 4); + eventParser.Configuration.Kill.AddMapping(6, 5); + eventParser.Configuration.Kill.AddMapping(4, 6); + eventParser.Configuration.Kill.AddMapping(2, 7); + eventParser.Configuration.Kill.AddMapping(8, 8); + eventParser.Configuration.Kill.AddMapping(9, 9); + eventParser.Configuration.Kill.AddMapping(12, 10); + + eventParser.Configuration.MapEnd.Pattern = '^World triggered "Match_Start" on "(.+)"$'; + + eventParser.Configuration.JoinTeam.Pattern = '^"(.+)<(\\d+)><(.*)>" switched from team <(.+)> to <(.+)>$'; + eventParser.Configuration.JoinTeam.AddMapping(5, 1); + eventParser.Configuration.JoinTeam.AddMapping(3, 2); + eventParser.Configuration.JoinTeam.AddMapping(1, 3); + eventParser.Configuration.JoinTeam.AddMapping(7, 5); + + eventParser.Configuration.TeamMapping.Add('CT', 2); + eventParser.Configuration.TeamMapping.Add('TERRORIST', 3); + + eventParser.Configuration.Time.Pattern = '^L [01]\\d/[0-3]\\d/\\d+ - [0-2]\\d:[0-5]\\d:[0-5]\\d:'; + + rconParser.Version = 'LFD2SM'; + rconParser.GameName = 10; // LFD2 + eventParser.Version = 'LFD2SM'; + eventParser.GameName = 10; // LFD2 + eventParser.URLProtocolFormat = 'steam://connect/{{ip}}:{{port}}'; + }, + + onUnloadAsync: function () { + }, + + onTickAsync: function (server) { + } +}; diff --git a/SharedLibraryCore/Server.cs b/SharedLibraryCore/Server.cs index d78182813..0abf1be11 100644 --- a/SharedLibraryCore/Server.cs +++ b/SharedLibraryCore/Server.cs @@ -35,7 +35,8 @@ namespace SharedLibraryCore T7 = 8, SHG1 = 9, CSGO = 10, - H1 = 11 + H1 = 11, + LFD2 = 12 } // only here for performance From d69a9ecf562b1aab0704c866831c0537020e0aa1 Mon Sep 17 00:00:00 2001 From: RaidMax Date: Sat, 2 Sep 2023 15:37:10 -0500 Subject: [PATCH 8/8] fix minor issue with csgo status mapping --- IW4MAdmin.sln | 1 + Plugins/ScriptPlugins/ParserCSGO.js | 4 ++-- Plugins/ScriptPlugins/ParserCSGOSM.js | 6 +++--- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/IW4MAdmin.sln b/IW4MAdmin.sln index e46ad4273..fd366adbc 100644 --- a/IW4MAdmin.sln +++ b/IW4MAdmin.sln @@ -53,6 +53,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ScriptPlugins", "ScriptPlug Plugins\ScriptPlugins\ParserPlutoniumT5.js = Plugins\ScriptPlugins\ParserPlutoniumT5.js Plugins\ScriptPlugins\ServerBanner.js = Plugins\ScriptPlugins\ServerBanner.js Plugins\ScriptPlugins\ParserBOIII.js = Plugins\ScriptPlugins\ParserBOIII.js + Plugins\ScriptPlugins\ParserLFD2SM.js = Plugins\ScriptPlugins\ParserLFD2SM.js EndProjectSection EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AutomessageFeed", "Plugins\AutomessageFeed\AutomessageFeed.csproj", "{F5815359-CFC7-44B4-9A3B-C04BACAD5836}" diff --git a/Plugins/ScriptPlugins/ParserCSGO.js b/Plugins/ScriptPlugins/ParserCSGO.js index eb63d824a..5573cfe94 100644 --- a/Plugins/ScriptPlugins/ParserCSGO.js +++ b/Plugins/ScriptPlugins/ParserCSGO.js @@ -22,10 +22,10 @@ const plugin = { rconParser.Configuration.MapStatus.AddMapping(111, 1); rconParser.Configuration.HostnameStatus.Pattern = '^hostname: +(.+)$'; - rconParser.Configuration.MapStatus.AddMapping(113, 1); + rconParser.Configuration.HostnameStatus.AddMapping(113, 1); rconParser.Configuration.MaxPlayersStatus.Pattern = '^players *: +\\d+ humans, \\d+ bots \\((\\d+).+'; - rconParser.Configuration.MapStatus.AddMapping(114, 1); + rconParser.Configuration.MaxPlayersStatus.AddMapping(114, 1); rconParser.Configuration.Dvar.Pattern = '^"(.+)" = "(.+)" (?:\\( def. "(.*)" \\))?(?: |\\w)+- (.+)$'; rconParser.Configuration.Dvar.AddMapping(106, 1); diff --git a/Plugins/ScriptPlugins/ParserCSGOSM.js b/Plugins/ScriptPlugins/ParserCSGOSM.js index 950d07b72..67f95df44 100644 --- a/Plugins/ScriptPlugins/ParserCSGOSM.js +++ b/Plugins/ScriptPlugins/ParserCSGOSM.js @@ -3,7 +3,7 @@ let eventParser; const plugin = { author: 'RaidMax', - version: 0.6, + version: 0.7, name: 'CS:GO (SourceMod) Parser', engine: 'Source', isParser: true, @@ -22,10 +22,10 @@ const plugin = { rconParser.Configuration.MapStatus.AddMapping(111, 1); rconParser.Configuration.HostnameStatus.Pattern = '^hostname: +(.+)$'; - rconParser.Configuration.MapStatus.AddMapping(113, 1); + rconParser.Configuration.HostnameStatus.AddMapping(113, 1); rconParser.Configuration.MaxPlayersStatus.Pattern = '^players *: +\\d+ humans, \\d+ bots \\((\\d+).+'; - rconParser.Configuration.MapStatus.AddMapping(114, 1); + rconParser.Configuration.MaxPlayersStatus.AddMapping(114, 1); rconParser.Configuration.Dvar.Pattern = '^"(.+)" = "(.+)" (?:\\( def. "(.*)" \\))?(?: |\\w)+- (.+)$'; rconParser.Configuration.Dvar.AddMapping(106, 1);