Skip to content

Commit

Permalink
AltCmd ContinueOnError, add missing permissions
Browse files Browse the repository at this point in the history
  • Loading branch information
sgkoishi committed Apr 28, 2023
1 parent 3f4da5d commit b6bc07f
Show file tree
Hide file tree
Showing 4 changed files with 124 additions and 108 deletions.
38 changes: 32 additions & 6 deletions src/AltCmd.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,23 +4,49 @@ namespace Chireiden.TShock.Omni;

public partial class Plugin : TerrariaPlugin
{
public class ParsedCommand
{
public string Command { get; set; } = string.Empty;
public List<string> Parameters { get; set; } = new List<string>();
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<TShockAPI.TSPlayer, string, bool> orig, TShockAPI.TSPlayer player, string text)
{
if (this.config.Enhancements.AlternativeCommandSyntax)
{
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;
}
Expand Down
118 changes: 59 additions & 59 deletions src/Consts.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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";
}
37 changes: 12 additions & 25 deletions src/Utils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -114,13 +114,12 @@ public static string ToCommand(string command, List<string> args)
/// <c>command [args] [; command [args]] ..</c>.
/// Similar but not fully compatible with the syntax of <seealso cref="TShockAPI.Commands.ParseParameters(string)"/>.
/// </summary>
public static List<List<string>> ParseCommands(string input)
public static List<Plugin.ParsedCommand> ParseCommands(string input)
{
var result = new List<List<string>>();
var result = new List<Plugin.ParsedCommand>();
var currentIndex = 0;
var inQuote = false;
var currentCommand = new List<string>();
var current = "";
var currentCommand = new Plugin.ParsedCommand();
while (currentIndex < input.Length)
{
switch (input[currentIndex])
Expand All @@ -133,47 +132,35 @@ public static List<List<string>> 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<string>();
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<string>();
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);
}
Expand Down
39 changes: 21 additions & 18 deletions src/Vanilla.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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,
Expand All @@ -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,
Expand All @@ -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)
{
Expand Down

0 comments on commit b6bc07f

Please sign in to comment.