Restore BauweltMember cache and notify all dev servers on member changes

getBauMember never read its cache after the Exposed migration, so every
scoreboard render hit the DB (Too many connections, #479). Cache by
(bauwelt, member) incl. negative results, evict on addMember/remove, and
send BaumemberUpdatePacket to the Bauserver and all dev servers (also on
addmember). BauMemberUpdate clears the cache itself to not depend on
handler order.
This commit is contained in:
2026-10-19 10:24:41 +02:00
parent 27d260a8d2
commit 0c3e63d521
3 changed files with 43 additions and 18 deletions
@@ -19,6 +19,7 @@
package de.steamwar.velocitycore.commands;
import com.velocitypowered.api.proxy.server.RegisteredServer;
import de.steamwar.command.PreviousArguments;
import de.steamwar.command.SWCommand;
import de.steamwar.command.TypeMapper;
@@ -45,7 +46,9 @@ import de.steamwar.velocitycore.network.NetworkSender;
import de.steamwar.velocitycore.util.BauLock;
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.UUID;
import java.util.function.Consumer;
@Linked
@@ -72,6 +75,7 @@ public class BauCommand extends SWCommand {
@Register(value = "addmember", description = "BAU_ADDMEMBER_USAGE")
public void addmember(Chatter sender, @Validator("addMemberTarget") SteamwarUser target) {
BauweltMember.addMember(sender.user().getUUID(), target.getUUID());
sendBaumemberUpdate(sender.user().getUUID());
sender.system("BAU_ADDMEMBER_ADDED");
Chatter.of(target.getUUID()).system("BAU_ADDMEMBER_ADDED_TARGET", sender);
}
@@ -161,10 +165,7 @@ public class BauCommand extends SWCommand {
withMember(owner, user, target -> {
setter.accept(target);
Bauserver bauserver = Bauserver.get(owner.user().getUUID());
if (bauserver != null) {
bauserver.getRegisteredServer().getPlayersConnected().stream().findAny().ifPresent(player -> NetworkSender.send(player, new BaumemberUpdatePacket()));
}
sendBaumemberUpdate(owner.user().getUUID());
Chatter.of(user.getUUID()).system("BAU_MEMBER_SET_TARGET", owner, new Message(permName));
owner.system("BAU_MEMBER_SET", new Message(permName));
@@ -184,9 +185,7 @@ public class BauCommand extends SWCommand {
}
});
if (bauserver != null) {
bauserver.getRegisteredServer().getPlayersConnected().stream().findAny().ifPresent(player -> NetworkSender.send(player, new BaumemberUpdatePacket()));
}
sendBaumemberUpdate(owner.user().getUUID());
try {
deletePlayerData(owner, user);
@@ -289,6 +288,23 @@ public class BauCommand extends SWCommand {
BauLock.setLocked(sender, BauLockState.OPEN);
}
/**
* Tells the owner's Bauserver and every dev server to drop their cached {@link BauweltMember}s,
* since those run in separate processes and would otherwise keep serving stale permissions.
* Plugin messages need a connected player, so servers without players are skipped.
*/
private static void sendBaumemberUpdate(UUID owner) {
Bauserver bauserver = Bauserver.get(owner);
if (bauserver != null) {
sendBaumemberUpdate(bauserver.getRegisteredServer());
}
new ArrayList<>(DevCommand.getDevServers().values()).forEach(BauCommand::sendBaumemberUpdate);
}
private static void sendBaumemberUpdate(RegisteredServer server) {
server.getPlayersConnected().stream().findAny().ifPresent(player -> NetworkSender.send(player, new BaumemberUpdatePacket()));
}
private static void withMember(Chatter owner, SteamwarUser member, Consumer<BauweltMember> function) {
if (member == null) {
owner.system("UNKNOWN_PLAYER");