From a30970572a9fc16305e66c7799ec3345f617bf6c Mon Sep 17 00:00:00 2001 From: HypherionMC Date: Sun, 2 Jul 2023 16:30:20 +0200 Subject: [PATCH] [FEAT] Allow Discord Mentions to be configurable --- .../core/config/impl/ChatSettingsConfig.java | 3 + .../discord/events/DiscordEventHandler.java | 50 +++++++++++++ .../sdlink/core/managers/CacheManager.java | 75 +++++++++++++++++++ .../discord/DiscordMessageBuilder.java | 5 +- 4 files changed, 132 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/hypherionmc/sdlink/core/managers/CacheManager.java diff --git a/src/main/java/com/hypherionmc/sdlink/core/config/impl/ChatSettingsConfig.java b/src/main/java/com/hypherionmc/sdlink/core/config/impl/ChatSettingsConfig.java index 8ffb97d..8052d43 100644 --- a/src/main/java/com/hypherionmc/sdlink/core/config/impl/ChatSettingsConfig.java +++ b/src/main/java/com/hypherionmc/sdlink/core/config/impl/ChatSettingsConfig.java @@ -89,4 +89,7 @@ public class ChatSettingsConfig { @SpecComment("Commands that should not be broadcasted to discord") public List ignoredCommands = new ArrayList() {{ add("particle"); add("login"); add("execute"); }}; + @Path("allowMentionsFromChat") + @SpecComment("Allow mentioning discord roles, users and channels from Minecraft Chat") + public boolean allowMentionsFromChat = false; } diff --git a/src/main/java/com/hypherionmc/sdlink/core/discord/events/DiscordEventHandler.java b/src/main/java/com/hypherionmc/sdlink/core/discord/events/DiscordEventHandler.java index 64d524d..28be6c6 100644 --- a/src/main/java/com/hypherionmc/sdlink/core/discord/events/DiscordEventHandler.java +++ b/src/main/java/com/hypherionmc/sdlink/core/discord/events/DiscordEventHandler.java @@ -10,11 +10,18 @@ import com.hypherionmc.sdlink.core.discord.commands.slash.general.ServerStatusSl import com.hypherionmc.sdlink.core.discord.hooks.BotReadyHooks; import com.hypherionmc.sdlink.core.discord.hooks.DiscordMessageHooks; import com.hypherionmc.sdlink.core.events.SDLinkReadyEvent; +import com.hypherionmc.sdlink.core.managers.CacheManager; import com.hypherionmc.sdlink.core.managers.ChannelManager; import com.hypherionmc.sdlink.core.managers.PermissionChecker; import net.dv8tion.jda.api.JDA; +import net.dv8tion.jda.api.events.channel.ChannelCreateEvent; +import net.dv8tion.jda.api.events.channel.ChannelDeleteEvent; +import net.dv8tion.jda.api.events.guild.GuildJoinEvent; +import net.dv8tion.jda.api.events.guild.member.GuildMemberRemoveEvent; import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent; import net.dv8tion.jda.api.events.message.MessageReceivedEvent; +import net.dv8tion.jda.api.events.role.RoleCreateEvent; +import net.dv8tion.jda.api.events.role.RoleDeleteEvent; import net.dv8tion.jda.api.events.session.ReadyEvent; import net.dv8tion.jda.api.hooks.ListenerAdapter; import org.jetbrains.annotations.NotNull; @@ -57,6 +64,7 @@ public class DiscordEventHandler extends ListenerAdapter { BotReadyHooks.startActivityUpdates(event); BotReadyHooks.startTopicUpdates(); CraterEventBus.INSTANCE.postEvent(new SDLinkReadyEvent()); + CacheManager.loadCache(); } } @@ -70,4 +78,46 @@ public class DiscordEventHandler extends ListenerAdapter { event.reply("Success!").setEphemeral(true).queue(); } } + + @Override + public void onGuildJoin(@NotNull GuildJoinEvent event) { + if (event.getJDA().getStatus() == JDA.Status.CONNECTED) { + CacheManager.loadUserCache(); + } + } + + @Override + public void onGuildMemberRemove(@NotNull GuildMemberRemoveEvent event) { + if (event.getJDA().getStatus() == JDA.Status.CONNECTED) { + CacheManager.loadUserCache(); + } + } + + @Override + public void onRoleCreate(@NotNull RoleCreateEvent event) { + if (event.getJDA().getStatus() == JDA.Status.CONNECTED) { + CacheManager.loadRoleCache(); + } + } + + @Override + public void onRoleDelete(@NotNull RoleDeleteEvent event) { + if (event.getJDA().getStatus() == JDA.Status.CONNECTED) { + CacheManager.loadRoleCache(); + } + } + + @Override + public void onChannelCreate(@NotNull ChannelCreateEvent event) { + if (event.getJDA().getStatus() == JDA.Status.CONNECTED) { + CacheManager.loadChannelCache(); + } + } + + @Override + public void onChannelDelete(@NotNull ChannelDeleteEvent event) { + if (event.getJDA().getStatus() == JDA.Status.CONNECTED) { + CacheManager.loadChannelCache(); + } + } } diff --git a/src/main/java/com/hypherionmc/sdlink/core/managers/CacheManager.java b/src/main/java/com/hypherionmc/sdlink/core/managers/CacheManager.java new file mode 100644 index 0000000..e3c5e16 --- /dev/null +++ b/src/main/java/com/hypherionmc/sdlink/core/managers/CacheManager.java @@ -0,0 +1,75 @@ +package com.hypherionmc.sdlink.core.managers; + +import com.hypherionmc.sdlink.core.discord.BotController; +import net.dv8tion.jda.api.JDA; +import net.dv8tion.jda.api.entities.channel.ChannelType; + +import java.util.HashMap; + +public class CacheManager { + + private static final HashMap serverChannels = new HashMap<>(); + private static final HashMap serverRoles = new HashMap<>(); + private static final HashMap userCache = new HashMap<>(); + + public static void loadCache() { + loadChannelCache(); + loadRoleCache(); + loadUserCache(); + } + + public static void loadChannelCache() { + serverChannels.clear(); + + JDA jda = BotController.INSTANCE.getJDA(); + + if (jda.getGuilds().isEmpty()) + return; + + jda.getGuilds().get(0).getChannels(false).forEach(c -> { + if (c.getType() != ChannelType.CATEGORY) { + serverChannels.put("#" + c.getName(), c.getAsMention()); + } + }); + } + + public static void loadRoleCache() { + serverRoles.clear(); + + JDA jda = BotController.INSTANCE.getJDA(); + + if (jda.getGuilds().isEmpty()) + return; + + jda.getGuilds().get(0).getRoles().forEach(r -> { + if (r.isMentionable() && !r.isManaged()) { + serverRoles.put("@" + r.getName(), r.getAsMention()); + } + }); + } + + public static void loadUserCache() { + userCache.clear(); + + JDA jda = BotController.INSTANCE.getJDA(); + + if (jda.getGuilds().isEmpty()) + return; + + jda.getGuilds().get(0).getMembers().forEach(r -> { + userCache.put("@" + r.getEffectiveName(), r.getAsMention()); + }); + } + + public static HashMap getServerChannels() { + return serverChannels; + } + + public static HashMap getServerRoles() { + return serverRoles; + } + + public static HashMap getUserCache() { + return userCache; + } +} diff --git a/src/main/java/com/hypherionmc/sdlink/core/messaging/discord/DiscordMessageBuilder.java b/src/main/java/com/hypherionmc/sdlink/core/messaging/discord/DiscordMessageBuilder.java index d9e3111..8512ce9 100644 --- a/src/main/java/com/hypherionmc/sdlink/core/messaging/discord/DiscordMessageBuilder.java +++ b/src/main/java/com/hypherionmc/sdlink/core/messaging/discord/DiscordMessageBuilder.java @@ -48,9 +48,12 @@ public final class DiscordMessageBuilder { */ public DiscordMessageBuilder message(String message) { if (this.messageType == MessageType.CHAT) { - message = message.replace("<@", ""); message = message.replace("@everyone", ""); message = message.replace("@here", ""); + + if (!SDLinkConfig.INSTANCE.chatConfig.allowMentionsFromChat) { + message = message.replace("<@", ""); + } } if (SDLinkConfig.INSTANCE.ignoreConfig.enabled) {