Add ChatService test suite to verify message filtering and delivery to appropriate users.
This commit is contained in:
@@ -7,6 +7,7 @@ import com.alttd.altitudeweb.database.Databases;
|
||||
import com.alttd.altitudeweb.database.chat.ChatLogMapper;
|
||||
import com.alttd.altitudeweb.model.PermissionClaimDto;
|
||||
import com.alttd.altitudeweb.services.chat.event_publisher.EventPublisher;
|
||||
import com.alttd.altitudeweb.services.chat.event_publisher.EventUser;
|
||||
import com.alttd.altitudeweb.setup.Connection;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
@@ -83,23 +84,56 @@ public class ChatService {
|
||||
}
|
||||
|
||||
private void sendMessagesToListeners(List<ChatMessage> chatMessageList) {
|
||||
String jsonMessageListIncludingBlocked = chatMessageList.stream()
|
||||
.map(ChatMessageMapper::toJson)
|
||||
.collect(Collectors.joining(",", "[", "]"));
|
||||
String jsonMessageList = chatMessageList.stream()
|
||||
.filter(ChatMessage::isNotBlocked)
|
||||
.filter(chatMessage -> Arrays.asList(allowedServers).contains(chatMessage.getServer()))
|
||||
//TODO [Stijn] [2026-07-19]: Handle different channel types
|
||||
.filter(chatMessage -> chatMessage.getType() == ChatMessageType.PUBLIC)
|
||||
.map(ChatMessageMapper::toJson)
|
||||
.collect(Collectors.joining(",", "[", "]"));
|
||||
Map<ChatMessage, String> jsonCache = new HashMap<>();
|
||||
for (ChatMessage message : chatMessageList) {
|
||||
jsonCache.put(message, ChatMessageMapper.toJson(message));
|
||||
}
|
||||
|
||||
eventPublisher.sendToUsers("chat", (eventUser) -> {
|
||||
if (eventUser.hasPermission(PermissionClaimDto.HEAD_MOD)) {
|
||||
return jsonMessageListIncludingBlocked;
|
||||
eventPublisher.sendToUsers("chat", (eventUser) ->
|
||||
chatMessageList.stream()
|
||||
.filter(chatMessage -> shouldReceive(eventUser, chatMessage))
|
||||
.map(jsonCache::get)
|
||||
.collect(Collectors.joining(",", "[", "]"))
|
||||
);
|
||||
}
|
||||
|
||||
private boolean shouldReceive(EventUser eventUser, ChatMessage chatMessage) {
|
||||
if (eventUser.hasPermission(PermissionClaimDto.HEAD_MOD)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!Arrays.asList(allowedServers).contains(chatMessage.getServer())) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!chatMessage.isNotBlocked()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return switch (chatMessage.getType()) {
|
||||
case PUBLIC, GLOBAL -> true;
|
||||
case PARTY -> {
|
||||
// TODO [Stijn] [2026-07-19]: Check if user is in party
|
||||
// if (isInParty(eventUser, chatMessage.getChannel())) return true;
|
||||
yield false;
|
||||
}
|
||||
return jsonMessageList;
|
||||
});
|
||||
case MSG -> {
|
||||
if (eventUser.uuid().equals(chatMessage.getUuid())) {
|
||||
yield true;
|
||||
}
|
||||
if (chatMessage.getReceiver() != null) {
|
||||
try {
|
||||
UUID receiverUuid = UUID.fromString(chatMessage.getReceiver());
|
||||
yield eventUser.uuid().equals(receiverUuid);
|
||||
} catch (IllegalArgumentException e) {
|
||||
yield false;
|
||||
}
|
||||
}
|
||||
yield false;
|
||||
}
|
||||
case GAC -> eventUser.hasPermission(PermissionClaimDto.MOD);
|
||||
case CUSTOM -> false;
|
||||
};
|
||||
}
|
||||
|
||||
public List<ChatMessage> getMessagesSince(Instant instant) {
|
||||
|
||||
Reference in New Issue
Block a user