diff --git a/bukkit/src/main/java/me/lucko/luckperms/bukkit/model/SubscriptionManager.java b/bukkit/src/main/java/me/lucko/luckperms/bukkit/model/SubscriptionManager.java index a68fabae3..b0d24310c 100644 --- a/bukkit/src/main/java/me/lucko/luckperms/bukkit/model/SubscriptionManager.java +++ b/bukkit/src/main/java/me/lucko/luckperms/bukkit/model/SubscriptionManager.java @@ -25,6 +25,7 @@ package me.lucko.luckperms.bukkit.model; +import lombok.AllArgsConstructor; import lombok.RequiredArgsConstructor; import com.google.common.collect.ImmutableSet; @@ -56,20 +57,26 @@ public class SubscriptionManager { // we compare changes to avoid unnecessary time wasted on the main thread mutating this data. // the changes can be calculated here async, and then only the needed changes can be applied. Map.Entry, Set> changes = compareSets(newPerms, currentSubscriptions); + permissible.getPlugin().doSync(new SubscriptionUpdateTask(permissible, changes.getKey(), changes.getValue())); - Set toAdd = changes.getKey(); - Set toRemove = changes.getValue(); + this.currentSubscriptions = newPerms; + } - permissible.getPlugin().doSync(() -> { + @AllArgsConstructor + public static final class SubscriptionUpdateTask implements Runnable { + private final LPPermissible permissible; + private final Set toAdd; + private final Set toRemove; + + @Override + public void run() { for (String s : toAdd) { permissible.getPlugin().getServer().getPluginManager().subscribeToPermission(s, permissible.getParent()); } for (String s : toRemove) { permissible.getPlugin().getServer().getPluginManager().unsubscribeFromPermission(s, permissible.getParent()); } - }); - - this.currentSubscriptions = newPerms; + } } /** diff --git a/common/src/main/java/me/lucko/luckperms/common/managers/GenericUserManager.java b/common/src/main/java/me/lucko/luckperms/common/managers/GenericUserManager.java index 1e9b4f703..353595fb0 100644 --- a/common/src/main/java/me/lucko/luckperms/common/managers/GenericUserManager.java +++ b/common/src/main/java/me/lucko/luckperms/common/managers/GenericUserManager.java @@ -34,8 +34,8 @@ import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import me.lucko.luckperms.common.references.UserIdentifier; import java.util.Optional; -import java.util.Set; import java.util.UUID; +import java.util.concurrent.CompletableFuture; @RequiredArgsConstructor public class GenericUserManager extends AbstractManager implements UserManager { @@ -109,16 +109,14 @@ public class GenericUserManager extends AbstractManager im } @Override - public void updateAllUsers() { - plugin.doSync(() -> { - Set players = plugin.getOnlinePlayers(); - plugin.doAsync(() -> { - for (UUID uuid : players) { - UUID internal = plugin.getUuidCache().getUUID(uuid); - plugin.getStorage().loadUser(internal, "null").join(); - } - }); - }); + public CompletableFuture updateAllUsers() { + return CompletableFuture.supplyAsync(plugin::getOnlinePlayers, plugin.getScheduler().sync()) + .thenAcceptAsync(players -> { + for (UUID uuid : players) { + UUID internal = plugin.getUuidCache().getUUID(uuid); + plugin.getStorage().loadUser(internal, "null").join(); + } + }, plugin.getScheduler().async()); } public static boolean giveDefaultIfNeeded(User user, boolean save, LuckPermsPlugin plugin) { diff --git a/common/src/main/java/me/lucko/luckperms/common/managers/UserManager.java b/common/src/main/java/me/lucko/luckperms/common/managers/UserManager.java index 10ac993e3..28658a794 100644 --- a/common/src/main/java/me/lucko/luckperms/common/managers/UserManager.java +++ b/common/src/main/java/me/lucko/luckperms/common/managers/UserManager.java @@ -30,6 +30,7 @@ import me.lucko.luckperms.common.references.Identifiable; import me.lucko.luckperms.common.references.UserIdentifier; import java.util.UUID; +import java.util.concurrent.CompletableFuture; public interface UserManager extends Manager { @@ -73,6 +74,6 @@ public interface UserManager extends Manager { /** * Reloads the data of all online users */ - void updateAllUsers(); + CompletableFuture updateAllUsers(); } diff --git a/common/src/main/java/me/lucko/luckperms/common/tasks/UpdateTask.java b/common/src/main/java/me/lucko/luckperms/common/tasks/UpdateTask.java index 683567dfc..9951c2093 100644 --- a/common/src/main/java/me/lucko/luckperms/common/tasks/UpdateTask.java +++ b/common/src/main/java/me/lucko/luckperms/common/tasks/UpdateTask.java @@ -55,7 +55,7 @@ public class UpdateTask implements Runnable { plugin.getStorage().loadAllTracks().join(); // Refresh all online users. - plugin.getUserManager().updateAllUsers(); + plugin.getUserManager().updateAllUsers().join(); plugin.onPostUpdate(); diff --git a/sponge/src/main/java/me/lucko/luckperms/sponge/managers/SpongeUserManager.java b/sponge/src/main/java/me/lucko/luckperms/sponge/managers/SpongeUserManager.java index d9fc9a9ef..d07b804cd 100644 --- a/sponge/src/main/java/me/lucko/luckperms/sponge/managers/SpongeUserManager.java +++ b/sponge/src/main/java/me/lucko/luckperms/sponge/managers/SpongeUserManager.java @@ -207,16 +207,14 @@ public class SpongeUserManager implements UserManager, LPSubjectCollection { } @Override - public void updateAllUsers() { - plugin.doSync(() -> { - Set players = plugin.getOnlinePlayers(); - plugin.doAsync(() -> { - for (UUID uuid : players) { - UUID internal = plugin.getUuidCache().getUUID(uuid); - plugin.getStorage().loadUser(internal, "null").join(); - } - }); - }); + public CompletableFuture updateAllUsers() { + return CompletableFuture.supplyAsync(plugin::getOnlinePlayers, plugin.getScheduler().sync()) + .thenAcceptAsync(players -> { + for (UUID uuid : players) { + UUID internal = plugin.getUuidCache().getUUID(uuid); + plugin.getStorage().loadUser(internal, "null").join(); + } + }, plugin.getScheduler().async()); } /* ------------------------------------------