From 2fe84d4629a7f0ad8832c03127d43aa2d6dd4994 Mon Sep 17 00:00:00 2001 From: William Beemer <37132465+MrBubbles06@users.noreply.github.com> Date: Sat, 20 Jan 2024 15:22:31 -0800 Subject: [PATCH 1/3] added support for non-webhook messages to be sent with the @silent flag --- .../java/net/essentialsx/discord/JDADiscordService.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/JDADiscordService.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/JDADiscordService.java index 4883cb634..0bac4e94a 100644 --- a/EssentialsDiscord/src/main/java/net/essentialsx/discord/JDADiscordService.java +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/JDADiscordService.java @@ -136,9 +136,14 @@ public class JDADiscordService implements DiscordService, IEssentialsModule { public void sendMessage(DiscordMessageEvent event, String message, boolean groupMentions) { final TextChannel channel = getChannel(event.getType().getKey(), true); + final boolean isSilentMessage = message.startsWith("@silent"); + + if (isSilentMessage) message = message.replace("@silent", ""); + final String strippedContent = FormatUtil.stripFormat(message); final String webhookChannelId = typeToChannelId.get(event.getType()); + if (webhookChannelId != null) { final WrappedWebhookClient client = channelIdToWebhook.get(webhookChannelId); if (client != null) { @@ -153,8 +158,10 @@ public class JDADiscordService implements DiscordService, IEssentialsModule { logger.warning(tl("discordNoSendPermission", channel.getName())); return; } + channel.sendMessage(strippedContent) .setAllowedMentions(groupMentions ? null : DiscordUtil.NO_GROUP_MENTIONS) + .setSuppressedNotifications(isSilentMessage) .queue(); } From b92e0432c3724b89206efa08594ffe49f36b3f6d Mon Sep 17 00:00:00 2001 From: William Beemer <37132465+MrBubbles06@users.noreply.github.com> Date: Tue, 23 Jan 2024 00:03:31 -0800 Subject: [PATCH 2/3] added support for socialspy in EssentialsDiscord. --- .../api/v2/services/discord/MessageType.java | 3 ++- .../essentialsx/discord/DiscordSettings.java | 7 +++++++ .../discord/listeners/BukkitListener.java | 21 +++++++++++++++++++ .../src/main/resources/config.yml | 10 +++++++++ 4 files changed, 40 insertions(+), 1 deletion(-) diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/MessageType.java b/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/MessageType.java index 567bfbde5..4733e7d2a 100644 --- a/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/MessageType.java +++ b/EssentialsDiscord/src/main/java/net/essentialsx/api/v2/services/discord/MessageType.java @@ -57,6 +57,7 @@ public final class MessageType { public final static MessageType FIRST_JOIN = new MessageType("first-join", true); public final static MessageType LEAVE = new MessageType("leave", true); public final static MessageType CHAT = new MessageType("chat", true); + public final static MessageType PRIVATE_CHAT = new MessageType("private-chat", true); public final static MessageType DEATH = new MessageType("death", true); public final static MessageType AFK = new MessageType("afk", true); public final static MessageType ADVANCEMENT = new MessageType("advancement", true); @@ -68,7 +69,7 @@ public final class MessageType { public final static MessageType LOCAL = new MessageType("local", true); public final static MessageType QUESTION = new MessageType("question", true); public final static MessageType SHOUT = new MessageType("shout", true); - private final static MessageType[] VALUES = new MessageType[]{JOIN, FIRST_JOIN, LEAVE, CHAT, DEATH, AFK, ADVANCEMENT, ACTION, SERVER_START, SERVER_STOP, KICK, MUTE, LOCAL, QUESTION, SHOUT}; + private final static MessageType[] VALUES = new MessageType[]{JOIN, FIRST_JOIN, LEAVE, CHAT, PRIVATE_CHAT, DEATH, AFK, ADVANCEMENT, ACTION, SERVER_START, SERVER_STOP, KICK, MUTE, LOCAL, QUESTION, SHOUT}; /** * Gets an array of all the default {@link MessageType MessageTypes}. diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/DiscordSettings.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/DiscordSettings.java index 63076eded..4f557483f 100644 --- a/EssentialsDiscord/src/main/java/net/essentialsx/discord/DiscordSettings.java +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/DiscordSettings.java @@ -47,6 +47,7 @@ public class DiscordSettings implements IConf { private MessageFormat permMuteReasonFormat; private MessageFormat unmuteFormat; private MessageFormat kickFormat; + private MessageFormat pmToDiscordFormat; public DiscordSettings(EssentialsDiscord plugin) { this.plugin = plugin; @@ -437,6 +438,10 @@ public class DiscordSettings implements IConf { return kickFormat; } + public MessageFormat getPmToDiscordFormat() { + return pmToDiscordFormat; + } + private String getFormatString(String node) { final String pathPrefix = node.startsWith(".") ? "" : "messages."; return config.getString(pathPrefix + (pathPrefix.isEmpty() ? node.substring(1) : node), null); @@ -573,6 +578,8 @@ public class DiscordSettings implements IConf { "username", "displayname", "controllername", "controllerdisplayname", "reason"); kickFormat = generateMessageFormat(getFormatString("kick"), "{displayname} was kicked with reason: {reason}", false, "username", "displayname", "reason"); + pmToDiscordFormat = generateMessageFormat(getFormatString("private-chat"), "{sender-username} -> {receiver-username}: {message}", false, + "sender-username", "sender-displayname", "receiver-username", "receiver-displayname", "message"); plugin.onReload(); } diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/listeners/BukkitListener.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/listeners/BukkitListener.java index 6e471786d..fcf0c4b40 100644 --- a/EssentialsDiscord/src/main/java/net/essentialsx/discord/listeners/BukkitListener.java +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/listeners/BukkitListener.java @@ -4,6 +4,7 @@ import com.earth2me.essentials.Console; import com.earth2me.essentials.utils.DateUtil; import com.earth2me.essentials.utils.FormatUtil; import com.earth2me.essentials.utils.VersionUtil; +import net.ess3.api.events.PrivateMessageSentEvent; import net.ess3.api.IUser; import net.ess3.api.events.AfkStatusChangeEvent; import net.ess3.api.events.MuteStatusChangeEvent; @@ -16,6 +17,7 @@ import net.essentialsx.api.v2.services.discord.MessageType; import net.essentialsx.discord.JDADiscordService; import net.essentialsx.discord.util.DiscordUtil; import net.essentialsx.discord.util.MessageUtil; +import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.GameRule; import org.bukkit.entity.Player; @@ -47,6 +49,25 @@ public class BukkitListener implements Listener { // Bukkit Events + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onPrivateMessage(PrivateMessageSentEvent event) { + final Player sender = Bukkit.getPlayer(event.getSender().getUUID()); + final Player recipient = Bukkit.getPlayer(event.getRecipient().getUUID()); + + if (sender.hasPermission("essentials.chat.spy.exempt")) { + return; + } + + sendDiscordMessage(MessageType.DefaultTypes.PRIVATE_CHAT, + MessageUtil.formatMessage(jda.getSettings().getPmToDiscordFormat(), + MessageUtil.sanitizeDiscordMarkdown(sender.getName()), + MessageUtil.sanitizeDiscordMarkdown(sender.getDisplayName()), + MessageUtil.sanitizeDiscordMarkdown(recipient.getName()), + MessageUtil.sanitizeDiscordMarkdown(recipient.getDisplayName()), + MessageUtil.sanitizeDiscordMarkdown(event.getMessage())), + sender); + } + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onMute(MuteStatusChangeEvent event) { if (!event.getValue()) { diff --git a/EssentialsDiscord/src/main/resources/config.yml b/EssentialsDiscord/src/main/resources/config.yml index 331be18df..2994661bf 100644 --- a/EssentialsDiscord/src/main/resources/config.yml +++ b/EssentialsDiscord/src/main/resources/config.yml @@ -144,6 +144,8 @@ message-types: kick: staff # Message sent when a player's mute state is changed on the Minecraft server. mute: staff + # Message sent when a private message (/msg, /whisper, etc.) is sent on the Minecraft Server. + private-chat: none # Message sent when a player talks in local chat. # use-essentials-events must be set to "true" for this to work. local: none @@ -432,3 +434,11 @@ messages: # - {displayname}: The display name of the user who got kicked # - {reason}: The reason the player was kicked kick: "{displayname} was kicked with reason: {reason}" + # This is the message that is used to relay minecraft private messages in Discord. + # The following placeholders can be used here: + # - {sender-username}: The username of the player sending the message + # - {sender-displayname}: The display name of the player sending the message (This would be their nickname) + # - {receiver-username}: The username of the player receiving the message + # - {receiver-displayname}: The display name of the player receiving the message (This would be their nickname) + # - {message}: The content of the message being sent + pms-to-discord: "{sender-username} -> {receiver-username}: {message}" From 95cd4ad3769c3e2698cf28858912957cc0ac99f2 Mon Sep 17 00:00:00 2001 From: William Beemer <37132465+MrBubbles06@users.noreply.github.com> Date: Tue, 23 Jan 2024 00:23:43 -0800 Subject: [PATCH 3/3] reverted unrelated changes --- .../essentialsx/discord/JDADiscordService.java | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/JDADiscordService.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/JDADiscordService.java index 0bac4e94a..968b96ab2 100644 --- a/EssentialsDiscord/src/main/java/net/essentialsx/discord/JDADiscordService.java +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/JDADiscordService.java @@ -75,7 +75,7 @@ public class JDADiscordService implements DiscordService, IEssentialsModule { private final static Logger logger = EssentialsDiscord.getWrappedLogger(); private final EssentialsDiscord plugin; private final Unsafe unsafe = this::getJda; - + private JDA jda; private Guild guild; private TextChannel primaryChannel; @@ -89,24 +89,24 @@ public class JDADiscordService implements DiscordService, IEssentialsModule { private InteractionControllerImpl interactionController; private Listener chatListener; private boolean invalidStartup = false; - + public JDADiscordService(EssentialsDiscord plugin) { this.plugin = plugin; for (final MessageType type : MessageType.DefaultTypes.values()) { registerMessageType(plugin, type); } } - + public TextChannel getChannel(String key, boolean primaryFallback) { if (NumberUtil.isLong(key)) { return getDefinedChannel(key, primaryFallback); } return getDefinedChannel(getSettings().getMessageChannel(key), primaryFallback); } - + public TextChannel getDefinedChannel(String key, boolean primaryFallback) { final long resolvedId = getSettings().getChannelId(key); - + if (isDebug()) { logger.log(Level.INFO, "Channel definition " + key + " resolved as " + resolvedId); } @@ -136,10 +136,6 @@ public class JDADiscordService implements DiscordService, IEssentialsModule { public void sendMessage(DiscordMessageEvent event, String message, boolean groupMentions) { final TextChannel channel = getChannel(event.getType().getKey(), true); - final boolean isSilentMessage = message.startsWith("@silent"); - - if (isSilentMessage) message = message.replace("@silent", ""); - final String strippedContent = FormatUtil.stripFormat(message); final String webhookChannelId = typeToChannelId.get(event.getType()); @@ -161,7 +157,6 @@ public class JDADiscordService implements DiscordService, IEssentialsModule { channel.sendMessage(strippedContent) .setAllowedMentions(groupMentions ? null : DiscordUtil.NO_GROUP_MENTIONS) - .setSuppressedNotifications(isSilentMessage) .queue(); }