You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

Command.cs 2.8 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. using Discord.Commands.Permissions;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Threading.Tasks;
  5. namespace Discord.Commands
  6. {
  7. public enum ParameterType
  8. {
  9. /// <summary> Catches a single required parameter. </summary>
  10. Required,
  11. /// <summary> Catches a single optional parameter. </summary>
  12. Optional,
  13. /// <summary> Catches a zero or more optional parameters. </summary>
  14. Multiple,
  15. /// <summary> Catches all remaining text as a single optional parameter. </summary>
  16. Unparsed
  17. }
  18. public sealed class CommandParameter
  19. {
  20. public string Name { get; }
  21. public int Id { get; internal set; }
  22. public ParameterType Type { get; }
  23. public CommandParameter(string name, ParameterType type)
  24. {
  25. Name = name;
  26. Type = type;
  27. }
  28. }
  29. public sealed class Command
  30. {
  31. public string Text { get; }
  32. public string Category { get; internal set; }
  33. public bool IsHidden { get; internal set; }
  34. public string Description { get; internal set; }
  35. //public int? MinArgs { get; private set; }
  36. //public int? MaxArgs { get; private set; }
  37. public IEnumerable<string> Aliases => _aliases;
  38. private string[] _aliases;
  39. public IEnumerable<CommandParameter> Parameters => _parameters;
  40. internal CommandParameter[] _parameters;
  41. private IPermissionChecker[] _checks;
  42. private Func<CommandEventArgs, Task> _runFunc;
  43. private Dictionary<string, CommandParameter> _parametersByName;
  44. internal Command(string text)
  45. {
  46. Text = text;
  47. IsHidden = false;
  48. _aliases = new string[0];
  49. _parameters = new CommandParameter[0];
  50. _parametersByName = new Dictionary<string, CommandParameter>();
  51. }
  52. public CommandParameter this[string name] => _parametersByName[name];
  53. internal void SetAliases(string[] aliases)
  54. {
  55. _aliases = aliases;
  56. }
  57. internal void SetParameters(CommandParameter[] parameters)
  58. {
  59. _parametersByName.Clear();
  60. for (int i = 0; i < parameters.Length; i++)
  61. {
  62. parameters[i].Id = i;
  63. _parametersByName[parameters[i].Name] = parameters[i];
  64. }
  65. _parameters = parameters;
  66. }
  67. internal void SetChecks(IPermissionChecker[] checks)
  68. {
  69. _checks = checks;
  70. }
  71. internal bool CanRun(User user, Channel channel, out string error)
  72. {
  73. for (int i = 0; i < _checks.Length; i++)
  74. {
  75. if (!_checks[i].CanRun(this, user, channel, out error))
  76. return false;
  77. }
  78. error = null;
  79. return true;
  80. }
  81. internal void SetRunFunc(Func<CommandEventArgs, Task> func)
  82. {
  83. _runFunc = func;
  84. }
  85. internal void SetRunFunc(Action<CommandEventArgs> func)
  86. {
  87. _runFunc = e => { func(e); return TaskHelper.CompletedTask; };
  88. }
  89. internal Task Run(CommandEventArgs args)
  90. {
  91. var task = _runFunc(args);
  92. if (task != null)
  93. return task;
  94. else
  95. return TaskHelper.CompletedTask;
  96. }
  97. }
  98. }