Actionbar unauffälliger: ♪ Name DC · Name TS

This commit is contained in:
MineTec committed 2026-10-18 16:17:40 +02:00
1 parent b335933678
commit 2e46c9ea1c
4 files changed
+21 -6

No files matched your search

@@ -85,12 +85,12 @@ public final class Room {
public void setMinecraftSink(MinecraftSink sink) { this.minecraft = sink; } public void setMinecraftSink(MinecraftSink sink) { this.minecraft = sink; }
public void setNameResolver(BiFunction<Side, String, String> names) { this.names = names; } public void setNameResolver(BiFunction<Side, String, String> 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<String> externalSpeakers(long millis) { public List<String> externalSpeakers(long millis) {
long since = System.currentTimeMillis() - millis; long since = System.currentTimeMillis() - millis;
return sources.values().stream() return sources.values().stream()
.filter(s -> s.side != Side.MINECRAFT && s.lastSeen >= since) .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(); .sorted().toList();
} }
@@ -142,14 +142,29 @@ final class BridgeVoicechat implements VoicechatPlugin {
case Message.Speakers speakers -> Bukkit.getScheduler().runTask(plugin, () -> { case Message.Speakers speakers -> Bukkit.getScheduler().runTask(plugin, () -> {
CrosstalkRoom room = rooms.get(speakers.room()); CrosstalkRoom room = rooms.get(speakers.room());
if (room == null || speakers.names().isEmpty() || !plugin.getConfig().getBoolean("actionbar", true)) return; if (room == null || speakers.names().isEmpty() || !plugin.getConfig().getBoolean("actionbar", true)) return;
Component text = Component.text("Spricht: ", NamedTextColor.GRAY) Component text = speakersLine(speakers.names());
.append(Component.text(String.join(", ", speakers.names()), NamedTextColor.GOLD));
room.memberPlayers().stream().filter(ActionbarCommand::enabled).forEach(player -> player.sendActionBar(text)); room.memberPlayers().stream().filter(ActionbarCommand::enabled).forEach(player -> player.sendActionBar(text));
}); });
case Message.Hello ignored -> {} case Message.Hello ignored -> {}
} }
} }
/** Unauffällige Actionbar: "♪ Anna DC · Bob TS", höchstens drei Namen, Rest als "+N". */
static Component speakersLine(List<String> 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. */ /** Main-Thread: Gruppen an die Räume der Bridge angleichen. */
private void syncRooms(List<Message.RoomInfo> infos) { private void syncRooms(List<Message.RoomInfo> infos) {
VoicechatServerApi api = this.api; VoicechatServerApi api = this.api;
+1 -1
View File
@@ -3,6 +3,6 @@ bridge:
host: 127.0.0.1 host: 127.0.0.1
port: 24470 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. # Jeder Spieler kann sie zusätzlich mit /crosstalk actionbar für sich aus- und einschalten.
actionbar: true actionbar: true
@@ -28,6 +28,6 @@ public sealed interface Message {
/** Bridge → Plugin: Chat-Hinweis an alle in der Gruppe, z. B. wer dazugekommen ist. */ /** Bridge → Plugin: Chat-Hinweis an alle in der Gruppe, z. B. wer dazugekommen ist. */
record Notice(String room, String text) implements Message {} 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<String> names) implements Message {} record Speakers(String room, List<String> names) implements Message {}
} }