using Discord.Commands.Permissions; using System; using System.Collections.Generic; using System.Threading.Tasks; namespace Discord.Commands { public enum ParameterType { /// Catches a single required parameter. Required, /// Catches a single optional parameter. Optional, /// Catches a zero or more optional parameters. Multiple, /// Catches all remaining text as a single optional parameter. Unparsed } public sealed class CommandParameter { public string Name { get; } public int Id { get; internal set; } public ParameterType Type { get; } public CommandParameter(string name, ParameterType type) { Name = name; Type = type; } } public sealed class Command { public string Text { get; } public string Category { get; internal set; } public bool IsHidden { get; internal set; } public string Description { get; internal set; } //public int? MinArgs { get; private set; } //public int? MaxArgs { get; private set; } public IEnumerable Aliases => _aliases; private string[] _aliases; public IEnumerable Parameters => _parameters; internal CommandParameter[] _parameters; private IPermissionChecker[] _checks; private Func _runFunc; private Dictionary _parametersByName; internal Command(string text) { Text = text; IsHidden = false; _aliases = new string[0]; _parameters = new CommandParameter[0]; _parametersByName = new Dictionary(); } public CommandParameter this[string name] => _parametersByName[name]; internal void SetAliases(string[] aliases) { _aliases = aliases; } internal void SetParameters(CommandParameter[] parameters) { _parametersByName.Clear(); for (int i = 0; i < parameters.Length; i++) { parameters[i].Id = i; _parametersByName[parameters[i].Name] = parameters[i]; } _parameters = parameters; } internal void SetChecks(IPermissionChecker[] checks) { _checks = checks; } internal bool CanRun(User user, Channel channel, out string error) { for (int i = 0; i < _checks.Length; i++) { if (!_checks[i].CanRun(this, user, channel, out error)) return false; } error = null; return true; } internal void SetRunFunc(Func func) { _runFunc = func; } internal void SetRunFunc(Action func) { _runFunc = e => { func(e); return TaskHelper.CompletedTask; }; } internal Task Run(CommandEventArgs args) { var task = _runFunc(args); if (task != null) return task; else return TaskHelper.CompletedTask; } } }