public static void WriteHelpInformation( CommandResult commandResult, string name, string parameters, string description, OptionSet options ) { var displayMode = DisplayMode.DontWrap | DisplayMode.DontType; commandResult.WriteLine(displayMode, description); commandResult.WriteLine(); commandResult.WriteLine(displayMode, "Usage: {0} {1}", name, parameters); commandResult.WriteLine(); commandResult.WriteLine(displayMode, "Options:"); commandResult.WriteLine(); var stringWriter = new StringWriter(); options.WriteOptionDescriptions(stringWriter); commandResult.WriteLine(displayMode, stringWriter.ToString()); }
private void FinalParsing(CommandResult commandResult) { foreach (var displayItem in commandResult.Display) { if (_currentUser != null && !_currentUser.Sound) displayItem.DisplayMode |= DisplayMode.Mute; if ((displayItem.DisplayMode & DisplayMode.DontWrap) == 0) displayItem.Text = displayItem.Text.WrapOnSpace(AppSettings.MaxLineLength); if (ParseAsHtml) { displayItem.Text = HttpUtility.HtmlEncode(displayItem.Text); if ((displayItem.DisplayMode & DisplayMode.Parse) != 0) displayItem.Text = BBCodeUtility.ConvertTagsToHtml(displayItem.Text); displayItem.Text = displayItem.Text .Replace("\n", "<br />") .Replace("\r", "") .Replace(" ", " "); string cssClass = null; if ((displayItem.DisplayMode & DisplayMode.Inverted) != 0) { cssClass += "inverted "; displayItem.Text = string.Format(" {0} ", displayItem.Text); } if ((displayItem.DisplayMode & DisplayMode.Dim) != 0) cssClass += "dim "; if ((displayItem.DisplayMode & DisplayMode.Italics) != 0) cssClass += "italics "; if ((displayItem.DisplayMode & DisplayMode.Bold) != 0) cssClass += "bold "; displayItem.Text = string.Format("<span class='{0}'>{1}</span>", cssClass, displayItem.Text); } } }
/// <summary> /// Display help information for all available commands, or invoke the help argument for a specifically supplied command. /// </summary> /// <param name="commands">The list of available commands.</param> /// <param name="args">Any arguments passed in.</param> /// <returns>A CommandResult option containing properties relevant to how data should be processed by the UI.</returns> private CommandResult DisplayHelp(IEnumerable<ICommand> commands, string[] args, CommandResult commandResult) { var options = new OptionSet(); options.Add( "?|help", "Show help information.", x => { HelpUtility.WriteHelpInformation( commandResult, "HELP", "[Option]", "Displays help information.", options ); } ); try { if (args != null) { var parsedArgs = options.Parse(args); if (parsedArgs.Count == args.Length) { var commandName = parsedArgs.First(); var command = commands.SingleOrDefault(x => x.Name.Is(commandName)); if (command != null) command.Invoke(new string[] { "-help" }); else commandResult.WriteLine("'{0}' is not a recognized command.", commandName); } } else { commandResult.WriteLine("The following commands are available:"); commandResult.WriteLine(); foreach (ICommand command in commands.OrderBy(x => x.Name)) if (command.ShowHelp) commandResult.WriteLine(DisplayMode.DontType, "{0}{1}", command.Name.PadRight(15), command.Description); commandResult.WriteLine(); commandResult.WriteLine("Type \"COMMAND -?\" for details on individual commands."); if (_currentUser != null) { commandResult.WriteLine(); commandResult.WriteLine(DisplayMode.Dim | DisplayMode.DontType, new string('-', AppSettings.DividerLength)); commandResult.WriteLine(); var aliases = _aliasRepository.GetAliases(_currentUser.Username); if (aliases.Count() > 0) { commandResult.WriteLine("You have the following aliases defined:"); commandResult.WriteLine(); foreach (var alias in aliases) commandResult.WriteLine(DisplayMode.DontType, "{0}'{1}'", alias.Shortcut.ToUpper().PadRight(15, ' '), alias.Command); } else commandResult.WriteLine("You have no aliases defined."); } } } catch (OptionException ex) { commandResult.WriteLine(ex.Message); } return commandResult; }
private CommandResult BanMessage(CommandResult commandResult) { commandResult.Display.Clear(); commandResult.WriteLine("You were banned by {0}.", _currentUser.BanInfo.Creator); commandResult.WriteLine(); commandResult.WriteLine("Reason: {0}", _currentUser.BanInfo.Reason); commandResult.WriteLine(); commandResult.WriteLine("Expires {0}.", _currentUser.BanInfo.EndDate.TimeUntil()); return commandResult; }
/// <summary> /// Accepts a command string and handles the parsing and execution of the command and the included arguments. /// </summary> /// <param name="commandString">The command string. Usually a string passed in from a command line interface by the user.</param> /// <returns>A CommandResult option containing properties relevant to how data should be processed by the UI.</returns> public CommandResult ExecuteCommand(string commandString) { if (commandString == null) commandString = string.Empty; var hasSpace = commandString.Contains(' '); var spaceIndex = 0; if (hasSpace) spaceIndex = commandString.IndexOf(' '); // Parse command string to find the command name. string commandName = hasSpace ? commandString.Remove(spaceIndex) : commandString; if (_currentUser != null) { _currentUser.LastLogin = DateTime.UtcNow; _userRepository.UpdateUser(_currentUser); // Check for alias. Replace command name with alias. if ((_commandContext.Status & ContextStatus.Forced) == 0) { var alias = _aliasRepository.GetAlias(_currentUser.Username, commandName); if (alias != null) { commandString = hasSpace ? alias.Command + commandString.Remove(0, spaceIndex) : alias.Command; hasSpace = commandString.Contains(' '); spaceIndex = 0; if (hasSpace) spaceIndex = commandString.IndexOf(' '); commandName = hasSpace ? commandString.Remove(spaceIndex) : commandString; } } } // Parse command string and divide up arguments into a string array. var args = hasSpace ? commandString.Remove(0, spaceIndex) .Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries) : null; // Obtain all roles the current user is a part of. var availableRoles = _currentUser != null ? _currentUser.Roles.Select(x => x.Name).ToArray() : new string[] { "Visitor" }; // Create command result. var commandResult = new CommandResult { Command = commandName.ToUpper(), CurrentUser = _currentUser, CommandContext = this._commandContext }; // Obtain all commands for the roles the user is a part of. var commands = _commands .Where(x => x.Roles.Any(y => availableRoles.Any(z => z.Is(y)))) .ToList(); foreach (var cmd in commands) { cmd.CommandResult = commandResult; cmd.AvailableCommands = commands; } if (_currentUser != null && _currentUser.BanInfo != null) if (DateTime.UtcNow < _currentUser.BanInfo.EndDate) return BanMessage(commandResult); else { _userRepository.UnbanUser(_currentUser.Username); _userRepository.UpdateUser(_currentUser); } // Obtain the command the user intends to execute from the list of available commands. var command = commands.SingleOrDefault(x => x.Name.Is(commandName)); if (commandName.Is("INITIALIZE")) this._commandContext.Deactivate(); // Perform different behaviors based on the current command context. switch (this._commandContext.Status) { // Perform normal command execution. case ContextStatus.Disabled: if (command != null) { command.CommandResult.Command = command.Name; command.Invoke(args); } break; // Perform normal command execution. // If command does not exist, attempt to use command context instead. case ContextStatus.Passive: if (command != null) { command.CommandResult.Command = command.Name; command.Invoke(args); } else if (!commandName.Is("HELP")) { command = commands.SingleOrDefault(x => x.Name.Is(this._commandContext.Command)); if (command != null) { args = commandString.Contains(' ') ? commandString.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries) : new string[] { commandString }; var newArgs = new List<string>(); if (this._commandContext.Args != null) newArgs.AddRange(this._commandContext.Args); newArgs.AddRange(args); command.CommandResult.Command = command.Name; command.Invoke(newArgs.ToArray()); } } break; // Perform command execution using command context. // Reset command context if "CANCEL" is supplied. case ContextStatus.Forced: if (!commandName.Is("CANCEL")) { command = commands.SingleOrDefault(x => x.Name.Is(this._commandContext.Command)); if (command != null) { command.CommandResult.Command = command.Name; if (this._commandContext.Prompt) { var newStrings = new List<string>(); if (this._commandContext.PromptData != null) newStrings.AddRange(this._commandContext.PromptData); newStrings.Add(commandString); this._commandContext.PromptData = newStrings.ToArray(); command.Invoke(this._commandContext.Args); } else { args = commandString.Contains(' ') ? commandString.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries) : new string[] { commandString }; var newArgs = new List<string>(); if (this._commandContext.Args != null) newArgs.AddRange(this._commandContext.Args); newArgs.AddRange(args); args = newArgs.ToArray(); command.Invoke(args); } } } else { commandResult.CommandContext.Restore(); commandResult.WriteLine("Action canceled."); } break; } // If command does not exist, check if the command was "HELP". // If so, call the ShowHelp method to show help information for all available commands. if (command == null) { if (commandName.Is("HELP")) commandResult = DisplayHelp(commands, args, commandResult); else if (!commandName.Is("CANCEL")) if (commandName.IsNullOrWhiteSpace()) commandResult.WriteLine("You must supply a command."); else commandResult.WriteLine("'{0}' is not a recognized command or is not available in the current context.", commandName); } _currentUser = commandResult.CurrentUser; if (_currentUser != null && _currentUser.BanInfo != null) if (DateTime.UtcNow < _currentUser.BanInfo.EndDate) return BanMessage(commandResult); else { _userRepository.UnbanUser(_currentUser.Username); _userRepository.UpdateUser(_currentUser); } // Temporarily notify of messages on each command execution. if (_currentUser != null) { var unreadMessageCount = _messageRepository.UnreadMessages(_currentUser.Username); if (unreadMessageCount > 0) { commandResult.WriteLine(); commandResult.WriteLine("You have {0} unread message(s).", unreadMessageCount); } } commandResult.TerminalTitle = string.Format("Terminal - {0}", _currentUser != null ? _currentUser.Username : "******"); FinalParsing(commandResult); return commandResult; }
/// <summary> /// Examine command result and perform relevant actions. /// </summary> /// <param name="commandResult">The command result returned by the terminal API.</param> private static void InterpretResult(CommandResult commandResult) { // Set the terminal API command context to the one returned in the result. _commandContext = commandResult.CommandContext; // If the result calls for the screen to be cleared, clear it. if (commandResult.ClearScreen) Console.Clear(); // Set the terminal API current user to the one returned in the result and display the username in the console title bar. _username = commandResult.CurrentUser != null ? commandResult.CurrentUser.Username : null; Console.Title = commandResult.TerminalTitle; // Add a blank line to the console before displaying results. if (commandResult.Display.Count > 0) Console.WriteLine(); // Iterate over the display collection and perform relevant display actions based on the type of the object. foreach (var displayInstruction in commandResult.Display) Display(displayInstruction); if (!commandResult.EditText.IsNullOrEmpty()) SendKeys.SendWait(commandResult.EditText.Replace("\n", "--")); // If the terminal is prompting for a password then set the global PasswordField bool to true. _passwordField = commandResult.PasswordField; // If the terminal is asking to be closed then kill the runtime loop for the console. _appRunning = !commandResult.Exit; }