From 38d6e043f2ff49e6e53cddcfce2b6f580a6c40e5 Mon Sep 17 00:00:00 2001 From: Deauthorized <49701242+Deauthorized@users.noreply.github.com> Date: Sat, 27 Apr 2024 22:36:40 -0400 Subject: [PATCH 01/15] Add moderated mode toggle option --- server/src/main/resources/toggles.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/server/src/main/resources/toggles.yml b/server/src/main/resources/toggles.yml index 5baf5ea..a5e1fa2 100644 --- a/server/src/main/resources/toggles.yml +++ b/server/src/main/resources/toggles.yml @@ -10,4 +10,7 @@ fluidspread: true drops: true # Should redstone be enabled? -redstone: true \ No newline at end of file +redstone: true + +# Should public chat be restricted to admins only? This does not affect commands such as /w, but will affect commands such as /me. +moderated: false From 2580c05404d5cad77d69b855c79d16f3ee4db78f Mon Sep 17 00:00:00 2001 From: Deauthorized <49701242+Deauthorized@users.noreply.github.com> Date: Sat, 27 Apr 2024 22:37:24 -0400 Subject: [PATCH 02/15] Add new messages to messages.yml for modmode toggle --- server/src/main/resources/messages.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/server/src/main/resources/messages.yml b/server/src/main/resources/messages.yml index 992e927..adbc283 100644 --- a/server/src/main/resources/messages.yml +++ b/server/src/main/resources/messages.yml @@ -110,6 +110,10 @@ playerFrozen: "That player is already frozen!" playerMuted: "That player is already muted!" playerLockedUp: "That player is already locked up!" muted: "You are currently muted - STFU!" +chatIsDisabled: "Public chat is currently restricted!" +# 0 - The command sender +modModeOn: "{0} - Restricting public chat to administrators" +modModeOff: "{0} - Unrestricting public chat" # 0 - The command sender # 1 - The player kickedPlayer: "{0} - Kicking {1}" From ad9aa328310a72bfa8545feca08f617b9b3f7314 Mon Sep 17 00:00:00 2001 From: Deauthorized <49701242+Deauthorized@users.noreply.github.com> Date: Sat, 27 Apr 2024 22:38:20 -0400 Subject: [PATCH 03/15] Add block_on_modmode list for commands to block, should be separate from block_on_mute so pms can still work --- server/src/main/resources/commands.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/server/src/main/resources/commands.yml b/server/src/main/resources/commands.yml index c42f2d4..a215bfa 100644 --- a/server/src/main/resources/commands.yml +++ b/server/src/main/resources/commands.yml @@ -60,4 +60,9 @@ block_on_mute: - say - msg - reply - - mail \ No newline at end of file + - mail + +# These commands will be blocked when chat has been toggled off, doesn't include commands that don't show a public message. +block_on_modmode: + - me + - say From 49b0d3a5d2a778400ec3b16887a32a203d5eafd5 Mon Sep 17 00:00:00 2001 From: Deauthorized <49701242+Deauthorized@users.noreply.github.com> Date: Sat, 27 Apr 2024 22:39:29 -0400 Subject: [PATCH 04/15] Implement the restricted chat toggle --- .../plex/listener/impl/TogglesListener.java | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/server/src/main/java/dev/plex/listener/impl/TogglesListener.java b/server/src/main/java/dev/plex/listener/impl/TogglesListener.java index 4cd7565..33c7e26 100644 --- a/server/src/main/java/dev/plex/listener/impl/TogglesListener.java +++ b/server/src/main/java/dev/plex/listener/impl/TogglesListener.java @@ -1,6 +1,12 @@ package dev.plex.listener.impl; +import dev.plex.Plex; import dev.plex.listener.PlexListener; +import dev.plex.util.PlexUtils; +import io.papermc.paper.event.player.AsyncChatEvent; +import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.block.BlockExplodeEvent; import org.bukkit.event.block.BlockFromToEvent; @@ -8,9 +14,13 @@ import org.bukkit.event.block.BlockRedstoneEvent; import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.event.entity.ExplosionPrimeEvent; import org.bukkit.event.player.PlayerDropItemEvent; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; + +import java.util.List; public class TogglesListener extends PlexListener { + List commands = plugin.commands.getStringList("block_on_modmode"); @EventHandler public void onExplosionPrime(ExplosionPrimeEvent event) { @@ -58,6 +68,48 @@ public class TogglesListener extends PlexListener } } + @EventHandler + public void onChat(AsyncChatEvent event) + { + Player player = event.getPlayer(); + if (plugin.toggles.getBoolean("moderated") && !Plex.get().getPermissions().has(player, "plex.togglechat.bypass")) + { + event.getPlayer().sendMessage(PlexUtils.messageComponent("chatIsDisabled")); + event.setCancelled(true); + } + } + + @EventHandler + public void onCommand(PlayerCommandPreprocessEvent event) + { + Player player = event.getPlayer(); + if (plugin.toggles.getBoolean("moderated") && !Plex.get().getPermissions().has(player, "plex.togglechat.bypass")) + { + String message = event.getMessage(); + message = message.replaceAll("\\s.*", "").replaceFirst("/", ""); + if (commands.contains(message.toLowerCase())) + { + event.getPlayer().sendMessage(PlexUtils.messageComponent("chatIsDisabled")); + event.setCancelled(true); + return; + } + + for (String command : commands) + { + Command cmd = Bukkit.getCommandMap().getCommand(command); + if (cmd == null) { + return; + } + if (cmd.getAliases().contains(message.toLowerCase())) { + event.getPlayer().sendMessage(PlexUtils.messageComponent("chatIsDisabled")); + event.setCancelled(true); + return; + } + } + } + + } + /* I have no idea if this is the best way to do this There is a very weird bug where if you try to create a loop using two repeaters and a lever, after disabling and re-enabling redstone, you are unable to recreate the loop with a lever. Using a redstone torch works fine. From 0b824fc7fd64423442b3a7f304f866e78788d588 Mon Sep 17 00:00:00 2001 From: Deauthorized <49701242+Deauthorized@users.noreply.github.com> Date: Sat, 27 Apr 2024 22:40:03 -0400 Subject: [PATCH 05/15] Add the restricted chat toggle to the toggle gui --- .../java/dev/plex/menu/impl/ToggleMenu.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/server/src/main/java/dev/plex/menu/impl/ToggleMenu.java b/server/src/main/java/dev/plex/menu/impl/ToggleMenu.java index 4f0bf06..b6a60f8 100644 --- a/server/src/main/java/dev/plex/menu/impl/ToggleMenu.java +++ b/server/src/main/java/dev/plex/menu/impl/ToggleMenu.java @@ -24,6 +24,7 @@ public class ToggleMenu extends AbstractMenu resetFluidspreadItem(this.inventory()); resetDropsItem(this.inventory()); resetRedstoneItem(this.inventory()); + resetChatItem(this.inventory()); } private void resetExplosionItem(Inventory inventory) @@ -66,6 +67,16 @@ public class ToggleMenu extends AbstractMenu inventory.setItem(3, redstone); } + private void resetChatItem(Inventory inventory) + { + ItemStack chat = new ItemStack(Material.OAK_SIGN); + ItemMeta chatItemMeta = chat.getItemMeta(); + chatItemMeta.displayName(PlexUtils.mmDeserialize("Toggle chat")); + chatItemMeta.lore(List.of(PlexUtils.mmDeserialize("Public chat is currently " + (plugin.toggles.getBoolean("moderated") ? "restricted to administrators" : "unrestricted")))); + chat.setItemMeta(chatItemMeta); + inventory.setItem(4, chat); + } + @Override public boolean onClick(InventoryView view, Inventory inventory, Player player, ItemStack clicked) { @@ -93,6 +104,13 @@ public class ToggleMenu extends AbstractMenu resetRedstoneItem(inventory); player.sendMessage(PlexUtils.mmDeserialize("Toggled redstone.")); } + if (clicked.getType() == Material.OAK_SIGN) + { + plugin.toggles.set("moderated", !plugin.toggles.getBoolean("moderated")); + PlexUtils.broadcast(PlexUtils.messageComponent(plugin.toggles.getBoolean("moderated") ? "modModeOn" : "modModeOff", player.getName())); + resetChatItem(inventory); + player.sendMessage(PlexUtils.mmDeserialize("Toggled moderated mode.")); + } return true; } } From 47bd1b6170b350ab7d358f1b21e9f250f950c599 Mon Sep 17 00:00:00 2001 From: Deauthorized <49701242+Deauthorized@users.noreply.github.com> Date: Sat, 27 Apr 2024 22:41:09 -0400 Subject: [PATCH 06/15] Add the restricted chat toggle to the consoles version of the command as well --- server/src/main/java/dev/plex/command/impl/ToggleCMD.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/server/src/main/java/dev/plex/command/impl/ToggleCMD.java b/server/src/main/java/dev/plex/command/impl/ToggleCMD.java index 152df22..38b5218 100644 --- a/server/src/main/java/dev/plex/command/impl/ToggleCMD.java +++ b/server/src/main/java/dev/plex/command/impl/ToggleCMD.java @@ -32,6 +32,7 @@ public class ToggleCMD extends PlexCommand sender.sendMessage(PlexUtils.mmDeserialize(" - Fluidspread" + status("fluidspread"))); sender.sendMessage(PlexUtils.mmDeserialize(" - Drops" + status("drops"))); sender.sendMessage(PlexUtils.mmDeserialize(" - Redstone" + status("redstone"))); + sender.sendMessage(PlexUtils.mmDeserialize(" - Admin-only public chat (modmode)" + status("moderated"))); return null; } switch (args[0].toLowerCase()) @@ -52,6 +53,11 @@ public class ToggleCMD extends PlexCommand { return toggle("redstone"); } + case "modmode" -> + { + PlexUtils.broadcast(messageComponent(plugin.toggles.getBoolean("moderated") ? "modModeOff" : "modModeOn", sender.getName())); + return toggle("moderated"); + } default -> { return messageComponent("invalidToggle"); From d6837b8b27aa65263d4e002f7e70f5907a9d6dd6 Mon Sep 17 00:00:00 2001 From: Deauthorized <49701242+Deauthorized@users.noreply.github.com> Date: Sun, 28 Apr 2024 02:05:55 -0400 Subject: [PATCH 07/15] Update toggles.yml / requested changes --- server/src/main/resources/toggles.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/src/main/resources/toggles.yml b/server/src/main/resources/toggles.yml index a5e1fa2..55c2437 100644 --- a/server/src/main/resources/toggles.yml +++ b/server/src/main/resources/toggles.yml @@ -12,5 +12,5 @@ drops: true # Should redstone be enabled? redstone: true -# Should public chat be restricted to admins only? This does not affect commands such as /w, but will affect commands such as /me. -moderated: false +# Is chat enabled? +chat: true From b286ee01ff6347358d863a4a5feac484b986ee61 Mon Sep 17 00:00:00 2001 From: Deauthorized <49701242+Deauthorized@users.noreply.github.com> Date: Sun, 28 Apr 2024 02:06:13 -0400 Subject: [PATCH 08/15] Update messages.yml / requested changes --- server/src/main/resources/messages.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/server/src/main/resources/messages.yml b/server/src/main/resources/messages.yml index adbc283..c6b8884 100644 --- a/server/src/main/resources/messages.yml +++ b/server/src/main/resources/messages.yml @@ -110,10 +110,11 @@ playerFrozen: "That player is already frozen!" playerMuted: "That player is already muted!" playerLockedUp: "That player is already locked up!" muted: "You are currently muted - STFU!" -chatIsDisabled: "Public chat is currently restricted!" +chatIsOff: "Chat is currently toggled off!" # 0 - The command sender -modModeOn: "{0} - Restricting public chat to administrators" -modModeOff: "{0} - Unrestricting public chat" +chatOff: "{0} - Toggled chat off" +# 0 - The command sender +chatOn: "{0} - Toggled chat on" # 0 - The command sender # 1 - The player kickedPlayer: "{0} - Kicking {1}" From 90d69dbcc323f532ff17936f48869046fc44815d Mon Sep 17 00:00:00 2001 From: Deauthorized <49701242+Deauthorized@users.noreply.github.com> Date: Sun, 28 Apr 2024 02:06:33 -0400 Subject: [PATCH 09/15] Update commands.yml / requested changes --- server/src/main/resources/commands.yml | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/server/src/main/resources/commands.yml b/server/src/main/resources/commands.yml index a215bfa..e199468 100644 --- a/server/src/main/resources/commands.yml +++ b/server/src/main/resources/commands.yml @@ -54,15 +54,10 @@ commands: - "r:a:^(co|core|coreprotect) (rb|rollback|l|lookup|rl|reload):_" - "r:e:^[A-z]*:[A-z]*::Plugin specific commands are disabled." -# These commands will be blocked when a player is muted +# These commands will be blocked when a player is muted or when chat is toggled off. block_on_mute: - me - say - msg - reply - mail - -# These commands will be blocked when chat has been toggled off, doesn't include commands that don't show a public message. -block_on_modmode: - - me - - say From 947332307d7be30955309e614501e7bf5af675cc Mon Sep 17 00:00:00 2001 From: Deauthorized <49701242+Deauthorized@users.noreply.github.com> Date: Sun, 28 Apr 2024 02:07:12 -0400 Subject: [PATCH 10/15] Update ToggleMenu.java / requested changes --- server/src/main/java/dev/plex/menu/impl/ToggleMenu.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/server/src/main/java/dev/plex/menu/impl/ToggleMenu.java b/server/src/main/java/dev/plex/menu/impl/ToggleMenu.java index b6a60f8..08fd84b 100644 --- a/server/src/main/java/dev/plex/menu/impl/ToggleMenu.java +++ b/server/src/main/java/dev/plex/menu/impl/ToggleMenu.java @@ -72,7 +72,7 @@ public class ToggleMenu extends AbstractMenu ItemStack chat = new ItemStack(Material.OAK_SIGN); ItemMeta chatItemMeta = chat.getItemMeta(); chatItemMeta.displayName(PlexUtils.mmDeserialize("Toggle chat")); - chatItemMeta.lore(List.of(PlexUtils.mmDeserialize("Public chat is currently " + (plugin.toggles.getBoolean("moderated") ? "restricted to administrators" : "unrestricted")))); + chatItemMeta.lore(List.of(PlexUtils.mmDeserialize("Chat is currently " + (plugin.toggles.getBoolean("chat") ? "on" : "off")))); chat.setItemMeta(chatItemMeta); inventory.setItem(4, chat); } @@ -106,10 +106,10 @@ public class ToggleMenu extends AbstractMenu } if (clicked.getType() == Material.OAK_SIGN) { - plugin.toggles.set("moderated", !plugin.toggles.getBoolean("moderated")); - PlexUtils.broadcast(PlexUtils.messageComponent(plugin.toggles.getBoolean("moderated") ? "modModeOn" : "modModeOff", player.getName())); + plugin.toggles.set("chat", !plugin.toggles.getBoolean("chat")); + PlexUtils.broadcast(PlexUtils.messageComponent(plugin.toggles.getBoolean("chat") ? "chatOn" : "chatOff", player.getName())); resetChatItem(inventory); - player.sendMessage(PlexUtils.mmDeserialize("Toggled moderated mode.")); + player.sendMessage(PlexUtils.mmDeserialize("Toggled chat.")); } return true; } From 4a1f2bd3e358e14c0cf32ae803e0345116a920a6 Mon Sep 17 00:00:00 2001 From: Deauthorized <49701242+Deauthorized@users.noreply.github.com> Date: Sun, 28 Apr 2024 02:08:02 -0400 Subject: [PATCH 11/15] Update TogglesListener.java / requested changes --- .../java/dev/plex/listener/impl/TogglesListener.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/server/src/main/java/dev/plex/listener/impl/TogglesListener.java b/server/src/main/java/dev/plex/listener/impl/TogglesListener.java index 33c7e26..5196d29 100644 --- a/server/src/main/java/dev/plex/listener/impl/TogglesListener.java +++ b/server/src/main/java/dev/plex/listener/impl/TogglesListener.java @@ -20,7 +20,7 @@ import java.util.List; public class TogglesListener extends PlexListener { - List commands = plugin.commands.getStringList("block_on_modmode"); + List commands = plugin.commands.getStringList("block_on_mute"); @EventHandler public void onExplosionPrime(ExplosionPrimeEvent event) { @@ -72,9 +72,9 @@ public class TogglesListener extends PlexListener public void onChat(AsyncChatEvent event) { Player player = event.getPlayer(); - if (plugin.toggles.getBoolean("moderated") && !Plex.get().getPermissions().has(player, "plex.togglechat.bypass")) + if (!plugin.toggles.getBoolean("chat") && !Plex.get().getPermissions().has(player, "plex.mute.bypass")) { - event.getPlayer().sendMessage(PlexUtils.messageComponent("chatIsDisabled")); + event.getPlayer().sendMessage(PlexUtils.messageComponent("chatIsOff")); event.setCancelled(true); } } @@ -83,13 +83,13 @@ public class TogglesListener extends PlexListener public void onCommand(PlayerCommandPreprocessEvent event) { Player player = event.getPlayer(); - if (plugin.toggles.getBoolean("moderated") && !Plex.get().getPermissions().has(player, "plex.togglechat.bypass")) + if (!plugin.toggles.getBoolean("chat") && !Plex.get().getPermissions().has(player, "plex.mute.bypass")) { String message = event.getMessage(); message = message.replaceAll("\\s.*", "").replaceFirst("/", ""); if (commands.contains(message.toLowerCase())) { - event.getPlayer().sendMessage(PlexUtils.messageComponent("chatIsDisabled")); + event.getPlayer().sendMessage(PlexUtils.messageComponent("chatIsOff")); event.setCancelled(true); return; } @@ -101,7 +101,7 @@ public class TogglesListener extends PlexListener return; } if (cmd.getAliases().contains(message.toLowerCase())) { - event.getPlayer().sendMessage(PlexUtils.messageComponent("chatIsDisabled")); + event.getPlayer().sendMessage(PlexUtils.messageComponent("chatIsOff")); event.setCancelled(true); return; } From 810a5470597e7ef4836bbbf5468899b1c4e47468 Mon Sep 17 00:00:00 2001 From: Deauthorized <49701242+Deauthorized@users.noreply.github.com> Date: Sun, 28 Apr 2024 02:08:31 -0400 Subject: [PATCH 12/15] Update ToggleCMD.java / requested changes --- server/src/main/java/dev/plex/command/impl/ToggleCMD.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/server/src/main/java/dev/plex/command/impl/ToggleCMD.java b/server/src/main/java/dev/plex/command/impl/ToggleCMD.java index 38b5218..2b96b8d 100644 --- a/server/src/main/java/dev/plex/command/impl/ToggleCMD.java +++ b/server/src/main/java/dev/plex/command/impl/ToggleCMD.java @@ -32,7 +32,7 @@ public class ToggleCMD extends PlexCommand sender.sendMessage(PlexUtils.mmDeserialize(" - Fluidspread" + status("fluidspread"))); sender.sendMessage(PlexUtils.mmDeserialize(" - Drops" + status("drops"))); sender.sendMessage(PlexUtils.mmDeserialize(" - Redstone" + status("redstone"))); - sender.sendMessage(PlexUtils.mmDeserialize(" - Admin-only public chat (modmode)" + status("moderated"))); + sender.sendMessage(PlexUtils.mmDeserialize(" - Chat" + status("chat"))); return null; } switch (args[0].toLowerCase()) @@ -53,10 +53,10 @@ public class ToggleCMD extends PlexCommand { return toggle("redstone"); } - case "modmode" -> + case "chat" -> { - PlexUtils.broadcast(messageComponent(plugin.toggles.getBoolean("moderated") ? "modModeOff" : "modModeOn", sender.getName())); - return toggle("moderated"); + PlexUtils.broadcast(messageComponent(plugin.toggles.getBoolean("chat") ? "chatOff" : "chatOn", sender.getName())); + return toggle("chat"); } default -> { From e79141b41553628a32d27ecda80159db45395fba Mon Sep 17 00:00:00 2001 From: Deauthorized <49701242+Deauthorized@users.noreply.github.com> Date: Sun, 28 Apr 2024 03:01:42 -0400 Subject: [PATCH 13/15] Update messages.yml / requested changes --- server/src/main/resources/messages.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/server/src/main/resources/messages.yml b/server/src/main/resources/messages.yml index c6b8884..9b97556 100644 --- a/server/src/main/resources/messages.yml +++ b/server/src/main/resources/messages.yml @@ -112,9 +112,8 @@ playerLockedUp: "That player is already locked up!" muted: "You are currently muted - STFU!" chatIsOff: "Chat is currently toggled off!" # 0 - The command sender -chatOff: "{0} - Toggled chat off" -# 0 - The command sender -chatOn: "{0} - Toggled chat on" +# 1 - The set value of the chat toggle +chatToggled: "{0} - Toggled chat {1}" # 0 - The command sender # 1 - The player kickedPlayer: "{0} - Kicking {1}" From 99c70eb71365e7d7d81acdd597d63769bd99756d Mon Sep 17 00:00:00 2001 From: Deauthorized <49701242+Deauthorized@users.noreply.github.com> Date: Sun, 28 Apr 2024 03:02:14 -0400 Subject: [PATCH 14/15] Update ToggleMenu.java / requested changes --- server/src/main/java/dev/plex/menu/impl/ToggleMenu.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/main/java/dev/plex/menu/impl/ToggleMenu.java b/server/src/main/java/dev/plex/menu/impl/ToggleMenu.java index 08fd84b..0f9b71a 100644 --- a/server/src/main/java/dev/plex/menu/impl/ToggleMenu.java +++ b/server/src/main/java/dev/plex/menu/impl/ToggleMenu.java @@ -107,7 +107,7 @@ public class ToggleMenu extends AbstractMenu if (clicked.getType() == Material.OAK_SIGN) { plugin.toggles.set("chat", !plugin.toggles.getBoolean("chat")); - PlexUtils.broadcast(PlexUtils.messageComponent(plugin.toggles.getBoolean("chat") ? "chatOn" : "chatOff", player.getName())); + PlexUtils.broadcast(PlexUtils.messageComponent("chatToggled", player.getName(), plugin.toggles.getBoolean("chat") ? "on" : "off")); resetChatItem(inventory); player.sendMessage(PlexUtils.mmDeserialize("Toggled chat.")); } From 87d94909bc29e3f21cf7c6adb8a42c9a54bb5808 Mon Sep 17 00:00:00 2001 From: Deauthorized <49701242+Deauthorized@users.noreply.github.com> Date: Sun, 28 Apr 2024 03:02:43 -0400 Subject: [PATCH 15/15] Update ToggleCMD.java / requested changes --- server/src/main/java/dev/plex/command/impl/ToggleCMD.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/main/java/dev/plex/command/impl/ToggleCMD.java b/server/src/main/java/dev/plex/command/impl/ToggleCMD.java index 2b96b8d..d152967 100644 --- a/server/src/main/java/dev/plex/command/impl/ToggleCMD.java +++ b/server/src/main/java/dev/plex/command/impl/ToggleCMD.java @@ -55,7 +55,7 @@ public class ToggleCMD extends PlexCommand } case "chat" -> { - PlexUtils.broadcast(messageComponent(plugin.toggles.getBoolean("chat") ? "chatOff" : "chatOn", sender.getName())); + PlexUtils.broadcast(PlexUtils.messageComponent("chatToggled", sender.getName(), plugin.toggles.getBoolean("chat") ? "off" : "on")); return toggle("chat"); } default ->