diff --git a/pom.xml b/pom.xml
index 3aa63b1..d2e2078 100644
--- a/pom.xml
+++ b/pom.xml
@@ -38,13 +38,11 @@
us.dynmap
dynmap-api
1.9.4
- provided
com.discordsrv
discordsrv
1.19.0
- provided
xyz.etztech
diff --git a/src/main/java/xyz/etztech/deluxegroups/DeluxeGroups.java b/src/main/java/xyz/etztech/deluxegroups/DeluxeGroups.java
index 81d209b..4c7e25c 100644
--- a/src/main/java/xyz/etztech/deluxegroups/DeluxeGroups.java
+++ b/src/main/java/xyz/etztech/deluxegroups/DeluxeGroups.java
@@ -12,6 +12,7 @@ import xyz.etztech.core.api.IMinecraftManager;
import xyz.etztech.deluxegroups.command.CommandGroup;
import xyz.etztech.deluxegroups.command.CommandMain;
import xyz.etztech.deluxegroups.listeners.AsyncPlayerChatListener;
+import xyz.etztech.deluxegroups.listeners.DGListener;
import xyz.etztech.deluxegroups.listeners.DiscordSRVListener;
import xyz.etztech.deluxegroups.listeners.SessionListener;
@@ -79,11 +80,11 @@ public class DeluxeGroups extends JavaPlugin {
CommandGroup cmdGroup = new CommandGroup(this);
this.getCommand("group").setExecutor(cmdGroup);
-
-
// Add Listeners
chatListener = new AsyncPlayerChatListener(this);
getServer().getPluginManager().registerEvents(chatListener, this);
+ DGListener dgListener = new DGListener(this);
+ getServer().getPluginManager().registerEvents(dgListener, this);
}
}
diff --git a/src/main/java/xyz/etztech/deluxegroups/events/GlobalChatEvent.java b/src/main/java/xyz/etztech/deluxegroups/events/GlobalChatEvent.java
new file mode 100644
index 0000000..e8f62f8
--- /dev/null
+++ b/src/main/java/xyz/etztech/deluxegroups/events/GlobalChatEvent.java
@@ -0,0 +1,47 @@
+package xyz.etztech.deluxegroups.events;
+
+import org.bukkit.entity.Player;
+import org.bukkit.event.Cancellable;
+import org.bukkit.event.Event;
+import org.bukkit.event.HandlerList;
+
+public class GlobalChatEvent extends Event implements Cancellable {
+ private Player author;
+ private String message;
+
+ public GlobalChatEvent(Player author, String message) {
+ this.author = author;
+ this.message = message;
+ }
+
+ public Player getAuthor() {
+ return author;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ //
+ // - - - HandlerList boilerplate - - -
+ //
+
+ public static final HandlerList HANDLERS = new HandlerList();
+
+ @Override
+ public HandlerList getHandlers() { return HANDLERS; }
+
+ public static HandlerList getHandlerList() { return HANDLERS; }
+
+ //
+ // - - - Cancellable boilerplate - - -
+ //
+
+ private boolean isCancelled = false;
+
+ @Override
+ public boolean isCancelled() { return isCancelled; }
+
+ @Override
+ public void setCancelled(boolean cancelled) { isCancelled = cancelled; }
+}
diff --git a/src/main/java/xyz/etztech/deluxegroups/events/GroupChatEvent.java b/src/main/java/xyz/etztech/deluxegroups/events/GroupChatEvent.java
new file mode 100644
index 0000000..fa6959a
--- /dev/null
+++ b/src/main/java/xyz/etztech/deluxegroups/events/GroupChatEvent.java
@@ -0,0 +1,55 @@
+package xyz.etztech.deluxegroups.events;
+
+import org.bukkit.entity.Player;
+import org.bukkit.event.Cancellable;
+import org.bukkit.event.Event;
+import org.bukkit.event.HandlerList;
+import xyz.etztech.deluxegroups.DeluxeGroup;
+import xyz.etztech.deluxegroups.DeluxeUtil;
+
+public class GroupChatEvent extends Event implements Cancellable {
+ private Player author;
+ private DeluxeGroup group;
+ private String message;
+
+ public GroupChatEvent(Player author, DeluxeGroup group, String message) {
+ this.author = author;
+ this.group = group;
+ this.message = message;
+ }
+
+ public Player getAuthor() {
+ return author;
+ }
+
+ public DeluxeGroup getGroup() {
+ return group;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ //
+ // - - - HandlerList boilerplate - - -
+ //
+
+ public static final HandlerList HANDLERS = new HandlerList();
+
+ @Override
+ public HandlerList getHandlers() { return HANDLERS; }
+
+ public static HandlerList getHandlerList() { return HANDLERS; }
+
+ //
+ // - - - Cancellable boilerplate - - -
+ //
+
+ private boolean isCancelled = false;
+
+ @Override
+ public boolean isCancelled() { return isCancelled; }
+
+ @Override
+ public void setCancelled(boolean cancelled) { isCancelled = cancelled; }
+}
diff --git a/src/main/java/xyz/etztech/deluxegroups/listeners/AsyncPlayerChatListener.java b/src/main/java/xyz/etztech/deluxegroups/listeners/AsyncPlayerChatListener.java
index 536e7d5..e5ea6e9 100644
--- a/src/main/java/xyz/etztech/deluxegroups/listeners/AsyncPlayerChatListener.java
+++ b/src/main/java/xyz/etztech/deluxegroups/listeners/AsyncPlayerChatListener.java
@@ -3,6 +3,7 @@ package xyz.etztech.deluxegroups.listeners;
import github.scarsz.discordsrv.DiscordSRV;
import github.scarsz.discordsrv.dependencies.jda.api.entities.TextChannel;
import org.apache.commons.lang.StringUtils;
+import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
@@ -15,6 +16,8 @@ import xyz.etztech.core.api.IMinecraftManager;
import xyz.etztech.deluxegroups.DeluxeGroup;
import xyz.etztech.deluxegroups.DeluxeGroups;
import xyz.etztech.deluxegroups.DeluxeUtil;
+import xyz.etztech.deluxegroups.events.GlobalChatEvent;
+import xyz.etztech.deluxegroups.events.GroupChatEvent;
import java.util.ArrayList;
import java.util.Iterator;
@@ -96,15 +99,10 @@ public class AsyncPlayerChatListener implements Listener {
// DiscordSRV
if (DeluxeGroups.getDiscord()) {
- TextChannel groupChannel = DiscordSRV.getPlugin().getDestinationTextChannelForGameChannelName(group.getName());
- if (groupChannel != null) {
- String discordFormat = plugin.getConfig().getString("mtd", " > ");
- String message = discordFormat.
- replace("", group.getName()).
- replace("", event.getMessage()).
- replace("", event.getPlayer().getName());
- groupChannel.sendMessage(message);
- }
+ String finalChat = chat;
+ plugin.getServer().getScheduler().runTask(plugin, () ->
+ Bukkit.getPluginManager().callEvent(new GroupChatEvent(sender, group, finalChat))
+ );
}
return;
}
@@ -122,6 +120,9 @@ public class AsyncPlayerChatListener implements Listener {
if (minecraftManager != null) {
minecraftManager.globalLog(sender, chat);
}
+ plugin.getServer().getScheduler().runTask(plugin, () ->
+ Bukkit.getPluginManager().callEvent(new GlobalChatEvent(sender, chat))
+ );
}
}
diff --git a/src/main/java/xyz/etztech/deluxegroups/listeners/DGListener.java b/src/main/java/xyz/etztech/deluxegroups/listeners/DGListener.java
new file mode 100644
index 0000000..2d10f77
--- /dev/null
+++ b/src/main/java/xyz/etztech/deluxegroups/listeners/DGListener.java
@@ -0,0 +1,85 @@
+package xyz.etztech.deluxegroups.listeners;
+
+import github.scarsz.discordsrv.DiscordSRV;
+import github.scarsz.discordsrv.dependencies.commons.lang3.StringUtils;
+import github.scarsz.discordsrv.dependencies.dev.vankka.mcdiscordreserializer.discord.DiscordSerializer;
+import github.scarsz.discordsrv.dependencies.jda.api.entities.TextChannel;
+import github.scarsz.discordsrv.dependencies.net.kyori.text.serializer.legacy.LegacyComponentSerializer;
+import github.scarsz.discordsrv.hooks.VaultHook;
+import github.scarsz.discordsrv.hooks.world.MultiverseCoreHook;
+import github.scarsz.discordsrv.util.DiscordUtil;
+import github.scarsz.discordsrv.util.LangUtil;
+import github.scarsz.discordsrv.util.PlaceholderUtil;
+import github.scarsz.discordsrv.util.TimeUtil;
+import org.bukkit.ChatColor;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import xyz.etztech.deluxegroups.DeluxeGroups;
+import xyz.etztech.deluxegroups.events.GlobalChatEvent;
+import xyz.etztech.deluxegroups.events.GroupChatEvent;
+
+import static org.bukkit.Bukkit.getServer;
+
+public class DGListener implements Listener {
+
+ private DeluxeGroups plugin;
+
+ public DGListener(DeluxeGroups deluxeGroups) {
+ this.plugin = deluxeGroups;
+ }
+
+ @EventHandler
+ public void onGlobalChat(GlobalChatEvent event) {
+ TextChannel mainChannel = DiscordSRV.getPlugin().getMainTextChannel();
+
+ // FIXME Do we really need to copy/paste DiscordSRV code??
+ String channel = mainChannel.getName();
+ String message = event.getMessage();
+ Player player = event.getAuthor();
+ String userPrimaryGroup = VaultHook.getPrimaryGroup(player);
+ boolean hasGoodGroup = StringUtils.isNotBlank(userPrimaryGroup);
+ if (hasGoodGroup) {
+ userPrimaryGroup = userPrimaryGroup.substring(0, 1).toUpperCase() + userPrimaryGroup.substring(1);
+ }
+
+ boolean reserializer = DiscordSRV.config().getBoolean("Experiment_MCDiscordReserializer_ToDiscord");
+ String username = DiscordUtil.strip(player.getName());
+ if (!reserializer) {
+ username = DiscordUtil.escapeMarkdown(username);
+ }
+
+ String discordMessage = (hasGoodGroup ? LangUtil.Message.CHAT_TO_DISCORD.toString() : LangUtil.Message.CHAT_TO_DISCORD_NO_PRIMARY_GROUP.toString()).replaceAll("%time%|%date%", TimeUtil.timeStamp()).replace("%channelname%", channel != null ? channel.substring(0, 1).toUpperCase() + channel.substring(1) : "").replace("%primarygroup%", userPrimaryGroup).replace("%username%", username).replace("%world%", player.getWorld().getName()).replace("%worldalias%", DiscordUtil.strip(MultiverseCoreHook.getWorldAlias(player.getWorld().getName())));
+ discordMessage = PlaceholderUtil.replacePlaceholdersToDiscord(discordMessage, player);
+ String displayName = DiscordUtil.strip(player.getDisplayName());
+ if (reserializer) {
+ message = DiscordSerializer.INSTANCE.serialize(LegacyComponentSerializer.legacy().deserialize(message));
+ } else {
+ displayName = DiscordUtil.escapeMarkdown(displayName);
+ }
+
+ discordMessage = discordMessage.replace("%displayname%", displayName).replace("%message%", message);
+ if (!reserializer) {
+ discordMessage = DiscordUtil.strip(discordMessage);
+ }
+ if (DiscordSRV.config().getBoolean("DiscordChatChannelTranslateMentions")) {
+ discordMessage = DiscordUtil.convertMentionsFromNames(discordMessage, DiscordSRV.getPlugin().getMainGuild());
+ } else {
+ discordMessage = discordMessage.replace("@", "@\u200b");
+ }
+ DiscordUtil.sendMessage(mainChannel, discordMessage);
+ }
+
+ @EventHandler
+ public void onGroupChat(GroupChatEvent event) {
+ TextChannel groupChannel = DiscordSRV.getPlugin().getDestinationTextChannelForGameChannelName(event.getGroup().getName());
+ if (groupChannel != null) {
+ String discordFormat = plugin.getConfig().getString("discord.mtd", " > ");
+ String message = discordFormat.
+ replace("", event.getGroup().getName()).
+ replace("", ChatColor.stripColor(event.getMessage())).
+ replace("", event.getAuthor().getName());
+ groupChannel.sendMessage(message).queue();
+ }
+ }
+}
diff --git a/src/main/java/xyz/etztech/deluxegroups/listeners/DiscordSRVListener.java b/src/main/java/xyz/etztech/deluxegroups/listeners/DiscordSRVListener.java
index 43463aa..239c1c0 100644
--- a/src/main/java/xyz/etztech/deluxegroups/listeners/DiscordSRVListener.java
+++ b/src/main/java/xyz/etztech/deluxegroups/listeners/DiscordSRVListener.java
@@ -1,8 +1,10 @@
package xyz.etztech.deluxegroups.listeners;
+import github.scarsz.discordsrv.DiscordSRV;
import github.scarsz.discordsrv.api.Subscribe;
import github.scarsz.discordsrv.api.events.DiscordGuildMessagePreProcessEvent;
import github.scarsz.discordsrv.api.events.GameChatMessagePreProcessEvent;
+import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import xyz.etztech.deluxegroups.DeluxeGroup;
import xyz.etztech.deluxegroups.DeluxeGroups;
@@ -30,7 +32,7 @@ public class DiscordSRVListener {
public void onDiscordMessage(DiscordGuildMessagePreProcessEvent event) {
if (DeluxeGroups.getDatabase().groupExists(event.getChannel().getName())) {
DeluxeGroup group = DeluxeGroups.getDatabase().getGroup(event.getChannel().getName());
- String format = plugin.getConfig().getString("dtm", "[DISCORD | ] > ");
+ String format = plugin.getConfig().getString("discord.dtm", "[DISCORD | ] > ");
String chat = format.
replace("", group.getName()).
replace("", event.getMessage().getContentStripped()).
@@ -39,27 +41,14 @@ public class DiscordSRVListener {
group.sendMessage(chat);
event.setCancelled(true);
}
+ if (!event.getChannel().getId().equals(DiscordSRV.getPlugin().getMainTextChannel().getId())) {
+ event.setCancelled(true);
+ }
}
@Subscribe
public void onMinecraftMessage(GameChatMessagePreProcessEvent event) {
- String chat = event.getMessage();
- boolean groupChat = false;
- for (String prefix : this.groupPrefixes) {
- // If chat starts with 1 prefix, it is group chat.
- if (chat.startsWith(prefix)) {
- groupChat = true;
- chat = chat.substring(1);
- // If chat still starts with the prefix, it means there were two and we are delegating to normal chat
- if (chat.startsWith(prefix)) {
- event.setMessage(chat);
- return;
- }
- break;
- }
- }
- if (groupChat) {
- event.setCancelled(true);
- }
+ // Handled with custom events
+ event.setCancelled(true);
}
}
diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml
index 907b3dd..45ff74b 100644
--- a/src/main/resources/config.yml
+++ b/src/main/resources/config.yml
@@ -16,6 +16,6 @@ format:
discord:
# These have the same variables available as custom, but also for the name of the speaker
# Discord to Minecraft. Can include color codes
- dtm: '[DISCORD | ] > '
+ dtm: '[&bDiscord &f| &b&f] > '
# Minecraft to Discord
mtd: ' > '
\ No newline at end of file