mirror of
https://github.com/Sheldan/abstracto.git
synced 2026-04-05 17:07:03 +00:00
added message caching
added message edited log (simple)
This commit is contained in:
@@ -0,0 +1,47 @@
|
|||||||
|
package dev.sheldan.abstracto.moderation.listener;
|
||||||
|
|
||||||
|
import dev.sheldan.abstracto.core.MessageTextUpdatedListener;
|
||||||
|
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.MessageEditedLog;
|
||||||
|
import dev.sheldan.abstracto.templating.TemplateService;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import net.dv8tion.jda.api.entities.Message;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
@Slf4j
|
||||||
|
public class MessageEditedListener implements MessageTextUpdatedListener {
|
||||||
|
|
||||||
|
private static final String MESSAGE_EDITED_TEMPLATE = "message_edited";
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private TemplateService templateService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private PostTargetService postTargetService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private MessageCache messageCache;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional
|
||||||
|
public void execute(Message messageBefore, Message messageAfter) {
|
||||||
|
if(messageBefore.getContentRaw().equals(messageAfter.getContentRaw())){
|
||||||
|
log.debug("Message content was the same. Possible reason was: message was not in cache.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
MessageEditedLog log = MessageEditedLog.
|
||||||
|
builder().
|
||||||
|
messageAfter(messageAfter)
|
||||||
|
.messageBefore(messageBefore)
|
||||||
|
.textChannel(messageAfter.getTextChannel())
|
||||||
|
.guild(messageAfter.getGuild())
|
||||||
|
.member(messageAfter.getMember()).build();
|
||||||
|
String simpleMessageUpdatedMessage = templateService.renderTemplate(MESSAGE_EDITED_TEMPLATE, log);
|
||||||
|
postTargetService.sendTextInPostTarget(simpleMessageUpdatedMessage, PostTarget.EDIT_LOG, messageAfter.getGuild().getIdLong());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
Message from ${member.effectiveName} (${member.idLong?c}) edited in ${textChannel.asMention}.
|
||||||
|
Before: ${messageBefore.contentRaw}
|
||||||
|
After: ${messageAfter.contentRaw}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
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 MessageEditedLog extends UserInitiatedServerContext {
|
||||||
|
private Message messageAfter;
|
||||||
|
private Message messageBefore;
|
||||||
|
}
|
||||||
@@ -92,6 +92,12 @@
|
|||||||
<artifactId>templating-interface</artifactId>
|
<artifactId>templating-interface</artifactId>
|
||||||
<version>${project.version}</version>
|
<version>${project.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.github.ben-manes.caffeine</groupId>
|
||||||
|
<artifactId>caffeine</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
package dev.sheldan.abstracto.core.service;
|
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import net.dv8tion.jda.api.entities.Guild;
|
||||||
|
import net.dv8tion.jda.api.entities.Message;
|
||||||
|
import net.dv8tion.jda.api.entities.TextChannel;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.cache.annotation.CacheConfig;
|
||||||
|
import org.springframework.cache.annotation.CachePut;
|
||||||
|
import org.springframework.cache.annotation.Cacheable;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
@Component @Slf4j
|
||||||
|
@CacheConfig(cacheNames = {"messages"})
|
||||||
|
public class MessageCacheBean implements MessageCache {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private Bot bot;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@CachePut(key = "#message.id")
|
||||||
|
public Message putMessageInCache(Message message) {
|
||||||
|
log.debug("Adding message {} to cache", message.getId());
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Cacheable(key = "#message.id")
|
||||||
|
public Message getMessageFromCache(Message message) {
|
||||||
|
log.debug("Retrieving message {}", message.getId());
|
||||||
|
Guild guildById = bot.getInstance().getGuildById(message.getGuild().getIdLong());
|
||||||
|
if(guildById != null) {
|
||||||
|
TextChannel textChannelById = guildById.getTextChannelById(message.getTextChannel().getIdLong());
|
||||||
|
if(textChannelById != null) {
|
||||||
|
return textChannelById.retrieveMessageById(message.getId()).complete();
|
||||||
|
} else {
|
||||||
|
log.warn("Failed to load text channel {} of message {} in guild {}", message.getTextChannel().getIdLong(), message.getId(), message.getGuild().getId());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
log.warn("Failed to guild {} of message {}", message.getGuild().getIdLong(), message.getId());
|
||||||
|
}
|
||||||
|
throw new RuntimeException("Message was not found");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -24,8 +24,6 @@ public class JoinLeaveListener extends ListenerAdapter {
|
|||||||
|
|
||||||
private static final String USER_JOIN_TEMPLATE = "user_join";
|
private static final String USER_JOIN_TEMPLATE = "user_join";
|
||||||
private static final String USER_LEAVE_TEMPLATE = "user_leave";
|
private static final String USER_LEAVE_TEMPLATE = "user_leave";
|
||||||
@Autowired
|
|
||||||
private PostTargetManagement postTargetManagement;
|
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private ServerManagementService serverManagementService;
|
private ServerManagementService serverManagementService;
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
package dev.sheldan.abstracto.listener;
|
||||||
|
|
||||||
|
import dev.sheldan.abstracto.core.service.MessageCache;
|
||||||
|
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent;
|
||||||
|
import net.dv8tion.jda.api.hooks.ListenerAdapter;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class MessageCacheListener extends ListenerAdapter {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private MessageCache messageCache;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onGuildMessageReceived(@Nonnull GuildMessageReceivedEvent event) {
|
||||||
|
messageCache.putMessageInCache(event.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
package dev.sheldan.abstracto.listener;
|
||||||
|
|
||||||
|
import dev.sheldan.abstracto.core.MessageTextUpdatedListener;
|
||||||
|
import dev.sheldan.abstracto.core.service.MessageCache;
|
||||||
|
import net.dv8tion.jda.api.entities.Message;
|
||||||
|
import net.dv8tion.jda.api.events.message.guild.GuildMessageUpdateEvent;
|
||||||
|
import net.dv8tion.jda.api.hooks.ListenerAdapter;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class MessageUpdatedListener extends ListenerAdapter {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private List<MessageTextUpdatedListener> listener;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private MessageCache messageCache;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onGuildMessageUpdate(@Nonnull GuildMessageUpdateEvent event) {
|
||||||
|
Message fromCache = messageCache.getMessageFromCache(event.getMessage());
|
||||||
|
listener.forEach(messageTextUpdatedListener -> {
|
||||||
|
messageTextUpdatedListener.execute(fromCache, event.getMessage());
|
||||||
|
});
|
||||||
|
messageCache.putMessageInCache(event.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
package dev.sheldan.abstracto.core;
|
||||||
|
|
||||||
|
import net.dv8tion.jda.api.entities.Message;
|
||||||
|
|
||||||
|
public interface MessageTextUpdatedListener {
|
||||||
|
void execute(Message messageBefore, Message messageAfter);
|
||||||
|
}
|
||||||
@@ -37,6 +37,7 @@ public class PostTarget {
|
|||||||
public static String WARN_LOG = "warnlog";
|
public static String WARN_LOG = "warnlog";
|
||||||
public static String KICK_LOG = "kicklog";
|
public static String KICK_LOG = "kicklog";
|
||||||
public static String BAN_LOG = "banlog";
|
public static String BAN_LOG = "banlog";
|
||||||
|
public static String EDIT_LOG = "editLog";
|
||||||
|
|
||||||
public static List<String> AVAILABLE_POST_TARGETS = Arrays.asList(JOIN_LOG, LEAVE_LOG, WARN_LOG, KICK_LOG, BAN_LOG);
|
public static List<String> AVAILABLE_POST_TARGETS = Arrays.asList(JOIN_LOG, LEAVE_LOG, WARN_LOG, KICK_LOG, BAN_LOG, EDIT_LOG);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package dev.sheldan.abstracto.core.service;
|
||||||
|
|
||||||
|
import net.dv8tion.jda.api.entities.Message;
|
||||||
|
|
||||||
|
public interface MessageCache {
|
||||||
|
Message putMessageInCache(Message message);
|
||||||
|
Message getMessageFromCache(Message message);
|
||||||
|
}
|
||||||
@@ -11,6 +11,8 @@ log4j.logger.org.hibernate.SQL=debug
|
|||||||
log4j.logger.org.hibernate.type.descriptor.sql=trace
|
log4j.logger.org.hibernate.type.descriptor.sql=trace
|
||||||
log4j.logger.org.hibernate.type=trace
|
log4j.logger.org.hibernate.type=trace
|
||||||
|
|
||||||
|
spring.cache.cache-names=messages
|
||||||
|
spring.cache.caffeine.spec=maximumSize=500,expireAfterAccess=600s
|
||||||
|
|
||||||
abstracto.startup.synchronize=true
|
abstracto.startup.synchronize=true
|
||||||
|
|
||||||
|
|||||||
@@ -58,6 +58,12 @@
|
|||||||
<version>2.8.6</version>
|
<version>2.8.6</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.github.ben-manes.caffeine</groupId>
|
||||||
|
<artifactId>caffeine</artifactId>
|
||||||
|
<version>2.7.0</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</dependencyManagement>
|
</dependencyManagement>
|
||||||
|
|||||||
Reference in New Issue
Block a user