Pulled the duplicated code for handling commands into helper method

This commit is contained in:
ricky 2011-06-16 14:03:06 +10:00
parent ad456ac7b6
commit 6ed2b5044d
2 changed files with 127 additions and 146 deletions

View file

@ -93,89 +93,7 @@ namespace TShockAPI
}
public static class Commands
{
public 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';
}
private static List<Command> ChatCommands = new List<Command>();
public static void InitCommands()
{
@ -235,6 +153,128 @@ namespace TShockAPI
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
private static void Kick(CommandArgs args)

View file

@ -249,33 +249,8 @@ namespace TShockAPI
}
else if (text.StartsWith("/"))
{
string cmdStr = text.Remove(0, 1);
var args = Commands.ParseParameters(cmdStr);
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;
if (Commands.HandleCommand(TSPlayer.Server, text))
e.Handled = true;
}
}
@ -685,42 +660,8 @@ namespace TShockAPI
if (text.StartsWith("/"))
{
text = text.Remove(0, 1);
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;
if (Commands.HandleCommand(tsplr, text))
e.Handled = true;
}
else
{