From 2e46c9ea1c09d4eeed291695eb1d52c6097ffa67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Sun, 18 Oct 2026 16:17:40 +0200 Subject: [PATCH] =?UTF-8?q?Actionbar=20unauff=C3=A4lliger:=20=E2=99=AA=20N?= =?UTF-8?q?ame=20DC=20=C2=B7=20Name=20TS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/eu/mhsl/voicebridge/bridge/Room.java | 4 ++-- .../voicebridge/plugin/BridgeVoicechat.java | 19 +++++++++++++++++-- plugin/src/main/resources/config.yml | 2 +- .../eu/mhsl/voicebridge/protocol/Message.java | 2 +- 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/bridge/src/main/java/eu/mhsl/voicebridge/bridge/Room.java b/bridge/src/main/java/eu/mhsl/voicebridge/bridge/Room.java index b12f60a..aee85c7 100644 --- a/bridge/src/main/java/eu/mhsl/voicebridge/bridge/Room.java +++ b/bridge/src/main/java/eu/mhsl/voicebridge/bridge/Room.java @@ -85,12 +85,12 @@ public final class Room { public void setMinecraftSink(MinecraftSink sink) { this.minecraft = sink; } public void setNameResolver(BiFunction names) { this.names = names; } - /** Wer aus Discord/TeamSpeak in den letzten {@code millis} Audio geschickt hat, als "Name (Plattform)". */ + /** Wer aus Discord/TeamSpeak in den letzten {@code millis} Audio geschickt hat, als "Name|Kürzel". */ public List externalSpeakers(long millis) { long since = System.currentTimeMillis() - millis; return sources.values().stream() .filter(s -> s.side != Side.MINECRAFT && s.lastSeen >= since) - .map(s -> s.name + " (" + label(s.side) + ")") + .map(s -> s.name + "|" + (s.side == Side.DISCORD ? "DC" : "TS")) .sorted().toList(); } diff --git a/plugin/src/main/java/eu/mhsl/voicebridge/plugin/BridgeVoicechat.java b/plugin/src/main/java/eu/mhsl/voicebridge/plugin/BridgeVoicechat.java index 2ec5f29..93d662f 100644 --- a/plugin/src/main/java/eu/mhsl/voicebridge/plugin/BridgeVoicechat.java +++ b/plugin/src/main/java/eu/mhsl/voicebridge/plugin/BridgeVoicechat.java @@ -142,14 +142,29 @@ final class BridgeVoicechat implements VoicechatPlugin { case Message.Speakers speakers -> Bukkit.getScheduler().runTask(plugin, () -> { CrosstalkRoom room = rooms.get(speakers.room()); if (room == null || speakers.names().isEmpty() || !plugin.getConfig().getBoolean("actionbar", true)) return; - Component text = Component.text("Spricht: ", NamedTextColor.GRAY) - .append(Component.text(String.join(", ", speakers.names()), NamedTextColor.GOLD)); + Component text = speakersLine(speakers.names()); room.memberPlayers().stream().filter(ActionbarCommand::enabled).forEach(player -> player.sendActionBar(text)); }); case Message.Hello ignored -> {} } } + /** Unauffällige Actionbar: "♪ Anna DC · Bob TS", höchstens drei Namen, Rest als "+N". */ + static Component speakersLine(List speakers) { + int shown = Math.min(3, speakers.size()); + Component line = Component.text("♪ ", NamedTextColor.DARK_GRAY); + for (int i = 0; i < shown; i++) { + String entry = speakers.get(i); + int split = entry.lastIndexOf('|'); + String name = split < 0 ? entry : entry.substring(0, split); + String tag = split < 0 ? "" : " " + entry.substring(split + 1); + if (i > 0) line = line.append(Component.text(" · ", NamedTextColor.DARK_GRAY)); + line = line.append(Component.text(name, NamedTextColor.GRAY)).append(Component.text(tag, NamedTextColor.DARK_GRAY)); + } + if (speakers.size() > shown) line = line.append(Component.text(" +" + (speakers.size() - shown), NamedTextColor.DARK_GRAY)); + return line; + } + /** Main-Thread: Gruppen an die Räume der Bridge angleichen. */ private void syncRooms(List infos) { VoicechatServerApi api = this.api; diff --git a/plugin/src/main/resources/config.yml b/plugin/src/main/resources/config.yml index 8651d12..31eb3c4 100644 --- a/plugin/src/main/resources/config.yml +++ b/plugin/src/main/resources/config.yml @@ -3,6 +3,6 @@ bridge: host: 127.0.0.1 port: 24470 -# Actionbar "Spricht: …" mit den gerade sprechenden Leuten aus Discord/TeamSpeak. +# Actionbar "♪ Anna DC · Bob TS" mit den gerade sprechenden Leuten aus Discord/TeamSpeak. # Jeder Spieler kann sie zusätzlich mit /crosstalk actionbar für sich aus- und einschalten. actionbar: true diff --git a/protocol/src/main/java/eu/mhsl/voicebridge/protocol/Message.java b/protocol/src/main/java/eu/mhsl/voicebridge/protocol/Message.java index 8e50605..acbb695 100644 --- a/protocol/src/main/java/eu/mhsl/voicebridge/protocol/Message.java +++ b/protocol/src/main/java/eu/mhsl/voicebridge/protocol/Message.java @@ -28,6 +28,6 @@ public sealed interface Message { /** Bridge → Plugin: Chat-Hinweis an alle in der Gruppe, z. B. wer dazugekommen ist. */ record Notice(String room, String text) implements Message {} - /** Bridge → Plugin: wer aus Discord/TeamSpeak gerade spricht (für die Actionbar). */ + /** Bridge → Plugin: wer aus Discord/TeamSpeak gerade spricht (für die Actionbar), je "Name|Kürzel". */ record Speakers(String room, List names) implements Message {} }