Search in sources :

Example 1 with Variables

use of ml.duncte123.skybot.Variables in project SkyBot by duncte123.

the class SQLiteTimers method checkUnbansAndUnmutes.

private static void checkUnbansAndUnmutes(Variables variables) {
    variables.getDatabaseAdapter().getExpiredBansAndMutes((bans, mutes) -> {
        final DatabaseAdapter adapter = variables.getDatabaseAdapter();
        handleUnban(bans, adapter, variables);
        handleUnmute(mutes, adapter, variables);
        return null;
    });
}
Also used : DatabaseAdapter(ml.duncte123.skybot.adapters.DatabaseAdapter)

Example 2 with Variables

use of ml.duncte123.skybot.Variables 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 3 with Variables

use of ml.duncte123.skybot.Variables in project SkyBot by duncte123.

the class MessageListener method doAutoModChecks.

private boolean doAutoModChecks(@Nonnull GuildMessageReceivedEvent event, GuildSetting settings, String raw) {
    final Guild guild = event.getGuild();
    if (guild.getSelfMember().hasPermission(Permission.MESSAGE_MANAGE) && !Objects.requireNonNull(event.getMember()).hasPermission(Permission.MESSAGE_MANAGE)) {
        checkMessageForInvites(guild, event, settings, raw);
        final Message messageToCheck = event.getMessage();
        final DunctebotGuild dbG = new DunctebotGuild(event.getGuild(), variables);
        if (blacklistedWordCheck(dbG, messageToCheck, event.getMember(), settings.getBlacklistedWords())) {
            return true;
        }
        if (checkSwearFilter(messageToCheck, event, dbG)) {
            return true;
        }
        checkSpamFilter(messageToCheck, event, settings, dbG);
    }
    return false;
}
Also used : DunctebotGuild(ml.duncte123.skybot.entities.jda.DunctebotGuild) DunctebotGuild(ml.duncte123.skybot.entities.jda.DunctebotGuild)

Example 4 with Variables

use of ml.duncte123.skybot.Variables 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 5 with Variables

use of ml.duncte123.skybot.Variables in project SkyBot by duncte123.

the class MessageListener method onMessageBulkDelete.

@SuppressWarnings("PMD.UseConcurrentHashMap")
protected void onMessageBulkDelete(final MessageBulkDeleteEvent event) {
    this.handlerThread.submit(() -> {
        try {
            final DunctebotGuild guild = new DunctebotGuild(event.getGuild(), variables);
            if (!guild.getSettings().isMessageLogging()) {
                // just delete the message here as we don't want to keep it around
                this.redis.deleteMessages(event.getMessageIds());
                return;
            }
            final List<MessageData> dataList = this.redis.getAndDeleteMessages(event.getMessageIds());
            final StringBuilder builder = new StringBuilder();
            // temporarily store the users to prevent spamming discord for the data
            final Map<Long, User> tmpUsers = new HashMap<>();
            final JDA jda = event.getJDA();
            // reverse the list to preserve the correct order
            Collections.reverse(dataList);
            for (final MessageData data : dataList) {
                final long authorId = data.getAuthorId();
                final Consumer<User> userConsumer = (user) -> {
                    builder.append('[').append(data.getCratedAt().format(DateTimeFormatter.RFC_1123_DATE_TIME)).append("] (").append(user.getAsTag()).append(" - ").append(user.getIdLong()).append(") [").append(data.getMessageId()).append("]: ").append(data.getContent()).append('\n');
                };
                if (tmpUsers.containsKey(authorId)) {
                    userConsumer.accept(tmpUsers.get(authorId));
                } else {
                    // try to fetch the user since we don't cache them
                    // calls are sequential making sure the messages are still in order
                    jda.retrieveUserById(authorId).queue((user) -> {
                        tmpUsers.put(authorId, user);
                        userConsumer.accept(user);
                    }, (error) -> userConsumer.accept(new UnknownUser(authorId)));
                }
            }
            final TextChannel channel = event.getChannel();
            final EmbedBuilder embed = EmbedUtils.embedField("Bulk Delete", "Bulk deleted messages from <#%s> are available in the attached file.".formatted(channel.getIdLong())).setColor(0xE67E22).setTimestamp(Instant.now());
            modLog(new MessageConfig.Builder().addEmbed(true, embed).setActionConfig((action) -> action.addFile(builder.toString().getBytes(), "bulk_delete_%s.txt".formatted(System.currentTimeMillis()))), guild);
        } catch (Exception e) {
            LOGGER.error("Exception on message bulk delete", e);
        }
    });
}
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) UnknownUser(ml.duncte123.skybot.objects.user.UnknownUser) UnknownUser(ml.duncte123.skybot.objects.user.UnknownUser) MessageData(ml.duncte123.skybot.objects.discord.MessageData) JDA(net.dv8tion.jda.api.JDA) DunctebotGuild(ml.duncte123.skybot.entities.jda.DunctebotGuild) EmbedBuilder(net.dv8tion.jda.api.EmbedBuilder) MessageConfig(me.duncte123.botcommons.messaging.MessageConfig)

Aggregations

DunctebotGuild (ml.duncte123.skybot.entities.jda.DunctebotGuild)8 CommandContext (ml.duncte123.skybot.objects.command.CommandContext)8 MessageData (ml.duncte123.skybot.objects.discord.MessageData)8 GuildSetting (com.dunctebot.models.settings.GuildSetting)6 CustomCommand (ml.duncte123.skybot.objects.command.custom.CustomCommand)6 UnknownUser (ml.duncte123.skybot.objects.user.UnknownUser)6 EmbedBuilder (net.dv8tion.jda.api.EmbedBuilder)6 MessageConfig (me.duncte123.botcommons.messaging.MessageConfig)4 DatabaseAdapter (ml.duncte123.skybot.adapters.DatabaseAdapter)4 Parser (com.jagrosh.jagtag.Parser)2 TLongLongMap (gnu.trove.map.TLongLongMap)2 TLongLongHashMap (gnu.trove.map.hash.TLongLongHashMap)2 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