Search in sources :

Example 6 with GuildSetting

use of com.dunctebot.models.settings.GuildSetting in project SkyBot by duncte123.

the class MessageListener method onGuildMessageUpdate.

protected void onGuildMessageUpdate(GuildMessageUpdateEvent event) {
    // ignore bots
    final Message message = event.getMessage();
    final User author = message.getAuthor();
    if (author.isBot() || author.isSystem() || message.isWebhookMessage() || event.getMember() == null) {
        return;
    }
    if (topicContains(event.getChannel(), PROFANITY_DISABLE)) {
        return;
    }
    this.handlerThread.submit(() -> {
        try {
            final DunctebotGuild guild = new DunctebotGuild(event.getGuild(), variables);
            final GuildSetting settings = guild.getSettings();
            if (settings.isMessageLogging()) {
                final MessageData edited = MessageData.from(message);
                final MessageData original = this.redis.getAndUpdateMessage(message.getId(), edited, isGuildPatron(guild));
                // data will be null if the message expired
                if (original != null) {
                    this.logEditedMessage(original, edited, guild);
                }
            }
            if (guild.getSelfMember().hasPermission(Permission.MESSAGE_MANAGE) && !event.getMember().hasPermission(Permission.MESSAGE_MANAGE)) {
                if (blacklistedWordCheck(guild, message, event.getMember(), settings.getBlacklistedWords())) {
                    return;
                }
                checkSwearFilter(message, event, guild);
            }
        } catch (Exception e) {
            LOGGER.error("Exception on message update", e);
        }
    });
}
Also used : DunctebotGuild(ml.duncte123.skybot.entities.jda.DunctebotGuild) UnknownUser(ml.duncte123.skybot.objects.user.UnknownUser) MessageData(ml.duncte123.skybot.objects.discord.MessageData) GuildSetting(com.dunctebot.models.settings.GuildSetting)

Example 7 with GuildSetting

use of com.dunctebot.models.settings.GuildSetting in project SkyBot by duncte123.

the class MessageListener method checkMessageForInvites.

// / <editor-fold desc="auto moderation" defaultstate="collapsed">
private void checkMessageForInvites(Guild guild, GuildMessageReceivedEvent event, GuildSetting settings, String raw) {
    if (settings.isFilterInvites() && guild.getSelfMember().hasPermission(Permission.MANAGE_SERVER)) {
        final Matcher matcher = Message.INVITE_PATTERN.matcher(raw);
        if (matcher.find()) {
            // Get the invite Id from the message
            final String inviteID = matcher.group(matcher.groupCount());
            // Prohibiting failure because the bot is currently banned from the other guild.
            guild.retrieveInvites().queue((invites) -> {
                // Check if the invite is for this guild, if it is not delete the message
                if (invites.stream().noneMatch((invite) -> invite.getCode().equals(inviteID))) {
                    event.getMessage().delete().reason("Contained unauthorized invite.").queue((it) -> sendMsg(MessageConfig.Builder.fromEvent(event).setMessage(event.getAuthor().getAsMention() + ", please don't post invite links here.").setSuccessAction(m -> m.delete().queueAfter(4, TimeUnit.SECONDS)).build()), new ErrorHandler().ignore(UNKNOWN_MESSAGE, MISSING_PERMISSIONS));
                }
            });
        }
    }
}
Also used : MessageData(ml.duncte123.skybot.objects.discord.MessageData) MessageBulkDeleteEvent(net.dv8tion.jda.api.events.message.MessageBulkDeleteEvent) EmbedUtils(me.duncte123.botcommons.messaging.EmbedUtils) StringUtils(me.duncte123.botcommons.StringUtils) Permission(net.dv8tion.jda.api.Permission) CommandCategory(ml.duncte123.skybot.objects.command.CommandCategory) PerspectiveApi(ml.duncte123.skybot.utils.PerspectiveApi) UNKNOWN_MESSAGE(net.dv8tion.jda.api.requests.ErrorResponse.UNKNOWN_MESSAGE) SpamFilter(ml.duncte123.skybot.utils.SpamFilter) Matcher(java.util.regex.Matcher) GuildSettingsUtils(ml.duncte123.skybot.utils.GuildSettingsUtils) GuildMessageReceivedEvent(net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent) GuildSetting(com.dunctebot.models.settings.GuildSetting) GuildMessageUpdateEvent(net.dv8tion.jda.api.events.message.guild.GuildMessageUpdateEvent) Variables(ml.duncte123.skybot.Variables) Instant(java.time.Instant) Collectors(java.util.stream.Collectors) Executors(java.util.concurrent.Executors) UnknownUser(ml.duncte123.skybot.objects.user.UnknownUser) Pattern(java.util.regex.Pattern) MISSING_PERMISSIONS(net.dv8tion.jda.api.requests.ErrorResponse.MISSING_PERMISSIONS) ICommand(ml.duncte123.skybot.objects.command.ICommand) net.dv8tion.jda.api.entities(net.dv8tion.jda.api.entities) BotCommons(me.duncte123.botcommons.BotCommons) java.util(java.util) JDA(net.dv8tion.jda.api.JDA) MarkdownSanitizer(net.dv8tion.jda.api.utils.MarkdownSanitizer) CustomCommand(ml.duncte123.skybot.objects.command.custom.CustomCommand) GuildMessageDeleteEvent(net.dv8tion.jda.api.events.message.guild.GuildMessageDeleteEvent) MessageUtils(me.duncte123.botcommons.messaging.MessageUtils) ScheduledExecutorService(java.util.concurrent.ScheduledExecutorService) Sentry(io.sentry.Sentry) Nonnull(javax.annotation.Nonnull) Nullable(javax.annotation.Nullable) ErrorHandler(net.dv8tion.jda.api.exceptions.ErrorHandler) GenericGuildMessageEvent(net.dv8tion.jda.api.events.message.guild.GenericGuildMessageEvent) CommandUtils.isGuildPatron(ml.duncte123.skybot.utils.CommandUtils.isGuildPatron) ShardManager(net.dv8tion.jda.api.sharding.ShardManager) MessageUtils.sendMsg(me.duncte123.botcommons.messaging.MessageUtils.sendMsg) CommandContext(ml.duncte123.skybot.objects.command.CommandContext) CommandUtils.isDev(ml.duncte123.skybot.utils.CommandUtils.isDev) ModerationUtils.modLog(ml.duncte123.skybot.utils.ModerationUtils.modLog) CommandManager(ml.duncte123.skybot.CommandManager) DunctebotGuild(ml.duncte123.skybot.entities.jda.DunctebotGuild) EmbedBuilder(net.dv8tion.jda.api.EmbedBuilder) AirUtils.setJDAContext(ml.duncte123.skybot.utils.AirUtils.setJDAContext) Triple(kotlin.Triple) Settings(ml.duncte123.skybot.Settings) TimeUnit(java.util.concurrent.TimeUnit) Consumer(java.util.function.Consumer) MessageConfig(me.duncte123.botcommons.messaging.MessageConfig) RedisConnection(ml.duncte123.skybot.database.RedisConnection) DateTimeFormatter(java.time.format.DateTimeFormatter) ErrorHandler(net.dv8tion.jda.api.exceptions.ErrorHandler) Matcher(java.util.regex.Matcher)

Example 8 with GuildSetting

use of com.dunctebot.models.settings.GuildSetting in project SkyBot by duncte123.

the class MessageListener method handleMessageEventChecked.

private void handleMessageEventChecked(String raw, Guild guild, GuildMessageReceivedEvent event) {
    final GuildSetting settings = GuildSettingsUtils.getGuild(guild.getIdLong(), this.variables);
    final String customPrefix = settings.getCustomPrefix();
    final Message message = event.getMessage();
    if (settings.isMessageLogging()) {
        final MessageData data = MessageData.from(message);
        this.redis.storeMessage(data, isGuildPatron(guild));
    }
    if (!commandManager.isCommand(customPrefix, raw) && doAutoModChecks(event, settings, raw)) {
        return;
    }
    final User selfUser = event.getJDA().getSelfUser();
    final long selfId = selfUser.getIdLong();
    final String selfRegex = "<@!?" + selfId + '>';
    if (raw.matches(selfRegex)) {
        sendMsg(new MessageConfig.Builder().setChannel(event.getChannel()).setMessageFormat("Hey %s, try `%shelp` for a list of commands. If it doesn't work scream at _duncte123#1245_", event.getAuthor(), customPrefix).build());
        return;
    }
    final String[] split = raw.replaceFirst(Pattern.quote(Settings.PREFIX), "").split("\\s+");
    final List<CustomCommand> autoResponses = commandManager.getAutoResponses(guild.getIdLong());
    if (!autoResponses.isEmpty() && invokeAutoResponse(autoResponses, split, event)) {
        return;
    }
    if (doesNotStartWithPrefix(selfId, raw, customPrefix) || !canRunCommands(raw, customPrefix, event)) {
        return;
    }
    if (raw.matches(selfRegex + "(.*)")) {
        // Handle the chat command
        Objects.requireNonNull(commandManager.getCommand("chat")).executeCommand(new CommandContext("chat", Arrays.asList(split).subList(1, split.length), event, variables));
    } else {
        // Handle the command
        commandManager.runCommand(event, customPrefix);
    }
}
Also used : UnknownUser(ml.duncte123.skybot.objects.user.UnknownUser) CustomCommand(ml.duncte123.skybot.objects.command.custom.CustomCommand) CommandContext(ml.duncte123.skybot.objects.command.CommandContext) MessageData(ml.duncte123.skybot.objects.discord.MessageData) EmbedBuilder(net.dv8tion.jda.api.EmbedBuilder) GuildSetting(com.dunctebot.models.settings.GuildSetting)

Example 9 with GuildSetting

use of com.dunctebot.models.settings.GuildSetting in project SkyBot by duncte123.

the class MessageListener method checkSwearFilter.

private boolean checkSwearFilter(Message messageToCheck, GenericGuildMessageEvent event, DunctebotGuild guild) {
    final GuildSetting settings = guild.getSettings();
    if (settings.isEnableSwearFilter() && !topicContains(event.getChannel(), PROFANITY_DISABLE)) {
        final float score = PerspectiveApi.checkSwearFilter(messageToCheck.getContentRaw(), event.getChannel().getId(), variables.getConfig().apis.googl, settings.getFilterType(), variables.getJackson());
        // if the score is less than our target value it's not swearing
        if (score < settings.getAiSensitivity()) {
            return false;
        }
        final String display = messageToCheck.getContentDisplay();
        messageToCheck.delete().reason("Blocked for swearing: " + display).queue(null, new ErrorHandler().ignore(UNKNOWN_MESSAGE, MISSING_PERMISSIONS));
        sendMsg(new MessageConfig.Builder().setChannel(event.getChannel()).setMessageFormat(// TODO: allow patrons to customise this message
        "Hello there, %s please do not use cursive language within this server.", messageToCheck.getAuthor().getAsMention()).setSuccessAction((m) -> m.delete().queueAfter(5, TimeUnit.SECONDS, null, new ErrorHandler().ignore(UNKNOWN_MESSAGE, MISSING_PERMISSIONS))).build());
        modLog(String.format("Message with score %.2f by %#s deleted in %s for profanity, message content was:```\n%s```", score, messageToCheck.getAuthor(), event.getChannel().getAsMention(), // Just to be safe
        StringUtils.abbreviate(display, Message.MAX_CONTENT_LENGTH - 150)), guild);
        return true;
    }
    return false;
}
Also used : ErrorHandler(net.dv8tion.jda.api.exceptions.ErrorHandler) MessageConfig(me.duncte123.botcommons.messaging.MessageConfig) GuildSetting(com.dunctebot.models.settings.GuildSetting)

Example 10 with GuildSetting

use of com.dunctebot.models.settings.GuildSetting in project SkyBot by duncte123.

the class UnmuteCommand method execute.

@Override
public void execute(@Nonnull CommandContext ctx) {
    final List<Member> mentioned = ctx.getMentionedArg(0);
    if (mentioned.isEmpty()) {
        this.sendUsageInstructions(ctx);
        return;
    }
    final GuildSetting settings = ctx.getGuildSettings();
    if (settings.getMuteRoleId() <= 0) {
        sendMsg(ctx, "No mute/spamrole is set, use `" + ctx.getPrefix() + "muterole <Role>` to set it");
        return;
    }
    final Role role = ctx.getGuild().getRoleById(settings.getMuteRoleId());
    if (role == null) {
        sendMsg(ctx, "The current mute role does not exist on this server, please contact your server administrator about this.");
        return;
    }
    final Member toMute = mentioned.get(0);
    final Member mod = ctx.getMember();
    if (!canInteract(mod, toMute, "unmute", ctx.getChannel())) {
        return;
    }
    final Member self = ctx.getSelfMember();
    if (!self.canInteract(role)) {
        sendMsg(ctx, "I cannot unmute this member, is the mute role above mine?");
        return;
    }
    String reason = "";
    final var flags = ctx.getParsedFlags(this);
    final List<String> args = ctx.getArgs();
    if (flags.containsKey("r")) {
        reason = String.join(" ", flags.get("r"));
    } else if (args.size() > 1) {
        final var example = "\nExample: `%sunmute %s -r %s`".formatted(ctx.getPrefix(), args.get(0), String.join(" ", args.subList(1, args.size())));
        sendMsg(ctx, "Hint: if you want to set a reason, use the `-r` flag" + example);
    }
    final String fReason = reason;
    ctx.getGuild().removeRoleFromMember(toMute, role).reason("Unmute by " + String.format("%#s: %s", ctx.getAuthor(), fReason)).queue(success -> {
        ModerationUtils.modLog(ctx.getAuthor(), toMute.getUser(), "unmuted", fReason, null, ctx.getGuild());
        sendSuccess(ctx.getMessage());
    });
}
Also used : Role(net.dv8tion.jda.api.entities.Role) GuildSetting(com.dunctebot.models.settings.GuildSetting) Member(net.dv8tion.jda.api.entities.Member)

Aggregations

GuildSetting (com.dunctebot.models.settings.GuildSetting)18 MessageData (ml.duncte123.skybot.objects.discord.MessageData)6 UnknownUser (ml.duncte123.skybot.objects.user.UnknownUser)6 EmbedBuilder (net.dv8tion.jda.api.EmbedBuilder)6 Member (net.dv8tion.jda.api.entities.Member)6 Role (net.dv8tion.jda.api.entities.Role)6 MessageConfig (me.duncte123.botcommons.messaging.MessageConfig)4 DunctebotGuild (ml.duncte123.skybot.entities.jda.DunctebotGuild)4 CommandContext (ml.duncte123.skybot.objects.command.CommandContext)4 CustomCommand (ml.duncte123.skybot.objects.command.custom.CustomCommand)4 Guild (net.dv8tion.jda.api.entities.Guild)4 ErrorHandler (net.dv8tion.jda.api.exceptions.ErrorHandler)3 Sentry (io.sentry.Sentry)2 Instant (java.time.Instant)2 DateTimeFormatter (java.time.format.DateTimeFormatter)2 java.util (java.util)2 Executors (java.util.concurrent.Executors)2 ScheduledExecutorService (java.util.concurrent.ScheduledExecutorService)2 TimeUnit (java.util.concurrent.TimeUnit)2 Consumer (java.util.function.Consumer)2