2024-07-01 20:20:39 +00:00
|
|
|
package cc.fascinated.bat.features.messagesnipe;
|
|
|
|
|
|
|
|
import cc.fascinated.bat.command.Category;
|
|
|
|
import cc.fascinated.bat.event.EventListener;
|
|
|
|
import cc.fascinated.bat.features.Feature;
|
|
|
|
import cc.fascinated.bat.features.messagesnipe.command.MessageSnipeCommand;
|
|
|
|
import cc.fascinated.bat.model.BatGuild;
|
|
|
|
import cc.fascinated.bat.model.BatUser;
|
|
|
|
import cc.fascinated.bat.model.DiscordMessage;
|
|
|
|
import cc.fascinated.bat.service.CommandService;
|
|
|
|
import lombok.NonNull;
|
|
|
|
import net.dv8tion.jda.api.events.message.MessageDeleteEvent;
|
|
|
|
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
|
|
|
|
import net.dv8tion.jda.api.events.message.MessageUpdateEvent;
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
import org.springframework.context.ApplicationContext;
|
|
|
|
import org.springframework.stereotype.Component;
|
|
|
|
|
|
|
|
import java.util.*;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @author Fascinated (fascinated7)
|
|
|
|
*/
|
|
|
|
@Component
|
|
|
|
public class MessageSnipeFeature extends Feature implements EventListener {
|
|
|
|
/**
|
|
|
|
* The sniped messages for each guild
|
|
|
|
*/
|
|
|
|
private static final Map<BatGuild, List<SnipedMessage>> snipedMessages = new HashMap<>();
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
public MessageSnipeFeature(@NonNull ApplicationContext context, @NonNull CommandService commandService) {
|
2024-07-03 20:43:29 +00:00
|
|
|
super("Message Snipe", false, Category.MESSAGES);
|
2024-07-01 20:20:39 +00:00
|
|
|
|
|
|
|
super.registerCommand(commandService, context.getBean(MessageSnipeCommand.class));
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Clears the sniped messages for the given guild
|
|
|
|
*
|
|
|
|
* @param guild the guild
|
|
|
|
* @return if the sniped messages were cleared
|
|
|
|
*/
|
|
|
|
public static boolean clearSnipedMessages(BatGuild guild) {
|
|
|
|
if (snipedMessages.containsKey(guild)) {
|
|
|
|
snipedMessages.remove(guild);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Gets the sniped messages for the given guild
|
|
|
|
*
|
|
|
|
* @param guild the guild
|
|
|
|
* @return the sniped messages for the given guild
|
|
|
|
*/
|
|
|
|
public static SnipedMessage getDeletedMessage(BatGuild guild, String channelId) {
|
2024-07-02 00:20:41 +00:00
|
|
|
List<SnipedMessage> messages = snipedMessages.getOrDefault(guild, new ArrayList<>()).stream().filter(message -> message.getDeletedDate() != null)
|
|
|
|
.sorted(Comparator.comparing(SnipedMessage::getDeletedDate).reversed()).toList();
|
2024-07-01 20:20:39 +00:00
|
|
|
for (SnipedMessage message : messages) {
|
|
|
|
if (message.getDeletedDate() != null // Check if the message was deleted
|
|
|
|
&& message.getMessage().getChannel().getId().equals(channelId)) {
|
|
|
|
return message;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Gets the sniped message with the given id
|
|
|
|
*
|
|
|
|
* @param guild the guild
|
|
|
|
* @param messageId the id of the message
|
|
|
|
* @return the sniped message with the given id
|
|
|
|
*/
|
|
|
|
private SnipedMessage getSnipedMessage(BatGuild guild, String messageId) {
|
|
|
|
List<SnipedMessage> messages = snipedMessages.getOrDefault(guild, new ArrayList<>());
|
|
|
|
for (SnipedMessage message : messages) {
|
|
|
|
if (message.getMessage().getId().equals(messageId)) {
|
|
|
|
return message;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onGuildMessageReceive(@NonNull BatGuild guild, @NonNull BatUser user, @NonNull MessageReceivedEvent event) {
|
|
|
|
if (event.getAuthor().isBot()) return;
|
2024-07-01 20:21:47 +00:00
|
|
|
if (guild.getFeatureProfile().isFeatureDisabled(this)) {
|
|
|
|
return;
|
|
|
|
}
|
2024-07-01 20:20:39 +00:00
|
|
|
|
|
|
|
List<SnipedMessage> messages = snipedMessages.getOrDefault(guild, new ArrayList<>());
|
|
|
|
if (messages.size() >= 10) {
|
|
|
|
messages.remove(0);
|
|
|
|
}
|
|
|
|
messages.add(new SnipedMessage(event.getMessage(), null));
|
|
|
|
snipedMessages.put(guild, messages);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onGuildMessageDelete(@NonNull BatGuild guild, BatUser user, DiscordMessage message, @NonNull MessageDeleteEvent event) {
|
2024-07-01 20:21:47 +00:00
|
|
|
if (guild.getFeatureProfile().isFeatureDisabled(this)) {
|
|
|
|
return;
|
|
|
|
}
|
2024-07-01 20:20:39 +00:00
|
|
|
List<SnipedMessage> messages = snipedMessages.getOrDefault(guild, new ArrayList<>());
|
|
|
|
if (messages.size() >= 10) {
|
|
|
|
messages.remove(0);
|
|
|
|
}
|
|
|
|
SnipedMessage snipedMessage = getSnipedMessage(guild, event.getMessageId());
|
|
|
|
if (snipedMessage == null) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
snipedMessage.setDeletedDate(new Date());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2024-07-02 17:21:24 +00:00
|
|
|
public void onGuildMessageEdit(@NonNull BatGuild guild, @NonNull BatUser user, DiscordMessage oldMessage,
|
|
|
|
@NonNull DiscordMessage newMessage, @NonNull MessageUpdateEvent event) {
|
2024-07-01 20:21:47 +00:00
|
|
|
if (guild.getFeatureProfile().isFeatureDisabled(this)) {
|
|
|
|
return;
|
|
|
|
}
|
2024-07-01 20:20:39 +00:00
|
|
|
List<SnipedMessage> messages = snipedMessages.getOrDefault(guild, new ArrayList<>());
|
|
|
|
if (messages.size() >= 10) {
|
|
|
|
messages.remove(0);
|
|
|
|
}
|
|
|
|
SnipedMessage snipedMessage = getSnipedMessage(guild, event.getMessageId());
|
|
|
|
if (snipedMessage == null) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
snipedMessage.setMessage(event.getMessage());
|
|
|
|
}
|
|
|
|
}
|