using System.Collections.Generic; using System.Linq; using System.Reflection.Metadata.Ecma335; using DeukBot4.MessageHandlers.CommandHandler.RequestStructure; namespace DeukBot4.MessageHandlers.CommandHandler { public abstract class CommandContainerBase { public abstract string Name { get; } public Command[] GetCommands() { var funcs = GetType().GetMethods() .Where(x => x.GetCustomAttributes(typeof(CommandAttribute), true).Length > 0); var commands = new List(); foreach (var methodInfo in funcs) { var commandAttributes = methodInfo.GetCustomAttributes(typeof(CommandAttribute), true) .Select(x => x as CommandAttribute); CommandHelpAttribute helpAttribute = null; var helpAttributes = methodInfo.GetCustomAttributes(typeof(CommandHelpAttribute), true) .Select(x => x as CommandHelpAttribute); var commandHelpAttributes = helpAttributes as CommandHelpAttribute[] ?? helpAttributes.ToArray(); if (commandHelpAttributes.Any()) helpAttribute = commandHelpAttributes[0]; var parametersAttributes = methodInfo.GetCustomAttributes(typeof(CommandParametersAttribute), true) .Select(x => x as CommandParametersAttribute); var commandParametersAttributes = parametersAttributes as CommandParametersAttribute[] ?? parametersAttributes.ToArray(); var parameters = commandParametersAttributes.Select(x => x.Types).ToArray(); foreach (var commandAttribute in commandAttributes) { if (commandAttribute == null) continue; if (helpAttribute == null) { commands.Add(new Command(commandAttribute.Command, commandAttribute.Permission, parameters, methodInfo, this)); } else { commands.Add(new Command(commandAttribute.Command, commandAttribute.Permission, helpAttribute.ShortHelp, helpAttribute.LongHelp, parameters, methodInfo, this)); } } } return commands.ToArray(); } } }