This commit is contained in:
kento2 2026-07-07 21:38:52 +02:00
parent 7e5bd1bb6d
commit 5073d933d2
24 changed files with 168 additions and 111 deletions

View file

@ -14,8 +14,12 @@ dependencies {
implementation(libs.bson)
implementation(libs.nats)
implementation(libs.scrow.commandapi.bukkit)
implementation(libs.scrow.commandapi.bukkit) {
isChanging = true
}
implementation(libs.postgres)
compileOnly(libs.luckperms)
}
tasks {

View file

@ -1,12 +1,13 @@
package de.kentoj.scrow.bukkit;
import de.kentoj.scrow.bukkit.chatstyle.ChatStyleListener;
import de.kentoj.scrow.bukkit.chatstyle.NoPrefixPrefixCache;
import de.kentoj.scrow.bukkit.command.economy.CoinsCommand;
import de.kentoj.scrow.bukkit.command.friends.FriendCommand;
import de.kentoj.scrow.bukkit.command.instance.InstanceCache;
import de.kentoj.scrow.bukkit.command.instance.InstanceCommand;
import de.kentoj.scrow.bukkit.command.instance.LobbyCommand;
import de.kentoj.scrow.bukkit.command.instance.PlayCommand;
import de.kentoj.scrow.bukkit.listener.ChatStyleListener;
import org.bukkit.plugin.java.JavaPlugin;
import java.io.IOException;
@ -15,7 +16,7 @@ import java.nio.channels.FileChannel;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
public class CoreImplPlugin extends JavaPlugin {
public final class CoreImplPlugin extends JavaPlugin {
@Override
public void onEnable() {
@ -29,7 +30,7 @@ public class CoreImplPlugin extends JavaPlugin {
ScrowAPI.getCommandApi().register(new LobbyCommand().getRootLiteral());
}
getServer().getPluginManager().registerEvents(new ChatStyleListener(), this);
getServer().getPluginManager().registerEvents(new ChatStyleListener(new NoPrefixPrefixCache()), this);
// TODO/FIXME
//registerServer();

View file

@ -15,7 +15,6 @@ import de.kentoj.scrowlib.instancemanager.InstanceManagerImpl;
import de.kentoj.scrowlib.messaging.InMemoyMessageBroker;
import de.kentoj.scrowlib.messaging.NatsMessageBroker;
import de.kentoj.scrowlib.player.NetworkPlayerImpl;
import de.kentoj.scrowlib.utils.EnvUtils;
import io.nats.client.Nats;
import io.nats.client.Options;
import lombok.AccessLevel;
@ -35,7 +34,7 @@ public class ScrowAPISurface {
ScrowAPI.setCorePlugin(plugin);
var natsHost = System.getenv("HOST_NATS");
if (natsHost!= null) {
if (natsHost != null) {
try {
var options = Options.builder()
.server(natsHost)
@ -56,7 +55,7 @@ public class ScrowAPISurface {
Class.forName("org.postgresql.Driver", true, ScrowAPISurface.class.getClassLoader());
var props = new Properties();
props.setProperty("user", "postgres");
ScrowAPI.setJdbi(Jdbi.create(hostPostgres));
ScrowAPI.setJdbi(Jdbi.create(hostPostgres, props));
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}

View file

@ -0,0 +1,32 @@
package de.kentoj.scrow.bukkit.chatstyle;
import de.kentoj.scrowlib.utils.ComponentUtils;
import io.papermc.paper.event.player.AsyncChatEvent;
import lombok.RequiredArgsConstructor;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
@RequiredArgsConstructor
public class ChatStyleListener implements Listener {
private final PrefixCache prefixCache;
@EventHandler
public void onChat(AsyncChatEvent ev) {
Component formattedMessage = formatMessage(ev.getPlayer(), ev.message());
ev.renderer((source, sourceDisplayName, message, viewer) -> formattedMessage);
}
private Component formatMessage(Player player, Component message) {
var prefix = prefixCache.getPrefix(player.getUniqueId());
Component msg = prefix != null
? prefix.append(Component.text("").color(NamedTextColor.DARK_GRAY))
: Component.empty();
return msg.append(Component.text(player.getName() + ": ").color(NamedTextColor.GRAY))
.append(ComponentUtils.resolveURLS(message).colorIfAbsent(NamedTextColor.GRAY));
}
}

View file

@ -0,0 +1,36 @@
package de.kentoj.scrow.bukkit.chatstyle;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
import net.luckperms.api.LuckPerms;
import net.luckperms.api.event.user.UserDataRecalculateEvent;
import org.bukkit.Bukkit;
import org.jetbrains.annotations.Nullable;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
public class LuckPermsPrefixCache implements PrefixCache {
private final Map<UUID, Component> cache = new HashMap<>();
// TODO load on join, unload on quit
public LuckPermsPrefixCache(LuckPerms luckPerms) {
//noinspection resource
luckPerms.getEventBus().subscribe(UserDataRecalculateEvent.class, this::onDataChange);
}
private void onDataChange(UserDataRecalculateEvent ev) {
var playerId = ev.getUser().getUniqueId();
if (Bukkit.getPlayer(playerId) == null) return;
var prefix = ev.getUser().getCachedData().getMetaData().getPrefix();
var prefixComponent = PlainTextComponentSerializer.plainText().deserialize(prefix);
cache.put(playerId, prefixComponent);
}
@Override
public @Nullable Component getPrefix(UUID playerId) {
return cache.get(playerId);
}
}

View file

@ -0,0 +1,13 @@
package de.kentoj.scrow.bukkit.chatstyle;
import net.kyori.adventure.text.Component;
import org.jetbrains.annotations.Nullable;
import java.util.UUID;
public class NoPrefixPrefixCache implements PrefixCache {
@Override
public @Nullable Component getPrefix(UUID playerId) {
return null;
}
}

View file

@ -0,0 +1,11 @@
package de.kentoj.scrow.bukkit.chatstyle;
import net.kyori.adventure.text.Component;
import org.jetbrains.annotations.Nullable;
import java.util.UUID;
public interface PrefixCache {
@Nullable Component getPrefix(UUID playerId);
}

View file

@ -1,29 +0,0 @@
package de.kentoj.scrow.bukkit.listener;
import io.papermc.paper.event.player.AsyncChatEvent;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
public class ChatStyleListener implements Listener {
@EventHandler
public void onChat(AsyncChatEvent event) {
Player player = event.getPlayer();
Component formattedMessage = formatMessage(player, event.message());
event.renderer((source, sourceDisplayName, message, viewer) -> formattedMessage);
}
private Component formatMessage(Player player, Component message) {
return Component.text()
.append(player.displayName()
.append(Component.text(": "))
.color(NamedTextColor.GRAY))
.append(message.color(NamedTextColor.WHITE))
.build();
}
}