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.database.Queries;
import com.alttd.chat.objects.channels.Channel; import com.alttd.chat.objects.channels.Channel;
import com.alttd.chat.util.Utility; import com.alttd.chat.util.Utility;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.ComponentLike; 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.ArrayList;
import java.util.List; import java.util.List;
@ -89,9 +92,15 @@ public class ChatUser {
return Utility.getStaffPrefix(uuid); return Utility.getStaffPrefix(uuid);
} }
public ComponentLike getPrefixAll() { public ComponentLike getPrefixAll(boolean isWebMessage) {
//return prefixAll; //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() { public String getReplyTarget() {

View File

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

View File

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