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; } }
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) { target?.Send("Command failed."); Program.Logger.Error("Command failed: ", e); return(true); } }