Exemple #1
0
        private async Task RunAllChecksAsync(Command cmd, CommandContext ctx)
        {
            if (cmd.Parent != null)
            {
                await this.RunAllChecksAsync(cmd.Parent, ctx).ConfigureAwait(false);
            }

            var fchecks = await cmd.RunChecksAsync(ctx, false).ConfigureAwait(false);

            if (fchecks.Any())
            {
                throw new ChecksFailedException(cmd, ctx, fchecks);
            }
        }
Exemple #2
0
            public async Task DefaultHelpAsync(CommandContext ctx, [Description("Command to provide help for.")] params string[] command)
            {
                var topLevel    = ctx.CommandsNext.TopLevelCommands.Values.Distinct();
                var helpBuilder = ctx.CommandsNext.HelpFormatter.Create(ctx);

                if (command != null && command.Any())
                {
                    Command cmd      = null;
                    var     searchIn = topLevel;
                    foreach (var c in command)
                    {
                        if (searchIn == null)
                        {
                            cmd = null;
                            break;
                        }

                        if (ctx.Config.CaseSensitive)
                        {
                            cmd = searchIn.FirstOrDefault(xc => xc.Name == c || (xc.Aliases != null && xc.Aliases.Contains(c)));
                        }
                        else
                        {
                            cmd = searchIn.FirstOrDefault(xc => xc.Name.ToLowerInvariant() == c.ToLowerInvariant() || (xc.Aliases != null && xc.Aliases.Select(xs => xs.ToLowerInvariant()).Contains(c.ToLowerInvariant())));
                        }

                        if (cmd == null)
                        {
                            break;
                        }

                        var failedChecks = await cmd.RunChecksAsync(ctx, true).ConfigureAwait(false);

                        if (failedChecks.Any())
                        {
                            throw new ChecksFailedException(cmd, ctx, failedChecks);
                        }

                        if (cmd is CommandGroup)
                        {
                            searchIn = (cmd as CommandGroup).Children;
                        }
                        else
                        {
                            searchIn = null;
                        }
                    }

                    if (cmd == null)
                    {
                        throw new CommandNotFoundException(string.Join(" ", command));
                    }

                    helpBuilder.WithCommand(cmd);

                    if (cmd is CommandGroup group)
                    {
                        var commandsToSearch = group.Children.Where(xc => !xc.IsHidden);
                        var eligibleCommands = new List <Command>();
                        foreach (var candidateCommand in commandsToSearch)
                        {
                            if (candidateCommand.ExecutionChecks == null || !candidateCommand.ExecutionChecks.Any())
                            {
                                eligibleCommands.Add(candidateCommand);
                                continue;
                            }

                            var candidateFailedChecks = await candidateCommand.RunChecksAsync(ctx, true).ConfigureAwait(false);

                            if (!candidateFailedChecks.Any())
                            {
                                eligibleCommands.Add(candidateCommand);
                            }
                        }

                        if (eligibleCommands.Any())
                        {
                            helpBuilder.WithSubcommands(eligibleCommands.OrderBy(xc => xc.Name));
                        }
                    }
                }
                else
                {
                    var commandsToSearch = topLevel.Where(xc => !xc.IsHidden);
                    var eligibleCommands = new List <Command>();
                    foreach (var sc in commandsToSearch)
                    {
                        if (sc.ExecutionChecks == null || !sc.ExecutionChecks.Any())
                        {
                            eligibleCommands.Add(sc);
                            continue;
                        }

                        var candidateFailedChecks = await sc.RunChecksAsync(ctx, true).ConfigureAwait(false);

                        if (!candidateFailedChecks.Any())
                        {
                            eligibleCommands.Add(sc);
                        }
                    }

                    if (eligibleCommands.Any())
                    {
                        helpBuilder.WithSubcommands(eligibleCommands.OrderBy(xc => xc.Name));
                    }
                }

                var helpMessage = helpBuilder.Build();

                var builder = new DiscordMessageBuilder().WithContent(helpMessage.Content).WithEmbed(helpMessage.Embed);

                if (!ctx.Config.DmHelp || ctx.Channel is DiscordDmChannel || ctx.Guild == null)
                {
                    await ctx.RespondAsync(builder).ConfigureAwait(false);
                }
                else
                {
                    await ctx.Member.SendMessageAsync(builder).ConfigureAwait(false);
                }
            }
Exemple #3
0
        /// <summary>
        /// Executes this command or its subcommand with specified context.
        /// </summary>
        /// <param name="ctx">Context to execute the command in.</param>
        /// <returns>Command's execution results.</returns>
        public override async Task <CommandResult> ExecuteAsync(CommandContext ctx)
        {
            var findpos = 0;
            var cn      = CommandsNextUtilities.ExtractNextArgument(ctx.RawArgumentString, ref findpos);

            if (cn != null)
            {
                Command cmd = null;
                if (ctx.Config.CaseSensitive)
                {
                    cmd = this.Children.FirstOrDefault(xc => xc.Name == cn || (xc.Aliases != null && xc.Aliases.Contains(cn)));
                }
                else
                {
                    cmd = this.Children.FirstOrDefault(xc => xc.Name.ToLowerInvariant() == cn.ToLowerInvariant() || (xc.Aliases != null && xc.Aliases.Select(xs => xs.ToLowerInvariant()).Contains(cn.ToLowerInvariant())));
                }

                if (cmd != null)
                {
                    // pass the execution on
                    var xctx = new CommandContext
                    {
                        Client            = ctx.Client,
                        Message           = ctx.Message,
                        Command           = cmd,
                        Config            = ctx.Config,
                        RawArgumentString = ctx.RawArgumentString.Substring(findpos),
                        Prefix            = ctx.Prefix,
                        CommandsNext      = ctx.CommandsNext,
                        Services          = ctx.Services
                    };

                    var fchecks = await cmd.RunChecksAsync(xctx, false).ConfigureAwait(false);

                    if (fchecks.Any())
                    {
                        return new CommandResult
                               {
                                   IsSuccessful = false,
                                   Exception    = new ChecksFailedException(cmd, xctx, fchecks),
                                   Context      = xctx
                               }
                    }
                    ;

                    return(await cmd.ExecuteAsync(xctx).ConfigureAwait(false));
                }
            }

            if (!this.IsExecutableWithoutSubcommands)
            {
                return new CommandResult
                       {
                           IsSuccessful = false,
                           Exception    = new InvalidOperationException("No matching subcommands were found, and this group is not executable."),
                           Context      = ctx
                       }
            }
            ;

            return(await base.ExecuteAsync(ctx).ConfigureAwait(false));
        }
    }
}
Exemple #4
0
        public async Task DefaultHelpAsync(CommandContext ctx, [Description("Command to provide help for.")] params string[] command)
        {
            var toplevel    = this.TopLevelCommands.Values.Distinct();
            var helpbuilder = Activator.CreateInstance(this.HelpFormatterType) as IHelpFormatter;

            if (command != null && command.Any())
            {
                Command cmd       = null;
                var     search_in = toplevel;
                foreach (var c in command)
                {
                    if (search_in == null)
                    {
                        cmd = null;
                        break;
                    }

                    if (this.Config.CaseSensitive)
                    {
                        cmd = search_in.FirstOrDefault(xc => xc.Name == c || (xc.Aliases != null && xc.Aliases.Contains(c)));
                    }
                    else
                    {
                        cmd = search_in.FirstOrDefault(xc => xc.Name.ToLowerInvariant() == c.ToLowerInvariant() || (xc.Aliases != null && xc.Aliases.Select(xs => xs.ToLowerInvariant()).Contains(c.ToLowerInvariant())));
                    }

                    if (cmd == null)
                    {
                        break;
                    }

                    var cfl = await cmd.RunChecksAsync(ctx, true).ConfigureAwait(false);

                    if (cfl.Any())
                    {
                        throw new ChecksFailedException(cmd, ctx, cfl);
                    }

                    if (cmd is CommandGroup)
                    {
                        search_in = (cmd as CommandGroup).Children;
                    }
                    else
                    {
                        search_in = null;
                    }
                }

                if (cmd == null)
                {
                    throw new CommandNotFoundException(string.Join(" ", command));
                }

                helpbuilder.WithCommandName(cmd.Name).WithDescription(cmd.Description);

                if (cmd is CommandGroup g && g.Callable != null)
                {
                    helpbuilder.WithGroupExecutable();
                }

                if (cmd.Aliases != null && cmd.Aliases.Any())
                {
                    helpbuilder.WithAliases(cmd.Aliases.OrderBy(xs => xs));
                }

                if (cmd.Arguments != null && cmd.Arguments.Any())
                {
                    helpbuilder.WithArguments(cmd.Arguments);
                }

                if (cmd is CommandGroup gx)
                {
                    var sxs = gx.Children.Where(xc => !xc.IsHidden);
                    var scs = new List <Command>();
                    foreach (var sc in sxs)
                    {
                        if (sc.ExecutionChecks == null || !sc.ExecutionChecks.Any())
                        {
                            scs.Add(sc);
                            continue;
                        }

                        var cfl = await sc.RunChecksAsync(ctx, true).ConfigureAwait(false);

                        if (!cfl.Any())
                        {
                            scs.Add(sc);
                        }
                    }

                    if (scs.Any())
                    {
                        helpbuilder.WithSubcommands(scs.OrderBy(xc => xc.Name));
                    }
                }
            }
            else
            {
                var sxs = toplevel.Where(xc => !xc.IsHidden);
                var scs = new List <Command>();
                foreach (var sc in sxs)
                {
                    if (sc.ExecutionChecks == null || !sc.ExecutionChecks.Any())
                    {
                        scs.Add(sc);
                        continue;
                    }

                    var cfl = await sc.RunChecksAsync(ctx, true).ConfigureAwait(false);

                    if (!cfl.Any())
                    {
                        scs.Add(sc);
                    }
                }

                if (scs.Any())
                {
                    helpbuilder.WithSubcommands(scs.OrderBy(xc => xc.Name));
                }
            }

            var hmsg = helpbuilder.Build();
            await ctx.RespondAsync(hmsg.Content, embed : hmsg.Embed).ConfigureAwait(false);
        }
Exemple #5
0
        /// <summary>
        /// Executes this command or its subcommand with specified context.
        /// </summary>
        /// <param name="ctx">Context to execute the command in.</param>
        /// <returns>Command's execution results.</returns>
        public override async Task <CommandResult> ExecuteAsync(CommandContext ctx)
        {
            //var cn = ctx.RawArguments.FirstOrDefault();
            var cn = CommandsNextUtilities.ExtractNextArgument(ctx.RawArgumentString, out var x);

            if (x != null)
            {
                var xi = 0;
                for (; xi < x.Length; xi++)
                {
                    if (!char.IsWhiteSpace(x[xi]))
                    {
                        break;
                    }
                }
                if (xi > 0)
                {
                    x = x.Substring(xi);
                }
            }

            if (cn != null)
            {
                Command cmd = null;
                if (ctx.Config.CaseSensitive)
                {
                    cmd = this.Children.FirstOrDefault(xc => xc.Name == cn || (xc.Aliases != null && xc.Aliases.Contains(cn)));
                }
                else
                {
                    cmd = this.Children.FirstOrDefault(xc => xc.Name.ToLowerInvariant() == cn.ToLowerInvariant() || (xc.Aliases != null && xc.Aliases.Select(xs => xs.ToLowerInvariant()).Contains(cn.ToLowerInvariant())));
                }

                if (cmd != null)
                {
                    // pass the execution on
                    var xctx = new CommandContext
                    {
                        Client            = ctx.Client,
                        Message           = ctx.Message,
                        Command           = cmd,
                        Config            = ctx.Config,
                        RawArgumentString = x,
                        CommandsNext      = ctx.CommandsNext,
                        Dependencies      = ctx.Dependencies
                    };

                    var fchecks = await cmd.RunChecksAsync(xctx, false);

                    if (fchecks.Any())
                    {
                        return new CommandResult
                               {
                                   IsSuccessful = false,
                                   Exception    = new ChecksFailedException(cmd, xctx, fchecks),
                                   Context      = xctx
                               }
                    }
                    ;

                    return(await cmd.ExecuteAsync(xctx));
                }
            }

            if (this.Callable == null)
            {
                return new CommandResult
                       {
                           IsSuccessful = false,
                           Exception    = new InvalidOperationException("No matching subcommands were found, and this group is not executable."),
                           Context      = ctx
                       }
            }
            ;

            return(await base.ExecuteAsync(ctx));
        }
    }
}