Refactor user name display logic: integrate MiniMessageComponent in UserListComponent and transition to ProcessedMiniMessageNode. Add server state caching in ChatService with eager state dispatch on subscription.

This commit is contained in:
2026-08-09 02:04:11 +02:00
parent 8c02543bca
commit 1a0bc902ac
4 changed files with 45 additions and 19 deletions
@@ -37,6 +37,7 @@ public class ChatService {
private final EventPublisher eventPublisher;
private final NavigableMap<Instant, ChatMessage> chatMessages = new TreeMap<>();
private final Map<String, EventUser> eventUserMap = new HashMap<>();
private final Map<String, ServerDto> serverStateCache = new HashMap<>();
@Value("${chat.allowed-servers}")
private String[] allowedServers;
@@ -73,7 +74,9 @@ public class ChatService {
public SseEmitter subscribe(EventUser eventUser, String json) {
String key = eventUser.uuid().toString();
eventUserMap.put(key, eventUser);
return eventPublisher.subscribe(key, json, this::handleSessionEnd);
SseEmitter emitter = eventPublisher.subscribe(key, json, this::handleSessionEnd);
sendServerStateToUser(key, eventUser);
return emitter;
}
private void handleSessionEnd(String key, Instant sessionStart, Instant sessionEnd) {
@@ -124,18 +127,26 @@ public class ChatService {
sendMessagesToListeners(chatMessageList);
}
public void updateServerState(ServerStateDto serverStateDto) {
sendToUsers("server-state", (eventUser) -> {
if (eventUser.hasPermission(PermissionClaimDto.HEAD_MOD)) {
return ServerStateMapper.toJson(serverStateDto);
}
public synchronized void updateServerState(ServerStateDto serverStateDto) {
serverStateDto.getServers().forEach(serverDto -> serverStateCache.put(serverDto.getName(), serverDto));
sendToUsers("server-state", this::getServerStateJson);
}
List<ServerDto> filteredServers = serverStateDto.getServers().stream()
.filter(serverDto -> Arrays.asList(allowedServers).contains(serverDto.getName()))
.toList();
private String getServerStateJson(EventUser eventUser) {
if (eventUser.hasPermission(PermissionClaimDto.HEAD_MOD)) {
return ServerStateMapper.toJson(new ServerStateDto().servers(serverStateCache.values().stream().toList()));
}
return ServerStateMapper.toJson(new ServerStateDto().servers(filteredServers));
});
List<ServerDto> filteredServers = serverStateCache.values().stream()
.filter(serverDto -> Arrays.asList(allowedServers).contains(serverDto.getName()))
.toList();
return ServerStateMapper.toJson(new ServerStateDto().servers(filteredServers));
}
private void sendServerStateToUser(String key, EventUser eventUser) {
String json = getServerStateJson(eventUser);
eventPublisher.sendToUser(key, "server-state", json);
}
private void sendMessagesToListeners(List<ChatMessage> chatMessageList) {