using System.Linq; using System.Collections.Generic; using System.Collections.Immutable; using Discord.Commands.Builders; namespace Discord.Commands { public class ModuleInfo { public CommandService Service { get; } public string Name { get; } public string Summary { get; } public string Remarks { get; } public IReadOnlyList Aliases { get; } public IEnumerable Commands { get; } public IReadOnlyList Preconditions { get; } public IReadOnlyList Submodules { get; } internal ModuleInfo(ModuleBuilder builder, CommandService service) { Service = service; Name = builder.Name; Summary = builder.Summary; Remarks = builder.Remarks; Aliases = BuildAliases(builder).ToImmutableArray(); Commands = builder.Commands.Select(x => x.Build(this, service)); Preconditions = BuildPreconditions(builder).ToImmutableArray(); Submodules = BuildSubmodules(builder, service).ToImmutableArray(); } private static IEnumerable BuildAliases(ModuleBuilder builder) { IEnumerable result = null; Stack builderStack = new Stack(); builderStack.Push(builder); ModuleBuilder parent = builder.Parent; while (parent != null) { builderStack.Push(parent); parent = parent.Parent; } while (builderStack.Count() > 0) { ModuleBuilder level = builderStack.Pop(); // get the topmost builder if (result == null) result = level.Aliases.ToList(); // create a shallow copy so we don't overwrite the builder unexpectedly else if (result.Count() > level.Aliases.Count) result = result.Permutate(level.Aliases, (first, second) => first + " " + second); else result = level.Aliases.Permutate(result, (second, first) => first + " " + second); } return result; } private static List BuildSubmodules(ModuleBuilder parent, CommandService service) { var result = new List(); foreach (var submodule in parent.Modules) { result.Add(submodule.Build(service)); } return result; } private static List BuildPreconditions(ModuleBuilder builder) { var result = new List(); ModuleBuilder parent = builder; while (parent != null) { result.AddRange(parent.Preconditions); parent = parent.Parent; } return result; } } }