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> snipedMessages = new HashMap<>(); @Autowired public MessageSnipeFeature(@NonNull ApplicationContext context, @NonNull CommandService commandService) { super("Message Snipe", false, Category.SNIPE); 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) { List messages = snipedMessages.getOrDefault(guild, new ArrayList<>()).stream().filter(message -> message.getDeletedDate() != null) .sorted(Comparator.comparing(SnipedMessage::getDeletedDate).reversed()).toList(); 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 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; if (guild.getFeatureProfile().isFeatureDisabled(this)) { return; } List 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) { if (guild.getFeatureProfile().isFeatureDisabled(this)) { return; } List 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 public void onGuildMessageEdit(@NonNull BatGuild guild, @NonNull BatUser user, DiscordMessage oldMessage, @NonNull DiscordMessage newMessage, @NonNull MessageUpdateEvent event) { if (guild.getFeatureProfile().isFeatureDisabled(this)) { return; } List 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()); } }