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.

ModuleBuilder.cs 4.5 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Threading.Tasks;
  4. using Microsoft.Extensions.DependencyInjection;
  5. namespace Discord.Commands.Builders
  6. {
  7. public class ModuleBuilder
  8. {
  9. private readonly List<CommandBuilder> _commands;
  10. private readonly List<ModuleBuilder> _submodules;
  11. private readonly List<PreconditionAttribute> _preconditions;
  12. private readonly List<Attribute> _attributes;
  13. private readonly List<string> _aliases;
  14. public CommandService Service { get; }
  15. public ModuleBuilder Parent { get; }
  16. public string Name { get; set; }
  17. public string Summary { get; set; }
  18. public string Remarks { get; set; }
  19. public IReadOnlyList<CommandBuilder> Commands => _commands;
  20. public IReadOnlyList<ModuleBuilder> Modules => _submodules;
  21. public IReadOnlyList<PreconditionAttribute> Preconditions => _preconditions;
  22. public IReadOnlyList<Attribute> Attributes => _attributes;
  23. public IReadOnlyList<string> Aliases => _aliases;
  24. //Automatic
  25. internal ModuleBuilder(CommandService service, ModuleBuilder parent)
  26. {
  27. Service = service;
  28. Parent = parent;
  29. _commands = new List<CommandBuilder>();
  30. _submodules = new List<ModuleBuilder>();
  31. _preconditions = new List<PreconditionAttribute>();
  32. _attributes = new List<Attribute>();
  33. _aliases = new List<string>();
  34. }
  35. //User-defined
  36. internal ModuleBuilder(CommandService service, ModuleBuilder parent, string primaryAlias)
  37. : this(service, parent)
  38. {
  39. Discord.Preconditions.NotNull(primaryAlias, nameof(primaryAlias));
  40. _aliases = new List<string> { primaryAlias };
  41. }
  42. public ModuleBuilder WithName(string name)
  43. {
  44. Name = name;
  45. return this;
  46. }
  47. public ModuleBuilder WithSummary(string summary)
  48. {
  49. Summary = summary;
  50. return this;
  51. }
  52. public ModuleBuilder WithRemarks(string remarks)
  53. {
  54. Remarks = remarks;
  55. return this;
  56. }
  57. public ModuleBuilder AddAliases(params string[] aliases)
  58. {
  59. for (int i = 0; i < aliases.Length; i++)
  60. {
  61. var alias = aliases[i] ?? "";
  62. if (!_aliases.Contains(alias))
  63. _aliases.Add(alias);
  64. }
  65. return this;
  66. }
  67. public ModuleBuilder AddAttributes(params Attribute[] attributes)
  68. {
  69. _attributes.AddRange(attributes);
  70. return this;
  71. }
  72. public ModuleBuilder AddPrecondition(PreconditionAttribute precondition)
  73. {
  74. _preconditions.Add(precondition);
  75. return this;
  76. }
  77. public ModuleBuilder AddCommand(string primaryAlias, Func<ICommandContext, object[], IServiceProvider, CommandInfo, Task> callback, Action<CommandBuilder> createFunc)
  78. {
  79. var builder = new CommandBuilder(this, primaryAlias, callback);
  80. createFunc(builder);
  81. _commands.Add(builder);
  82. return this;
  83. }
  84. internal ModuleBuilder AddCommand(Action<CommandBuilder> createFunc)
  85. {
  86. var builder = new CommandBuilder(this);
  87. createFunc(builder);
  88. _commands.Add(builder);
  89. return this;
  90. }
  91. public ModuleBuilder AddModule(string primaryAlias, Action<ModuleBuilder> createFunc)
  92. {
  93. var builder = new ModuleBuilder(Service, this, primaryAlias);
  94. createFunc(builder);
  95. _submodules.Add(builder);
  96. return this;
  97. }
  98. internal ModuleBuilder AddModule(Action<ModuleBuilder> createFunc)
  99. {
  100. var builder = new ModuleBuilder(Service, this);
  101. createFunc(builder);
  102. _submodules.Add(builder);
  103. return this;
  104. }
  105. private ModuleInfo BuildImpl(CommandService service, ModuleInfo parent = null)
  106. {
  107. //Default name to first alias
  108. if (Name == null)
  109. Name = _aliases[0];
  110. return new ModuleInfo(this, service, parent);
  111. }
  112. public ModuleInfo Build(CommandService service) => BuildImpl(service);
  113. internal ModuleInfo Build(CommandService service, ModuleInfo parent) => BuildImpl(service, parent);
  114. }
  115. }