From b6bc07fd0fa7a679e20a872fa571b9577c190a18 Mon Sep 17 00:00:00 2001 From: SGKoishi Date: Fri, 28 Apr 2023 02:16:34 -0700 Subject: [PATCH] AltCmd ContinueOnError, add missing permissions --- src/AltCmd.cs | 38 +++++++++++++--- src/Consts.cs | 118 ++++++++++++++++++++++++------------------------- src/Utils.cs | 37 +++++----------- src/Vanilla.cs | 39 ++++++++-------- 4 files changed, 124 insertions(+), 108 deletions(-) diff --git a/src/AltCmd.cs b/src/AltCmd.cs index 96397ab..f04b8e7 100644 --- a/src/AltCmd.cs +++ b/src/AltCmd.cs @@ -4,6 +4,30 @@ namespace Chireiden.TShock.Omni; public partial class Plugin : TerrariaPlugin { + public class ParsedCommand + { + public string Command { get; set; } = string.Empty; + public List Parameters { get; set; } = new List(); + internal bool ContinueOnError = false; + private string _buffer = string.Empty; + internal bool IsEmpty => string.IsNullOrEmpty(this.Command); + internal void AppendChar(char c) + { + this._buffer += c; + } + internal void EndSegment() + { + if (string.IsNullOrEmpty(this.Command) && !string.IsNullOrWhiteSpace(this._buffer)) + { + this.Command = this._buffer.Trim(); + } + else + { + this.Parameters.Add(this._buffer); + } + this._buffer = string.Empty; + } + } private bool Detour_Command_Alternative(Func orig, TShockAPI.TSPlayer player, string text) { if (this.config.Enhancements.AlternativeCommandSyntax) @@ -11,16 +35,18 @@ private bool Detour_Command_Alternative(Func o var commands = Utils.ParseCommands(text); foreach (var command in commands) { - if (command.Count == 0) - { - continue; - } - var cmd = Utils.ToCommand(command[0], command.GetRange(1, command.Count - 1)); + var cmd = Utils.ToCommand(command.Command, command.Parameters); if (!cmd.StartsWith(TShockAPI.Commands.Specifier) && !cmd.StartsWith(TShockAPI.Commands.SilentSpecifier)) { cmd = TShockAPI.Commands.Specifier + cmd; } - orig(player, cmd); + try + { + orig(player, cmd); + } + catch when (command.ContinueOnError) + { + } } return true; } diff --git a/src/Consts.cs b/src/Consts.cs index c6815bd..a5413fb 100644 --- a/src/Consts.cs +++ b/src/Consts.cs @@ -4,73 +4,73 @@ public static class Consts { public static class Permissions { - public static readonly string Whynot = "chireiden.omni.whynot"; - public static readonly string TogglePvP = "chireiden.omni.togglepvp"; - public static readonly string ToggleTeam = "chireiden.omni.toggleteam"; - public static readonly string PvPCommand = "chireiden.omni.setpvp"; - public static readonly string TeamCommand = "chireiden.omni.setteam"; - public static readonly string SyncLoadout = "chireiden.omni.syncloadout"; - public static readonly string TimeoutCommand = "chireiden.omni.timeout"; - public static readonly string IntervalCommand = "chireiden.omni.interval"; - public static readonly string ClearInterval = "chireiden.omni.cleartimeout"; - public static readonly string ShowTimeout = "chireiden.omni.showtimeout"; - public static readonly string ResetCharacter = "chireiden.omni.resetcharacter"; - public static readonly string Ping = "chireiden.omni.ping"; - public static readonly string Chat = "chireiden.omni.chat"; - public static readonly string SummonBoss = "chireiden.omni.summonboss"; - public static readonly string Echo = "chireiden.omni.echo"; + public static string Whynot => "chireiden.omni.whynot"; + public static string TogglePvP => "chireiden.omni.togglepvp"; + public static string ToggleTeam => "chireiden.omni.toggleteam"; + public static string PvPCommand => "chireiden.omni.setpvp"; + public static string TeamCommand => "chireiden.omni.setteam"; + public static string SyncLoadout => "chireiden.omni.syncloadout"; + public static string TimeoutCommand => "chireiden.omni.timeout"; + public static string IntervalCommand => "chireiden.omni.interval"; + public static string ClearInterval => "chireiden.omni.cleartimeout"; + public static string ShowTimeout => "chireiden.omni.showtimeout"; + public static string ResetCharacter => "chireiden.omni.resetcharacter"; + public static string Ping => "chireiden.omni.ping"; + public static string Chat => "chireiden.omni.chat"; + public static string SummonBoss => "chireiden.omni.summonboss"; + public static string Echo => "chireiden.omni.echo"; public static class Admin { - public static readonly string Ghost = "chireiden.omni.ghost"; - public static readonly string SetLanguage = "chireiden.omni.setlang"; - public static readonly string SetPvp = "chireiden.omni.admin.setpvp"; - public static readonly string SetTeam = "chireiden.omni.admin.setteam"; - public static readonly string TriggerGarbageCollection = "chireiden.omni.admin.gc"; - public static readonly string DebugStat = "chireiden.omni.admin.debugstat"; - public static readonly string MaxPlayers = "chireiden.omni.admin.maxplayers"; - public static readonly string TileProvider = "chireiden.omni.admin.tileprovider"; - public static readonly string RawBroadcast = "chireiden.omni.admin.rawbroadcast"; - public static readonly string Sudo = "chireiden.omni.admin.sudo"; - public static readonly string DetailedPermissionStackTrace = "chireiden.omni.whynot.detailed"; - public static readonly string ListClients = "chireiden.omni.admin.listclients"; - public static readonly string DumpBuffer = "chireiden.omni.admin.dumpbuffer"; - public static readonly string TerminateSocket = "chireiden.omni.admin.terminatesocket"; - public static readonly string ResetCharacterOther = "chireiden.omni.admin.resetcharacter"; - public static readonly string ResetCharacterAll = "chireiden.omni.admin.resetcharacter.all"; - public static readonly string ExportCharacter = "chireiden.omni.admin.exportcharacter"; + public static string Ghost => "chireiden.omni.ghost"; + public static string SetLanguage => "chireiden.omni.setlang"; + public static string SetPvp => "chireiden.omni.admin.setpvp"; + public static string SetTeam => "chireiden.omni.admin.setteam"; + public static string TriggerGarbageCollection => "chireiden.omni.admin.gc"; + public static string DebugStat => "chireiden.omni.admin.debugstat"; + public static string MaxPlayers => "chireiden.omni.admin.maxplayers"; + public static string TileProvider => "chireiden.omni.admin.tileprovider"; + public static string RawBroadcast => "chireiden.omni.admin.rawbroadcast"; + public static string Sudo => "chireiden.omni.admin.sudo"; + public static string DetailedPermissionStackTrace => "chireiden.omni.whynot.detailed"; + public static string ListClients => "chireiden.omni.admin.listclients"; + public static string DumpBuffer => "chireiden.omni.admin.dumpbuffer"; + public static string TerminateSocket => "chireiden.omni.admin.terminatesocket"; + public static string ResetCharacterOther => "chireiden.omni.admin.resetcharacter"; + public static string ResetCharacterAll => "chireiden.omni.admin.resetcharacter.all"; + public static string ExportCharacter => "chireiden.omni.admin.exportcharacter"; } } public static class Commands { - public static readonly string Whynot = "whynot"; - public static readonly string Ghost = "ghost"; - public static readonly string SetLanguage = "setlang"; - public static readonly string SetPvp = "_pvp"; - public static readonly string SetTeam = "_team"; - public static readonly string TriggerGarbageCollection = "_gc"; - public static readonly string DebugStat = "_debugstat"; - public static readonly string MaxPlayers = "maxplayers"; - public static readonly string TileProvider = "tileprovider"; - public static readonly string Timeout = "settimeout"; - public static readonly string Interval = "setinterval"; - public static readonly string ClearInterval = "clearinterval"; - public static readonly string ShowTimeout = "showdelay"; - public static readonly string RawBroadcast = "rbc"; - public static readonly string Sudo = "runas"; - public static readonly string ListClients = "listclients"; - public static readonly string DumpBuffer = "dumpbuffer"; - public static readonly string TerminateSocket = "kc"; - public static readonly string ResetCharacter = "resetcharacter"; - public static readonly string Ping = "_ping"; - public static readonly string Chat = "_chat"; - public static readonly string ExportCharacter = "exportcharacter"; - public static readonly string Echo = "_echo"; + public static string Whynot => "whynot"; + public static string Ghost => "ghost"; + public static string SetLanguage => "setlang"; + public static string SetPvp => "_pvp"; + public static string SetTeam => "_team"; + public static string TriggerGarbageCollection => "_gc"; + public static string DebugStat => "_debugstat"; + public static string MaxPlayers => "maxplayers"; + public static string TileProvider => "tileprovider"; + public static string Timeout => "settimeout"; + public static string Interval => "setinterval"; + public static string ClearInterval => "clearinterval"; + public static string ShowTimeout => "showdelay"; + public static string RawBroadcast => "rbc"; + public static string Sudo => "runas"; + public static string ListClients => "listclients"; + public static string DumpBuffer => "dumpbuffer"; + public static string TerminateSocket => "kc"; + public static string ResetCharacter => "resetcharacter"; + public static string Ping => "_ping"; + public static string Chat => "_chat"; + public static string ExportCharacter => "exportcharacter"; + public static string Echo => "_echo"; } public static class DataKey { - public static readonly string IsPE = "chireiden.data.ispe"; + public static string IsPE => "chireiden.data.ispe"; } - public static readonly string ConfigFile = "chireiden.omni.json"; - public static readonly string PresetLock = "chireiden.omni.preset.lock"; - public static readonly string VanillaGroup = "chireiden_vanilla"; + public static string ConfigFile => "chireiden.omni.json"; + public static string PresetLock => "chireiden.omni.preset.lock"; + public static string VanillaGroup => "chireiden_vanilla"; } \ No newline at end of file diff --git a/src/Utils.cs b/src/Utils.cs index 1c120de..cb92cc0 100644 --- a/src/Utils.cs +++ b/src/Utils.cs @@ -114,13 +114,12 @@ public static string ToCommand(string command, List args) /// command [args] [; command [args]] ... /// Similar but not fully compatible with the syntax of . /// - public static List> ParseCommands(string input) + public static List ParseCommands(string input) { - var result = new List>(); + var result = new List(); var currentIndex = 0; var inQuote = false; - var currentCommand = new List(); - var current = ""; + var currentCommand = new Plugin.ParsedCommand(); while (currentIndex < input.Length) { switch (input[currentIndex]) @@ -133,47 +132,35 @@ public static List> ParseCommands(string input) { currentIndex++; } - current += input[currentIndex]; + currentCommand.AppendChar(input[currentIndex]); break; case '&' when !inQuote && currentIndex + 1 < input.Length && input[currentIndex + 1] == '&': - result.Add(currentCommand); - currentCommand = new List(); - current = ""; - currentIndex++; - while (currentIndex + 1 < input.Length && char.IsWhiteSpace(input[currentIndex + 1])) - { - currentIndex++; - } - break; case ';' when !inQuote: + currentCommand.EndSegment(); + currentCommand.ContinueOnError = input[currentIndex] == ';'; result.Add(currentCommand); - currentCommand = new List(); - current = ""; - currentIndex++; + currentCommand = new Plugin.ParsedCommand(); + currentIndex += currentCommand.ContinueOnError ? 0 : 1; while (currentIndex + 1 < input.Length && char.IsWhiteSpace(input[currentIndex + 1])) { currentIndex++; } break; case char c when !inQuote && char.IsWhiteSpace(c): - currentCommand.Add(current); - current = ""; + currentCommand.EndSegment(); while (currentIndex + 1 < input.Length && char.IsWhiteSpace(input[currentIndex + 1])) { currentIndex++; } break; case char c: - current += c; + currentCommand.AppendChar(c); break; } currentIndex++; } - if (!string.IsNullOrWhiteSpace(current)) - { - currentCommand.Add(current); - } - if (currentCommand.Count > 0) + currentCommand.EndSegment(); + if (!currentCommand.IsEmpty) { result.Add(currentCommand); } diff --git a/src/Vanilla.cs b/src/Vanilla.cs index 168f077..1b01910 100644 --- a/src/Vanilla.cs +++ b/src/Vanilla.cs @@ -60,30 +60,32 @@ private void PermissionSetup() var guest = TShockAPI.TShock.Groups.GetGroupByName(TShockAPI.TShock.Config.Settings.DefaultGuestGroupName); if (preset.AllowRestricted || vanillaMode) { - this.AddPermission(guest, + AddPermission(guest, Consts.Permissions.TogglePvP, Consts.Permissions.ToggleTeam, - Consts.Permissions.SyncLoadout); + Consts.Permissions.SyncLoadout, + Consts.Permissions.PvPCommand, + Consts.Permissions.TeamCommand); } - this.AddPermission(guest, Consts.Permissions.Ping); - this.AddPermission(guest, Consts.Permissions.Echo); + AddPermission(guest, Consts.Permissions.Ping); + AddPermission(guest, Consts.Permissions.Echo); - this.AliasPermission(TShockAPI.Permissions.canchat, Consts.Permissions.Chat); - this.AliasPermission(Consts.Permissions.TogglePvP, $"{Consts.Permissions.TogglePvP}.*"); - this.AliasPermission(Consts.Permissions.ToggleTeam, $"{Consts.Permissions.ToggleTeam}.*"); - this.AliasPermission(TShockAPI.Permissions.summonboss, $"{Consts.Permissions.SummonBoss}.*"); - this.AliasPermission(TShockAPI.Permissions.startinvasion, $"{Consts.Permissions.SummonBoss}.*"); + AliasPermission(TShockAPI.Permissions.canchat, Consts.Permissions.Chat); + AliasPermission(Consts.Permissions.TogglePvP, $"{Consts.Permissions.TogglePvP}.*"); + AliasPermission(Consts.Permissions.ToggleTeam, $"{Consts.Permissions.ToggleTeam}.*"); + AliasPermission(TShockAPI.Permissions.summonboss, $"{Consts.Permissions.SummonBoss}.*"); + AliasPermission(TShockAPI.Permissions.startinvasion, $"{Consts.Permissions.SummonBoss}.*"); if (preset.DebugForAdminOnly) { - this.AliasPermission(TShockAPI.Permissions.kick, Consts.Permissions.Whynot); + AliasPermission(TShockAPI.Permissions.kick, Consts.Permissions.Whynot); } else { - this.AddPermission(guest, Consts.Permissions.Whynot); + AddPermission(guest, Consts.Permissions.Whynot); } - this.AliasPermission(TShockAPI.Permissions.kick, + AliasPermission(TShockAPI.Permissions.kick, Consts.Permissions.Admin.Ghost, Consts.Permissions.Admin.SetLanguage, Consts.Permissions.Admin.DebugStat, @@ -92,9 +94,10 @@ private void PermissionSetup() Consts.Permissions.TimeoutCommand, Consts.Permissions.IntervalCommand, Consts.Permissions.ClearInterval, - Consts.Permissions.ShowTimeout); + Consts.Permissions.ShowTimeout, + Consts.Permissions.ResetCharacter); - this.AliasPermission(TShockAPI.Permissions.maintenance, + AliasPermission(TShockAPI.Permissions.maintenance, Consts.Permissions.Admin.MaxPlayers, Consts.Permissions.Admin.TileProvider, Consts.Permissions.Admin.TriggerGarbageCollection, @@ -103,7 +106,7 @@ private void PermissionSetup() Consts.Permissions.Admin.ResetCharacterOther, Consts.Permissions.Admin.ExportCharacter); - this.AliasPermission(TShockAPI.Permissions.su, + AliasPermission(TShockAPI.Permissions.su, Consts.Permissions.Admin.Sudo, Consts.Permissions.Admin.ListClients, Consts.Permissions.Admin.DumpBuffer, @@ -112,18 +115,18 @@ private void PermissionSetup() File.WriteAllText(Path.Combine(TShockAPI.TShock.SavePath, Consts.PresetLock), string.Empty); } - private void AliasPermission(string orig, params string[] equiv) + private static void AliasPermission(string orig, params string[] equiv) { foreach (var group in TShockAPI.TShock.Groups.groups) { if (group.HasPermission(orig) && (group.Parent?.HasPermission(orig) != true)) { - this.AddPermission(group, equiv); + AddPermission(group, equiv); } } } - private void AddPermission(TShockAPI.Group? group, params string[] perm) + private static void AddPermission(TShockAPI.Group? group, params string[] perm) { if (group == null) {