From d4cf6a5ad79416dfd35759a9a0bc716ba9ae1fcf Mon Sep 17 00:00:00 2001 From: Luck Date: Mon, 29 Aug 2016 13:32:21 +0100 Subject: [PATCH] Remove subjects from cache when they leave the server --- .../main/java/me/lucko/luckperms/LPSpongePlugin.java | 3 ++- .../main/java/me/lucko/luckperms/SpongeListener.java | 10 ++++++++++ .../api/sponge/collections/UserCollection.java | 5 +++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/sponge/src/main/java/me/lucko/luckperms/LPSpongePlugin.java b/sponge/src/main/java/me/lucko/luckperms/LPSpongePlugin.java index 086860ac5..bb7ff3241 100644 --- a/sponge/src/main/java/me/lucko/luckperms/LPSpongePlugin.java +++ b/sponge/src/main/java/me/lucko/luckperms/LPSpongePlugin.java @@ -93,6 +93,7 @@ public class LPSpongePlugin implements LuckPermsPlugin { private me.lucko.luckperms.api.Logger log; private Importer importer; private ConsecutiveExecutor consecutiveExecutor; + private LuckPermsService service; @Listener public void onEnable(GamePreInitializationEvent event) { @@ -121,7 +122,7 @@ public class LPSpongePlugin implements LuckPermsPlugin { consecutiveExecutor = new ConsecutiveExecutor(commandManager); getLog().info("Registering PermissionService..."); - Sponge.getServiceManager().setProvider(this, PermissionService.class, new LuckPermsService(this)); + Sponge.getServiceManager().setProvider(this, PermissionService.class, (service = new LuckPermsService(this))); getLog().info("Registering API..."); apiProvider = new ApiProvider(this); diff --git a/sponge/src/main/java/me/lucko/luckperms/SpongeListener.java b/sponge/src/main/java/me/lucko/luckperms/SpongeListener.java index 7d5043da2..90c1e0b6a 100644 --- a/sponge/src/main/java/me/lucko/luckperms/SpongeListener.java +++ b/sponge/src/main/java/me/lucko/luckperms/SpongeListener.java @@ -22,6 +22,7 @@ package me.lucko.luckperms; +import me.lucko.luckperms.api.sponge.LuckPermsSubject; import me.lucko.luckperms.constants.Message; import me.lucko.luckperms.users.User; import me.lucko.luckperms.utils.AbstractListener; @@ -30,6 +31,8 @@ import org.spongepowered.api.event.network.ClientConnectionEvent; import org.spongepowered.api.profile.GameProfile; import org.spongepowered.api.text.serializer.TextSerializers; +import java.util.Iterator; + @SuppressWarnings("WeakerAccess") public class SpongeListener extends AbstractListener { private final LPSpongePlugin plugin; @@ -75,5 +78,12 @@ public class SpongeListener extends AbstractListener { @Listener public void onClientLeave(ClientConnectionEvent.Disconnect e) { onLeave(e.getTargetEntity().getUniqueId()); + Iterator iterator = plugin.getService().getUserSubjects().getCache().iterator(); + while (iterator.hasNext()) { + LuckPermsSubject subject = iterator.next(); + if (subject.getIdentifier().equalsIgnoreCase(e.getTargetEntity().getUniqueId().toString())) { + iterator.remove(); + } + } } } diff --git a/sponge/src/main/java/me/lucko/luckperms/api/sponge/collections/UserCollection.java b/sponge/src/main/java/me/lucko/luckperms/api/sponge/collections/UserCollection.java index 69b42989b..08fb263aa 100644 --- a/sponge/src/main/java/me/lucko/luckperms/api/sponge/collections/UserCollection.java +++ b/sponge/src/main/java/me/lucko/luckperms/api/sponge/collections/UserCollection.java @@ -23,6 +23,7 @@ package me.lucko.luckperms.api.sponge.collections; import lombok.AllArgsConstructor; +import lombok.Getter; import lombok.NonNull; import me.lucko.luckperms.api.sponge.LuckPermsService; import me.lucko.luckperms.api.sponge.LuckPermsSubject; @@ -47,6 +48,8 @@ import java.util.stream.Collectors; public class UserCollection implements SubjectCollection { private final LuckPermsService service; private final UserManager manager; + + @Getter private final Set cache = ConcurrentHashMap.newKeySet(); @Override @@ -82,6 +85,8 @@ public class UserCollection implements SubjectCollection { return subject; } + service.getPlugin().getLog().warn("Couldn't get subject for: " + id); + // What am I meant to do here? What if no user is loaded? Load it? Create it? // If I do load/create it, this method should always be called async??.... errr. return new SimpleSubject(id, service, this);