From fc5d0639b8ad4adf81fb0773e9b8810f4e52642c Mon Sep 17 00:00:00 2001 From: ehko Date: Fri, 29 May 2026 13:29:16 -0400 Subject: [PATCH] replace staffchat payload with a better ver (i hate the toggle) --- .../java/net/kewwbec/staff/StaffPlugin.java | 9 +-- .../staff/command/chat/StaffChatCommand.java | 28 +++------ .../kewwbec/staff/listener/ChatEnforcer.java | 20 ++---- .../staff/listener/PlayerSeenTracker.java | 5 -- .../staff/service/StaffChatPayload.java | 1 + .../staff/service/StaffChatService.java | 63 ++++++++++++++++--- .../staff/service/StaffChatToggleService.java | 34 ---------- 7 files changed, 73 insertions(+), 87 deletions(-) delete mode 100644 src/main/java/net/kewwbec/staff/service/StaffChatToggleService.java diff --git a/src/main/java/net/kewwbec/staff/StaffPlugin.java b/src/main/java/net/kewwbec/staff/StaffPlugin.java index 4eb582b..9eba801 100644 --- a/src/main/java/net/kewwbec/staff/StaffPlugin.java +++ b/src/main/java/net/kewwbec/staff/StaffPlugin.java @@ -29,7 +29,6 @@ import net.kewwbec.staff.listener.StaffPresenceListener; import net.kewwbec.staff.service.MuteCache; import net.kewwbec.staff.service.PunishmentService; import net.kewwbec.staff.service.StaffChatService; -import net.kewwbec.staff.service.StaffChatToggleService; import net.kewwbec.staff.util.PlayerResolver; import net.kewwbec.staff.util.StaffPermissions; @@ -45,7 +44,6 @@ public final class StaffPlugin extends JavaPlugin { private StaffConfig config; private StaffPermissions permissions; private MuteCache muteCache; - private StaffChatToggleService chatToggle; private PunishmentService punishmentService; private StaffChatService staffChat; private StaffPresenceListener staffPresenceListener; @@ -64,7 +62,6 @@ public final class StaffPlugin extends JavaPlugin { } this.permissions = new StaffPermissions(); this.muteCache = new MuteCache(); - this.chatToggle = new StaffChatToggleService(); LOGGER.at(Level.INFO).log("Staff setup complete"); } @@ -111,8 +108,8 @@ public final class StaffPlugin extends JavaPlugin { punishmentService.start(); BanEnforcer banEnforcer = new BanEnforcer(punishmentService); - ChatEnforcer chatEnforcer = new ChatEnforcer(muteCache, chatToggle, staffChat); - PlayerSeenTracker seenTracker = new PlayerSeenTracker(seenRepo, muteCache, punishmentService, chatToggle, core.getServerId()); + ChatEnforcer chatEnforcer = new ChatEnforcer(muteCache); + PlayerSeenTracker seenTracker = new PlayerSeenTracker(seenRepo, muteCache, punishmentService, core.getServerId()); getEventRegistry().registerGlobal(PlayerSetupConnectEvent.class, banEnforcer::onSetupConnect); getEventRegistry().registerGlobal(PlayerChatEvent.class, chatEnforcer::onChat); @@ -139,7 +136,7 @@ public final class StaffPlugin extends JavaPlugin { getCommandRegistry().registerCommand(new PunishmentCommands.Warn(punishmentService, staffChat, resolver)); getCommandRegistry().registerCommand(new PunishmentCommands.Unban(punishmentService, staffChat, resolver)); getCommandRegistry().registerCommand(new PunishmentCommands.Unmute(punishmentService, staffChat, resolver)); - getCommandRegistry().registerCommand(new StaffChatCommand(chatToggle, staffChat)); + getCommandRegistry().registerCommand(new StaffChatCommand(staffChat)); getCommandRegistry().registerCommand(new LookupCommand(resolver, seenRepo, punishmentService)); getCommandRegistry().registerCommand(new HistoryCommand(resolver, punishmentRepo)); diff --git a/src/main/java/net/kewwbec/staff/command/chat/StaffChatCommand.java b/src/main/java/net/kewwbec/staff/command/chat/StaffChatCommand.java index 1d23343..96a3cb4 100644 --- a/src/main/java/net/kewwbec/staff/command/chat/StaffChatCommand.java +++ b/src/main/java/net/kewwbec/staff/command/chat/StaffChatCommand.java @@ -4,7 +4,7 @@ import com.hypixel.hytale.component.Ref; import com.hypixel.hytale.component.Store; import com.hypixel.hytale.server.core.Message; import com.hypixel.hytale.server.core.command.system.CommandContext; -import com.hypixel.hytale.server.core.command.system.arguments.system.OptionalArg; +import com.hypixel.hytale.server.core.command.system.arguments.system.RequiredArg; import com.hypixel.hytale.server.core.command.system.arguments.types.ArgTypes; import com.hypixel.hytale.server.core.command.system.basecommands.AbstractPlayerCommand; import com.hypixel.hytale.server.core.universe.PlayerRef; @@ -12,26 +12,20 @@ import com.hypixel.hytale.server.core.universe.world.World; import com.hypixel.hytale.server.core.universe.world.storage.EntityStore; import net.kewwbec.staff.StaffPermissionsNodes; import net.kewwbec.staff.service.StaffChatService; -import net.kewwbec.staff.service.StaffChatToggleService; import javax.annotation.Nonnull; import java.awt.Color; /** - * /sc [message...] - * - * If a body is supplied, sends it once to staff chat without changing your chat mode. - * If no body, toggles staff chat mode - all subsequent chat goes to staff until /sc is run again. + * /sc <message...> - send one staff-chat line. */ public final class StaffChatCommand extends AbstractPlayerCommand { - private final StaffChatToggleService toggle; private final StaffChatService staffChat; - private final OptionalArg bodyArg = withOptionalArg("message", "Message body (optional)", ArgTypes.GREEDY_STRING); + private final RequiredArg bodyArg = withRequiredArg("message", "Message body", ArgTypes.GREEDY_STRING); - public StaffChatCommand(@Nonnull StaffChatToggleService toggle, @Nonnull StaffChatService staffChat) { - super("sc", "Send a one-shot staff message, or toggle staff chat mode if no message given"); - this.toggle = toggle; + public StaffChatCommand(@Nonnull StaffChatService staffChat) { + super("sc", "Send a staff chat message"); this.staffChat = staffChat; requirePermission(StaffPermissionsNodes.CHAT); } @@ -45,16 +39,10 @@ public final class StaffChatCommand extends AbstractPlayerCommand { @Nonnull PlayerRef sender, @Nonnull World world) { String body = bodyArg.get(ctx); - if (body != null && !body.isBlank()) { - staffChat.send(sender, body.trim()); + if (body == null || body.isBlank()) { + ctx.sendMessage(Message.raw("Usage: /sc ").color(Color.YELLOW)); return; } - - boolean nowOn = toggle.toggle(sender.getUuid()); - if (nowOn) { - ctx.sendMessage(Message.raw("Staff chat ON. Your chat now broadcasts to staff. Run /sc again to turn off.").color(Color.GREEN)); - } else { - ctx.sendMessage(Message.raw("Staff chat OFF. Your chat is back to normal.").color(Color.YELLOW)); - } + staffChat.send(sender, body.trim()); } } diff --git a/src/main/java/net/kewwbec/staff/listener/ChatEnforcer.java b/src/main/java/net/kewwbec/staff/listener/ChatEnforcer.java index a352519..7ef9757 100644 --- a/src/main/java/net/kewwbec/staff/listener/ChatEnforcer.java +++ b/src/main/java/net/kewwbec/staff/listener/ChatEnforcer.java @@ -5,25 +5,21 @@ import com.hypixel.hytale.server.core.event.events.player.PlayerChatEvent; import com.hypixel.hytale.server.core.universe.PlayerRef; import net.kewwbec.staff.model.Punishment; import net.kewwbec.staff.service.MuteCache; -import net.kewwbec.staff.service.StaffChatService; -import net.kewwbec.staff.service.StaffChatToggleService; import net.kewwbec.staff.util.DurationParser; import javax.annotation.Nonnull; import java.awt.Color; +/** + * Cancels chat if the speaker is muted. Staff chat is opt-in via /sc; this listener does not + * re-route any normal chat events. + */ public final class ChatEnforcer { private final MuteCache muteCache; - private final StaffChatToggleService toggle; - private final StaffChatService staffChat; - public ChatEnforcer(@Nonnull MuteCache muteCache, - @Nonnull StaffChatToggleService toggle, - @Nonnull StaffChatService staffChat) { + public ChatEnforcer(@Nonnull MuteCache muteCache) { this.muteCache = muteCache; - this.toggle = toggle; - this.staffChat = staffChat; } public void onChat(@Nonnull PlayerChatEvent event) { @@ -37,12 +33,6 @@ public final class ChatEnforcer { ? "permanently" : "for " + DurationParser.formatRemaining(mute.expiresAt() - System.currentTimeMillis()); sender.sendMessage(Message.raw("You are muted " + suffix + ": " + mute.reason()).color(Color.RED)); - return; - } - - if (toggle.isOn(sender.getUuid())) { - event.setCancelled(true); - staffChat.send(sender, event.getContent()); } } } diff --git a/src/main/java/net/kewwbec/staff/listener/PlayerSeenTracker.java b/src/main/java/net/kewwbec/staff/listener/PlayerSeenTracker.java index a050f8a..bf0124a 100644 --- a/src/main/java/net/kewwbec/staff/listener/PlayerSeenTracker.java +++ b/src/main/java/net/kewwbec/staff/listener/PlayerSeenTracker.java @@ -7,7 +7,6 @@ import com.hypixel.hytale.server.core.universe.PlayerRef; import net.kewwbec.staff.db.PlayerSeenRepository; import net.kewwbec.staff.service.MuteCache; import net.kewwbec.staff.service.PunishmentService; -import net.kewwbec.staff.service.StaffChatToggleService; import javax.annotation.Nonnull; import java.sql.SQLException; @@ -20,18 +19,15 @@ public final class PlayerSeenTracker { private final PlayerSeenRepository seen; private final MuteCache muteCache; private final PunishmentService punishments; - private final StaffChatToggleService toggle; private final String serverId; public PlayerSeenTracker(@Nonnull PlayerSeenRepository seen, @Nonnull MuteCache muteCache, @Nonnull PunishmentService punishments, - @Nonnull StaffChatToggleService toggle, @Nonnull String serverId) { this.seen = seen; this.muteCache = muteCache; this.punishments = punishments; - this.toggle = toggle; this.serverId = serverId; } @@ -57,6 +53,5 @@ public final class PlayerSeenTracker { .log("Failed to record leave for %s", ref.getUuid()); } muteCache.remove(ref.getUuid()); - toggle.clear(ref.getUuid()); } } diff --git a/src/main/java/net/kewwbec/staff/service/StaffChatPayload.java b/src/main/java/net/kewwbec/staff/service/StaffChatPayload.java index 3ea15cb..19df0de 100644 --- a/src/main/java/net/kewwbec/staff/service/StaffChatPayload.java +++ b/src/main/java/net/kewwbec/staff/service/StaffChatPayload.java @@ -3,6 +3,7 @@ package net.kewwbec.staff.service; public final class StaffChatPayload { public String fromServerId; + public String fromUuid; public String fromUsername; public String message; public long ts; diff --git a/src/main/java/net/kewwbec/staff/service/StaffChatService.java b/src/main/java/net/kewwbec/staff/service/StaffChatService.java index d776696..d46a19b 100644 --- a/src/main/java/net/kewwbec/staff/service/StaffChatService.java +++ b/src/main/java/net/kewwbec/staff/service/StaffChatService.java @@ -3,7 +3,10 @@ package net.kewwbec.staff.service; import com.hypixel.hytale.server.core.Message; import com.hypixel.hytale.server.core.universe.PlayerRef; import com.hypixel.hytale.server.core.universe.Universe; +import net.kewwbec.networkcore.NetworkCore; import net.kewwbec.networkcore.api.MessageBus; +import net.kewwbec.networkcore.api.ranks.RankInfo; +import net.kewwbec.networkcore.api.ranks.RankLookup; import net.kewwbec.staff.StaffPermissionsNodes; import net.kewwbec.staff.config.StaffConfig; import net.kewwbec.staff.util.StaffPermissions; @@ -11,9 +14,12 @@ import net.kewwbec.staff.util.StaffPermissions; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.awt.Color; +import java.util.UUID; public final class StaffChatService { + private static final Color AQUA = new Color(0x55FFFF); + private final MessageBus bus; private final StaffConfig.ChatSection cfg; private final StaffPermissions perms; @@ -45,6 +51,7 @@ public final class StaffChatService { public void send(@Nonnull PlayerRef sender, @Nonnull String message) { StaffChatPayload p = new StaffChatPayload(); p.fromServerId = serverId; + p.fromUuid = sender.getUuid().toString(); p.fromUsername = sender.getUsername(); p.message = message; p.ts = System.currentTimeMillis(); @@ -58,6 +65,7 @@ public final class StaffChatService { public void announce(@Nonnull String text) { StaffChatPayload p = new StaffChatPayload(); p.fromServerId = serverId; + p.fromUuid = null; p.fromUsername = "SYSTEM"; p.message = text; p.ts = System.currentTimeMillis(); @@ -70,19 +78,60 @@ public final class StaffChatService { Universe universe = Universe.get(); if (universe == null) return; - String formatted = formatLine(p); + RankInfo senderRank = null; + if (!p.systemAnnouncement && p.fromUuid != null) { + try { + UUID uuid = UUID.fromString(p.fromUuid); + senderRank = lookupRank(uuid); + } catch (IllegalArgumentException ignored) {} + } + + Message line = buildLine(p.fromServerId, senderRank, p.fromUsername, p.message); for (PlayerRef ref : universe.getPlayers()) { if (!perms.has(ref, StaffPermissionsNodes.CHAT)) continue; - ref.sendMessage(Message.raw(formatted).color(p.systemAnnouncement ? Color.YELLOW : Color.LIGHT_GRAY)); + ref.sendMessage(line); + } + } + + @Nullable + private static RankInfo lookupRank(@Nonnull UUID uuid) { + try { + RankLookup ranks = NetworkCore.getInstance().getRankLookup(); + return ranks == null ? null : ranks.getPrimaryRank(uuid); + } catch (RuntimeException ignored) { + return null; } } @Nonnull - private String formatLine(@Nonnull StaffChatPayload p) { - String origin = (p.fromServerId == null) ? "?" : p.fromServerId; - if (p.systemAnnouncement) { - return cfg.prefix + " " + origin + " | " + p.message; + private static Message buildLine(@Nullable String originServerId, + @Nullable RankInfo senderRank, + @Nonnull String senderName, + @Nonnull String body) { + String origin = (originServerId == null) ? "?" : originServerId; + String prefix = (senderRank == null || senderRank.prefix() == null || senderRank.prefix().isBlank()) + ? "" : senderRank.prefix(); + Color nameColor = (senderRank == null) ? null : parseHex(senderRank.color()); + + Message line = Message.empty() + .insert(Message.raw("[Staff (" + origin + ")] ").color(AQUA)); + if (!prefix.isEmpty()) { + Message prefixMsg = Message.raw(prefix + " "); + line = line.insert(nameColor == null ? prefixMsg : prefixMsg.color(nameColor)); } - return cfg.prefix + " " + p.fromUsername + " (" + origin + "): " + p.message; + Message nameMsg = Message.raw(senderName); + line = line.insert(nameColor == null ? nameMsg : nameMsg.color(nameColor)); + line = line.insert(Message.raw(": ").color(AQUA)); + line = line.insert(Message.raw(body).color(Color.WHITE)); + return line; + } + + @Nullable + private static Color parseHex(@Nullable String hex) { + if (hex == null || hex.isBlank()) return null; + String s = hex.startsWith("#") ? hex.substring(1) : hex; + if (s.length() != 6) return null; + try { return new Color(Integer.parseInt(s, 16)); } + catch (NumberFormatException ignored) { return null; } } } diff --git a/src/main/java/net/kewwbec/staff/service/StaffChatToggleService.java b/src/main/java/net/kewwbec/staff/service/StaffChatToggleService.java deleted file mode 100644 index d2f95b3..0000000 --- a/src/main/java/net/kewwbec/staff/service/StaffChatToggleService.java +++ /dev/null @@ -1,34 +0,0 @@ -package net.kewwbec.staff.service; - -import javax.annotation.Nonnull; -import java.util.Set; -import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; - -/** - * Tracks which players have "staff chat mode" toggled on. When on, the player's regular chat - * messages are intercepted in {@link net.kewwbec.staff.listener.ChatEnforcer} and routed - * through {@link StaffChatService} instead. - * - * State is per-server and in-memory only. Cleared on disconnect. - */ -public final class StaffChatToggleService { - - private final Set enabled = ConcurrentHashMap.newKeySet(); - - public boolean toggle(@Nonnull UUID uuid) { - if (enabled.remove(uuid)) { - return false; - } - enabled.add(uuid); - return true; - } - - public boolean isOn(@Nonnull UUID uuid) { - return enabled.contains(uuid); - } - - public void clear(@Nonnull UUID uuid) { - enabled.remove(uuid); - } -}