public static bool Handle(CommandTarget target, string message, string commandHeader)
{
if (string.IsNullOrWhiteSpace(message) || !message.StartsWith(commandHeader))
return false;
try
{
var commandStr = message.Substring(commandHeader.Length);
if (string.IsNullOrWhiteSpace(commandStr))
return false;
var reader = new StringReader(commandStr);
var type = (ReadWord(reader) ?? "").ToLower();
Command command = null;
string format = null;
Func<string, bool> tryResolve = s =>
{
if (!Commands.TryGetValue(s, out command))
return false;
format = command.Format(target, type);
if (format == null)
return false;
return true;
};
// TODO: is there a better way to do this?
if (!target.IsRoom || !tryResolve(target.Room.CommandPrefix + type))
if (!target.IsRoom || !tryResolve(target.Room.CommandPrefix))
if (!tryResolve(type))
if (!tryResolve(""))
return true;
var parameters = new List<string>();
foreach (var p in format)
{
var param = "";
switch (p)
{
case '-':
param = ReadWord(reader);
break;
case ']':
param = ReadRemaining(reader);
break;
}
if (param == null)
break;
parameters.Add(param);
}
command.Handle(target, type, parameters.ToArray());
return true;
}
catch (Exception e)
{
if (target != null)
target.Send("Command failed.");
Program.Logger.Error("Command failed: ", e);
return true;
}
}