@@ -1,5 +1,4 @@ | |||
using System; | |||
using System.Collections.Generic; | |||
using System.Collections.Generic; | |||
namespace Discord.Commands | |||
{ | |||
@@ -11,15 +10,15 @@ namespace Discord.Commands | |||
private readonly List<Command> _commands; | |||
private readonly Dictionary<string, CommandMap> _items; | |||
private bool _isHidden; | |||
private bool _isVisible, _hasNonAliases, _hasSubGroups; | |||
public string Name => _name; | |||
public string FullName => _fullName; | |||
public bool IsHidden => _isHidden; | |||
public bool IsVisible => _isVisible; | |||
public bool HasNonAliases => _hasNonAliases; | |||
public bool HasSubGroups => _hasSubGroups; | |||
public IEnumerable<Command> Commands => _commands; | |||
public IEnumerable<CommandMap> SubGroups => _items.Values; | |||
/*public IEnumerable<Command> SubCommands => _items.Select(x => x.Value._command).Where(x => x != null); | |||
public IEnumerable<CommandMap> SubGroups => _items.Select(x => x.Value).Where(x => x._items.Count > 0);*/ | |||
public CommandMap(CommandMap parent, string name, string fullName) | |||
{ | |||
@@ -28,7 +27,9 @@ namespace Discord.Commands | |||
_fullName = fullName; | |||
_items = new Dictionary<string, CommandMap>(); | |||
_commands = new List<Command>(); | |||
_isHidden = true; | |||
_isVisible = false; | |||
_hasNonAliases = false; | |||
_hasSubGroups = false; | |||
} | |||
public CommandMap GetItem(string text) | |||
@@ -81,29 +82,34 @@ namespace Discord.Commands | |||
return null; | |||
} | |||
public void AddCommand(string text, Command command) | |||
public void AddCommand(string text, Command command, bool isAlias) | |||
{ | |||
AddCommand(0, text.Split(' '), command); | |||
AddCommand(0, text.Split(' '), command, isAlias); | |||
} | |||
private void AddCommand(int index, string[] parts, Command command) | |||
private void AddCommand(int index, string[] parts, Command command, bool isAlias) | |||
{ | |||
if (!command.IsHidden && _isHidden) | |||
_isHidden = false; | |||
if (!command.IsHidden) | |||
_isVisible = true; | |||
if (index != parts.Length) | |||
{ | |||
CommandMap nextGroup; | |||
string name = parts[index].ToLowerInvariant(); | |||
string fullName = string.Join(" ", parts, 0, index + 1); | |||
if (!_items.TryGetValue(name, out nextGroup)) | |||
if (!_items.TryGetValue(name, out nextGroup)) | |||
{ | |||
nextGroup = new CommandMap(this, name, fullName); | |||
_items.Add(name, nextGroup); | |||
_hasSubGroups = true; | |||
} | |||
nextGroup.AddCommand(index + 1, parts, command); | |||
} | |||
nextGroup.AddCommand(index + 1, parts, command, isAlias); | |||
} | |||
else | |||
{ | |||
_commands.Add(command); | |||
if (!isAlias) | |||
_hasNonAliases = true; | |||
} | |||
} | |||
public bool CanRun(User user, Channel channel, out string error) | |||
@@ -60,8 +60,7 @@ namespace Discord.Commands | |||
else | |||
await client.SendMessage(replyChannel, "Unable to display help: Unknown command."); | |||
} | |||
else //Show general help | |||
else //Show general help | |||
await ShowGeneralHelp(e.User, e.Channel, replyChannel); | |||
})); | |||
} | |||
@@ -143,16 +142,6 @@ namespace Discord.Commands | |||
public Task ShowGeneralHelp(User user, Channel channel, Channel replyChannel = null) | |||
{ | |||
StringBuilder output = new StringBuilder(); | |||
/*output.AppendLine("These are the commands you can use:"); | |||
output.Append(string.Join(", ", _map.SubCommands | |||
.Where(x => x.CanRun(user, channel) && !x.IsHidden) | |||
.Select(x => '`' + x.Text + '`' + | |||
(x.Aliases.Count() > 0 ? ", `" + string.Join("`, `", x.Aliases) + '`' : "")))); | |||
output.AppendLine("\nThese are the groups you can access:"); | |||
output.Append(string.Join(", ", _map.SubGroups | |||
.Where(x => /*x.CanRun(user, channel)*//* && !x.IsHidden) | |||
.Select(x => '`' + x.Text + '`')));*/ | |||
bool isFirstCategory = true; | |||
foreach (var category in _categories) | |||
{ | |||
@@ -160,9 +149,9 @@ namespace Discord.Commands | |||
foreach (var group in category.Value.SubGroups) | |||
{ | |||
string error; | |||
if (!group.IsHidden && group.CanRun(user, channel, out error)) | |||
if (group.IsVisible && (group.HasSubGroups || group.HasNonAliases) && group.CanRun(user, channel, out error)) | |||
{ | |||
if (isFirstItem) | |||
if (isFirstItem) | |||
{ | |||
isFirstItem = false; | |||
//This is called for the first item in each category. If we never get here, we dont bother writing the header for a category type (since it's empty) | |||
@@ -184,7 +173,7 @@ namespace Discord.Commands | |||
output.Append(", "); | |||
output.Append('`'); | |||
output.Append(group.Name); | |||
if (group.SubGroups.Any()) | |||
if (group.HasSubGroups) | |||
output.Append("*"); | |||
output.Append('`'); | |||
} | |||
@@ -244,7 +233,7 @@ namespace Discord.Commands | |||
} | |||
bool isFirstSubCmd = true; | |||
foreach (var subCmd in map.SubGroups.Where(x => x.CanRun(user, channel, out error) && !x.IsHidden)) | |||
foreach (var subCmd in map.SubGroups.Where(x => x.CanRun(user, channel, out error) && !x.IsVisible)) | |||
{ | |||
if (isFirstSubCmd) | |||
{ | |||
@@ -324,14 +313,14 @@ namespace Discord.Commands | |||
} | |||
//Add main command | |||
category.AddCommand(command.Text, command); | |||
_map.AddCommand(command.Text, command); | |||
category.AddCommand(command.Text, command, false); | |||
_map.AddCommand(command.Text, command, false); | |||
//Add aliases | |||
foreach (var alias in command.Aliases) | |||
{ | |||
category.AddCommand(alias, command); | |||
_map.AddCommand(alias, command); | |||
category.AddCommand(alias, command, true); | |||
_map.AddCommand(alias, command, true); | |||
} | |||
} | |||
} | |||