diff --git a/.gitignore b/.gitignore index 09963c4..e9e8484 100644 --- a/.gitignore +++ b/.gitignore @@ -245,3 +245,5 @@ launchSettings.json /Tests/ApplicationTests/Files/replay.json /GameLogServer/game_log_server_env *.bak +/TebexApiClient.cs +/Models diff --git a/ClanTag.cs b/ClanTag.cs index ef936e3..fbd4f46 100644 --- a/ClanTag.cs +++ b/ClanTag.cs @@ -3,7 +3,7 @@ using SharedLibraryCore.Database.Models; using SharedLibraryCore; using SharedLibraryCore.Interfaces; -namespace ClanTagRankApi +namespace ClanTagRankCommands { static class ExtensionMethods diff --git a/ClanTagRankCommands.csproj b/ClanTagRankCommands.csproj index 5348bdd..8b51261 100644 --- a/ClanTagRankCommands.csproj +++ b/ClanTagRankCommands.csproj @@ -10,7 +10,12 @@ - + + + + + + diff --git a/Commands/MuteClearCommand.cs b/Commands/MuteClearCommand.cs new file mode 100644 index 0000000..acd93fb --- /dev/null +++ b/Commands/MuteClearCommand.cs @@ -0,0 +1,43 @@ +using SharedLibraryCore; +using SharedLibraryCore.Commands; +using SharedLibraryCore.Configuration; +using SharedLibraryCore.Database.Models; +using SharedLibraryCore.Interfaces; +using System.Threading.Tasks; + + +namespace ClanTagRankCommands.Commands +{ + + /// + /// Example script command + /// + /// + + public class MuteClearCommand : Command + { + + + + + public MuteClearCommand(CommandConfiguration config, ITranslationLookup lookup, IMetaService metaService, IConfigurationHandlerFactory configurationHandlerFactory) : base(config, lookup) + { + + + Name = "MuteClear"; + Description = "clears the muted player list for current server"; + Alias = "mc"; + Permission = EFClient.Permission.Administrator; + RequiresTarget = false; + + } + + public override async Task ExecuteAsync(GameEvent E) + { + await E.Owner.ExecuteCommandAsync("muteclear"); + E.Origin.Tell("mute list cleared"); + + + } + } +} diff --git a/Commands/MuteCommand.cs b/Commands/MuteCommand.cs new file mode 100644 index 0000000..4d39e75 --- /dev/null +++ b/Commands/MuteCommand.cs @@ -0,0 +1,75 @@ +using SharedLibraryCore; +using SharedLibraryCore.Commands; +using SharedLibraryCore.Configuration; +using SharedLibraryCore.Database.Models; +using SharedLibraryCore.Interfaces; +using System.Threading.Tasks; + + +namespace ClanTagRankCommands.Commands +{ + + /// + /// Example script command + /// + /// + + public class MuteCommand : Command + { + + + + + public MuteCommand(CommandConfiguration config, ITranslationLookup lookup, IMetaService metaService, IConfigurationHandlerFactory configurationHandlerFactory) : base(config, lookup) + { + + + Name = "Mute"; + Description = "mutes a player's chat."; + Alias = "mute"; + Permission = EFClient.Permission.Administrator; + RequiresTarget = true; + Arguments = new[] + { + new CommandArgument() + { + Name = "player", + Required = true + }, + new CommandArgument() + { + Name = "reason", + Required = false + } + }; + } + + public override async Task ExecuteAsync(GameEvent E) + { + //var S = E.Owner; + + var msg = E.Data; + if (E.Data == null) + { + msg = "Muted"; + } + else + { + msg = E.Data; + } + if(E.Target.IsIngame && E.Target is object && E.Target != E.Origin) + { + await E.Owner.ExecuteCommandAsync("mute_player" + " " + E.Target.ClientNumber.ToString()); + E.Target.Warn("muted", E.Origin); + } + if(E.Target == E.Origin) + { + E.Origin.Tell("Can't mute yourself"); + } + + + + + } + } +} diff --git a/Commands/PermaperkCommand.cs b/Commands/PermaperkCommand.cs new file mode 100644 index 0000000..a1821ea --- /dev/null +++ b/Commands/PermaperkCommand.cs @@ -0,0 +1,86 @@ +using SharedLibraryCore; +using SharedLibraryCore.Commands; +using SharedLibraryCore.Configuration; +using SharedLibraryCore.Database.Models; +using SharedLibraryCore.Interfaces; +using System.Threading.Tasks; +using ClanTagRankCommands; + +namespace ClanTagRankCommands.Commands +{ + /// + /// Example script command + /// + public class PermaperkCommand : Command + { + private readonly IMetaService _metaService; + private readonly IConfigurationHandler _configurationHandler; + private Configuration Config; + public PermaperkCommand(CommandConfiguration config, ITranslationLookup lookup, IMetaService metaService, IConfigurationHandlerFactory configurationHandlerFactory) : base(config, lookup) + { + _metaService = metaService; + _configurationHandler = configurationHandlerFactory.GetConfigurationHandler("ClanTagRankCommands"); + if (_configurationHandler.Configuration() == null) + { + _configurationHandler.Set((Configuration)new Configuration().Generate()); + _configurationHandler.Save(); + } + Config = _configurationHandler.Configuration(); + Name = "Permaperk"; + Description = "force permaperks, clan tag, and speed if they don't set correctly."; + Alias = "perma"; + Permission = EFClient.Permission.Trusted; + RequiresTarget = false; + Arguments = new[] + { + new CommandArgument() + { + } + }; + } + + public override async Task ExecuteAsync(GameEvent E) + { + //await yadb.notifyYADB("Kicked player @{target} after a successful vote started from @{origin}", $"testing", E.Data,":pencil:", E.Owner, E.Origin, E.Origin); + var speedtoggle = await _metaService.GetPersistentMeta("speedtoggle", E.Origin); + if (speedtoggle == null) + { + // speedtoggle == 1 means slower, unmodified speed) + await _metaService.AddPersistentMeta("speedtoggle", "0", E.Origin); + speedtoggle = await _metaService.GetPersistentMeta("speedtoggle", E.Origin); + } + await E.Owner.SetDvarAsync("sv_iw4madmin_options", "speedtoggle;" + E.Origin.ClientNumber.ToString() + ";" + speedtoggle.Value.ToString()); + + if (E.Origin.CurrentServer == E.Owner && E.Origin is object && E.Origin.ClientNumber != -1 && E.Origin.ClientNumber != 9) + { + var rank_player_var = await _metaService.GetPersistentMeta("rank", E.Origin); + var rankName = E.Origin.Level.ClanTag(Config); + + rank_player_var = await _metaService.GetPersistentMeta("rank", E.Origin); + if (rank_player_var == null) + { + + await _metaService.AddPersistentMeta("rank", "none", E.Origin); + rank_player_var = await _metaService.GetPersistentMeta("rank", E.Origin); + } + + if (!(rank_player_var.Value.Contains("none")) && !(rank_player_var.Value.Contains("None")) && !(rank_player_var.Value.Contains("NONE"))) + { + rankName = rank_player_var.Value; + + } + if (E.Origin.CurrentServer == E.Owner && E.Origin is object && E.Origin.ClientNumber != -1 && E.Origin.ClientNumber != 9)// && (E.Origin.Level > EFClient.Permission.Trusted || rankName != Config.User)) + { + await E.Owner.ExecuteCommandAsync("setclantag" + " " + E.Origin.ClientNumber.ToString() + " " + rankName.ToString()); + await E.Owner.SetDvarAsync("sv_iw4madmin_role", "setRole;" + E.Origin.ClientNumber.ToString() + ";" + rankName.ToString()); + } + } + + + + } + } +} + + + diff --git a/Commands/ResetRankCommand.cs b/Commands/ResetRankCommand.cs index e8470c2..9725be3 100644 --- a/Commands/ResetRankCommand.cs +++ b/Commands/ResetRankCommand.cs @@ -8,7 +8,7 @@ using System.Threading.Tasks; -namespace ClanTagRankApi.Commands +namespace ClanTagRankCommands.Commands { /// /// Example script command @@ -57,7 +57,11 @@ namespace ClanTagRankApi.Commands rank_string = E.Target.Level.ClanTag(Config); E.Origin.Tell(E.Target.Name + "'s rank has been reset to: " + rank_string); if (E.Target.IsIngame && E.Target is object) - await E.Owner.ExecuteCommandAsync("setclantag" + " " + E.Target.ClientNumber + " " + rank_string); + { + await E.Owner.ExecuteCommandAsync("setclantag" + " " + E.Target.ClientNumber.ToString() + " " + rank_string.ToString()); + await E.Owner.SetDvarAsync("sv_iw4madmin_role", "setRole;" + E.Target.ClientNumber.ToString() + ";" + rank_string.ToString()); + } + } diff --git a/Commands/SetRankCommand.cs b/Commands/SetRankCommand.cs index fa381b5..080a4a1 100644 --- a/Commands/SetRankCommand.cs +++ b/Commands/SetRankCommand.cs @@ -6,7 +6,7 @@ using SharedLibraryCore.Interfaces; using System.Threading.Tasks; -namespace ClanTagRankApi.Commands +namespace ClanTagRankCommands.Commands { /// @@ -91,7 +91,12 @@ namespace ClanTagRankApi.Commands } if(E.Target.IsIngame && E.Target is object) - await E.Owner.ExecuteCommandAsync("setclantag" + " " + E.Target.ClientNumber + " " + rank_string); + { + await E.Owner.ExecuteCommandAsync("setclantag" + " " + E.Target.ClientNumber.ToString() + " " + rank_string.ToString()); + await E.Owner.SetDvarAsync("sv_iw4madmin_role", "setRole;" + E.Target.ClientNumber.ToString() + ";" + rank_string.ToString()); + } + + } } diff --git a/Commands/UnMuteCommand.cs b/Commands/UnMuteCommand.cs new file mode 100644 index 0000000..b775503 --- /dev/null +++ b/Commands/UnMuteCommand.cs @@ -0,0 +1,59 @@ +using SharedLibraryCore; +using SharedLibraryCore.Commands; +using SharedLibraryCore.Configuration; +using SharedLibraryCore.Database.Models; +using SharedLibraryCore.Interfaces; +using System.Threading.Tasks; + + +namespace ClanTagRankCommands.Commands +{ + + /// + /// Example script command + /// + /// + + public class UnMuteCommand : Command + { + + + + + public UnMuteCommand(CommandConfiguration config, ITranslationLookup lookup, IMetaService metaService, IConfigurationHandlerFactory configurationHandlerFactory) : base(config, lookup) + { + + + Name = "Unmute"; + Description = "Unmutes a player's chat."; + Alias = "Unmute"; + Permission = EFClient.Permission.Administrator; + RequiresTarget = true; + Arguments = new[] + { + new CommandArgument() + { + Name = "player", + Required = true + } + }; + } + + public override async Task ExecuteAsync(GameEvent E) + { + //var S = E.Owner; + + + if(E.Target.IsIngame && E.Target is object) + { + await E.Owner.ExecuteCommandAsync("unmute_player" + " " + E.Target.ClientNumber.ToString()); + E.Target.WarnClear(E.Origin); + E.Target.Tell("You have been Unmuted"); + } + + + + + } + } +} diff --git a/Configuration.cs b/Configuration.cs index ce91c79..d871d20 100644 --- a/Configuration.cs +++ b/Configuration.cs @@ -1,7 +1,7 @@  using SharedLibraryCore.Interfaces; -namespace ClanTagRankApi +namespace ClanTagRankCommands { public class Configuration : IBaseConfiguration { diff --git a/Events/Script.cs b/Events/Script.cs new file mode 100644 index 0000000..ad133d7 --- /dev/null +++ b/Events/Script.cs @@ -0,0 +1,67 @@ +using SharedLibraryCore; +using SharedLibraryCore.Database.Models; +using SharedLibraryCore.Interfaces; +using System.Collections.Generic; +using EventGeneratorCallback = System.ValueTuple>; + +namespace IW4MAdmin.Plugins.ClanTagRankCommands.Events +{ + public class Script : IRegisterEvent + { + + private const string EVENT_RC = "RC"; + + /// + /// this is a custom event printed out by _clientids.gsc (used for recording highest personal round records) + /// + /// + private EventGeneratorCallback RC() + { + return (EVENT_RC, EVENT_RC, (string eventLine, IEventParserConfiguration config, GameEvent autoEvent) => + { + string[] lineSplit = eventLine.Split(";"); + + + long originId = lineSplit[1].ConvertGuidToLong(config.GuidNumberStyle, 1); + + autoEvent.Type = GameEvent.EventType.Other; + autoEvent.Origin = new EFClient() { NetworkId = originId }; + autoEvent.RequiredEntity = GameEvent.EventRequiredEntity.Origin; + autoEvent.GameTime = autoEvent.GameTime; + autoEvent.Subtype = EVENT_RC; + + return autoEvent; + } + ); + } + //private const string EVENT_RoundNumber = "RoundNumber"; + + ///// + ///// this is a custom event printed out by _clientids.gsc (used for recording highest server round records) + ///// + ///// + //private EventGeneratorCallback RoundNumber() + //{ + // return (EVENT_RoundNumber, EVENT_RoundNumber, (string eventLine, IEventParserConfiguration config, GameEvent autoEvent) => + // { + // string[] lineSplit = eventLine.Split(";"); + + // autoEvent.Type = GameEvent.EventType.RoundNumber; + // autoEvent.Origin = Utilities.IW4MAdminClient(); + // autoEvent.GameTime = autoEvent.GameTime; + + // return autoEvent; + // } + // ); + //} + public IEnumerable Events => + new[] + { + RC(), + + }; + } +} diff --git a/GscApiController.cs b/GscApiController.cs index 880a79b..0d92692 100644 --- a/GscApiController.cs +++ b/GscApiController.cs @@ -1,4 +1,5 @@ -using ClanTagRankApi; +using ClanTagRankCommands; +using Data.Models; using Microsoft.AspNetCore.Mvc; using SharedLibraryCore; using SharedLibraryCore.Database.Models; diff --git a/Plugin.cs b/Plugin.cs index 98cbba6..cb5cc1f 100644 --- a/Plugin.cs +++ b/Plugin.cs @@ -6,9 +6,11 @@ using SharedLibraryCore.Database.Models; using System.Collections.Generic; using Microsoft.Extensions.Logging; using ILogger = Microsoft.Extensions.Logging.ILogger; +using Data.Models; +using System; -namespace ClanTagRankApi +namespace ClanTagRankCommands { public class Plugin : IPlugin @@ -29,7 +31,7 @@ namespace ClanTagRankApi private readonly IMetaService _metaService; - public Plugin(IMetaService metaService, IConfigurationHandlerFactory configurationHandlerFactory, ILogger logger) + public Plugin(IMetaService metaService, IConfigurationHandlerFactory configurationHandlerFactory, ILogger logger) { _logger = logger; _metaService = metaService; @@ -46,14 +48,18 @@ namespace ClanTagRankApi string version = manager.Version; string str = string.Format("Loaded {0} ({1}) by {2} in {3} ({4})!", (object)((IPlugin)this).Name, (object)((IPlugin)this).Version, (object)((IPlugin)this).Author, (object)"IW4MAdmin", (object)version); _logger.LogInformation(str); - + return Task.CompletedTask; } public async Task OnEventAsync(GameEvent E, Server S)// => Task.CompletedTask; { - if (E.Type == GameEvent.EventType.Join ||E.Type == GameEvent.EventType.ChangePermission) + + //if (E.Type == GameEvent.EventType.Join || E.Type == GameEvent.EventType.ChangePermission ) + if ((E.Type == GameEvent.EventType.Other) && E.Subtype.Contains("RC")) { - if(E.Origin.IsIngame && E.Origin is object) + //Console.WriteLine("RC: " + E.Origin.Name); + + if (E.Origin.CurrentServer == S && E.Origin is object && E.Origin.ClientNumber != -1 && E.Origin.ClientNumber != 9) { var rank_player_var = await _metaService.GetPersistentMeta(rank, E.Origin); rankName = E.Origin.Level.ClanTag(Config); @@ -61,6 +67,7 @@ namespace ClanTagRankApi rank_player_var = await _metaService.GetPersistentMeta("rank", E.Origin); if (rank_player_var == null) { + await _metaService.AddPersistentMeta("rank", "none", E.Origin); rank_player_var = await _metaService.GetPersistentMeta("rank", E.Origin); } @@ -70,42 +77,54 @@ namespace ClanTagRankApi rankName = rank_player_var.Value; } - if (E.Origin.IsIngame && E.Origin is object) - await S.ExecuteCommandAsync("setclantag" + " " + E.Origin.ClientNumber + " " + rankName); - } - - } - if (E.Type == GameEvent.EventType.Start || E.Type == GameEvent.EventType.MapEnd || E.Type == GameEvent.EventType.MapChange) - { - IList currentclients = E.Owner.Manager.GetActiveClients(); - foreach(EFClient client in currentclients) - { - if (client.IsIngame && client is object) + if (E.Origin.CurrentServer == S && E.Origin is object && E.Origin.ClientNumber != -1 && E.Origin.ClientNumber != 9)// && (E.Origin.Level > EFClient.Permission.Trusted || rankName != Config.User)) { - var rank_player_var = await _metaService.GetPersistentMeta("rank", client); - rankName = client.Level.ClanTag(Config); - - rank_player_var = await _metaService.GetPersistentMeta("rank", client); - if (rank_player_var == null) - { - await _metaService.AddPersistentMeta("rank", "none", client); - rank_player_var = await _metaService.GetPersistentMeta("rank", client); - } - - if (!(rank_player_var.Value.Contains("none")) && !(rank_player_var.Value.Contains("None")) && !(rank_player_var.Value.Contains("NONE"))) - { - rankName = rank_player_var.Value; - - } - if (client.IsIngame && client is object) - await S.ExecuteCommandAsync("setclantag" + " " + client.ClientNumber + " " + rankName); + await S.ExecuteCommandAsync("setclantag" + " " + E.Origin.ClientNumber.ToString() + " " + rankName.ToString()); + await S.SetDvarAsync("sv_iw4madmin_role", "setRole;" + E.Origin.ClientNumber.ToString() + ";" + rankName.ToString()); } - - } } - //return Task.CompletedTask; + //if ((E.Type == GameEvent.EventType.Other) && E.Subtype.Contains("YADB-Embed")) + //{ + // Console.WriteLine(E.Extra); + // Console.WriteLine(E.Origin.Name); + //} + //if (E.Type == GameEvent.EventType.Start || E.Type == GameEvent.EventType.MapChange) + //{ + // var currentclients = S.GetClientsAsList(); //GetActiveClients(); + // foreach (EFClient client in currentclients) + // { + // if (client.CurrentServer == S && client is object && client.ClientNumber != -1 && client.ClientNumber != 9) + // { + // var rank_player_var = await _metaService.GetPersistentMeta("rank", client); + // rankName = client.Level.ClanTag(Config); + + // rank_player_var = await _metaService.GetPersistentMeta("rank", client); + // if (rank_player_var == null) + // { + // await _metaService.AddPersistentMeta("rank", "none", client); + // rank_player_var = await _metaService.GetPersistentMeta("rank", client); + // } + + // if (!(rank_player_var.Value.Contains("none")) && !(rank_player_var.Value.Contains("None")) && !(rank_player_var.Value.Contains("NONE"))) + // { + // rankName = rank_player_var.Value; + + // } + // if (client.CurrentServer == S && client is object && client.ClientNumber != -1 && client.ClientNumber != 9) + // { + // await S.SetDvarAsync("sv_iw4madmin_role", "setRole;" + client.ClientNumber.ToString() + ";" + rankName.ToString()); + // await S.ExecuteCommandAsync("setclantag" + " " + client.ClientNumber.ToString() + " " + rankName.ToString()); + // } + + // } + + + // } + + //} + //return Task.CompletedTask; } public Task OnTickAsync(Server S)// => { @@ -116,7 +135,11 @@ namespace ClanTagRankApi public Task OnUnloadAsync() => Task.CompletedTask; - public Task notifyYADB(string message, string title, string reason, string icon, Server S, EFClient OriginClient, EFClient TargetClient) + + } + public static class yadb + { + public static Task notifyYADB(string message, string title, string reason, string icon, Server S, EFClient OriginClient, EFClient TargetClient) { string json = ""; using (var stream = new System.IO.MemoryStream()) @@ -144,9 +167,16 @@ namespace ClanTagRankApi }; S.ExecuteEvent(e); + Console.WriteLine("event triggered!" + message); return Task.CompletedTask; + + //notifyYADB("Kicked player @{target} after a successful vote started from @{origin}", $"Vote kicked {target.Name}", gameEvent.Data,":pencil:", Server, origin, target); } + + } + + } diff --git a/unusedClanTag.cs b/unusedClanTag.cs new file mode 100644 index 0000000..e7612c5 --- /dev/null +++ b/unusedClanTag.cs @@ -0,0 +1,65 @@ + +using SharedLibraryCore.Database.Models; +using SharedLibraryCore; +using SharedLibraryCore.Interfaces; + +namespace Tebex_IW4M_Admin +{ + + static class ExtensionMethods + { + public static string Truncate(this string input, int strLength) + { + if (string.IsNullOrEmpty(input)) return input; + return input.Length <= strLength ? input : input.Substring(0, strLength); + } + public static string ClanTag(this EFClient.Permission level, Configuration Config) + { + string rankName; + + switch ((int)level) + { + case -1: + rankName = "Banned"; //this typically won't be seen. + break; + case 0: + rankName = Config.User; + break; + case 1: + rankName = Config.User; //1 = flagged, but don't want to show this in game. + break; + case 2: + rankName = Config.Trusted; + break; + case 3: + rankName = Config.Moderator; + break; + case 4: + rankName = Config.Admin; + break; + case 5: + rankName = Config.SeniorAdmin; + break; + case 6: + rankName = Config.Owner; + break; + case 7: + rankName = Config.Creator; + break; + case 8: + rankName = Config.Console; + break; + default: + rankName = Config.User; + break; + } + return rankName.Truncate(8); + } + + + + } +} + + +