using System; 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 IReadOnlyList Commands { get; } public IReadOnlyList Preconditions { get; } public IReadOnlyList Attributes { get; } public IReadOnlyList Submodules { get; } public ModuleInfo Parent { get; } public bool IsSubmodule => Parent != null; internal ModuleInfo(ModuleBuilder builder, CommandService service, ModuleInfo parent = null) { Service = service; Name = builder.Name; Summary = builder.Summary; Remarks = builder.Remarks; 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).ToImmutableArray(); } 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; else if (second == "") return first; else return first + service._separatorChar + second; }).ToList(); } return result; } private List BuildSubmodules(ModuleBuilder parent, CommandService service) { var result = new List(); foreach (var submodule in parent.Modules) result.Add(submodule.Build(service, this)); 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; } private static List BuildAttributes(ModuleBuilder builder) { var result = new List(); ModuleBuilder parent = builder; while (parent != null) { result.AddRange(parent.Attributes); parent = parent.Parent; } return result; } } }