using System.Text; namespace Server; public static class CommandHandler { public delegate Response Handler(string[] args); public static Dictionary Handlers = new Dictionary(); static CommandHandler() { RegisterCommand("help", _ => $"Valid commands: {string.Join(", ", Handlers.Keys)}"); } public static void RegisterCommand(string name, Handler handler) { Handlers[name] = handler; } public static void RegisterCommandAliases(Handler handler, params string[] names) { foreach (string name in names) { Handlers.Add(name, handler); } } /// /// Modified by TheUbMunster /// public static Response GetResult(string input) { try { string[] args = input.Split(' '); if (args.Length == 0) return "No command entered, see help command for valid commands"; //this part is to allow single arguments that contain spaces (since the game seems to be able to handle usernames with spaces, we need to as well) List newArgs = new List(); newArgs.Add(args[0]); for (int i = 1; i < args.Length; i++) { if (args[i].Length == 0) continue; //empty string (>1 whitespace between arguments). else if (args[i][0] == '\"') { //concatenate args until a string ends with a quote StringBuilder sb = new StringBuilder(); i--; //fix off-by-one issue do { i++; sb.Append(args[i] + " "); //add space back removed by the string.Split(' ') if (i >= args.Length) { return "Unmatching quotes, make sure that whenever quotes are used, another quote is present to close it (no action was performed)."; } } while (args[i][^1] != '\"'); newArgs.Add(sb.ToString(1, sb.Length - 3)); //remove quotes and extra space at the end. } else { newArgs.Add(args[i]); } } args = newArgs.ToArray(); string commandName = args[0]; return Handlers.TryGetValue(commandName, out Handler? handler) ? handler(args[1..]) : $"Invalid command {args[0]}, see help command for valid commands"; } catch (Exception e) { return $"An error occured while trying to process your command: {e}"; } } public class Response { public string[] ReturnStrings = null!; private Response(){} public static implicit operator Response(string value) => new Response { ReturnStrings = value.Split('\n') }; public static implicit operator Response(string[] values) => new Response { ReturnStrings = values }; } }