diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index 3c37e90c40..a903fd8c32 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs @@ -58,6 +58,10 @@ namespace OpenSim private string m_timedScript = "disabled"; private Timer m_scriptTimer; + /// <summary> + /// List of Console Plugin Commands + /// </summary> + private static List<ConsolePluginCommand> m_PluginCommandInfos = new List<ConsolePluginCommand>(); public OpenSim(IConfigSource configSource) : base(configSource) { @@ -226,7 +230,6 @@ namespace OpenSim break; case "help": - RunPluginCommandHelp(CombineParams(cmdparams, 0),m_console); m_console.Notice("alert - send alert to a designated user or all users."); m_console.Notice(" alert [First] [Last] [Message] - send an alert to a user. Case sensitive."); m_console.Notice(" alert general [Message] - send an alert to all users."); @@ -259,6 +262,7 @@ namespace OpenSim m_console.Notice("config get section field - get a config value"); m_console.Notice("config save - save OpenSim.ini"); m_console.Notice("terrain help - show help for terrain commands."); + ShowPluginCommandsHelp(CombineParams(cmdparams, 0), m_console); break; case "threads": @@ -673,97 +677,148 @@ namespace OpenSim return result; } + /// <summary> + /// Runs the best matching plugin command + /// + /// returns true if a match was found, false otherwise. + /// </summary> + public bool RunPluginCommands(string cmdWithParams) + { + ConsolePluginCommand bestMatch = null; + int bestLength = 0; + foreach (ConsolePluginCommand cmdinfo in m_PluginCommandInfos) + { + int matchLen = cmdinfo.matchLength(cmdWithParams); + if (matchLen > bestLength) + { + bestMatch = cmdinfo; + bestLength = matchLen; + } + } + if (bestMatch == null) return false; + bestMatch.Run(cmdWithParams.Substring(bestLength)); + return true; + } + + /// <summary> + /// Show the matching plugins command help + /// </summary> + public void ShowPluginCommandsHelp(string cmdWithParams, ConsoleBase console) + { + foreach (ConsolePluginCommand cmdinfo in m_PluginCommandInfos) + { + if (cmdinfo.IsHelpfull(cmdWithParams)) + { + cmdinfo.ShowHelp(console); + } + } + } + + /// <summary> + /// Registers a new console plugin command + /// </summary> + public static void RegisterCmd(string cmd, ConsoleCommand deligate, string help) + { + RegisterConsolePluginCommand(new ConsolePluginCommand(cmd, deligate, help)); + } + /// <summary> + /// Registers a new console plugin command + /// </summary> + public static void RegisterConsolePluginCommand(ConsolePluginCommand pluginCommand) + { + m_PluginCommandInfos.Add(pluginCommand); + } #endregion - static private List<ConsolePluginCommand> m_PluginCommandInfos = new List<ConsolePluginCommand>(); + } + /// <summary> + /// Holder object for a new console plugin command + /// + /// Override the methods like Run and IsHelpfull (but the defaults might work ok.) + /// </summary> + public class ConsolePluginCommand + { + /// <summary> + /// command delegate used in running + /// </summary> + private ConsoleCommand m_commandDelegate; + /// <summary> + /// help text displayed + /// </summary> + private string m_helpText; + /// <summary> + /// command in the form of "showme new commands" + /// </summary> + private string m_cmdText; - public bool RunPluginCommands(string cmd) + /// <summary> + /// Construct a new ConsolePluginCommand + /// + /// for use with OpenSim.RegisterConsolePluginCommand(myCmd); + /// + /// </summary> + /// <param name="command">in the form of "showme new commands"</param> + /// <param name="dlg">ommand delegate used in running</param> + /// <param name="help">the text displayed in "help showme new commands"</param> + public ConsolePluginCommand(string command, ConsoleCommand dlg, string help) { - ConsolePluginCommand bestMatch = null; - int bestLength = 0; - foreach (ConsolePluginCommand cmdinfo in m_PluginCommandInfos) - { - int matchLen = cmdinfo.matchLength(cmd); - if (matchLen > bestLength) - { - bestMatch = cmdinfo; - bestLength = matchLen; - } - } - if (bestMatch == null) - { - return false; - } - bestMatch.Run(cmd); - return true; - } - public bool RunPluginCommandHelp(string cmd, ConsoleBase console) - { - ConsolePluginCommand bestMatch = null; - int bestLength = 0; - foreach (ConsolePluginCommand cmdinfo in m_PluginCommandInfos) - { - int matchLen = cmdinfo.matchLength(cmd); - if (matchLen > bestLength) - { - bestMatch = cmdinfo; - bestLength = matchLen; - } - } - if (bestMatch == null) - { - return false; - } - bestMatch.ShowHelp(console); - return true; - } - public static void RegisterCmd(string cmd, ConsoleCommand deligate, string hlp) - { - m_PluginCommandInfos.Add(new ConsolePluginCommand(cmd, deligate, hlp)); + m_cmdText = command; + m_commandDelegate = dlg; + m_helpText = help; } - public class ConsolePluginCommand + /// <summary> + /// Returns the match length this command has upon the 'cmdWithParams' + /// At least a higher number for "show plugin status" then "show" would return + /// This is used to have multi length command verbs + /// + /// @see OopenSim.RunPluginCommands + /// It will only run the one with the highest number + /// + /// </summary> + public int matchLength(string cmdWithParams) { - private ConsoleCommand m_commandDelegate; - private string m_helpText; - private string m_cmdText; - - public int matchLength(string targetText) + // QUESTION: have a case insensitive flag? + cmdWithParams = cmdWithParams.ToLower().Trim(); + string matchText = m_cmdText.ToLower().Trim(); + if (cmdWithParams.StartsWith(matchText)) { - // QUESTION: have a case insensitive flag? - targetText = targetText.ToLower(); - string matchText = m_cmdText.ToLower(); - if (targetText.StartsWith(matchText)) - { - // TODO return cmdText.Length; ? - return matchText.Length; - } - return 0; + // QUESTION Instead return cmdText.Length; ? + return matchText.Length; } - public ConsolePluginCommand(string cmd, ConsoleCommand del, string help) + return 0; + } + + /// <summary> + /// Run the delegate the incomming string may contain the command, if so, it is chopped off + /// </summary> + public void Run(string cmdParams) + { + string targetText = m_cmdText.ToLower(); + string matchText = cmdParams.ToLower(); + if (targetText.StartsWith(matchText)) { - m_cmdText = cmd; - m_commandDelegate = del; - m_helpText = help; + cmdParams = cmdParams.Substring(matchText.Length); } + m_commandDelegate(cmdParams.Split(new char[] { ' ' })); + } - public void Run(string incomming) - { - string targetText = m_cmdText.ToLower(); - string matchText = incomming.ToLower(); + /// <summary> + /// Shows help information on the console's Notice method + /// </summary> + public void ShowHelp(ConsoleBase console) + { + console.Notice(m_cmdText + " - " + m_helpText); + } - if (targetText.StartsWith(matchText)) - { - incomming = incomming.Substring(matchText.Length); - } - m_commandDelegate(incomming.Split(new char[] {' '})); - } - - public void ShowHelp(ConsoleBase console) - { - console.Notice(m_cmdText + ": " + m_helpText); - // throw new Exception("The method or operation is not implemented."); - } + /// <summary> + /// return true if the ShowHelp(..) method might be helpfull + /// </summary> + public bool IsHelpfull(string cmdWithParams) + { + cmdWithParams = cmdWithParams.ToLower(); + return cmdWithParams.Contains(m_cmdText.ToLower()) || m_helpText.ToLower().Contains(cmdWithParams); } } + }