Search in sources :

Example 6 with CommandContext

use of fredboat.commandmeta.abs.CommandContext in project FredBoat by Frederikam.

the class EventListenerBoat method doOnMessageReceived.

private void doOnMessageReceived(MessageReceivedEvent event) {
    if (ratelimiter.isBlacklisted(event.getAuthor().getIdLong())) {
        Metrics.blacklistedMessagesReceived.inc();
        return;
    }
    if (event.getPrivateChannel() != null) {
        log.info("PRIVATE" + " \t " + event.getAuthor().getName() + " \t " + event.getMessage().getContentRaw());
        return;
    }
    if (event.getAuthor().equals(event.getJDA().getSelfUser())) {
        log.info(event.getMessage().getContentRaw());
        return;
    }
    if (event.getAuthor().isBot()) {
        return;
    }
    // never null since we are filtering private messages out above
    TextChannel channel = event.getTextChannel();
    // where we can't talk in
    if (!channel.canTalk() && !event.getMessage().getContentRaw().toLowerCase().contains(CommandInitializer.HELP_COMM_NAME)) {
        return;
    }
    CommandContext context = commandContextParser.parse(event);
    if (context == null) {
        return;
    }
    log.info(event.getMessage().getContentRaw());
    // ignore all commands in channels where we can't write, except for the help command
    if (!channel.canTalk() && !(context.command instanceof HelpCommand)) {
        log.info("Ignoring command {} because this bot cannot write in that channel", context.command.name);
        return;
    }
    Metrics.commandsReceived.labels(context.command.getClass().getSimpleName()).inc();
    // BOT_ADMINs can always use all commands everywhere
    if (!PermsUtil.checkPerms(PermissionLevel.BOT_ADMIN, event.getMember())) {
        // ignore commands of disabled modules for plebs
        Module module = context.command.getModule();
        if (module != null && !context.getEnabledModules().contains(module)) {
            log.debug("Ignoring command {} because its module {} is disabled in guild {}", context.command.name, module.name(), event.getGuild().getIdLong());
            return;
        }
    }
    limitOrExecuteCommand(context);
}
Also used : CommandContext(fredboat.commandmeta.abs.CommandContext) HelpCommand(fredboat.command.info.HelpCommand) Module(fredboat.definitions.Module)

Example 7 with CommandContext

use of fredboat.commandmeta.abs.CommandContext in project FredBoat by Frederikam.

the class ServerInfoCommand method onInvoke.

@Override
public void onInvoke(@Nonnull CommandContext context) {
    Guild guild = context.guild;
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd-MMM-yyyy");
    EmbedBuilder eb = CentralMessaging.getColoredEmbedBuilder();
    eb.setTitle(context.i18nFormat("serverinfoTitle", guild.getName()), null);
    eb.setThumbnail(guild.getIconUrl());
    long onlineMembers = guild.getMemberCache().stream().filter(m -> m.getOnlineStatus() != OnlineStatus.OFFLINE).count();
    eb.addField(context.i18n("serverinfoOnlineUsers"), String.valueOf(onlineMembers), true);
    eb.addField(context.i18n("serverinfoTotalUsers"), String.valueOf(guild.getMembers().size()), true);
    eb.addField(context.i18n("serverinfoRoles"), String.valueOf(guild.getRoles().size()), true);
    eb.addField(context.i18n("serverinfoText"), String.valueOf(guild.getTextChannels().size()), true);
    eb.addField(context.i18n("serverinfoVoice"), String.valueOf(guild.getVoiceChannels().size()), true);
    eb.addField(context.i18n("serverinfoCreationDate"), guild.getCreationTime().format(dtf), true);
    eb.addField(context.i18n("serverinfoGuildID"), guild.getId(), true);
    eb.addField(context.i18n("serverinfoVLv"), guild.getVerificationLevel().name(), true);
    eb.addField(context.i18n("serverinfoOwner"), guild.getOwner().getAsMention(), true);
    String prefix = TextUtils.shorten(TextUtils.escapeMarkdown(context.getPrefix()), MessageEmbed.VALUE_MAX_LENGTH);
    if (prefix.isEmpty()) {
        prefix = "No Prefix";
    }
    eb.addField(context.i18n("prefix"), prefix, true);
    context.reply(eb.build());
}
Also used : CentralMessaging(fredboat.messaging.CentralMessaging) Guild(net.dv8tion.jda.core.entities.Guild) Context(fredboat.messaging.internal.Context) DateTimeFormatter(java.time.format.DateTimeFormatter) Command(fredboat.commandmeta.abs.Command) CommandContext(fredboat.commandmeta.abs.CommandContext) TextUtils(fredboat.util.TextUtils) MessageEmbed(net.dv8tion.jda.core.entities.MessageEmbed) Nonnull(javax.annotation.Nonnull) IUtilCommand(fredboat.commandmeta.abs.IUtilCommand) EmbedBuilder(net.dv8tion.jda.core.EmbedBuilder) OnlineStatus(net.dv8tion.jda.core.OnlineStatus) EmbedBuilder(net.dv8tion.jda.core.EmbedBuilder) Guild(net.dv8tion.jda.core.entities.Guild) DateTimeFormatter(java.time.format.DateTimeFormatter)

Example 8 with CommandContext

use of fredboat.commandmeta.abs.CommandContext in project FredBoat by Frederikam.

the class CommandContextParser method parse.

/**
 * @param event the event to be parsed
 * @return The full context for the triggered command, or null if it's not a command that we know.
 */
@Nullable
public CommandContext parse(MessageReceivedEvent event) {
    String raw = event.getMessage().getContentRaw();
    String input;
    boolean isMention = false;
    Matcher mentionMatcher = MENTION_PREFIX.matcher(raw);
    // either starts with a mention of us
    if (mentionMatcher.find() && mentionMatcher.group(2).equals(event.getJDA().getSelfUser().getId())) {
        input = mentionMatcher.group(3).trim();
        isMention = true;
    } else // or starts with a custom/default prefix
    {
        String prefix = PrefixCommand.giefPrefix(event.getGuild());
        String defaultPrefix = appConfig.getPrefix();
        if (raw.startsWith(prefix)) {
            input = raw.substring(prefix.length());
            if (prefix.equals(defaultPrefix)) {
                Metrics.prefixParsed.labels("default").inc();
            } else {
                Metrics.prefixParsed.labels("custom").inc();
            }
        } else {
            // hardcoded check for the help or prefix command that is always displayed as FredBoat status
            if (raw.startsWith(defaultPrefix + CommandInitializer.HELP_COMM_NAME) || raw.startsWith(defaultPrefix + CommandInitializer.PREFIX_COMM_NAME)) {
                Metrics.prefixParsed.labels("default").inc();
                input = raw.substring(defaultPrefix.length());
            } else {
                // no match neither mention nor custom/default prefix
                return null;
            }
        }
    }
    // eliminate possible whitespace between the mention/prefix and the rest of the input
    input = input.trim();
    if (input.isEmpty()) {
        if (isMention) {
            // just a mention and nothing else? trigger the prefix command
            input = "prefix";
        } else {
            // no command will be detectable from an empty input
            return null;
        }
    }
    // the \p{javaSpaceChar} instead of the better known \s is used because it actually includes unicode whitespaces
    String[] args = input.split("\\p{javaSpaceChar}+");
    if (args.length < 1) {
        // while this shouldn't technically be possible due to the preprocessing of the input, better be safe than throw exceptions
        return null;
    }
    String commandTrigger = args[0];
    Command command = CommandRegistry.findCommand(commandTrigger.toLowerCase());
    if (command == null) {
        log.info("Unknown command:\t{}", commandTrigger);
        return null;
    } else {
        return new CommandContext(event.getGuild(), event.getTextChannel(), event.getMember(), event.getMessage(), isMention, commandTrigger, // exclude args[0] that contains the command trigger
        Arrays.copyOfRange(args, 1, args.length), input.replaceFirst(commandTrigger, "").trim(), command);
    }
}
Also used : CommandContext(fredboat.commandmeta.abs.CommandContext) Matcher(java.util.regex.Matcher) Command(fredboat.commandmeta.abs.Command) PrefixCommand(fredboat.command.config.PrefixCommand) Nullable(javax.annotation.Nullable)

Example 9 with CommandContext

use of fredboat.commandmeta.abs.CommandContext in project FredBoat by Frederikam.

the class CommandsCommand method onInvoke.

@Override
public void onInvoke(@Nonnull CommandContext context) {
    if (!context.hasArguments()) {
        Collection<Module> enabledModules = context.getEnabledModules();
        if (!PermsUtil.checkPerms(PermissionLevel.BOT_ADMIN, context.invoker)) {
            // dont show admin commands/modules for non admins
            enabledModules.remove(Module.ADMIN);
        }
        String prefixAndCommand = "`" + context.getPrefix() + CommandInitializer.COMMANDS_COMM_NAME;
        List<String> translatedModuleNames = enabledModules.stream().map(module -> context.i18n(module.translationKey)).collect(Collectors.toList());
        context.reply(context.i18nFormat("modulesCommands", prefixAndCommand + " <module>`", prefixAndCommand + " " + ALL + "`") + "\n\n" + context.i18nFormat("musicCommandsPromotion", "`" + context.getPrefix() + CommandInitializer.MUSICHELP_COMM_NAME + "`") + "\n\n" + context.i18n("modulesEnabledInGuild") + " **" + String.join("**, **", translatedModuleNames) + "**" + "\n" + context.i18nFormat("commandsModulesHint", "`" + context.getPrefix() + CommandInitializer.MODULES_COMM_NAME + "`"));
        return;
    }
    List<Module> showHelpFor;
    if (context.rawArgs.toLowerCase().contains(ALL.toLowerCase())) {
        showHelpFor = new ArrayList<>(Arrays.asList(Module.values()));
        if (!PermsUtil.checkPerms(PermissionLevel.BOT_ADMIN, context.invoker)) {
            // dont show admin commands/modules for non admins
            showHelpFor.remove(Module.ADMIN);
        }
    } else {
        Module module = CommandRegistry.whichModule(context.rawArgs, context);
        if (module == null) {
            context.reply(context.i18nFormat("moduleCantParse", "`" + context.getPrefix() + context.command.name) + "`");
            return;
        } else {
            showHelpFor = Collections.singletonList(module);
        }
    }
    EmbedBuilder eb = CentralMessaging.getColoredEmbedBuilder();
    for (Module module : showHelpFor) {
        eb = addModuleCommands(eb, context, CommandRegistry.getCommandModule(module));
    }
    eb.addField("", context.i18nFormat("commandsMoreHelp", "`" + TextUtils.escapeMarkdown(context.getPrefix()) + CommandInitializer.HELP_COMM_NAME + " <command>`"), false);
    context.reply(eb.build());
}
Also used : CommandRegistry(fredboat.commandmeta.CommandRegistry) CentralMessaging(fredboat.messaging.CentralMessaging) java.util(java.util) IInfoCommand(fredboat.commandmeta.abs.IInfoCommand) Command(fredboat.commandmeta.abs.Command) ICommandRestricted(fredboat.commandmeta.abs.ICommandRestricted) CommandContext(fredboat.commandmeta.abs.CommandContext) PermissionLevel(fredboat.definitions.PermissionLevel) TextUtils(fredboat.util.TextUtils) Collectors(java.util.stream.Collectors) CommandInitializer(fredboat.commandmeta.CommandInitializer) EmbedBuilder(net.dv8tion.jda.core.EmbedBuilder) Module(fredboat.definitions.Module) Context(fredboat.messaging.internal.Context) Nonnull(javax.annotation.Nonnull) DestroyCommand(fredboat.command.music.control.DestroyCommand) PermsUtil(fredboat.perms.PermsUtil) EmbedBuilder(net.dv8tion.jda.core.EmbedBuilder) Module(fredboat.definitions.Module)

Example 10 with CommandContext

use of fredboat.commandmeta.abs.CommandContext in project FredBoat by Frederikam.

the class CommandsCommand method addModuleCommands.

private EmbedBuilder addModuleCommands(@Nonnull EmbedBuilder embedBuilder, @Nonnull CommandContext context, @Nonnull CommandRegistry module) {
    List<Command> commands = module.getDeduplicatedCommands().stream().filter(command -> {
        if (command instanceof ICommandRestricted) {
            if (((ICommandRestricted) command).getMinimumPerms().getLevel() >= PermissionLevel.BOT_ADMIN.getLevel()) {
                return PermsUtil.checkPerms(PermissionLevel.BOT_ADMIN, context.invoker);
            }
        }
        return true;
    }).collect(Collectors.toList());
    String prefix = context.getPrefix();
    if (commands.size() >= 6) {
        // split the commands into three even columns
        StringBuilder[] sbs = new StringBuilder[3];
        sbs[0] = new StringBuilder();
        sbs[1] = new StringBuilder();
        sbs[2] = new StringBuilder();
        int i = 0;
        for (Command c : commands) {
            if (c instanceof DestroyCommand) {
                // dont want to publicly show this one
                continue;
            }
            sbs[i++ % 3].append(prefix).append(c.name).append("\n");
        }
        return embedBuilder.addField(context.i18n(module.module.translationKey), sbs[0].toString(), true).addField("", sbs[1].toString(), true).addField("", sbs[2].toString(), true);
    } else {
        StringBuilder sb = new StringBuilder();
        for (Command c : commands) {
            sb.append(prefix).append(c.name).append("\n");
        }
        return embedBuilder.addField(context.i18n(module.module.translationKey), sb.toString(), true).addBlankField(true).addBlankField(true);
    }
}
Also used : CommandRegistry(fredboat.commandmeta.CommandRegistry) CentralMessaging(fredboat.messaging.CentralMessaging) java.util(java.util) IInfoCommand(fredboat.commandmeta.abs.IInfoCommand) Command(fredboat.commandmeta.abs.Command) ICommandRestricted(fredboat.commandmeta.abs.ICommandRestricted) CommandContext(fredboat.commandmeta.abs.CommandContext) PermissionLevel(fredboat.definitions.PermissionLevel) TextUtils(fredboat.util.TextUtils) Collectors(java.util.stream.Collectors) CommandInitializer(fredboat.commandmeta.CommandInitializer) EmbedBuilder(net.dv8tion.jda.core.EmbedBuilder) Module(fredboat.definitions.Module) Context(fredboat.messaging.internal.Context) Nonnull(javax.annotation.Nonnull) DestroyCommand(fredboat.command.music.control.DestroyCommand) PermsUtil(fredboat.perms.PermsUtil) IInfoCommand(fredboat.commandmeta.abs.IInfoCommand) Command(fredboat.commandmeta.abs.Command) DestroyCommand(fredboat.command.music.control.DestroyCommand) ICommandRestricted(fredboat.commandmeta.abs.ICommandRestricted) DestroyCommand(fredboat.command.music.control.DestroyCommand)

Aggregations

CommandContext (fredboat.commandmeta.abs.CommandContext)12 Command (fredboat.commandmeta.abs.Command)11 Context (fredboat.messaging.internal.Context)10 TextUtils (fredboat.util.TextUtils)10 Nonnull (javax.annotation.Nonnull)10 CentralMessaging (fredboat.messaging.CentralMessaging)7 HelpCommand (fredboat.command.info.HelpCommand)6 ICommandRestricted (fredboat.commandmeta.abs.ICommandRestricted)5 PermissionLevel (fredboat.definitions.PermissionLevel)5 Launcher (fredboat.main.Launcher)4 Collectors (java.util.stream.Collectors)4 Guild (net.dv8tion.jda.core.entities.Guild)4 GuildPlayer (fredboat.audio.player.GuildPlayer)3 IModerationCommand (fredboat.commandmeta.abs.IModerationCommand)3 Module (fredboat.definitions.Module)3 Metrics (fredboat.feature.metrics.Metrics)3 PermsUtil (fredboat.perms.PermsUtil)3 ArgumentUtil (fredboat.util.ArgumentUtil)3 DiscordUtil (fredboat.util.DiscordUtil)3 Consumer (java.util.function.Consumer)3