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.

OverloadBuilder.cs 3.2 kB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. using System;
  2. using System.Linq;
  3. using System.Threading.Tasks;
  4. using System.Collections.Generic;
  5. using System.Diagnostics;
  6. using CommandCallback = System.Func<Discord.Commands.ICommandContext, object[], System.IServiceProvider, Discord.Commands.OverloadInfo, System.Threading.Tasks.Task>;
  7. namespace Discord.Commands.Builders
  8. {
  9. public class OverloadBuilder
  10. {
  11. private readonly List<PreconditionAttribute> _preconditions;
  12. private readonly List<ParameterBuilder> _parameters;
  13. public CommandBuilder Command { get; }
  14. public CommandCallback Callback { get; set; }
  15. public RunMode RunMode { get; set; }
  16. public int Priority { get; set; }
  17. public IReadOnlyList<PreconditionAttribute> Preconditions => _preconditions;
  18. public IReadOnlyList<ParameterBuilder> Parameters => _parameters;
  19. internal OverloadBuilder(CommandBuilder command)
  20. {
  21. Command = command;
  22. _preconditions = new List<PreconditionAttribute>();
  23. _parameters = new List<ParameterBuilder>();
  24. }
  25. public OverloadBuilder WithRunMode(RunMode runMode)
  26. {
  27. RunMode = runMode;
  28. return this;
  29. }
  30. public OverloadBuilder WithPriority(int priority)
  31. {
  32. Priority = priority;
  33. return this;
  34. }
  35. public OverloadBuilder WithCallback(CommandCallback callback)
  36. {
  37. Callback = callback;
  38. return this;
  39. }
  40. public OverloadBuilder AddPrecondition(PreconditionAttribute precondition)
  41. {
  42. _preconditions.Add(precondition);
  43. return this;
  44. }
  45. internal OverloadBuilder AddParameter(Action<ParameterBuilder> createFunc)
  46. {
  47. var param = new ParameterBuilder(this);
  48. createFunc(param);
  49. _parameters.Add(param);
  50. return this;
  51. }
  52. public OverloadBuilder AddParameter(string name, Type type, Action<ParameterBuilder> createFunc)
  53. {
  54. var param = new ParameterBuilder(this, name, type);
  55. createFunc(param);
  56. _parameters.Add(param);
  57. return this;
  58. }
  59. internal OverloadInfo Build(CommandInfo info, CommandService service)
  60. {
  61. Discord.Preconditions.NotNull(Callback, nameof(Callback));
  62. if (_parameters.Count > 0)
  63. {
  64. var lastParam = _parameters[_parameters.Count - 1];
  65. var firstMultipleParam = _parameters.FirstOrDefault(x => x.IsMultiple);
  66. if ((firstMultipleParam != null) && (firstMultipleParam != lastParam))
  67. throw new InvalidOperationException("Only the last parameter in a command may have the Multiple flag.");
  68. var firstRemainderParam = _parameters.FirstOrDefault(x => x.IsRemainder);
  69. if ((firstRemainderParam != null) && (firstRemainderParam != lastParam))
  70. throw new InvalidOperationException("Only the last parameter in a command may have the Remainder flag.");
  71. }
  72. return new OverloadInfo(this, info, service);
  73. }
  74. }
  75. }