Files
Discord.Net/src/Discord.Net.Commands/CommandMap.cs
2015-11-29 11:31:52 -04:00

138 lines
3.3 KiB
C#

using System.Collections.Generic;
namespace Discord.Commands
{
//Represents either a single function, command group, or both
internal class CommandMap
{
private readonly CommandMap _parent;
private readonly string _name, _fullName;
private readonly List<Command> _commands;
private readonly Dictionary<string, CommandMap> _items;
private bool _isVisible, _hasNonAliases, _hasSubGroups;
public string Name => _name;
public string FullName => _fullName;
public bool IsVisible => _isVisible;
public bool HasNonAliases => _hasNonAliases;
public bool HasSubGroups => _hasSubGroups;
public IEnumerable<Command> Commands => _commands;
public IEnumerable<CommandMap> SubGroups => _items.Values;
public CommandMap(CommandMap parent, string name, string fullName)
{
_parent = parent;
_name = name;
_fullName = fullName;
_items = new Dictionary<string, CommandMap>();
_commands = new List<Command>();
_isVisible = false;
_hasNonAliases = false;
_hasSubGroups = false;
}
public CommandMap GetItem(string text)
{
return GetItem(0, text.Split(' '));
}
public CommandMap GetItem(int index, string[] parts)
{
if (index != parts.Length)
{
string nextPart = parts[index];
CommandMap nextGroup;
if (_items.TryGetValue(nextPart.ToLowerInvariant(), out nextGroup))
return nextGroup.GetItem(index + 1, parts);
else
return null;
}
return this;
}
public IEnumerable<Command> GetCommands()
{
if (_commands.Count > 0)
return _commands;
else if (_parent != null)
return _parent.GetCommands();
else
return null;
}
public IEnumerable<Command> GetCommands(string text)
{
return GetCommands(0, text.Split(' '));
}
public IEnumerable<Command> GetCommands(int index, string[] parts)
{
if (index != parts.Length)
{
string nextPart = parts[index];
CommandMap nextGroup;
if (_items.TryGetValue(nextPart.ToLowerInvariant(), out nextGroup))
{
var cmd = nextGroup.GetCommands(index + 1, parts);
if (cmd != null)
return cmd;
}
}
if (_commands != null)
return _commands;
return null;
}
public void AddCommand(string text, Command command, bool isAlias)
{
AddCommand(0, text.Split(' '), command, isAlias);
}
private void AddCommand(int index, string[] parts, Command command, bool isAlias)
{
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))
{
nextGroup = new CommandMap(this, name, fullName);
_items.Add(name, nextGroup);
_hasSubGroups = true;
}
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)
{
if (_commands.Count > 0)
{
foreach (var cmd in _commands)
{
if (!cmd.CanRun(user, channel, out error))
return false;
}
}
if (_items.Count > 0)
{
foreach (var item in _items)
{
if (!item.Value.CanRun(user, channel, out error))
return false;
}
}
error = null;
return true;
}
}
}