forked from SteamWar/SteamWar
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:
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user