Search in sources :

Example 1 with GuildMessage

use of com.sx4.bot.entities.cache.GuildMessage in project Sx4 by sx4-discord-bot.

the class LoggerHandler method handleBulkMessages.

public void handleBulkMessages(TextChannel textChannel, List<String> messageIds, List<Document> loggers, LoggerEvent loggerEvent, User moderator) {
    Guild guild = textChannel.getGuild();
    for (Document logger : loggers) {
        if ((logger.get("events", LoggerEvent.ALL) & loggerEvent.getRaw()) != loggerEvent.getRaw()) {
            continue;
        }
        long channelId = logger.getLong("channelId");
        TextChannel channel = guild.getTextChannelById(channelId);
        if (channel == null) {
            continue;
        }
        List<Document> entities = logger.getEmbedded(List.of("blacklist", "entities"), Collections.emptyList());
        List<WebhookEmbed> embeds = new ArrayList<>();
        for (String messageId : messageIds) {
            WebhookEmbedBuilder embed = new WebhookEmbedBuilder().setColor(this.bot.getConfig().getRed()).setTimestamp(Instant.now()).setFooter(new EmbedFooter("Message ID: " + messageId, null));
            LoggerContext loggerContext = new LoggerContext().setChannel(textChannel);
            if (moderator != null) {
                loggerContext.setModerator(moderator);
            }
            String reason = moderator == null ? "in a bulk delete" : "by **" + moderator.getAsTag() + "**";
            GuildMessage message = this.bot.getMessageCache().getMessageById(messageId);
            if (message == null) {
                if (!LoggerUtility.isWhitelisted(entities, loggerEvent, loggerContext)) {
                    continue;
                }
                embed.setDescription(String.format("A message sent in %s was deleted %s", textChannel.getAsMention(), reason));
                embed.setAuthor(new EmbedAuthor(guild.getName(), guild.getIconUrl(), null));
            } else {
                User author = message.getAuthor();
                loggerContext.setUser(author);
                if (!LoggerUtility.isWhitelisted(entities, loggerEvent, loggerContext)) {
                    continue;
                }
                embed.setDescription(String.format("The message sent by `%s` in %s was deleted %s", author.getName(), textChannel.getAsMention(), reason));
                embed.setAuthor(new EmbedAuthor(author.getAsTag(), author.getEffectiveAvatarUrl(), null));
                String content = message.getContent();
                if (!content.isBlank()) {
                    embed.addField(new EmbedField(false, "Message", StringUtility.limit(content, MessageEmbed.VALUE_MAX_LENGTH, "...")));
                }
            }
            embeds.add(embed.build());
        }
        this.getManager(channelId).queue(channel, logger, embeds);
    }
}
Also used : EmbedField(club.minnced.discord.webhook.send.WebhookEmbed.EmbedField) Document(org.bson.Document) LoggerContext(com.sx4.bot.entities.management.LoggerContext) EmbedFooter(club.minnced.discord.webhook.send.WebhookEmbed.EmbedFooter) WebhookEmbed(club.minnced.discord.webhook.send.WebhookEmbed) GuildMessage(com.sx4.bot.entities.cache.GuildMessage) EmbedAuthor(club.minnced.discord.webhook.send.WebhookEmbed.EmbedAuthor) WebhookEmbedBuilder(club.minnced.discord.webhook.send.WebhookEmbedBuilder)

Example 2 with GuildMessage

use of com.sx4.bot.entities.cache.GuildMessage in project Sx4 by sx4-discord-bot.

the class LoggerHandler method onGuildMessageDelete.

public void onGuildMessageDelete(GuildMessageDeleteEvent event) {
    TextChannel channel = event.getChannel();
    Guild guild = event.getGuild();
    LoggerEvent loggerEvent = LoggerEvent.MESSAGE_DELETE;
    LoggerContext loggerContext = new LoggerContext().setChannel(channel);
    GuildMessage message = this.bot.getMessageCache().getMessageById(event.getMessageIdLong());
    if (message != null) {
        loggerContext.setUser(message.getAuthor());
    }
    this.bot.getMongo().aggregateLoggers(this.getPipeline(guild.getIdLong())).whenComplete((documents, exception) -> {
        if (ExceptionUtility.sendErrorMessage(exception)) {
            return;
        }
        if (documents.isEmpty()) {
            return;
        }
        Document data = documents.get(0);
        List<Document> loggers = LoggerUtility.getValidLoggers(data.getList("loggers", Document.class), loggerEvent, loggerContext);
        if (loggers.isEmpty()) {
            return;
        }
        WebhookEmbedBuilder embed = new WebhookEmbedBuilder().setColor(this.bot.getConfig().getRed()).setTimestamp(Instant.now()).setFooter(new EmbedFooter("Message ID: " + event.getMessageId(), null));
        StringBuilder description = new StringBuilder();
        if (message == null) {
            description.append(String.format("A message sent in %s was deleted", channel.getAsMention()));
            embed.setAuthor(new EmbedAuthor(guild.getName(), guild.getIconUrl(), null));
        } else {
            User author = message.getAuthor();
            description.append(String.format("The message sent by `%s` in %s was deleted", author.getAsTag(), channel.getAsMention()));
            embed.setAuthor(new EmbedAuthor(author.getAsTag(), author.getEffectiveAvatarUrl(), null));
            String content = message.getContent();
            if (!content.isBlank()) {
                embed.addField(new EmbedField(false, "Message", StringUtility.limit(content, MessageEmbed.VALUE_MAX_LENGTH, "...")));
            }
        }
        if (guild.getSelfMember().hasPermission(Permission.VIEW_AUDIT_LOGS)) {
            this.retrieveAuditLogsDelayed(guild, ActionType.MESSAGE_DELETE).whenComplete((logs, auditException) -> {
                this.messageCache.putIfAbsent(guild.getIdLong(), new TLongIntHashMap());
                TLongIntMap guildCache = this.messageCache.get(guild.getIdLong());
                AuditLogEntry entry = logs == null ? null : logs.stream().filter(e -> Duration.between(e.getTimeCreated(), ZonedDateTime.now(ZoneOffset.UTC)).toMinutes() <= 5).filter(e -> Long.parseLong(e.getOptionByName("channel_id")) == channel.getIdLong()).filter(e -> {
                    int count = Integer.parseInt(e.getOptionByName("count"));
                    int oldCount = guildCache.get(e.getIdLong());
                    guildCache.put(e.getIdLong(), count);
                    return (count == 1 && count != oldCount) || count > oldCount;
                }).findFirst().orElse(null);
                User moderator = entry == null ? null : entry.getUser();
                if (moderator != null) {
                    loggerContext.setModerator(moderator);
                    description.append(" by **").append(moderator.getAsTag()).append("**");
                }
                embed.setDescription(description.toString());
                this.queue(guild, loggers, loggerEvent, loggerContext, embed.build());
            });
            return;
        }
        embed.setDescription(description.toString());
        this.queue(guild, loggers, loggerEvent, loggerContext, embed.build());
    });
}
Also used : TLongIntMap(gnu.trove.map.TLongIntMap) MessageBulkDeleteEvent(net.dv8tion.jda.api.events.message.MessageBulkDeleteEvent) Document(org.bson.Document) PermissionOverrideCreateEvent(net.dv8tion.jda.api.events.guild.override.PermissionOverrideCreateEvent) RoleCreateEvent(net.dv8tion.jda.api.events.role.RoleCreateEvent) StoreChannelDeleteEvent(net.dv8tion.jda.api.events.channel.store.StoreChannelDeleteEvent) Permission(net.dv8tion.jda.api.Permission) ZonedDateTime(java.time.ZonedDateTime) Aggregates(com.mongodb.client.model.Aggregates) EmoteUpdateRolesEvent(net.dv8tion.jda.api.events.emote.update.EmoteUpdateRolesEvent) AuditLogChange(net.dv8tion.jda.api.audit.AuditLogChange) CategoryCreateEvent(net.dv8tion.jda.api.events.channel.category.CategoryCreateEvent) LoggerManager(com.sx4.bot.managers.LoggerManager) ColourUtility(com.sx4.bot.utility.ColourUtility) TextChannelDeleteEvent(net.dv8tion.jda.api.events.channel.text.TextChannelDeleteEvent) EmoteAddedEvent(net.dv8tion.jda.api.events.emote.EmoteAddedEvent) TextChannelUpdateNameEvent(net.dv8tion.jda.api.events.channel.text.update.TextChannelUpdateNameEvent) TextChannelCreateEvent(net.dv8tion.jda.api.events.channel.text.TextChannelCreateEvent) Duration(java.time.Duration) GenericEvent(net.dv8tion.jda.api.events.GenericEvent) ZoneOffset(java.time.ZoneOffset) LoggerContext(com.sx4.bot.entities.management.LoggerContext) LoggerEvent(com.sx4.bot.entities.management.LoggerEvent) AuditLogKey(net.dv8tion.jda.api.audit.AuditLogKey) PermissionOverrideDeleteEvent(net.dv8tion.jda.api.events.guild.override.PermissionOverrideDeleteEvent) EmbedFooter(club.minnced.discord.webhook.send.WebhookEmbed.EmbedFooter) GuildMessageUpdateEvent(net.dv8tion.jda.api.events.message.guild.GuildMessageUpdateEvent) java.util.concurrent(java.util.concurrent) EmoteUpdateNameEvent(net.dv8tion.jda.api.events.emote.update.EmoteUpdateNameEvent) CategoryDeleteEvent(net.dv8tion.jda.api.events.channel.category.CategoryDeleteEvent) Instant(java.time.Instant) Collectors(java.util.stream.Collectors) GuildBanEvent(net.dv8tion.jda.api.events.guild.GuildBanEvent) GuildMemberRemoveEvent(net.dv8tion.jda.api.events.guild.member.GuildMemberRemoveEvent) EventListener(net.dv8tion.jda.api.hooks.EventListener) CategoryUpdateNameEvent(net.dv8tion.jda.api.events.channel.category.update.CategoryUpdateNameEvent) GuildMemberUpdateNicknameEvent(net.dv8tion.jda.api.events.guild.member.update.GuildMemberUpdateNicknameEvent) NotNull(org.jetbrains.annotations.NotNull) RoleUpdateColorEvent(net.dv8tion.jda.api.events.role.update.RoleUpdateColorEvent) ActionType(net.dv8tion.jda.api.audit.ActionType) net.dv8tion.jda.api.entities(net.dv8tion.jda.api.entities) VoiceChannelUpdateNameEvent(net.dv8tion.jda.api.events.channel.voice.update.VoiceChannelUpdateNameEvent) java.util(java.util) JDA(net.dv8tion.jda.api.JDA) EmbedAuthor(club.minnced.discord.webhook.send.WebhookEmbed.EmbedAuthor) GuildMemberRoleRemoveEvent(net.dv8tion.jda.api.events.guild.member.GuildMemberRoleRemoveEvent) RoleUpdatePermissionsEvent(net.dv8tion.jda.api.events.role.update.RoleUpdatePermissionsEvent) VoiceChannelDeleteEvent(net.dv8tion.jda.api.events.channel.voice.VoiceChannelDeleteEvent) Projections(com.mongodb.client.model.Projections) MongoDatabase(com.sx4.bot.database.mongo.MongoDatabase) TLongIntHashMap(gnu.trove.map.hash.TLongIntHashMap) EmbedField(club.minnced.discord.webhook.send.WebhookEmbed.EmbedField) AuditLogEntry(net.dv8tion.jda.api.audit.AuditLogEntry) Filters(com.mongodb.client.model.Filters) GuildMessageDeleteEvent(net.dv8tion.jda.api.events.message.guild.GuildMessageDeleteEvent) Bson(org.bson.conversions.Bson) Pair(net.dv8tion.jda.internal.utils.tuple.Pair) WebhookEmbedBuilder(club.minnced.discord.webhook.send.WebhookEmbedBuilder) Sx4(com.sx4.bot.core.Sx4) GuildMemberRoleAddEvent(net.dv8tion.jda.api.events.guild.member.GuildMemberRoleAddEvent) WebhookEmbed(club.minnced.discord.webhook.send.WebhookEmbed) EmoteRemovedEvent(net.dv8tion.jda.api.events.emote.EmoteRemovedEvent) Operators(com.sx4.bot.database.mongo.model.Operators) Accumulators(com.mongodb.client.model.Accumulators) TLongIntMap(gnu.trove.map.TLongIntMap) VoiceChannelCreateEvent(net.dv8tion.jda.api.events.channel.voice.VoiceChannelCreateEvent) LoggerUtility(com.sx4.bot.utility.LoggerUtility) RoleUpdateNameEvent(net.dv8tion.jda.api.events.role.update.RoleUpdateNameEvent) StoreChannelUpdateNameEvent(net.dv8tion.jda.api.events.channel.store.update.StoreChannelUpdateNameEvent) TLongObjectHashMap(gnu.trove.map.hash.TLongObjectHashMap) OkHttpClient(okhttp3.OkHttpClient) PermissionOverrideUpdateEvent(net.dv8tion.jda.api.events.guild.override.PermissionOverrideUpdateEvent) net.dv8tion.jda.api.events.guild.voice(net.dv8tion.jda.api.events.guild.voice) StoreChannelCreateEvent(net.dv8tion.jda.api.events.channel.store.StoreChannelCreateEvent) GuildMessage(com.sx4.bot.entities.cache.GuildMessage) GuildUnbanEvent(net.dv8tion.jda.api.events.guild.GuildUnbanEvent) TLongObjectMap(gnu.trove.map.TLongObjectMap) RoleDeleteEvent(net.dv8tion.jda.api.events.role.RoleDeleteEvent) ExceptionUtility(com.sx4.bot.utility.ExceptionUtility) StringUtility(com.sx4.bot.utility.StringUtility) GuildMemberJoinEvent(net.dv8tion.jda.api.events.guild.member.GuildMemberJoinEvent) TLongIntHashMap(gnu.trove.map.hash.TLongIntHashMap) EmbedField(club.minnced.discord.webhook.send.WebhookEmbed.EmbedField) LoggerEvent(com.sx4.bot.entities.management.LoggerEvent) Document(org.bson.Document) LoggerContext(com.sx4.bot.entities.management.LoggerContext) EmbedFooter(club.minnced.discord.webhook.send.WebhookEmbed.EmbedFooter) AuditLogEntry(net.dv8tion.jda.api.audit.AuditLogEntry) GuildMessage(com.sx4.bot.entities.cache.GuildMessage) EmbedAuthor(club.minnced.discord.webhook.send.WebhookEmbed.EmbedAuthor) WebhookEmbedBuilder(club.minnced.discord.webhook.send.WebhookEmbedBuilder)

Example 3 with GuildMessage

use of com.sx4.bot.entities.cache.GuildMessage in project Sx4 by sx4-discord-bot.

the class LoggerHandler method onGuildMessageUpdate.

public void onGuildMessageUpdate(GuildMessageUpdateEvent event) {
    Guild guild = event.getGuild();
    TextChannel textChannel = event.getChannel();
    Member member = event.getMember();
    User user = event.getAuthor();
    Message message = event.getMessage();
    if (message.getTimeEdited() == null) {
        return;
    }
    GuildMessage previousMessage = this.bot.getMessageCache().getMessageById(message.getIdLong());
    if (previousMessage != null && message.isPinned() != previousMessage.isPinned()) {
        return;
    }
    LoggerEvent loggerEvent = LoggerEvent.MESSAGE_UPDATE;
    LoggerContext loggerContext = new LoggerContext().setUser(user).setChannel(textChannel);
    WebhookEmbedBuilder embed = new WebhookEmbedBuilder();
    if (member != null) {
        embed.setDescription(String.format("`%s` edited their [message](%s) in %s", member.getEffectiveName(), message.getJumpUrl(), textChannel.getAsMention()));
    } else {
        embed.setDescription(String.format("`%s` edited their [message](%s) in %s", user.getName(), message.getJumpUrl(), textChannel.getAsMention()));
    }
    embed.setAuthor(new EmbedAuthor(user.getAsTag(), user.getEffectiveAvatarUrl(), null));
    embed.setColor(this.bot.getConfig().getOrange());
    embed.setTimestamp(Instant.now());
    embed.setFooter(new EmbedFooter(String.format("Message ID: %s", message.getId()), null));
    String oldContent = previousMessage == null ? null : previousMessage.getContent();
    if (oldContent != null && !oldContent.isBlank()) {
        embed.addField(new EmbedField(false, "Before", StringUtility.limit(oldContent, MessageEmbed.VALUE_MAX_LENGTH, "...")));
    }
    if (!message.getContentRaw().isBlank()) {
        embed.addField(new EmbedField(false, "After", StringUtility.limit(message.getContentRaw(), MessageEmbed.VALUE_MAX_LENGTH, String.format("[...](%s)", message.getJumpUrl()))));
    }
    this.bot.getMongo().aggregateLoggers(this.getPipeline(guild.getIdLong())).whenComplete((documents, exception) -> {
        if (ExceptionUtility.sendErrorMessage(exception)) {
            return;
        }
        if (documents.isEmpty()) {
            return;
        }
        Document data = documents.get(0);
        this.queue(guild, data.getList("loggers", Document.class), loggerEvent, loggerContext, embed.build());
    });
}
Also used : GuildMessage(com.sx4.bot.entities.cache.GuildMessage) EmbedField(club.minnced.discord.webhook.send.WebhookEmbed.EmbedField) LoggerEvent(com.sx4.bot.entities.management.LoggerEvent) Document(org.bson.Document) LoggerContext(com.sx4.bot.entities.management.LoggerContext) EmbedFooter(club.minnced.discord.webhook.send.WebhookEmbed.EmbedFooter) GuildMessage(com.sx4.bot.entities.cache.GuildMessage) EmbedAuthor(club.minnced.discord.webhook.send.WebhookEmbed.EmbedAuthor) WebhookEmbedBuilder(club.minnced.discord.webhook.send.WebhookEmbedBuilder)

Aggregations

EmbedAuthor (club.minnced.discord.webhook.send.WebhookEmbed.EmbedAuthor)3 EmbedField (club.minnced.discord.webhook.send.WebhookEmbed.EmbedField)3 EmbedFooter (club.minnced.discord.webhook.send.WebhookEmbed.EmbedFooter)3 WebhookEmbedBuilder (club.minnced.discord.webhook.send.WebhookEmbedBuilder)3 GuildMessage (com.sx4.bot.entities.cache.GuildMessage)3 LoggerContext (com.sx4.bot.entities.management.LoggerContext)3 Document (org.bson.Document)3 WebhookEmbed (club.minnced.discord.webhook.send.WebhookEmbed)2 LoggerEvent (com.sx4.bot.entities.management.LoggerEvent)2 Accumulators (com.mongodb.client.model.Accumulators)1 Aggregates (com.mongodb.client.model.Aggregates)1 Filters (com.mongodb.client.model.Filters)1 Projections (com.mongodb.client.model.Projections)1 Sx4 (com.sx4.bot.core.Sx4)1 MongoDatabase (com.sx4.bot.database.mongo.MongoDatabase)1 Operators (com.sx4.bot.database.mongo.model.Operators)1 LoggerManager (com.sx4.bot.managers.LoggerManager)1 ColourUtility (com.sx4.bot.utility.ColourUtility)1 ExceptionUtility (com.sx4.bot.utility.ExceptionUtility)1 LoggerUtility (com.sx4.bot.utility.LoggerUtility)1