diff --git a/api/src/main/java/net/luckperms/api/model/user/UserManager.java b/api/src/main/java/net/luckperms/api/model/user/UserManager.java index f1819ccb9..e26d2e093 100644 --- a/api/src/main/java/net/luckperms/api/model/user/UserManager.java +++ b/api/src/main/java/net/luckperms/api/model/user/UserManager.java @@ -81,6 +81,15 @@ public interface UserManager { return loadUser(uniqueId, null); } + /** + * Loads multiple users from the plugin's storage provider into memory. + * + * @param uniqueIds the uuids of the users to load + * @return a future for an unmodifiable map of loaded users + * @throws NullPointerException if the uuid set is null + */ + @NonNull CompletableFuture<@Unmodifiable Map> loadUsers(@NonNull Set<@NonNull UUID> uniqueIds); + /** * Uses the LuckPerms cache to find a uuid for the given username. * diff --git a/common/src/main/java/me/lucko/luckperms/common/api/implementation/ApiUserManager.java b/common/src/main/java/me/lucko/luckperms/common/api/implementation/ApiUserManager.java index 4303ffb3a..c52f22d29 100644 --- a/common/src/main/java/me/lucko/luckperms/common/api/implementation/ApiUserManager.java +++ b/common/src/main/java/me/lucko/luckperms/common/api/implementation/ApiUserManager.java @@ -49,6 +49,7 @@ import java.util.Set; import java.util.UUID; import java.util.concurrent.CompletableFuture; import java.util.function.Consumer; +import java.util.stream.Collectors; public class ApiUserManager extends ApiAbstractManager> implements net.luckperms.api.model.user.UserManager { public ApiUserManager(LuckPermsPlugin plugin, UserManager handle) { @@ -76,6 +77,18 @@ public class ApiUserManager extends ApiAbstractManager> loadUsers(@NonNull Set<@NonNull UUID> uniqueIds) { + Objects.requireNonNull(uniqueIds, "uuid set"); + + if (uniqueIds.isEmpty()) { + return CompletableFuture.completedFuture(Map.of()); + } + + return this.plugin.getStorage().loadUsers(uniqueIds) + .thenApply(map -> map.entrySet().stream().collect(Collectors.toUnmodifiableMap(Map.Entry::getKey, entry -> this.proxyAndRegisterUsage(entry.getValue())))); + } + @Override public @NonNull CompletableFuture lookupUniqueId(@NonNull String username) { Objects.requireNonNull(username, "username");