diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/JDADiscordService.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/JDADiscordService.java index 2843e55af2b..96a8300a9a0 100644 --- a/EssentialsDiscord/src/main/java/net/essentialsx/discord/JDADiscordService.java +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/JDADiscordService.java @@ -37,11 +37,12 @@ import net.essentialsx.discord.interactions.commands.ExecuteCommand; import net.essentialsx.discord.interactions.commands.ListCommand; import net.essentialsx.discord.interactions.commands.MessageCommand; +import net.essentialsx.discord.listeners.BukkitChatListener; import net.essentialsx.discord.listeners.BukkitListener; import net.essentialsx.discord.listeners.DiscordCommandDispatcher; import net.essentialsx.discord.listeners.DiscordListener; import net.essentialsx.discord.listeners.EssentialsChatListener; -import net.essentialsx.discord.listeners.BukkitChatListener; +import net.essentialsx.discord.listeners.PaperChatListener; import net.essentialsx.discord.util.ConsoleInjector; import net.essentialsx.discord.util.DiscordUtil; import net.essentialsx.discord.util.MessageUtil; @@ -350,9 +351,13 @@ public void updateListener() { chatListener = null; } - chatListener = getSettings().isUseEssentialsEvents() && plugin.isEssentialsChat() - ? new EssentialsChatListener(this) - : new BukkitChatListener(this); + if (getSettings().isUseEssentialsEvents() && plugin.isEssentialsChat()) { + chatListener = new EssentialsChatListener(this); + } else if (VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_16_5_R01) && VersionUtil.isPaper() && plugin.getEss().getSettings().isUsePaperChatEvent()) { + chatListener = new PaperChatListener(this); + } else { + chatListener = new BukkitChatListener(this); + } Bukkit.getPluginManager().registerEvents(chatListener, plugin); } diff --git a/EssentialsDiscord/src/main/java/net/essentialsx/discord/listeners/PaperChatListener.java b/EssentialsDiscord/src/main/java/net/essentialsx/discord/listeners/PaperChatListener.java new file mode 100644 index 00000000000..6f5588fe450 --- /dev/null +++ b/EssentialsDiscord/src/main/java/net/essentialsx/discord/listeners/PaperChatListener.java @@ -0,0 +1,36 @@ +package net.essentialsx.discord.listeners; + +import net.ess3.provider.AbstractChatEvent; +import net.ess3.provider.providers.PaperChatListenerProvider; +import net.essentialsx.api.v2.ChatType; +import net.essentialsx.api.v2.events.discord.DiscordChatMessageEvent; +import net.essentialsx.discord.JDADiscordService; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +public class PaperChatListener extends PaperChatListenerProvider { + private final JDADiscordService jda; + + public PaperChatListener(JDADiscordService jda) { + this.jda = jda; + } + + @Override + public void onChatMonitor(AbstractChatEvent event) { + if (event.isCancelled()) { + return; + } + + final Player player = event.getPlayer(); + Bukkit.getScheduler().runTask(jda.getPlugin(), () -> { + final DiscordChatMessageEvent chatEvent = new DiscordChatMessageEvent(event.getPlayer(), event.getMessage(), ChatType.UNKNOWN); + chatEvent.setCancelled(!jda.getSettings().isShowAllChat() && !event.recipients().containsAll(Bukkit.getOnlinePlayers())); + Bukkit.getPluginManager().callEvent(chatEvent); + if (chatEvent.isCancelled()) { + return; + } + + jda.sendChatMessage(player, chatEvent.getMessage()); + }); + } +} diff --git a/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperChatListenerProvider.java b/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperChatListenerProvider.java index 5337559855e..24a7273e71f 100644 --- a/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperChatListenerProvider.java +++ b/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperChatListenerProvider.java @@ -23,42 +23,59 @@ public PaperChatListenerProvider() { .useUnusualXRepeatedCharacterHexFormat().build(); } - public abstract void onChatLowest(final AbstractChatEvent event); + public void onChatLowest(final AbstractChatEvent event) { - public abstract void onChatNormal(final AbstractChatEvent event); + } + + public void onChatNormal(final AbstractChatEvent event) { + + } + + public void onChatHighest(final AbstractChatEvent event) { + + } + + public void onChatMonitor(final AbstractChatEvent event) { - public abstract void onChatHighest(final AbstractChatEvent event); + } @EventHandler(priority = EventPriority.LOWEST) - public void onLowest(final AsyncChatEvent event) { + public final void onLowest(final AsyncChatEvent event) { onChatLowest(wrap(event)); } @EventHandler(priority = EventPriority.NORMAL) - public void onNormal(final AsyncChatEvent event) { + public final void onNormal(final AsyncChatEvent event) { onChatNormal(wrap(event)); } @EventHandler(priority = EventPriority.HIGHEST) - public void onHighest(final AsyncChatEvent event) { + public final void onHighest(final AsyncChatEvent event) { final PaperChatEvent paperChatEvent = wrap(event); onChatHighest(paperChatEvent); - if (!event.isCancelled()) { - final TextComponent format = serializer.deserialize(paperChatEvent.getFormat()); - final TextComponent eventMessage = serializer.deserialize(paperChatEvent.getMessage()); - - event.renderer(ChatRenderer.viewerUnaware((player, displayName, message) -> - format.replaceText(builder -> builder - .match("%(\\d)\\$s").replacement((index, match) -> { - if (index.group(1).equals("1")) { - return displayName; - } - return eventMessage; - }) - ))); + if (event.isCancelled()) { + return; } + final TextComponent format = serializer.deserialize(paperChatEvent.getFormat()); + final TextComponent eventMessage = serializer.deserialize(paperChatEvent.getMessage()); + + event.renderer(ChatRenderer.viewerUnaware((player, displayName, message) -> + format.replaceText(builder -> builder + .match("%(\\d)\\$s").replacement((index, match) -> { + if (index.group(1).equals("1")) { + return displayName; + } + return eventMessage; + }) + ))); + } + + @EventHandler(priority = EventPriority.MONITOR) + public final void onMonitor(final AsyncChatEvent event) { + onChatMonitor(wrap(event)); + eventMap.remove(event); }