From c5c60d25b130b52235025dc1df92ccb4b9425f5a Mon Sep 17 00:00:00 2001 From: Teriuihi Date: Thu, 2 Jan 2025 00:22:03 +0100 Subject: [PATCH 1/2] Cleanup --- .../alttd/chat/listeners/PluginMessage.java | 40 ++++++++++--------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/galaxy/src/main/java/com/alttd/chat/listeners/PluginMessage.java b/galaxy/src/main/java/com/alttd/chat/listeners/PluginMessage.java index 73a5d0d..c09772f 100755 --- a/galaxy/src/main/java/com/alttd/chat/listeners/PluginMessage.java +++ b/galaxy/src/main/java/com/alttd/chat/listeners/PluginMessage.java @@ -22,13 +22,14 @@ import org.bukkit.Sound; import org.bukkit.entity.Player; import org.bukkit.plugin.messaging.PluginMessageListener; import org.bukkit.scheduler.BukkitRunnable; +import org.jetbrains.annotations.NotNull; import java.util.UUID; public class PluginMessage implements PluginMessageListener { @Override - public void onPluginMessageReceived(String channel, Player player, byte[] bytes) { + public void onPluginMessageReceived(String channel, @NotNull Player ignored, byte[] bytes) { if (!channel.equals(Config.MESSAGECHANNEL)) { return; } @@ -38,35 +39,36 @@ public class PluginMessage implements PluginMessageListener { case "privatemessagein": { UUID uuid = UUID.fromString(in.readUTF()); String target = in.readUTF(); - Player p = Bukkit.getPlayer(uuid); + Player player = Bukkit.getPlayer(uuid); String message = in.readUTF(); UUID targetuuid = UUID.fromString(in.readUTF()); - if (p != null) { - ChatUser chatUser = ChatUserManager.getChatUser(uuid); - if (!chatUser.getIgnoredPlayers().contains(targetuuid)) { - p.sendMessage(GsonComponentSerializer.gson().deserialize(message)); - p.playSound(p.getLocation(), Sound.BLOCK_NOTE_BLOCK_BASS, 1, 1); // todo load this from config - ChatUser user = ChatUserManager.getChatUser(uuid); - if (!user.getReplyContinueTarget().equalsIgnoreCase(target)) - user.setReplyTarget(target); - } + if (player == null) { + break; + } + ChatUser chatUser = ChatUserManager.getChatUser(uuid); + if (!chatUser.getIgnoredPlayers().contains(targetuuid)) { + player.sendMessage(GsonComponentSerializer.gson().deserialize(message)); + player.playSound(player.getLocation(), Sound.BLOCK_NOTE_BLOCK_BASS, 1, 1); // todo load this from config + ChatUser user = ChatUserManager.getChatUser(uuid); + if (!user.getReplyContinueTarget().equalsIgnoreCase(target)) + user.setReplyTarget(target); } - break; } case "privatemessageout": { UUID uuid = UUID.fromString(in.readUTF()); String target = in.readUTF(); - Player p = Bukkit.getPlayer(uuid); + Player player = Bukkit.getPlayer(uuid); String message = in.readUTF(); UUID targetuuid = UUID.fromString(in.readUTF()); - if (p != null) { - ChatUser chatUser = ChatUserManager.getChatUser(uuid); - if (!chatUser.getIgnoredPlayers().contains(targetuuid)) { - chatUser.setReplyTarget(target); - p.sendMessage(GsonComponentSerializer.gson().deserialize(message)); + if (player == null) { + break; + } + ChatUser chatUser = ChatUserManager.getChatUser(uuid); + if (!chatUser.getIgnoredPlayers().contains(targetuuid)) { + chatUser.setReplyTarget(target); + player.sendMessage(GsonComponentSerializer.gson().deserialize(message)); // ChatUser user = ChatUserManager.getChatUser(uuid); // user.setReplyTarget(target); - } } break; } From 5e34e6e7faf3d99ee5e2d932f46c23cdcbce73f4 Mon Sep 17 00:00:00 2001 From: Teriuihi Date: Thu, 2 Jan 2025 00:30:55 +0100 Subject: [PATCH 2/2] Don't ignore users with bypass permission Refactored chat logic to respect 'chat.ignorebypass' permission for both senders and receivers. This only applies to cases where a user is sending text to another user, checks for login/out messages were not fixed --- .../com/alttd/chat/handler/ChatHandler.java | 16 +++++++--- .../alttd/chat/listeners/ChatListener.java | 29 ++++++++++++------- .../alttd/chat/listeners/PluginMessage.java | 18 +++++++++--- 3 files changed, 45 insertions(+), 18 deletions(-) diff --git a/galaxy/src/main/java/com/alttd/chat/handler/ChatHandler.java b/galaxy/src/main/java/com/alttd/chat/handler/ChatHandler.java index c0dfe2e..02a43c0 100755 --- a/galaxy/src/main/java/com/alttd/chat/handler/ChatHandler.java +++ b/galaxy/src/main/java/com/alttd/chat/handler/ChatHandler.java @@ -26,6 +26,7 @@ import org.bukkit.inventory.ItemStack; import java.util.*; import java.util.concurrent.TimeUnit; +import java.util.stream.Stream; public class ChatHandler { @@ -239,10 +240,17 @@ public class ChatHandler { private void sendChatChannelMessage(CustomChannel chatChannel, UUID uuid, Component component) { if (!chatChannel.getServers().contains(Bukkit.getServerName())) return; - Bukkit.getServer().getOnlinePlayers().stream() - .filter(p -> p.hasPermission(chatChannel.getPermission())) - .filter(p -> !ChatUserManager.getChatUser(p.getUniqueId()).getIgnoredPlayers().contains(uuid)) - .forEach(p -> p.sendMessage(component)); + Player player = Bukkit.getPlayer(uuid); + if (player == null) { + return; + } + + Stream stream = Bukkit.getServer().getOnlinePlayers().stream() + .filter(p -> p.hasPermission(chatChannel.getPermission())); + if (!player.hasPermission("chat.ignorebypass")) { + stream = stream.filter(p -> !ChatUserManager.getChatUser(p.getUniqueId()).getIgnoredPlayers().contains(uuid) && !p.hasPermission("chat.ignorebypass")); + } + stream.forEach(p -> p.sendMessage(component)); } private void sendPluginMessage(Player player, String channel, Component component) { diff --git a/galaxy/src/main/java/com/alttd/chat/listeners/ChatListener.java b/galaxy/src/main/java/com/alttd/chat/listeners/ChatListener.java index 0e40256..e13afc0 100755 --- a/galaxy/src/main/java/com/alttd/chat/listeners/ChatListener.java +++ b/galaxy/src/main/java/com/alttd/chat/listeners/ChatListener.java @@ -32,8 +32,10 @@ import org.jetbrains.annotations.NotNull; import java.util.HashSet; import java.util.Set; +import java.util.UUID; import java.util.regex.Pattern; import java.util.stream.Collectors; +import java.util.stream.Stream; public class ChatListener implements Listener { @@ -81,13 +83,14 @@ public class ChatListener implements Listener { } Player player = event.getPlayer(); + UUID uuid = player.getUniqueId(); Component input = event.message().colorIfAbsent(NamedTextColor.WHITE); ModifiableString modifiableString = new ModifiableString(input); // todo a better way for this - if(!RegexManager.filterText(player.getName(), player.getUniqueId(), modifiableString, true, "chat", filterType -> { + if(!RegexManager.filterText(player.getName(), uuid, modifiableString, true, "chat", filterType -> { if (!filterType.equals(FilterType.PUNISH)) { ALogger.warn("Received another FilterType than punish when filtering chat and executing a filter action"); return; @@ -95,7 +98,7 @@ public class ChatListener implements Listener { ByteArrayDataOutput out = ByteStreams.newDataOutput(); out.writeUTF("punish"); out.writeUTF(player.getName()); - out.writeUTF(player.getUniqueId().toString()); + out.writeUTF(uuid.toString()); out.writeUTF(modifiableString.string()); player.sendPluginMessage(ChatPlugin.getInstance(), Config.MESSAGECHANNEL, out.toByteArray()); })) { @@ -103,14 +106,18 @@ public class ChatListener implements Listener { GalaxyUtility.sendBlockedNotification("Language", player, modifiableString.component(), ""); - chatLogHandler.addChatLog(player.getUniqueId(), player.getServer().getServerName(), PlainTextComponentSerializer.plainText().serialize(input), true); + chatLogHandler.addChatLog(uuid, player.getServer().getServerName(), PlainTextComponentSerializer.plainText().serialize(input), true); return; // the message was blocked } - Set receivers = event.viewers().stream().filter(audience -> audience instanceof Player) - .map(audience -> (Player) audience) - .filter(receiver -> !ChatUserManager.getChatUser(receiver.getUniqueId()).getIgnoredPlayers().contains(player.getUniqueId())) - .collect(Collectors.toSet()); + Stream stream = event.viewers().stream().filter(audience -> audience instanceof Player) + .map(audience -> (Player) audience); + + if (!player.hasPermission("chat.ignorebypass")) { + stream = stream.filter(receiver -> !ChatUserManager.getChatUser(receiver.getUniqueId()).getIgnoredPlayers().contains(uuid) + && !receiver.hasPermission("chat.ignorebypass")); + } + Set receivers = stream.collect(Collectors.toSet()); Set playersToPing = new HashSet<>(); pingPlayers(playersToPing, modifiableString, player); @@ -122,7 +129,7 @@ public class ChatListener implements Listener { for (Player pingPlayer : playersToPing) { pingPlayer.playSound(pingPlayer.getLocation(), Sound.BLOCK_NOTE_BLOCK_BASS, 1, 1); } - chatLogHandler.addChatLog(player.getUniqueId(), player.getServer().getServerName(), modifiableString.string(), false); + chatLogHandler.addChatLog(uuid, player.getServer().getServerName(), modifiableString.string(), false); ALogger.info(PlainTextComponentSerializer.plainText().serialize(input)); } @@ -150,7 +157,8 @@ public class ChatListener implements Listener { // String substring = a.group().substring(1); // return ; // }); - if (!ChatUserManager.getChatUser(onlinePlayer.getUniqueId()).getIgnoredPlayers().contains(player.getUniqueId())) + if (!ChatUserManager.getChatUser(onlinePlayer.getUniqueId()).getIgnoredPlayers().contains(player.getUniqueId()) + && !player.hasPermission("chat.ignorebypass")) playersToPing.add(onlinePlayer); } else if (nickPattern.matcher(modifiableString.string()).find()) { modifiableString.replace(TextReplacementConfig.builder() @@ -158,7 +166,8 @@ public class ChatListener implements Listener { .match(nickPattern) .replacement(mention.append(onlinePlayer.displayName())) .build()); - if (!ChatUserManager.getChatUser(onlinePlayer.getUniqueId()).getIgnoredPlayers().contains(player.getUniqueId())) + if (!ChatUserManager.getChatUser(onlinePlayer.getUniqueId()).getIgnoredPlayers().contains(player.getUniqueId()) + && !player.hasPermission("chat.ignorebypass")) playersToPing.add(onlinePlayer); } } diff --git a/galaxy/src/main/java/com/alttd/chat/listeners/PluginMessage.java b/galaxy/src/main/java/com/alttd/chat/listeners/PluginMessage.java index c09772f..925eca3 100755 --- a/galaxy/src/main/java/com/alttd/chat/listeners/PluginMessage.java +++ b/galaxy/src/main/java/com/alttd/chat/listeners/PluginMessage.java @@ -15,7 +15,6 @@ import com.alttd.chat.util.Utility; import com.google.common.io.ByteArrayDataInput; import com.google.common.io.ByteStreams; import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import org.bukkit.Bukkit; import org.bukkit.Sound; @@ -46,7 +45,7 @@ public class PluginMessage implements PluginMessageListener { break; } ChatUser chatUser = ChatUserManager.getChatUser(uuid); - if (!chatUser.getIgnoredPlayers().contains(targetuuid)) { + if (isTargetNotIgnored(chatUser, targetuuid)) { player.sendMessage(GsonComponentSerializer.gson().deserialize(message)); player.playSound(player.getLocation(), Sound.BLOCK_NOTE_BLOCK_BASS, 1, 1); // todo load this from config ChatUser user = ChatUserManager.getChatUser(uuid); @@ -64,7 +63,7 @@ public class PluginMessage implements PluginMessageListener { break; } ChatUser chatUser = ChatUserManager.getChatUser(uuid); - if (!chatUser.getIgnoredPlayers().contains(targetuuid)) { + if (isTargetNotIgnored(chatUser, targetuuid)) { chatUser.setReplyTarget(target); player.sendMessage(GsonComponentSerializer.gson().deserialize(message)); // ChatUser user = ChatUserManager.getChatUser(uuid); @@ -80,7 +79,7 @@ public class PluginMessage implements PluginMessageListener { Bukkit.getOnlinePlayers().stream().filter(p -> p.hasPermission(Config.GCPERMISSION)).forEach(p -> { ChatUser chatUser = ChatUserManager.getChatUser(p.getUniqueId()); - if (!chatUser.getIgnoredPlayers().contains(uuid)) { + if (isTargetNotIgnored(chatUser, uuid)) { p.sendMessage(GsonComponentSerializer.gson().deserialize(message)); } }); @@ -218,4 +217,15 @@ public class PluginMessage implements PluginMessageListener { }.runTaskAsynchronously(ChatPlugin.getInstance()); } + private boolean isTargetNotIgnored(ChatUser chatUser, UUID targetUUID) { + if (!chatUser.getIgnoredPlayers().contains(targetUUID)) { + return true; + } + Player target = Bukkit.getPlayer(targetUUID); + if (target == null) { + return true; + } + return target.hasPermission("chat.ignorebypass"); + } + } \ No newline at end of file