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 0d85bf3..d803685 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)); } @@ -151,7 +158,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() @@ -159,7 +167,8 @@ public class ChatListener implements Listener { .match(nickPattern) .replacement(mention.append(onlinePlayerUser.getDisplayName())) .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 73a5d0d..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,20 +15,20 @@ 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; 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 +38,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 (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); + 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 (isTargetNotIgnored(chatUser, targetuuid)) { + chatUser.setReplyTarget(target); + player.sendMessage(GsonComponentSerializer.gson().deserialize(message)); // ChatUser user = ChatUserManager.getChatUser(uuid); // user.setReplyTarget(target); - } } break; } @@ -78,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)); } }); @@ -216,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