Pulled the duplicated code for handling commands into helper method
This commit is contained in:
parent
ad456ac7b6
commit
6ed2b5044d
2 changed files with 127 additions and 146 deletions
|
|
@ -93,89 +93,7 @@ namespace TShockAPI
|
||||||
}
|
}
|
||||||
public static class Commands
|
public static class Commands
|
||||||
{
|
{
|
||||||
public static List<Command> ChatCommands = new List<Command>();
|
private static List<Command> ChatCommands = new List<Command>();
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Parses a string of parameters into a list. Handles quotes.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="str"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public static List<String> ParseParameters(string str)
|
|
||||||
{
|
|
||||||
var ret = new List<string>();
|
|
||||||
var sb = new StringBuilder();
|
|
||||||
bool instr = false;
|
|
||||||
for (int i = 0; i < str.Length; i++)
|
|
||||||
{
|
|
||||||
char c = str[i];
|
|
||||||
|
|
||||||
if (instr)
|
|
||||||
{
|
|
||||||
if (c == '\\')
|
|
||||||
{
|
|
||||||
if (i + 1 >= str.Length)
|
|
||||||
break;
|
|
||||||
c = GetEscape(str[++i]);
|
|
||||||
}
|
|
||||||
else if (c == '"')
|
|
||||||
{
|
|
||||||
ret.Add(sb.ToString());
|
|
||||||
sb.Clear();
|
|
||||||
instr = false;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
sb.Append(c);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (IsWhiteSpace(c))
|
|
||||||
{
|
|
||||||
if (sb.Length > 0)
|
|
||||||
{
|
|
||||||
ret.Add(sb.ToString());
|
|
||||||
sb.Clear();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (c == '"')
|
|
||||||
{
|
|
||||||
if (sb.Length > 0)
|
|
||||||
{
|
|
||||||
ret.Add(sb.ToString());
|
|
||||||
sb.Clear();
|
|
||||||
}
|
|
||||||
instr = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sb.Append(c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (sb.Length > 0)
|
|
||||||
ret.Add(sb.ToString());
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static char GetEscape(char c)
|
|
||||||
{
|
|
||||||
switch (c)
|
|
||||||
{
|
|
||||||
case '\\':
|
|
||||||
return '\\';
|
|
||||||
case '"':
|
|
||||||
return '"';
|
|
||||||
case 't':
|
|
||||||
return '\t';
|
|
||||||
default:
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool IsWhiteSpace(char c)
|
|
||||||
{
|
|
||||||
return c == ' ' || c == '\t' || c == '\n';
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void InitCommands()
|
public static void InitCommands()
|
||||||
{
|
{
|
||||||
|
|
@ -235,6 +153,128 @@ namespace TShockAPI
|
||||||
Commands.ChatCommands.Add(new Command("updatenow", "maintenance", Commands.UpdateNow));
|
Commands.ChatCommands.Add(new Command("updatenow", "maintenance", Commands.UpdateNow));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static bool HandleCommand(TSPlayer player, string text)
|
||||||
|
{
|
||||||
|
string cmdText = text.Remove(0, 1);
|
||||||
|
|
||||||
|
var args = Commands.ParseParameters(cmdText);
|
||||||
|
if (args.Count < 1)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
string cmdName = args[0];
|
||||||
|
args.RemoveAt(0);
|
||||||
|
|
||||||
|
Command cmd = null;
|
||||||
|
foreach (Command command in Commands.ChatCommands)
|
||||||
|
{
|
||||||
|
if (command.Name.Equals(cmdName))
|
||||||
|
{
|
||||||
|
cmd = command;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cmd == null)
|
||||||
|
{
|
||||||
|
player.SendMessage("That command does not exist, try /help", Color.Red);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!cmd.CanRun(player))
|
||||||
|
{
|
||||||
|
Tools.SendLogs(string.Format("{0} tried to execute {1}", player.Name, cmd.Name), Color.Red);
|
||||||
|
player.SendMessage("You do not have access to that command.", Color.Red);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Tools.SendLogs(string.Format("{0} executed: /{1}", player.Name, cmdText), Color.Red);
|
||||||
|
cmd.Run(cmdText, player, args);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Parses a string of parameters into a list. Handles quotes.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="str"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
private static List<String> ParseParameters(string str)
|
||||||
|
{
|
||||||
|
var ret = new List<string>();
|
||||||
|
var sb = new StringBuilder();
|
||||||
|
bool instr = false;
|
||||||
|
for (int i = 0; i < str.Length; i++)
|
||||||
|
{
|
||||||
|
char c = str[i];
|
||||||
|
|
||||||
|
if (instr)
|
||||||
|
{
|
||||||
|
if (c == '\\')
|
||||||
|
{
|
||||||
|
if (i + 1 >= str.Length)
|
||||||
|
break;
|
||||||
|
c = GetEscape(str[++i]);
|
||||||
|
}
|
||||||
|
else if (c == '"')
|
||||||
|
{
|
||||||
|
ret.Add(sb.ToString());
|
||||||
|
sb.Clear();
|
||||||
|
instr = false;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
sb.Append(c);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (IsWhiteSpace(c))
|
||||||
|
{
|
||||||
|
if (sb.Length > 0)
|
||||||
|
{
|
||||||
|
ret.Add(sb.ToString());
|
||||||
|
sb.Clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (c == '"')
|
||||||
|
{
|
||||||
|
if (sb.Length > 0)
|
||||||
|
{
|
||||||
|
ret.Add(sb.ToString());
|
||||||
|
sb.Clear();
|
||||||
|
}
|
||||||
|
instr = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sb.Append(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (sb.Length > 0)
|
||||||
|
ret.Add(sb.ToString());
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static char GetEscape(char c)
|
||||||
|
{
|
||||||
|
switch (c)
|
||||||
|
{
|
||||||
|
case '\\':
|
||||||
|
return '\\';
|
||||||
|
case '"':
|
||||||
|
return '"';
|
||||||
|
case 't':
|
||||||
|
return '\t';
|
||||||
|
default:
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool IsWhiteSpace(char c)
|
||||||
|
{
|
||||||
|
return c == ' ' || c == '\t' || c == '\n';
|
||||||
|
}
|
||||||
|
|
||||||
#region Player Management Commands
|
#region Player Management Commands
|
||||||
|
|
||||||
private static void Kick(CommandArgs args)
|
private static void Kick(CommandArgs args)
|
||||||
|
|
|
||||||
|
|
@ -249,33 +249,8 @@ namespace TShockAPI
|
||||||
}
|
}
|
||||||
else if (text.StartsWith("/"))
|
else if (text.StartsWith("/"))
|
||||||
{
|
{
|
||||||
string cmdStr = text.Remove(0, 1);
|
if (Commands.HandleCommand(TSPlayer.Server, text))
|
||||||
var args = Commands.ParseParameters(cmdStr);
|
e.Handled = true;
|
||||||
if (args.Count < 1)
|
|
||||||
return;
|
|
||||||
|
|
||||||
string scmd = args[0];
|
|
||||||
args.RemoveAt(0);
|
|
||||||
|
|
||||||
Command cmd = null;
|
|
||||||
for (int i = 0; i < Commands.ChatCommands.Count; i++)
|
|
||||||
{
|
|
||||||
if (Commands.ChatCommands[i].Name.Equals(scmd))
|
|
||||||
{
|
|
||||||
cmd = Commands.ChatCommands[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cmd == null)
|
|
||||||
{
|
|
||||||
TSPlayer.Server.SendMessage("That command does not exist, try /help");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Tools.SendLogs(string.Format("{0} executed: /{1}", TSPlayer.Server.Name, cmdStr), Color.Red);
|
|
||||||
cmd.Run(cmdStr, TSPlayer.Server, args);
|
|
||||||
}
|
|
||||||
e.Handled = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -685,42 +660,8 @@ namespace TShockAPI
|
||||||
|
|
||||||
if (text.StartsWith("/"))
|
if (text.StartsWith("/"))
|
||||||
{
|
{
|
||||||
text = text.Remove(0, 1);
|
if (Commands.HandleCommand(tsplr, text))
|
||||||
|
e.Handled = true;
|
||||||
var args = Commands.ParseParameters(text);
|
|
||||||
if (args.Count < 1)
|
|
||||||
return;
|
|
||||||
|
|
||||||
string scmd = args[0];
|
|
||||||
args.RemoveAt(0);
|
|
||||||
|
|
||||||
Command cmd = null;
|
|
||||||
for (int i = 0; i < Commands.ChatCommands.Count; i++)
|
|
||||||
{
|
|
||||||
if (Commands.ChatCommands[i].Name.Equals(scmd))
|
|
||||||
{
|
|
||||||
cmd = Commands.ChatCommands[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cmd == null)
|
|
||||||
{
|
|
||||||
tsplr.SendMessage("That command does not exist, try /help", Color.Red);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (!cmd.CanRun(tsplr))
|
|
||||||
{
|
|
||||||
Tools.SendLogs(string.Format("{0} tried to execute {1}", tsplr.Name, cmd.Name), Color.Red);
|
|
||||||
tsplr.SendMessage("You do not have access to that command.", Color.Red);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Tools.SendLogs(string.Format("{0} executed: /{1}", tsplr.Name, text), Color.Red);
|
|
||||||
cmd.Run(text, tsplr, args);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
e.Handled = true;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue