added logging of message deleted

This commit is contained in:
Sheldan
2020-03-20 19:57:19 +01:00
parent 35f976aaa4
commit ff29edbdac
7 changed files with 136 additions and 11 deletions

View File

@@ -0,0 +1,48 @@
package dev.sheldan.abstracto.moderation.listener;
import dev.sheldan.abstracto.core.ContextUtils;
import dev.sheldan.abstracto.core.models.database.PostTarget;
import dev.sheldan.abstracto.core.service.MessageCache;
import dev.sheldan.abstracto.core.service.PostTargetService;
import dev.sheldan.abstracto.moderation.models.template.listener.MessageDeletedLog;
import dev.sheldan.abstracto.templating.TemplateService;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.events.message.guild.GuildMessageDeleteEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Nonnull;
@Component
public class MessageDeletedListener extends ListenerAdapter {
private static String MESSAGE_DELETED_TEMPLATE = "message_deleted";
@Autowired
private MessageCache messageCache;
@Autowired
private ContextUtils contextUtils;
@Autowired
private TemplateService templateService;
@Autowired
private PostTargetService postTargetService;
@Override
@Transactional
public void onGuildMessageDelete(@Nonnull GuildMessageDeleteEvent event) {
Message messageFromCache = messageCache.getMessageFromCache(event.getMessageIdLong(),
event.getChannel().getIdLong(), event.getGuild().getIdLong());
MessageDeletedLog logModel = (MessageDeletedLog) contextUtils.fromMessage(messageFromCache, MessageDeletedLog.class);
logModel.setMessage(messageFromCache);
String simpleMessageUpdatedMessage = templateService.renderTemplate(MESSAGE_DELETED_TEMPLATE, logModel);
postTargetService.sendTextInPostTarget(simpleMessageUpdatedMessage, PostTarget.EDIT_LOG, event.getGuild().getIdLong());
messageFromCache.getAttachments().forEach(attachment -> {
});
}
}

View File

@@ -0,0 +1,2 @@
Message from ${member.effectiveName} (${member.idLong?c}) deleted in ${textChannel.asMention}.
Message: ${message.contentRaw}

View File

@@ -0,0 +1,12 @@
package dev.sheldan.abstracto.moderation.models.template.listener;
import dev.sheldan.abstracto.core.models.UserInitiatedServerContext;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.SuperBuilder;
import net.dv8tion.jda.api.entities.Message;
@Getter @Setter @SuperBuilder
public class MessageDeletedLog extends UserInitiatedServerContext {
private Message message;
}

View File

@@ -28,17 +28,29 @@ public class MessageCacheBean implements MessageCache {
@Cacheable(key = "#message.id")
public Message getMessageFromCache(Message message) {
log.debug("Retrieving message {}", message.getId());
Guild guildById = bot.getInstance().getGuildById(message.getGuild().getIdLong());
return getMessageInTextChannelOfGuild(message.getIdLong(), message.getTextChannel().getIdLong(), message.getGuild().getIdLong());
}
@Override
@Cacheable(key = "#messageId.toString()")
public Message getMessageFromCache(Long messageId, Long textChannelId, Long guildId) {
log.info("Retrieving message with parameters");
return getMessageInTextChannelOfGuild(messageId, textChannelId, guildId);
}
private Message getMessageInTextChannelOfGuild(Long messageId, Long textChannelId, Long guildId) {
Guild guildById = bot.getInstance().getGuildById(guildId);
if(guildById != null) {
TextChannel textChannelById = guildById.getTextChannelById(message.getTextChannel().getIdLong());
TextChannel textChannelById = guildById.getTextChannelById(textChannelId);
if(textChannelById != null) {
return textChannelById.retrieveMessageById(message.getId()).complete();
return textChannelById.retrieveMessageById(messageId).complete();
} else {
log.warn("Failed to load text channel {} of message {} in guild {}", message.getTextChannel().getIdLong(), message.getId(), message.getGuild().getId());
log.warn("Failed to load text channel {} of message {} in guild {}", textChannelId, messageId, guildId);
}
} else {
log.warn("Failed to guild {} of message {}", message.getGuild().getIdLong(), message.getId());
log.warn("Failed to guild {} of message {}", guildId, messageId);
}
throw new RuntimeException("Message was not found");
}
}

View File

@@ -0,0 +1,49 @@
package dev.sheldan.abstracto.core;
import dev.sheldan.abstracto.core.management.ChannelManagementService;
import dev.sheldan.abstracto.core.management.ServerManagementService;
import dev.sheldan.abstracto.core.management.UserManagementService;
import dev.sheldan.abstracto.core.models.UserInitiatedServerContext;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.entities.Message;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
@Component
@Slf4j
public class ContextUtils {
@Autowired
private ChannelManagementService channelManagementService;
@Autowired
private UserManagementService userManagementService;
@Autowired
private ServerManagementService serverManagementService;
public <T extends UserInitiatedServerContext> UserInitiatedServerContext fromMessage(Message message, Class<T> clazz) {
Method m = null;
try {
m = clazz.getMethod("builder");
UserInitiatedServerContext.UserInitiatedServerContextBuilder<?, ?> builder = (UserInitiatedServerContext.UserInitiatedServerContextBuilder) m.invoke(null, null);
AUserInAServer aUserInAServer = userManagementService.loadUser(message.getMember());
return builder
.member(message.getMember())
.guild(message.getGuild())
.textChannel(message.getTextChannel())
.channel(channelManagementService.loadChannel(message.getTextChannel().getIdLong()))
.server(serverManagementService.loadServer(message.getGuild().getIdLong()))
.aUserInAServer(aUserInAServer)
.user(aUserInAServer.getUserReference())
.build();
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
log.error("Failed to execute builder method", e);
}
throw new RuntimeException("Failed to create model from message");
}
}

View File

@@ -32,12 +32,13 @@ public class PostTarget {
@Getter @Setter
private AServer serverReference;
public static String JOIN_LOG = "joinlog";
public static String LEAVE_LOG = "leavelog";
public static String WARN_LOG = "warnlog";
public static String KICK_LOG = "kicklog";
public static String BAN_LOG = "banlog";
public static String JOIN_LOG = "joinLog";
public static String LEAVE_LOG = "leaveLog";
public static String WARN_LOG = "warnLog";
public static String KICK_LOG = "kickLog";
public static String BAN_LOG = "banLog";
public static String EDIT_LOG = "editLog";
public static String DELETE_LOG = "deleteLog";
public static List<String> AVAILABLE_POST_TARGETS = Arrays.asList(JOIN_LOG, LEAVE_LOG, WARN_LOG, KICK_LOG, BAN_LOG, EDIT_LOG);
public static List<String> AVAILABLE_POST_TARGETS = Arrays.asList(JOIN_LOG, LEAVE_LOG, WARN_LOG, KICK_LOG, BAN_LOG, EDIT_LOG, DELETE_LOG);
}

View File

@@ -5,4 +5,5 @@ import net.dv8tion.jda.api.entities.Message;
public interface MessageCache {
Message putMessageInCache(Message message);
Message getMessageFromCache(Message message);
Message getMessageFromCache(Long messageId, Long textChannelId, Long guildId);
}