* Make existing module commanders register as help topics

* Typing help will now give a list of these topics at the top (as well as the rest of the current help stuff)
* Typing help <topic> will give information about commands specific to that topic
0.6.3-post-fixes
Justin Clarke Casey 2009-02-05 21:35:59 +00:00
parent 9a666bda02
commit 732cd838b1
10 changed files with 132 additions and 69 deletions

View File

@ -105,6 +105,16 @@ namespace OpenSim.Framework.Servers
/// </summary>
public virtual void ShutdownSpecific() {}
/// <summary>
/// Provides a list of help topics that are available. Overriding classes should append their topics to the
/// information returned when the base method is called.
/// </summary>
///
/// <returns>
/// A list of strings that represent different help topics on which more information is available
/// </returns>
protected virtual List<string> GetHelpTopics() { return new List<string>(); }
/// <summary>
/// Print statistics to the logfile, if they are active
/// </summary>
@ -310,11 +320,20 @@ namespace OpenSim.Framework.Servers
/// <param name="helpArgs"></param>
protected virtual void ShowHelp(string[] helpArgs)
{
Notice("");
if (helpArgs.Length == 0)
{
List<string> helpTopics = GetHelpTopics();
if (helpTopics.Count > 0)
{
Notice(
"As well as the help information below, you can also type help <topic> to get more information on the following areas:");
Notice(string.Format(" {0}", string.Join(", ", helpTopics.ToArray())));
Notice("");
// TODO: not yet implemented
//Notice("help [command] - display general help or specific command help. Try help help for more info.");
}
Notice("quit - equivalent to shutdown.");
Notice("set log level [level] - change the console logging level only. For example, off or debug.");
@ -326,7 +345,8 @@ namespace OpenSim.Framework.Servers
Notice("show threads - list tracked threads");
Notice("show uptime - show server startup time and uptime.");
Notice("show version - show server version.");
Notice("shutdown - shutdown the server.\n");
Notice("shutdown - shutdown the server.");
Notice("");
return;
}

View File

@ -496,6 +496,7 @@ namespace OpenSim
case "reset":
Reset(cmdparams);
break;
case "predecode-j2k":
if (cmdparams.Length > 0)
{
@ -661,6 +662,8 @@ namespace OpenSim
{
base.ShowHelp(helpArgs);
if (helpArgs.Length == 0)
{
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.");
@ -694,12 +697,10 @@ namespace OpenSim
m_console.Notice("config set section field value - set a config value");
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.");
m_console.Notice("login-enable - Allows login at sim level");
m_console.Notice("login-disable - Disable login at sim level");
m_console.Notice("login-status - Show the actual login status");
m_console.Notice("predecode-j2k - Precache assets,decode j2k layerdata, First parameter is threads to use");
ShowPluginCommandsHelp(CombineParams(helpArgs, 0), m_console);
if (ConfigurationSettings.Standalone)
@ -709,6 +710,15 @@ namespace OpenSim
m_console.Notice("reset user password - reset a user's password.");
}
}
else
{
ICommander moduleCommander = SceneManager.CurrentOrFirstScene.GetCommander(helpArgs[0]);
if (moduleCommander != null)
{
m_console.Notice(moduleCommander.Help);
}
}
}
// see BaseOpenSimServer
public override void Show(string[] showParams)

View File

@ -159,6 +159,14 @@ namespace OpenSim
m_plugins = loader.Plugins;
}
protected override List<string> GetHelpTopics()
{
List<string> topics = base.GetHelpTopics();
topics.AddRange(SceneManager.CurrentOrFirstScene.GetCommanders().Keys);
return topics;
}
/// <summary>
/// Performs startup specific to this region server, including initialization of the scene
/// such as loading configuration from disk.

View File

@ -29,11 +29,16 @@ namespace OpenSim.Region.Environment.Interfaces
{
public interface ICommander
{
/// <summary>
/// <value>
/// The name of this commander
/// </summary>
/// </value>
string Name { get; }
/// <value>
/// Provide general help information about this commander.
/// </value>
string Help { get; }
void ProcessConsoleCommand(string function, string[] args);
void RegisterCommand(string commandName, ICommand command);
void Run(string function, object[] args);

View File

@ -53,6 +53,23 @@ namespace OpenSim.Region.Environment.Modules.Framework.InterfaceCommander
}
private string m_name;
public string Help
{
get
{
StringBuilder sb = new StringBuilder();
sb.AppendLine("===" + m_name + "===");
foreach (ICommand com in m_commands.Values)
{
sb.AppendLine("* " + com.Name + " - " + com.Help);
}
return sb.ToString();
}
}
/// <summary>
/// Constructor
/// </summary>
@ -60,7 +77,10 @@ namespace OpenSim.Region.Environment.Modules.Framework.InterfaceCommander
public Commander(string name)
{
m_name = name;
m_generatedApiClassName = m_name;
m_generatedApiClassName = m_name[0].ToString().ToUpper();
if (m_name.Length > 1)
m_generatedApiClassName += m_name.Substring(1);
}
/// <value>
@ -145,22 +165,14 @@ namespace OpenSim.Region.Environment.Modules.Framework.InterfaceCommander
{
if (function != "help")
Console.WriteLine("ERROR: Invalid command - No such command exists");
ShowConsoleHelp();
Console.Write(Help);
}
}
}
#endregion
private void ShowConsoleHelp()
{
Console.WriteLine("===" + m_name + "===");
foreach (ICommand com in m_commands.Values)
{
Console.WriteLine("* " + com.Name + " - " + com.Help);
}
}
private string EscapeRuntimeAPICommand(string command)
{
command = command.Replace('-', '_');

View File

@ -35,7 +35,7 @@ namespace OpenSim.Region.Environment.Modules.Framework.InterfaceCommander
{
public class CommanderTestModule : IRegionModule, ICommandableModule
{
private readonly Commander m_commander = new Commander("CommanderTest");
private readonly Commander m_commander = new Commander("commandertest");
private Scene m_scene;
#region ICommandableModule Members

View File

@ -46,7 +46,7 @@ namespace OpenSim.Region.Environment.Modules.World.Permissions
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
protected Scene m_scene;
private readonly Commander m_commander = new Commander("Permissions");
private readonly Commander m_commander = new Commander("permissions");
#region Constants
// These are here for testing. They will be taken out

View File

@ -38,7 +38,7 @@ namespace OpenSim.Region.Environment.Modules.World.Serialiser
{
public class SerialiserModule : IRegionModule, IRegionSerialiserModule
{
private Commander m_commander = new Commander("Export");
private Commander m_commander = new Commander("export");
private List<Scene> m_regions = new List<Scene>();
private string m_savedir = "exports" + "/";
private List<IFileSerialiser> m_serialisers = new List<IFileSerialiser>();

View File

@ -68,7 +68,7 @@ namespace OpenSim.Region.Environment.Modules.World.Terrain
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private readonly Commander m_commander = new Commander("Terrain");
private readonly Commander m_commander = new Commander("terrain");
private readonly Dictionary<StandardTerrainEffects, ITerrainFloodEffect> m_floodeffects =
new Dictionary<StandardTerrainEffects, ITerrainFloodEffect>();

View File

@ -286,12 +286,20 @@ namespace OpenSim.Region.Environment.Scenes
}
}
/// <summary>
/// Get a module commander
/// </summary>
/// <param name="name"></param>
/// <returns>The module commander, null if no module commander with that name was found</returns>
public ICommander GetCommander(string name)
{
lock (m_moduleCommanders)
{
if (m_moduleCommanders.ContainsKey(name))
return m_moduleCommanders[name];
}
return null;
}
public Dictionary<string, ICommander> GetCommanders()