using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; using Discord.Commands.Builders; namespace Discord.Commands { public class ModuleInfo { internal ModuleInfo(ModuleBuilder builder, CommandService service, IServiceProvider services, ModuleInfo parent = null) { Service = service; Name = builder.Name; Summary = builder.Summary; Remarks = builder.Remarks; Group = builder.Group; Parent = parent; Aliases = BuildAliases(builder, service).ToImmutableArray(); Commands = builder.Commands.Select(x => x.Build(this, service)).ToImmutableArray(); Preconditions = BuildPreconditions(builder).ToImmutableArray(); Attributes = BuildAttributes(builder).ToImmutableArray(); Submodules = BuildSubmodules(builder, service, services).ToImmutableArray(); } public CommandService Service { get; } public string Name { get; } public string Summary { get; } public string Remarks { get; } public string Group { get; } public IReadOnlyList Aliases { get; } public IReadOnlyList Commands { get; } public IReadOnlyList Preconditions { get; } public IReadOnlyList Attributes { get; } public IReadOnlyList Submodules { get; } public ModuleInfo Parent { get; } public bool IsSubmodule => Parent != null; private static IEnumerable BuildAliases(ModuleBuilder builder, CommandService service) { var result = builder.Aliases.ToList(); var builderQueue = new Queue(); var parent = builder; while ((parent = parent.Parent) != null) builderQueue.Enqueue(parent); while (builderQueue.Count > 0) { var level = builderQueue.Dequeue(); // permute in reverse because we want to *prefix* our aliases result = level.Aliases.Permutate(result, (first, second) => { if (first == "") return second; if (second == "") return first; return first + service._separatorChar + second; }).ToList(); } return result; } private IEnumerable BuildSubmodules(ModuleBuilder parent, CommandService service, IServiceProvider services) => parent.Modules.Select(submodule => submodule.Build(service, services, this)).ToList(); private static IEnumerable BuildPreconditions(ModuleBuilder builder) { var result = new List(); var parent = builder; while (parent != null) { result.AddRange(parent.Preconditions); parent = parent.Parent; } return result; } private static List BuildAttributes(ModuleBuilder builder) { var result = new List(); var parent = builder; while (parent != null) { result.AddRange(parent.Attributes); parent = parent.Parent; } return result; } } }