private static void AppendCommandInfo(StringBuilder sb, BaseConsoleCommand consoleCommand, string prefix) { if (consoleCommand.Alias != null) { sb.Append(prefix) .Append(consoleCommand.Alias) .AppendLine(); } sb.Append(prefix) .Append(consoleCommand.Name); sb.AppendLine(); sb.Append("* Description: ") .AppendLine(consoleCommand.Description); sb.Append("* Type: ") .Append(GetTypeString(consoleCommand.Kind)) .AppendLine() .AppendLine("* Usage: "); var isServer = IsServer; if (consoleCommand.Alias != null) { PrintUsageExample(consoleCommand.Alias); } PrintUsageExample(consoleCommand.Name); sb.AppendLine(); void PrintUsageExample(string title) { foreach (var variant in consoleCommand.Variants) { sb.Append(" "); if (isServer || (consoleCommand.Kind & ConsoleCommandKinds.ServerEveryone) != 0 || (consoleCommand.Kind & ConsoleCommandKinds.ServerOperator) != 0) { sb.Append(ConsoleCommandsSystem.ServerConsoleCommandPrefixOnClient); } sb.Append(title); var parameters = variant.Parameters; foreach (var commandParameter in parameters) { sb.Append(' ') .Append(commandParameter.Name); } sb.AppendLine(); } } }
static IEnumerable <string> Execute(BaseConsoleCommand command) { if (!commandLibraries.ContainsKey(command.LibraryClassName) || !commandLibraries[command.LibraryClassName].ContainsKey(command.Name)) { throw new Exception(Constants.LibraryClassDoesntExistMessage); } var parameterInfo = commandLibraries[command.LibraryClassName][command.Name]; if (parameterInfo.Where(_ => _.IsOptional == false).Count() > command.Arguments.Count()) { throw new Exception(Constants.InvalidArgumentCountMessage); } object result; try { result = Assembly.GetExecutingAssembly() .GetType($"{Constants.CommandNamespace}.{command.LibraryClassName}") .InvokeMember( command.Name, BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.Public, null, null, command.Arguments .Take(parameterInfo.Count()) .ZipAll(parameterInfo, (a, b) => Convert.ChangeType(a == default(string) ? b.DefaultValue : a, b.ParameterType)).ToArray()); } catch (TargetInvocationException ex) { throw ex.InnerException; } if (result == null) { yield return(null); } else if (result is IEnumerable <string> ) { foreach (var str in result.As <IEnumerable <string> >()) { yield return(str); } } else { yield return(result.ToString()); } }