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.

ModuleInfo.cs 3.5 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. using System;
  2. using System.Linq;
  3. using System.Collections.Generic;
  4. using System.Collections.Immutable;
  5. using Discord.Commands.Builders;
  6. namespace Discord.Commands
  7. {
  8. public class ModuleInfo
  9. {
  10. public CommandService Service { get; }
  11. public string Name { get; }
  12. public string Summary { get; }
  13. public string Remarks { get; }
  14. public IReadOnlyList<string> Aliases { get; }
  15. public IReadOnlyList<CommandInfo> Commands { get; }
  16. public IReadOnlyList<PreconditionAttribute> Preconditions { get; }
  17. public IReadOnlyList<Attribute> Attributes { get; }
  18. public IReadOnlyList<ModuleInfo> Submodules { get; }
  19. public ModuleInfo Parent { get; }
  20. public bool IsSubmodule => Parent != null;
  21. internal ModuleInfo(ModuleBuilder builder, CommandService service, ModuleInfo parent = null)
  22. {
  23. Service = service;
  24. Name = builder.Name;
  25. Summary = builder.Summary;
  26. Remarks = builder.Remarks;
  27. Parent = parent;
  28. Aliases = BuildAliases(builder, service).ToImmutableArray();
  29. Commands = builder.Commands.Select(x => x.Build(this, service)).ToImmutableArray();
  30. Preconditions = BuildPreconditions(builder).ToImmutableArray();
  31. Attributes = BuildAttributes(builder).ToImmutableArray();
  32. Submodules = BuildSubmodules(builder, service).ToImmutableArray();
  33. }
  34. private static IEnumerable<string> BuildAliases(ModuleBuilder builder, CommandService service)
  35. {
  36. var result = builder.Aliases.ToList();
  37. var builderQueue = new Queue<ModuleBuilder>();
  38. var parent = builder;
  39. while ((parent = parent.Parent) != null)
  40. builderQueue.Enqueue(parent);
  41. while (builderQueue.Count > 0)
  42. {
  43. var level = builderQueue.Dequeue();
  44. // permute in reverse because we want to *prefix* our aliases
  45. result = level.Aliases.Permutate(result, (first, second) =>
  46. {
  47. if (first == "")
  48. return second;
  49. else if (second == "")
  50. return first;
  51. else
  52. return first + service._separatorChar + second;
  53. }).ToList();
  54. }
  55. return result;
  56. }
  57. private List<ModuleInfo> BuildSubmodules(ModuleBuilder parent, CommandService service)
  58. {
  59. var result = new List<ModuleInfo>();
  60. foreach (var submodule in parent.Modules)
  61. result.Add(submodule.Build(service, this));
  62. return result;
  63. }
  64. private static List<PreconditionAttribute> BuildPreconditions(ModuleBuilder builder)
  65. {
  66. var result = new List<PreconditionAttribute>();
  67. ModuleBuilder parent = builder;
  68. while (parent != null)
  69. {
  70. result.AddRange(parent.Preconditions);
  71. parent = parent.Parent;
  72. }
  73. return result;
  74. }
  75. private static List<Attribute> BuildAttributes(ModuleBuilder builder)
  76. {
  77. var result = new List<Attribute>();
  78. ModuleBuilder parent = builder;
  79. while (parent != null)
  80. {
  81. result.AddRange(parent.Attributes);
  82. parent = parent.Parent;
  83. }
  84. return result;
  85. }
  86. }
  87. }