* Add the ability to type help <command> for more detailed help about a specific command if any is available
parent
66dc421be7
commit
a034b640da
|
@ -38,24 +38,108 @@ namespace OpenSim.Framework.Console
|
|||
|
||||
public class Commands
|
||||
{
|
||||
/// <summary>
|
||||
/// Encapsulates a command that can be invoked from the console
|
||||
/// </summary>
|
||||
private class CommandInfo
|
||||
{
|
||||
/// <value>
|
||||
/// The module from which this command comes
|
||||
/// </value>
|
||||
public string module;
|
||||
|
||||
/// <value>
|
||||
/// Very short BNF description
|
||||
/// </value>
|
||||
public string help_text;
|
||||
|
||||
/// <value>
|
||||
/// Longer one line help text
|
||||
/// </value>
|
||||
public string long_help;
|
||||
|
||||
/// <value>
|
||||
/// Full descriptive help for this command
|
||||
/// </value>
|
||||
public string descriptive_help;
|
||||
|
||||
/// <value>
|
||||
/// The method to invoke for this command
|
||||
/// </value>
|
||||
public CommandDelegate fn;
|
||||
}
|
||||
|
||||
/// <value>
|
||||
/// Commands organized by keyword in a tree
|
||||
/// </value>
|
||||
private Dictionary<string, Object> tree =
|
||||
new Dictionary<string, Object>();
|
||||
|
||||
public List<string> GetHelp()
|
||||
/// <summary>
|
||||
/// Get help for the given help string
|
||||
/// </summary>
|
||||
/// <param name="helpParts">Parsed parts of the help string. If empty then general help is returned.</param>
|
||||
/// <returns></returns>
|
||||
public List<string> GetHelp(string[] cmd)
|
||||
{
|
||||
List<string> help = new List<string>();
|
||||
List<string> helpParts = new List<string>(cmd);
|
||||
|
||||
// Remove initial help keyword
|
||||
helpParts.RemoveAt(0);
|
||||
|
||||
// General help
|
||||
if (helpParts.Count == 0)
|
||||
{
|
||||
help.AddRange(CollectHelp(tree));
|
||||
|
||||
help.Sort();
|
||||
}
|
||||
else
|
||||
{
|
||||
help.AddRange(CollectHelp(helpParts));
|
||||
}
|
||||
|
||||
return help;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// See if we can find the requested command in order to display longer help
|
||||
/// </summary>
|
||||
/// <param name="helpParts"></param>
|
||||
/// <returns></returns>
|
||||
private List<string> CollectHelp(List<string> helpParts)
|
||||
{
|
||||
string originalHelpRequest = string.Join(" ", helpParts.ToArray());
|
||||
List<string> help = new List<string>();
|
||||
|
||||
Dictionary<string, object> dict = tree;
|
||||
while (helpParts.Count > 0)
|
||||
{
|
||||
string helpPart = helpParts[0];
|
||||
|
||||
if (!dict.ContainsKey(helpPart))
|
||||
break;
|
||||
|
||||
//System.Console.WriteLine("Found {0}", helpParts[0]);
|
||||
|
||||
if (dict[helpPart] is Dictionary<string, Object>)
|
||||
dict = (Dictionary<string, object>)dict[helpPart];
|
||||
|
||||
helpParts.RemoveAt(0);
|
||||
}
|
||||
|
||||
// There was a command for the given help string
|
||||
if (dict.ContainsKey(String.Empty))
|
||||
{
|
||||
CommandInfo commandInfo = (CommandInfo)dict[String.Empty];
|
||||
help.Add(commandInfo.help_text);
|
||||
help.Add(commandInfo.long_help);
|
||||
help.Add(commandInfo.descriptive_help);
|
||||
}
|
||||
else
|
||||
{
|
||||
help.Add(string.Format("No help is available for {0}", originalHelpRequest));
|
||||
}
|
||||
|
||||
return help;
|
||||
}
|
||||
|
@ -80,11 +164,36 @@ namespace OpenSim.Framework.Console
|
|||
return result;
|
||||
}
|
||||
|
||||
public void AddCommand(string module, string command, string help, string longhelp, CommandDelegate fn)
|
||||
/// <summary>
|
||||
/// Add a command to those which can be invoked from the console.
|
||||
/// </summary>
|
||||
/// <param name="module"></param>
|
||||
/// <param name="command"></param>
|
||||
/// <param name="help"></param>
|
||||
/// <param name="longhelp"></param>
|
||||
/// <param name="fn"></param>
|
||||
public void AddCommand(
|
||||
string module, string command, string help, string longhelp, CommandDelegate fn)
|
||||
{
|
||||
AddCommand(module, command, help, longhelp, String.Empty, fn);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Add a command to those which can be invoked from the console.
|
||||
/// </summary>
|
||||
/// <param name="module"></param>
|
||||
/// <param name="command"></param>
|
||||
/// <param name="help"></param>
|
||||
/// <param name="longhelp"></param>
|
||||
/// <param name="descriptivehelp"></param>
|
||||
/// <param name="fn"></param>
|
||||
public void AddCommand(
|
||||
string module, string command, string help, string longhelp, string descriptivehelp, CommandDelegate fn)
|
||||
{
|
||||
string[] parts = Parser.Parse(command);
|
||||
|
||||
Dictionary<string, Object> current = tree;
|
||||
|
||||
foreach (string s in parts)
|
||||
{
|
||||
if (current.ContainsKey(s))
|
||||
|
@ -105,10 +214,12 @@ namespace OpenSim.Framework.Console
|
|||
|
||||
if (current.ContainsKey(String.Empty))
|
||||
return;
|
||||
|
||||
CommandInfo info = new CommandInfo();
|
||||
info.module = module;
|
||||
info.help_text = help;
|
||||
info.long_help = longhelp;
|
||||
info.descriptive_help = descriptivehelp;
|
||||
info.fn = fn;
|
||||
current[String.Empty] = info;
|
||||
}
|
||||
|
@ -285,7 +396,9 @@ namespace OpenSim.Framework.Console
|
|||
{
|
||||
DefaultPrompt = defaultPrompt;
|
||||
|
||||
Commands.AddCommand("console", "help", "help", "Get command list", Help);
|
||||
Commands.AddCommand(
|
||||
"console", "help", "help [<command>]",
|
||||
"Get general command list or more detailed help on a specific command", Help);
|
||||
}
|
||||
|
||||
private void AddToHistory(string text)
|
||||
|
@ -517,7 +630,7 @@ namespace OpenSim.Framework.Console
|
|||
|
||||
private void Help(string module, string[] cmd)
|
||||
{
|
||||
List<string> help = Commands.GetHelp();
|
||||
List<string> help = Commands.GetHelp(cmd);
|
||||
|
||||
foreach (string s in help)
|
||||
Output(s);
|
||||
|
|
|
@ -142,7 +142,8 @@ namespace OpenSim
|
|||
|
||||
m_console.Commands.AddCommand("region", "save oar",
|
||||
"save oar <oar name>",
|
||||
"Save a region's data to an OAR archive", SaveOar);
|
||||
"Save a region's data to an OAR archive",
|
||||
"More information on forthcoming options here soon", SaveOar);
|
||||
|
||||
m_console.Commands.AddCommand("region", "save inventory",
|
||||
"save inventory <first> <last> <path> <file>",
|
||||
|
|
|
@ -203,14 +203,14 @@ namespace OpenSim
|
|||
|
||||
foreach (string topic in topics)
|
||||
{
|
||||
m_console.Commands.AddCommand("plugin", "help "+topic,
|
||||
"help "+topic,
|
||||
"Get help on plugin command '"+topic+"'",
|
||||
m_console.Commands.AddCommand("plugin", "help " + topic,
|
||||
"help " + topic,
|
||||
"Get help on plugin command '" + topic + "'",
|
||||
HandleCommanderHelp);
|
||||
|
||||
m_console.Commands.AddCommand("plugin", topic,
|
||||
topic,
|
||||
"Execute subcommand for plugin '"+topic+"'",
|
||||
"Execute subcommand for plugin '" + topic + "'",
|
||||
null);
|
||||
|
||||
ICommander commander =
|
||||
|
@ -221,8 +221,8 @@ namespace OpenSim
|
|||
|
||||
foreach (string command in commander.Commands.Keys)
|
||||
{
|
||||
m_console.Commands.AddCommand(topic, topic+" "+command,
|
||||
topic+" "+commander.Commands[command].ShortHelp(),
|
||||
m_console.Commands.AddCommand(topic, topic + " " + command,
|
||||
topic + " " + commander.Commands[command].ShortHelp(),
|
||||
String.Empty, HandleCommanderCommand);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -68,7 +68,8 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver
|
|||
|
||||
public void ArchiveRegion(string savePath)
|
||||
{
|
||||
m_log.InfoFormat("[SCENE]: Writing archive for region {0} to {1}", m_scene.RegionInfo.RegionName, savePath);
|
||||
m_log.InfoFormat(
|
||||
"[ARCHIVER]: Writing archive for region {0} to {1}", m_scene.RegionInfo.RegionName, savePath);
|
||||
|
||||
new ArchiveWriteRequestPreparation(m_scene, savePath).ArchiveRegion();
|
||||
}
|
||||
|
@ -80,7 +81,8 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver
|
|||
|
||||
public void DearchiveRegion(string loadPath)
|
||||
{
|
||||
m_log.InfoFormat("[SCENE]: Loading archive to region {0} from {1}", m_scene.RegionInfo.RegionName, loadPath);
|
||||
m_log.InfoFormat(
|
||||
"[ARCHIVER]: Loading archive to region {0} from {1}", m_scene.RegionInfo.RegionName, loadPath);
|
||||
|
||||
new ArchiveReadRequest(m_scene, loadPath).DearchiveRegion();
|
||||
}
|
||||
|
|
|
@ -204,7 +204,9 @@ namespace OpenSim.Region.Environment.Modules.World.Permissions
|
|||
|
||||
m_bypassPermissions = val;
|
||||
|
||||
m_log.InfoFormat("[PERMISSIONS] Set permissions bypass to {0} for {1}", m_bypassPermissions, m_scene.RegionInfo.RegionName);
|
||||
m_log.InfoFormat(
|
||||
"[PERMISSIONS]: Set permissions bypass to {0} for {1}",
|
||||
m_bypassPermissions, m_scene.RegionInfo.RegionName);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue