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:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user