Add support for marking and processing web-originated chat messages.

This commit is contained in:
akastijn 2026-08-08 23:54:03 +02:00
parent 421f6655fd
commit 5a4140c2e2
3 changed files with 26 additions and 13 deletions

View File

@ -3,7 +3,10 @@ package com.alttd.chat.objects;
import com.alttd.chat.database.Queries;
import com.alttd.chat.objects.channels.Channel;
import com.alttd.chat.util.Utility;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.ComponentLike;
import net.kyori.adventure.text.TextComponent;
import net.kyori.adventure.text.format.NamedTextColor;
import java.util.ArrayList;
import java.util.List;
@ -89,9 +92,15 @@ public class ChatUser {
return Utility.getStaffPrefix(uuid);
}
public ComponentLike getPrefixAll() {
public ComponentLike getPrefixAll(boolean isWebMessage) {
//return prefixAll;
return Utility.getPrefix(uuid, false);
ComponentLike prefix = Utility.getPrefix(uuid, false);
if (isWebMessage) {
//TODO [Stijn] [2026-08-08]: Check icon
TextComponent webIcon = Component.text("\uD83D\uDEDC").color(NamedTextColor.DARK_AQUA);
prefix = webIcon.append(prefix);
}
return prefix;
}
public String getReplyTarget() {

View File

@ -50,27 +50,28 @@ public class ChatMessageSender {
private final MiniMessage miniMessage = MiniMessage.miniMessage();
public void sendMessage(UUID sender, String message) {
//TODO [Stijn] [2026-08-02]: Mark as from website
OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(sender);
Component component = miniMessage.deserialize(message);
sendMessage(offlinePlayer, component);
sendMessage(offlinePlayer, component, true);
}
public void sendMessage(@NotNull OfflinePlayer offlinePlayer, Component message) {
public void sendMessage(@NotNull OfflinePlayer offlinePlayer, Component message, boolean isFromWeb) {
UUID uuid = offlinePlayer.getUniqueId();
if (luckPerms.getUserManager().isLoaded(uuid)) {
User user = luckPerms.getUserManager().getUser(uuid);
sendMessage(user, offlinePlayer, message);
sendMessage(user, offlinePlayer, message, isFromWeb);
} else {
luckPerms.getUserManager().loadUser(uuid).whenComplete((user, throwable) -> {
if (throwable != null) {
ALogger.error("Failed to load user: " + uuid, throwable);
}
sendMessage(user, offlinePlayer, message);
sendMessage(user, offlinePlayer, message, isFromWeb);
});
}
}
private void sendMessage(User user, OfflinePlayer offlinePlayer, Component message) {
private void sendMessage(User user, OfflinePlayer offlinePlayer, Component message, boolean isFromWeb) {
if (offlinePlayer == null) {
ALogger.error("OfflinePlayer is null");
return;
@ -87,7 +88,7 @@ public class ChatMessageSender {
ModifiableString modifiableString = new ModifiableString(inputComponent);
if (parseMessage(offlinePlayer, uuid, modifiableString, inputComponent)) {
if (parseMessage(offlinePlayer, uuid, modifiableString, inputComponent, isFromWeb)) {
//Parse message failed likely due to something the player said, already logged
return;
}
@ -142,7 +143,7 @@ public class ChatMessageSender {
return false;
}
private boolean parseMessage(OfflinePlayer offlinePlayer, UUID uuid, ModifiableString modifiableString, Component inputComponent) {
private boolean parseMessage(OfflinePlayer offlinePlayer, UUID uuid, ModifiableString modifiableString, Component inputComponent, boolean isWebMessage) {
// todo a better way for this
if (!RegexManager.filterText(offlinePlayer.getName(), uuid, modifiableString, true, "chat",
filterType -> punishOnlinePlayer(filterType, uuid, modifiableString)
@ -152,7 +153,10 @@ public class ChatMessageSender {
""
);
String originalMessage = PlainTextComponentSerializer.plainText().serialize(inputComponent);
Optional<Component> component = render(offlinePlayer, inputComponent).map(ComponentLike::asComponent);
Optional<Component> component = render(offlinePlayer,
inputComponent,
isWebMessage
).map(ComponentLike::asComponent);
if (component.isEmpty()) {
//Already logged
return true;
@ -220,7 +224,7 @@ public class ChatMessageSender {
}
}
private Optional<ComponentLike> render(@NotNull OfflinePlayer offlinePlayer, @NotNull Component message) {
private Optional<ComponentLike> render(@NotNull OfflinePlayer offlinePlayer, @NotNull Component message, boolean isWebMessage) {
if (offlinePlayer.getName() == null) {
ALogger.error("Invalid offline player");
return Optional.empty();
@ -231,7 +235,7 @@ public class ChatMessageSender {
Placeholder.component("sender", user.getDisplayName()),
Placeholder.parsed("sendername", offlinePlayer.getName()),
Placeholder.component("prefix", user.getPrefix()),
Placeholder.component("prefixall", user.getPrefixAll()),
Placeholder.component("prefixall", user.getPrefixAll(isWebMessage)),
Placeholder.component("staffprefix", user.getStaffPrefix()),
Placeholder.component("message", message)
);

View File

@ -70,7 +70,7 @@ public class ChatListener implements Listener {
toggleable.sendMessage(event.getPlayer(), event.message());
return;
}
chatMessageSender.sendMessage(event.getPlayer(), event.message());
chatMessageSender.sendMessage(event.getPlayer(), event.message(), false);
}
private ComponentLike parseMessageContent(Player player, String rawMessage) {