From 48b52e8c58fda49246a4398ded28b2dbff732e98 Mon Sep 17 00:00:00 2001 From: INSANEMODE Date: Sun, 9 Apr 2023 22:32:48 -0500 Subject: [PATCH] -add ScriptBan event -add new automated penalty to ban players for certain filtered words or phrases --- ClanTagRankCommands.csproj | 4 +++ Commands/SetRankCommand.cs | 1 + Events/Script.cs | 34 +++++++++++++++++++++-- Plugin.cs | 55 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 92 insertions(+), 2 deletions(-) diff --git a/ClanTagRankCommands.csproj b/ClanTagRankCommands.csproj index b4d204d..13f87ea 100644 --- a/ClanTagRankCommands.csproj +++ b/ClanTagRankCommands.csproj @@ -19,6 +19,10 @@ + + + + diff --git a/Commands/SetRankCommand.cs b/Commands/SetRankCommand.cs index 04a6ced..90b5ae7 100644 --- a/Commands/SetRankCommand.cs +++ b/Commands/SetRankCommand.cs @@ -3,6 +3,7 @@ using SharedLibraryCore.Commands; using SharedLibraryCore.Configuration; using SharedLibraryCore.Database.Models; using SharedLibraryCore.Interfaces; +using SharedLibraryCore.Interfaces.Events; using System.Threading.Tasks; diff --git a/Events/Script.cs b/Events/Script.cs index ad133d7..6d340bf 100644 --- a/Events/Script.cs +++ b/Events/Script.cs @@ -1,7 +1,10 @@ -using SharedLibraryCore; +using Serilog.Debugging; +using SharedLibraryCore; using SharedLibraryCore.Database.Models; +using SharedLibraryCore.Events.Game; using SharedLibraryCore.Interfaces; using System.Collections.Generic; +using System.Globalization; using EventGeneratorCallback = System.ValueTuple /// this is a custom event printed out by _clientids.gsc (used for recording highest personal round records) @@ -37,6 +41,28 @@ namespace IW4MAdmin.Plugins.ClanTagRankCommands.Events } ); } + private EventGeneratorCallback ScriptBan() + { + return (EVENT_ScriptBan, EVENT_ScriptBan, (eventLine, _, _) => + { + string[] lineSplit = eventLine.Split(";"); + + + long originId = lineSplit[1].ConvertGuidToLong(NumberStyles.Integer); + int clientnum = int.Parse(lineSplit[2]); + var scriptBan = new ScriptBanEvent + + { + Type = GameEvent.EventType.Other, + Subtype = EVENT_ScriptBan, + Origin = Utilities.IW4MAdminClient(), + Target = new EFClient { NetworkId = originId, Name = lineSplit[3], ClientNumber = clientnum }, + ScriptData = eventLine + }; + return scriptBan; + } + ); + } //private const string EVENT_RoundNumber = "RoundNumber"; ///// @@ -60,8 +86,12 @@ namespace IW4MAdmin.Plugins.ClanTagRankCommands.Events public IEnumerable Events => new[] { - RC(), + RC(),ScriptBan() }; + + public class ScriptBanEvent : GameScriptEvent + { + } } } diff --git a/Plugin.cs b/Plugin.cs index b68c267..540483b 100644 --- a/Plugin.cs +++ b/Plugin.cs @@ -17,12 +17,19 @@ using JsonSerializer = System.Text.Json.JsonSerializer; using System.Linq; using Serilog.Core; using EFClient = Data.Models.Client.EFClient; +using static IW4MAdmin.Plugins.ClanTagRankCommands.Events.Script; +using SharedLibraryCore.Events.Game; +using SharedLibraryCore.Events.Server; +using System.Collections.Concurrent; + + namespace ClanTagRankCommands { public class Plugin : IPluginV2 { + //private const string ProfanityKey = "_profanityInfringements"; //private readonly IConfigurationHandler _configurationHandler; private readonly ILogger _logger; //private ClanTagConfiguration Config; @@ -51,7 +58,9 @@ namespace ClanTagRankCommands public Plugin(IMetaServiceV2 metaService, ClanTagConfiguration Config, ILogger logger, IInteractionRegistration interactionRegistration, IRemoteCommandService remoteCommandService) { + IManagementEventSubscriptions.Load += OnLoad; + IGameEventSubscriptions.ScriptEventTriggered += OnScriptEvent; _remoteCommandService = remoteCommandService; _logger = logger; _metaService = metaService; @@ -62,6 +71,7 @@ namespace ClanTagRankCommands public static void RegisterDependencies(IServiceCollection serviceCollection) { serviceCollection.AddConfiguration("ClanTagRankCommands"); + } private Task OnLoad(IManager manager, CancellationToken token) { @@ -203,6 +213,44 @@ namespace ClanTagRankCommands }); return Task.CompletedTask; } + + private Task OnScriptEvent(GameScriptEvent scriptEvent, CancellationToken token) + { + if (scriptEvent is not ScriptBanEvent ScriptBan) + { + return Task.CompletedTask; + } + + try + { + string[] lineSplit = ScriptBan.ScriptData.Split(";"); + var sender = Utilities.IW4MAdminClient(ScriptBan.Owner); + sender.AdministeredPenalties = new List + { + new() + { + + AutomatedOffense = $"Profanity Filter Match: {lineSplit[4]} - {string.Join(",", lineSplit[5])}" + } + }; + SharedLibraryCore.Database.Models.EFClient efClient = (SharedLibraryCore.Database.Models.EFClient)null; + string rule = ScriptBan.Owner.Manager.GetApplicationSettings().Configuration().GlobalRules.Where(rule => rule.Contains("hate")).FirstOrDefault().ToString(); + efClient = ScriptBan.Owner.GetClientsAsList().First((Func)(_client => _client.NetworkId == ScriptBan.Target.NetworkId)); + efClient.Ban($"Profanity filter Racism match - {rule}", sender, false); + + //ScriptBan.Owner.Ban("Blatent racism match", ScriptBan.Target., sender); + + } + + catch (Exception e) + { + _logger.LogError(e, "Could not parse ScriptBan Event: {Data}", e.Data); + } + + return Task.CompletedTask; + } + + public async Task OnEventAsync(GameEvent E, Server S)// => Task.CompletedTask; { if (E.Type == GameEvent.EventType.Disconnect && (S.Hostname.Contains("Donator") || S.Hostname.Contains("Test")) && E.Origin.Tag == "Guest") @@ -211,6 +259,13 @@ namespace ClanTagRankCommands await _metaService.RemovePersistentMeta(EFMeta.ClientTagV2, E.Origin.ClientId, E.Owner.Manager.CancellationToken); } + else if (E.Type == GameEvent.EventType.Other && (S.Hostname.Contains("Donator") || S.Hostname.Contains("Test")) && E.Origin.Tag == "Guest") + { + E.Origin.Tag = null; + await _metaService.RemovePersistentMeta(EFMeta.ClientTagV2, E.Origin.ClientId, + E.Owner.Manager.CancellationToken); + } + } public Task OnTickAsync(Server S)// =>