>> getWithPermission(@Nonnull String permission);
+
/**
* Gets a loaded group.
*
diff --git a/api/src/main/java/me/lucko/luckperms/api/manager/TrackManager.java b/api/src/main/java/me/lucko/luckperms/api/manager/TrackManager.java
index 3a6491aa..c7682895 100644
--- a/api/src/main/java/me/lucko/luckperms/api/manager/TrackManager.java
+++ b/api/src/main/java/me/lucko/luckperms/api/manager/TrackManager.java
@@ -31,6 +31,8 @@ import me.lucko.luckperms.api.Track;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.Executor;
+import java.util.function.Consumer;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
@@ -38,6 +40,16 @@ import javax.annotation.Nullable;
/**
* Represents the object responsible for managing {@link Track} instances.
*
+ * All blocking methods return {@link CompletableFuture}s, which will be
+ * populated with the result once the data has been loaded/saved asynchronously.
+ * Care should be taken when using such methods to ensure that the main server
+ * thread is not blocked.
+ *
+ * Methods such as {@link CompletableFuture#get()} and equivalent should
+ * not be called on the main server thread. If you need to use
+ * the result of these operations on the main server thread, register a
+ * callback using {@link CompletableFuture#thenAcceptAsync(Consumer, Executor)}.
+ *
* @since 4.0
*/
public interface TrackManager {
diff --git a/api/src/main/java/me/lucko/luckperms/api/manager/UserManager.java b/api/src/main/java/me/lucko/luckperms/api/manager/UserManager.java
index 188add7a..3d96dd84 100644
--- a/api/src/main/java/me/lucko/luckperms/api/manager/UserManager.java
+++ b/api/src/main/java/me/lucko/luckperms/api/manager/UserManager.java
@@ -25,13 +25,18 @@
package me.lucko.luckperms.api.manager;
+import me.lucko.luckperms.api.HeldPermission;
+import me.lucko.luckperms.api.PlayerSaveResult;
import me.lucko.luckperms.api.Storage;
import me.lucko.luckperms.api.User;
+import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.Executor;
+import java.util.function.Consumer;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
@@ -42,6 +47,16 @@ import javax.annotation.Nullable;
* Note that User instances are automatically loaded for online players.
* It's likely that offline players will not have an instance pre-loaded.
*
+ * All blocking methods return {@link CompletableFuture}s, which will be
+ * populated with the result once the data has been loaded/saved asynchronously.
+ * Care should be taken when using such methods to ensure that the main server
+ * thread is not blocked.
+ *
+ * Methods such as {@link CompletableFuture#get()} and equivalent should
+ * not be called on the main server thread. If you need to use
+ * the result of these operations on the main server thread, register a
+ * callback using {@link CompletableFuture#thenAcceptAsync(Consumer, Executor)}.
+ *
* @since 4.0
*/
public interface UserManager {
@@ -85,6 +100,32 @@ public interface UserManager {
return loadUser(uuid, null);
}
+ /**
+ * Uses the LuckPerms cache to find a uuid for the given username.
+ *
+ * This lookup is case insensitive.
+ *
+ * @param username the username
+ * @return a uuid, could be null
+ * @throws NullPointerException if either parameters are null
+ * @throws IllegalArgumentException if the username is invalid
+ * @since 4.2
+ */
+ @Nonnull
+ CompletableFuture lookupUuid(@Nonnull String username);
+
+ /**
+ * Uses the LuckPerms cache to find a username for the given uuid.
+ *
+ * @param uuid the uuid
+ * @return a username, could be null
+ * @throws NullPointerException if either parameters are null
+ * @throws IllegalArgumentException if the username is invalid
+ * @since 4.2
+ */
+ @Nonnull
+ CompletableFuture lookupUsername(@Nonnull UUID uuid);
+
/**
* Saves a user's data back to the plugin's storage provider.
*
@@ -105,6 +146,41 @@ public interface UserManager {
@Nonnull
CompletableFuture saveUser(@Nonnull User user);
+ /**
+ * Saves data about a player to the uuid caching system.
+ *
+ * @param uuid the users mojang unique id
+ * @param username the users username
+ * @return the result of the operation.
+ * @throws NullPointerException if either parameters are null
+ * @throws IllegalArgumentException if the username is invalid
+ * @since 4.2
+ */
+ @Nonnull
+ CompletableFuture savePlayerData(@Nonnull UUID uuid, @Nonnull String username);
+
+ /**
+ * Gets a set all "unique" user UUIDs.
+ *
+ * "Unique" meaning the user isn't just a member of the "default" group.
+ *
+ * @return a set of uuids
+ * @since 4.2
+ */
+ @Nonnull
+ CompletableFuture> getUniqueUsers();
+
+ /**
+ * Searches for a list of users with a given permission.
+ *
+ * @param permission the permission to search for
+ * @return a list of held permissions
+ * @throws NullPointerException if the permission is null
+ * @since 4.2
+ */
+ @Nonnull
+ CompletableFuture>> getWithPermission(@Nonnull String permission);
+
/**
* Gets a loaded user.
*
diff --git a/bukkit/pom.xml b/bukkit/pom.xml
index 381c444b..bad31f8e 100644
--- a/bukkit/pom.xml
+++ b/bukkit/pom.xml
@@ -5,7 +5,7 @@
luckperms
me.lucko.luckperms
- 4.1-SNAPSHOT
+ 4.2-SNAPSHOT
4.0.0
diff --git a/bukkit/src/main/java/me/lucko/luckperms/bukkit/LPBukkitPlugin.java b/bukkit/src/main/java/me/lucko/luckperms/bukkit/LPBukkitPlugin.java
index acf5c915..7016ccb8 100644
--- a/bukkit/src/main/java/me/lucko/luckperms/bukkit/LPBukkitPlugin.java
+++ b/bukkit/src/main/java/me/lucko/luckperms/bukkit/LPBukkitPlugin.java
@@ -297,7 +297,7 @@ public class LPBukkitPlugin extends AbstractLuckPermsPlugin {
final User user = getUserManager().getIfLoaded(player.getUniqueId());
if (user != null) {
- user.getCachedData().invalidateCaches();
+ user.getCachedData().invalidate();
getUserManager().unload(user);
}
}
diff --git a/bungee/pom.xml b/bungee/pom.xml
index 85b77f89..4def9786 100644
--- a/bungee/pom.xml
+++ b/bungee/pom.xml
@@ -5,7 +5,7 @@
luckperms
me.lucko.luckperms
- 4.1-SNAPSHOT
+ 4.2-SNAPSHOT
4.0.0
diff --git a/common/pom.xml b/common/pom.xml
index b9b463c5..326e0c8a 100644
--- a/common/pom.xml
+++ b/common/pom.xml
@@ -5,7 +5,7 @@
luckperms
me.lucko.luckperms
- 4.1-SNAPSHOT
+ 4.2-SNAPSHOT
4.0.0
diff --git a/common/src/main/java/me/lucko/luckperms/common/api/delegates/manager/ApiGroupManager.java b/common/src/main/java/me/lucko/luckperms/common/api/delegates/manager/ApiGroupManager.java
index 8282bf70..c8b8e16b 100644
--- a/common/src/main/java/me/lucko/luckperms/common/api/delegates/manager/ApiGroupManager.java
+++ b/common/src/main/java/me/lucko/luckperms/common/api/delegates/manager/ApiGroupManager.java
@@ -25,16 +25,20 @@
package me.lucko.luckperms.common.api.delegates.manager;
+import me.lucko.luckperms.api.HeldPermission;
import me.lucko.luckperms.api.event.cause.CreationCause;
import me.lucko.luckperms.api.event.cause.DeletionCause;
import me.lucko.luckperms.common.api.ApiUtils;
import me.lucko.luckperms.common.api.delegates.model.ApiGroup;
+import me.lucko.luckperms.common.bulkupdate.comparisons.Constraint;
+import me.lucko.luckperms.common.bulkupdate.comparisons.StandardComparison;
import me.lucko.luckperms.common.managers.group.GroupManager;
import me.lucko.luckperms.common.model.Group;
import me.lucko.luckperms.common.node.factory.NodeFactory;
import me.lucko.luckperms.common.plugin.LuckPermsPlugin;
import me.lucko.luckperms.common.utils.ImmutableCollectors;
+import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
@@ -94,6 +98,13 @@ public class ApiGroupManager extends ApiAbstractManager>> getWithPermission(@Nonnull String permission) {
+ Objects.requireNonNull(permission, "permission");
+ return this.plugin.getStorage().getGroupsWithPermission(Constraint.of(StandardComparison.EQUAL, permission));
+ }
+
@Override
public me.lucko.luckperms.api.Group getGroup(@Nonnull String name) {
Objects.requireNonNull(name, "name");
diff --git a/common/src/main/java/me/lucko/luckperms/common/api/delegates/manager/ApiUserManager.java b/common/src/main/java/me/lucko/luckperms/common/api/delegates/manager/ApiUserManager.java
index 0224baa5..de66e873 100644
--- a/common/src/main/java/me/lucko/luckperms/common/api/delegates/manager/ApiUserManager.java
+++ b/common/src/main/java/me/lucko/luckperms/common/api/delegates/manager/ApiUserManager.java
@@ -25,14 +25,19 @@
package me.lucko.luckperms.common.api.delegates.manager;
+import me.lucko.luckperms.api.HeldPermission;
+import me.lucko.luckperms.api.PlayerSaveResult;
import me.lucko.luckperms.common.api.ApiUtils;
import me.lucko.luckperms.common.api.delegates.model.ApiUser;
+import me.lucko.luckperms.common.bulkupdate.comparisons.Constraint;
+import me.lucko.luckperms.common.bulkupdate.comparisons.StandardComparison;
import me.lucko.luckperms.common.managers.user.UserManager;
import me.lucko.luckperms.common.model.User;
import me.lucko.luckperms.common.model.UserIdentifier;
import me.lucko.luckperms.common.plugin.LuckPermsPlugin;
import me.lucko.luckperms.common.utils.ImmutableCollectors;
+import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.UUID;
@@ -68,6 +73,20 @@ public class ApiUserManager extends ApiAbstractManager lookupUuid(@Nonnull String username) {
+ Objects.requireNonNull(username, "username");
+ return this.plugin.getStorage().getPlayerUuid(username);
+ }
+
+ @Nonnull
+ @Override
+ public CompletableFuture lookupUsername(@Nonnull UUID uuid) {
+ Objects.requireNonNull(uuid, "uuid");
+ return this.plugin.getStorage().getPlayerName(uuid);
+ }
+
@Nonnull
@Override
public CompletableFuture saveUser(@Nonnull me.lucko.luckperms.api.User user) {
@@ -75,6 +94,27 @@ public class ApiUserManager extends ApiAbstractManager savePlayerData(@Nonnull UUID uuid, @Nonnull String username) {
+ Objects.requireNonNull(uuid, "uuid");
+ Objects.requireNonNull(username, "username");
+ return this.plugin.getStorage().savePlayerData(uuid, username);
+ }
+
+ @Nonnull
+ @Override
+ public CompletableFuture> getUniqueUsers() {
+ return this.plugin.getStorage().getUniqueUsers();
+ }
+
+ @Nonnull
+ @Override
+ public CompletableFuture>> getWithPermission(@Nonnull String permission) {
+ Objects.requireNonNull(permission, "permission");
+ return this.plugin.getStorage().getUsersWithPermission(Constraint.of(StandardComparison.EQUAL, permission));
+ }
+
@Override
public me.lucko.luckperms.api.User getUser(@Nonnull UUID uuid) {
Objects.requireNonNull(uuid, "uuid");
diff --git a/common/src/main/java/me/lucko/luckperms/common/api/delegates/misc/ApiPlatformInfo.java b/common/src/main/java/me/lucko/luckperms/common/api/delegates/misc/ApiPlatformInfo.java
index 138b06cb..1fc55224 100644
--- a/common/src/main/java/me/lucko/luckperms/common/api/delegates/misc/ApiPlatformInfo.java
+++ b/common/src/main/java/me/lucko/luckperms/common/api/delegates/misc/ApiPlatformInfo.java
@@ -50,7 +50,7 @@ public class ApiPlatformInfo implements PlatformInfo {
@Override
public double getApiVersion() {
- return 4.1;
+ return 4.2;
}
@Nonnull
diff --git a/common/src/main/java/me/lucko/luckperms/common/api/delegates/model/ApiPermissionHolder.java b/common/src/main/java/me/lucko/luckperms/common/api/delegates/model/ApiPermissionHolder.java
index ead7cc13..d2267ed9 100644
--- a/common/src/main/java/me/lucko/luckperms/common/api/delegates/model/ApiPermissionHolder.java
+++ b/common/src/main/java/me/lucko/luckperms/common/api/delegates/model/ApiPermissionHolder.java
@@ -99,7 +99,7 @@ public class ApiPermissionHolder implements me.lucko.luckperms.api.PermissionHol
@Nonnull
@Override
public CompletableFuture refreshCachedData() {
- return CompletableFuture.runAsync(() -> this.handle.getCachedData().invalidateCaches());
+ return CompletableFuture.runAsync(() -> this.handle.getCachedData().invalidate());
}
@Nonnull
diff --git a/common/src/main/java/me/lucko/luckperms/common/caching/AbstractCachedData.java b/common/src/main/java/me/lucko/luckperms/common/caching/AbstractCachedData.java
index 27eb9ae7..41966bc4 100644
--- a/common/src/main/java/me/lucko/luckperms/common/caching/AbstractCachedData.java
+++ b/common/src/main/java/me/lucko/luckperms/common/caching/AbstractCachedData.java
@@ -355,14 +355,24 @@ public abstract class AbstractCachedData implements CachedData {
this.meta.synchronous().invalidate(getDefaultMetaContexts(contexts));
}
+ @Override
+ public void invalidatePermissions() {
+ this.permission.synchronous().invalidateAll();
+ }
+
+ @Override
+ public void invalidateMeta() {
+ this.meta.synchronous().invalidateAll();
+ }
+
@Override
public void invalidatePermissionCalculators() {
this.permission.synchronous().asMap().values().forEach(PermissionCache::invalidateCache);
}
- public void invalidateCaches() {
- this.permission.synchronous().invalidateAll();
- this.meta.synchronous().invalidateAll();
+ public void invalidate() {
+ invalidatePermissions();
+ invalidateMeta();
}
public void doCacheCleanup() {
diff --git a/common/src/main/java/me/lucko/luckperms/common/caching/handlers/StateListener.java b/common/src/main/java/me/lucko/luckperms/common/caching/handlers/StateListener.java
deleted file mode 100644
index bf233dc4..00000000
--- a/common/src/main/java/me/lucko/luckperms/common/caching/handlers/StateListener.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * This file is part of LuckPerms, licensed under the MIT License.
- *
- * Copyright (c) lucko (Luck)
- * Copyright (c) contributors
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package me.lucko.luckperms.common.caching.handlers;
-
-import me.lucko.luckperms.common.model.PermissionHolder;
-
-/**
- * Represents an object which is notified when the state of a {@link PermissionHolder} changes.
- */
-public interface StateListener {
-
- void onStateChange();
-
-}
diff --git a/common/src/main/java/me/lucko/luckperms/common/listener/AbstractConnectionListener.java b/common/src/main/java/me/lucko/luckperms/common/listener/AbstractConnectionListener.java
index 1d598cbd..d3765a16 100644
--- a/common/src/main/java/me/lucko/luckperms/common/listener/AbstractConnectionListener.java
+++ b/common/src/main/java/me/lucko/luckperms/common/listener/AbstractConnectionListener.java
@@ -25,11 +25,12 @@
package me.lucko.luckperms.common.listener;
+import me.lucko.luckperms.api.PlayerSaveResult;
import me.lucko.luckperms.common.assignments.AssignmentRule;
import me.lucko.luckperms.common.config.ConfigKeys;
import me.lucko.luckperms.common.model.User;
import me.lucko.luckperms.common.plugin.LuckPermsPlugin;
-import me.lucko.luckperms.common.storage.PlayerSaveResult;
+import me.lucko.luckperms.common.storage.PlayerSaveResultImpl;
import java.util.Set;
import java.util.UUID;
@@ -63,11 +64,11 @@ public abstract class AbstractConnectionListener implements ConnectionListener {
// save uuid data.
PlayerSaveResult saveResult = this.plugin.getStorage().savePlayerData(u, username).join();
- if (saveResult.includes(PlayerSaveResult.Status.CLEAN_INSERT)) {
+ if (saveResult.includes(PlayerSaveResultImpl.Status.CLEAN_INSERT)) {
this.plugin.getEventFactory().handleUserFirstLogin(u, username);
}
- if (saveResult.includes(PlayerSaveResult.Status.OTHER_UUIDS_PRESENT_FOR_USERNAME)) {
+ if (saveResult.includes(PlayerSaveResultImpl.Status.OTHER_UUIDS_PRESENT_FOR_USERNAME)) {
this.plugin.getLogger().warn("LuckPerms already has data for player '" + username + "' - but this data is stored under a different uuid.");
this.plugin.getLogger().warn("'" + username + "' has previously used the unique ids " + saveResult.getOtherUuids() + " but is now connecting with '" + u + "'");
this.plugin.getLogger().warn("This is usually because the server is not authenticating correctly. If you're using BungeeCord, please ensure that IP-Forwarding is setup correctly!");
diff --git a/common/src/main/java/me/lucko/luckperms/common/model/PermissionHolder.java b/common/src/main/java/me/lucko/luckperms/common/model/PermissionHolder.java
index 51a0c972..1beea55e 100644
--- a/common/src/main/java/me/lucko/luckperms/common/model/PermissionHolder.java
+++ b/common/src/main/java/me/lucko/luckperms/common/model/PermissionHolder.java
@@ -205,7 +205,7 @@ public abstract class PermissionHolder {
* Invalidates the holder's cached data.
*/
public void invalidateCachedData() {
- getCachedData().invalidateCaches();
+ getCachedData().invalidate();
}
protected void invalidateCache() {
diff --git a/common/src/main/java/me/lucko/luckperms/common/storage/AbstractStorage.java b/common/src/main/java/me/lucko/luckperms/common/storage/AbstractStorage.java
index 250d7fdd..26437d5a 100644
--- a/common/src/main/java/me/lucko/luckperms/common/storage/AbstractStorage.java
+++ b/common/src/main/java/me/lucko/luckperms/common/storage/AbstractStorage.java
@@ -30,6 +30,7 @@ import com.google.common.collect.ImmutableList;
import me.lucko.luckperms.api.HeldPermission;
import me.lucko.luckperms.api.LogEntry;
+import me.lucko.luckperms.api.PlayerSaveResult;
import me.lucko.luckperms.api.event.cause.CreationCause;
import me.lucko.luckperms.api.event.cause.DeletionCause;
import me.lucko.luckperms.common.actionlog.Log;
@@ -115,11 +116,6 @@ public class AbstractStorage implements Storage {
return this.dao.getName();
}
- @Override
- public Storage noBuffer() {
- return this;
- }
-
@Override
public void init() {
try {
diff --git a/common/src/main/java/me/lucko/luckperms/common/storage/PlayerSaveResultImpl.java b/common/src/main/java/me/lucko/luckperms/common/storage/PlayerSaveResultImpl.java
new file mode 100644
index 00000000..b3c7f261
--- /dev/null
+++ b/common/src/main/java/me/lucko/luckperms/common/storage/PlayerSaveResultImpl.java
@@ -0,0 +1,135 @@
+/*
+ * This file is part of LuckPerms, licensed under the MIT License.
+ *
+ * Copyright (c) lucko (Luck)
+ * Copyright (c) contributors
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+package me.lucko.luckperms.common.storage;
+
+import com.google.common.collect.ImmutableSet;
+
+import me.lucko.luckperms.api.PlayerSaveResult;
+
+import java.util.EnumSet;
+import java.util.Objects;
+import java.util.Set;
+import java.util.UUID;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+/**
+ * Represents the result to a player history save operation
+ */
+public final class PlayerSaveResultImpl implements PlayerSaveResult {
+ private static final PlayerSaveResultImpl CLEAN_INSERT = new PlayerSaveResultImpl(Status.CLEAN_INSERT);
+ private static final PlayerSaveResultImpl NO_CHANGE = new PlayerSaveResultImpl(Status.NO_CHANGE);
+
+ public static PlayerSaveResultImpl cleanInsert() {
+ return CLEAN_INSERT;
+ }
+
+ public static PlayerSaveResultImpl noChange() {
+ return NO_CHANGE;
+ }
+
+ public static PlayerSaveResultImpl usernameUpdated(String oldUsername) {
+ return new PlayerSaveResultImpl(EnumSet.of(Status.USERNAME_UPDATED), oldUsername, null);
+ }
+
+ public static PlayerSaveResultImpl determineBaseResult(String username, String oldUsername) {
+ PlayerSaveResultImpl result;
+ if (oldUsername == null) {
+ result = PlayerSaveResultImpl.cleanInsert();
+ } else if (oldUsername.equalsIgnoreCase(username)) {
+ result = PlayerSaveResultImpl.noChange();
+ } else {
+ result = PlayerSaveResultImpl.usernameUpdated(oldUsername);
+ }
+ return result;
+ }
+
+ private final Set status;
+ @Nullable private final String oldUsername;
+ @Nullable private final Set otherUuids;
+
+ private PlayerSaveResultImpl(EnumSet status, @Nullable String oldUsername, @Nullable Set otherUuids) {
+ this.status = ImmutableSet.copyOf(status);
+ this.oldUsername = oldUsername;
+ this.otherUuids = otherUuids;
+ }
+
+ private PlayerSaveResultImpl(Status status) {
+ this(EnumSet.of(status), null, null);
+ }
+
+ /**
+ * Returns a new {@link PlayerSaveResultImpl} with the {@link Status#OTHER_UUIDS_PRESENT_FOR_USERNAME}
+ * status attached to the state of this result.
+ *
+ * @param otherUuids the other uuids
+ * @return a new result
+ */
+ public PlayerSaveResultImpl withOtherUuidsPresent(@Nonnull Set otherUuids) {
+ EnumSet status = EnumSet.copyOf(this.status);
+ status.add(Status.OTHER_UUIDS_PRESENT_FOR_USERNAME);
+ return new PlayerSaveResultImpl(status, this.oldUsername, ImmutableSet.copyOf(otherUuids));
+ }
+
+ @Nonnull
+ @Override
+ public Set getStatus() {
+ return this.status;
+ }
+
+ @Override
+ public boolean includes(@Nonnull Status status) {
+ return this.status.contains(status);
+ }
+
+ @Nullable
+ @Override
+ public String getOldUsername() {
+ return this.oldUsername;
+ }
+
+ @Nullable
+ @Override
+ public Set getOtherUuids() {
+ return this.otherUuids;
+ }
+
+ @Override
+ public boolean equals(Object that) {
+ if (this == that) return true;
+ if (that == null || getClass() != that.getClass()) return false;
+ PlayerSaveResultImpl result = (PlayerSaveResultImpl) that;
+ return Objects.equals(this.status, result.status) &&
+ Objects.equals(this.oldUsername, result.oldUsername) &&
+ Objects.equals(this.otherUuids, result.otherUuids);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(this.status, this.oldUsername, this.otherUuids);
+ }
+}
diff --git a/common/src/main/java/me/lucko/luckperms/common/storage/Storage.java b/common/src/main/java/me/lucko/luckperms/common/storage/Storage.java
index 89ac09e5..66e3f71c 100644
--- a/common/src/main/java/me/lucko/luckperms/common/storage/Storage.java
+++ b/common/src/main/java/me/lucko/luckperms/common/storage/Storage.java
@@ -27,6 +27,7 @@ package me.lucko.luckperms.common.storage;
import me.lucko.luckperms.api.HeldPermission;
import me.lucko.luckperms.api.LogEntry;
+import me.lucko.luckperms.api.PlayerSaveResult;
import me.lucko.luckperms.api.event.cause.CreationCause;
import me.lucko.luckperms.api.event.cause.DeletionCause;
import me.lucko.luckperms.common.actionlog.Log;
@@ -56,8 +57,6 @@ public interface Storage {
String getName();
- Storage noBuffer();
-
void init();
void shutdown();
diff --git a/common/src/main/java/me/lucko/luckperms/common/storage/dao/AbstractDao.java b/common/src/main/java/me/lucko/luckperms/common/storage/dao/AbstractDao.java
index 200bf80e..75f4a9e9 100644
--- a/common/src/main/java/me/lucko/luckperms/common/storage/dao/AbstractDao.java
+++ b/common/src/main/java/me/lucko/luckperms/common/storage/dao/AbstractDao.java
@@ -27,6 +27,7 @@ package me.lucko.luckperms.common.storage.dao;
import me.lucko.luckperms.api.HeldPermission;
import me.lucko.luckperms.api.LogEntry;
+import me.lucko.luckperms.api.PlayerSaveResult;
import me.lucko.luckperms.common.actionlog.Log;
import me.lucko.luckperms.common.bulkupdate.BulkUpdate;
import me.lucko.luckperms.common.bulkupdate.comparisons.Constraint;
@@ -34,7 +35,6 @@ import me.lucko.luckperms.common.model.Group;
import me.lucko.luckperms.common.model.Track;
import me.lucko.luckperms.common.model.User;
import me.lucko.luckperms.common.plugin.LuckPermsPlugin;
-import me.lucko.luckperms.common.storage.PlayerSaveResult;
import java.util.Collections;
import java.util.List;
diff --git a/common/src/main/java/me/lucko/luckperms/common/storage/dao/SplitStorageDao.java b/common/src/main/java/me/lucko/luckperms/common/storage/dao/SplitStorageDao.java
index cf7249d2..c0a8a852 100644
--- a/common/src/main/java/me/lucko/luckperms/common/storage/dao/SplitStorageDao.java
+++ b/common/src/main/java/me/lucko/luckperms/common/storage/dao/SplitStorageDao.java
@@ -29,6 +29,7 @@ import com.google.common.collect.ImmutableMap;
import me.lucko.luckperms.api.HeldPermission;
import me.lucko.luckperms.api.LogEntry;
+import me.lucko.luckperms.api.PlayerSaveResult;
import me.lucko.luckperms.common.actionlog.Log;
import me.lucko.luckperms.common.bulkupdate.BulkUpdate;
import me.lucko.luckperms.common.bulkupdate.comparisons.Constraint;
@@ -36,7 +37,6 @@ import me.lucko.luckperms.common.model.Group;
import me.lucko.luckperms.common.model.Track;
import me.lucko.luckperms.common.model.User;
import me.lucko.luckperms.common.plugin.LuckPermsPlugin;
-import me.lucko.luckperms.common.storage.PlayerSaveResult;
import me.lucko.luckperms.common.storage.SplitStorageType;
import me.lucko.luckperms.common.storage.StorageType;
diff --git a/common/src/main/java/me/lucko/luckperms/common/storage/dao/file/AbstractConfigurateDao.java b/common/src/main/java/me/lucko/luckperms/common/storage/dao/file/AbstractConfigurateDao.java
index c47b1045..797340c4 100644
--- a/common/src/main/java/me/lucko/luckperms/common/storage/dao/file/AbstractConfigurateDao.java
+++ b/common/src/main/java/me/lucko/luckperms/common/storage/dao/file/AbstractConfigurateDao.java
@@ -32,6 +32,7 @@ import com.google.common.collect.Maps;
import me.lucko.luckperms.api.ChatMetaType;
import me.lucko.luckperms.api.LogEntry;
import me.lucko.luckperms.api.Node;
+import me.lucko.luckperms.api.PlayerSaveResult;
import me.lucko.luckperms.api.context.ImmutableContextSet;
import me.lucko.luckperms.common.actionlog.Log;
import me.lucko.luckperms.common.bulkupdate.BulkUpdate;
@@ -45,7 +46,6 @@ import me.lucko.luckperms.common.node.factory.NodeFactory;
import me.lucko.luckperms.common.node.model.NodeDataContainer;
import me.lucko.luckperms.common.node.utils.MetaType;
import me.lucko.luckperms.common.plugin.LuckPermsPlugin;
-import me.lucko.luckperms.common.storage.PlayerSaveResult;
import me.lucko.luckperms.common.storage.dao.AbstractDao;
import me.lucko.luckperms.common.storage.dao.file.loader.ConfigurateLoader;
import me.lucko.luckperms.common.storage.dao.file.loader.JsonLoader;
diff --git a/common/src/main/java/me/lucko/luckperms/common/storage/dao/file/FileUuidCache.java b/common/src/main/java/me/lucko/luckperms/common/storage/dao/file/FileUuidCache.java
index af44cad4..01dfd02c 100644
--- a/common/src/main/java/me/lucko/luckperms/common/storage/dao/file/FileUuidCache.java
+++ b/common/src/main/java/me/lucko/luckperms/common/storage/dao/file/FileUuidCache.java
@@ -30,7 +30,8 @@ import com.google.common.collect.Iterables;
import com.google.common.collect.Multimaps;
import com.google.common.collect.SetMultimap;
-import me.lucko.luckperms.common.storage.PlayerSaveResult;
+import me.lucko.luckperms.api.PlayerSaveResult;
+import me.lucko.luckperms.common.storage.PlayerSaveResultImpl;
import me.lucko.luckperms.common.utils.Uuids;
import java.io.BufferedReader;
@@ -104,7 +105,7 @@ public class FileUuidCache {
// perform the insert
String oldUsername = this.lookupMap.put(uuid, username);
- PlayerSaveResult result = PlayerSaveResult.determineBaseResult(username, oldUsername);
+ PlayerSaveResultImpl result = PlayerSaveResultImpl.determineBaseResult(username, oldUsername);
Set conflicting = new HashSet<>(this.lookupMap.lookupUuid(username));
conflicting.remove(uuid);
diff --git a/common/src/main/java/me/lucko/luckperms/common/storage/dao/mongodb/MongoDao.java b/common/src/main/java/me/lucko/luckperms/common/storage/dao/mongodb/MongoDao.java
index 7050dec9..34fca7ef 100644
--- a/common/src/main/java/me/lucko/luckperms/common/storage/dao/mongodb/MongoDao.java
+++ b/common/src/main/java/me/lucko/luckperms/common/storage/dao/mongodb/MongoDao.java
@@ -40,6 +40,7 @@ import com.mongodb.client.model.UpdateOptions;
import me.lucko.luckperms.api.HeldPermission;
import me.lucko.luckperms.api.LogEntry;
import me.lucko.luckperms.api.Node;
+import me.lucko.luckperms.api.PlayerSaveResult;
import me.lucko.luckperms.api.context.ContextSet;
import me.lucko.luckperms.api.context.ImmutableContextSet;
import me.lucko.luckperms.api.context.MutableContextSet;
@@ -59,7 +60,7 @@ import me.lucko.luckperms.common.node.factory.NodeFactory;
import me.lucko.luckperms.common.node.model.NodeDataContainer;
import me.lucko.luckperms.common.node.model.NodeHeldPermission;
import me.lucko.luckperms.common.plugin.LuckPermsPlugin;
-import me.lucko.luckperms.common.storage.PlayerSaveResult;
+import me.lucko.luckperms.common.storage.PlayerSaveResultImpl;
import me.lucko.luckperms.common.storage.StorageCredentials;
import me.lucko.luckperms.common.storage.dao.AbstractDao;
@@ -582,7 +583,7 @@ public class MongoDao extends AbstractDao {
c.replaceOne(new Document("_id", uuid), new Document("_id", uuid).append("name", username), new UpdateOptions().upsert(true));
}
- PlayerSaveResult result = PlayerSaveResult.determineBaseResult(username, oldUsername);
+ PlayerSaveResultImpl result = PlayerSaveResultImpl.determineBaseResult(username, oldUsername);
Set conflicting = new HashSet<>();
try (MongoCursor cursor = c.find(new Document("name", username)).iterator()) {
diff --git a/common/src/main/java/me/lucko/luckperms/common/storage/dao/sql/SqlDao.java b/common/src/main/java/me/lucko/luckperms/common/storage/dao/sql/SqlDao.java
index 78b57f83..ccb8e42a 100644
--- a/common/src/main/java/me/lucko/luckperms/common/storage/dao/sql/SqlDao.java
+++ b/common/src/main/java/me/lucko/luckperms/common/storage/dao/sql/SqlDao.java
@@ -32,6 +32,7 @@ import com.google.gson.reflect.TypeToken;
import me.lucko.luckperms.api.HeldPermission;
import me.lucko.luckperms.api.LogEntry;
import me.lucko.luckperms.api.Node;
+import me.lucko.luckperms.api.PlayerSaveResult;
import me.lucko.luckperms.common.actionlog.ExtendedLogEntry;
import me.lucko.luckperms.common.actionlog.Log;
import me.lucko.luckperms.common.bulkupdate.BulkUpdate;
@@ -49,7 +50,7 @@ import me.lucko.luckperms.common.node.factory.NodeFactory;
import me.lucko.luckperms.common.node.model.NodeDataContainer;
import me.lucko.luckperms.common.node.model.NodeHeldPermission;
import me.lucko.luckperms.common.plugin.LuckPermsPlugin;
-import me.lucko.luckperms.common.storage.PlayerSaveResult;
+import me.lucko.luckperms.common.storage.PlayerSaveResultImpl;
import me.lucko.luckperms.common.storage.dao.AbstractDao;
import me.lucko.luckperms.common.storage.dao.sql.connection.AbstractConnectionFactory;
import me.lucko.luckperms.common.storage.dao.sql.connection.file.SQLiteConnectionFactory;
@@ -932,7 +933,7 @@ public class SqlDao extends AbstractDao {
}
}
- PlayerSaveResult result = PlayerSaveResult.determineBaseResult(username, oldUsername);
+ PlayerSaveResultImpl result = PlayerSaveResultImpl.determineBaseResult(username, oldUsername);
Set conflicting = new HashSet<>();
try (Connection c = this.provider.getConnection()) {
diff --git a/nukkit/pom.xml b/nukkit/pom.xml
index f58addd3..c9173ba0 100644
--- a/nukkit/pom.xml
+++ b/nukkit/pom.xml
@@ -5,7 +5,7 @@
luckperms
me.lucko.luckperms
- 4.1-SNAPSHOT
+ 4.2-SNAPSHOT
4.0.0
diff --git a/nukkit/src/main/java/me/lucko/luckperms/nukkit/LPNukkitPlugin.java b/nukkit/src/main/java/me/lucko/luckperms/nukkit/LPNukkitPlugin.java
index 667a76d2..3519b5c3 100644
--- a/nukkit/src/main/java/me/lucko/luckperms/nukkit/LPNukkitPlugin.java
+++ b/nukkit/src/main/java/me/lucko/luckperms/nukkit/LPNukkitPlugin.java
@@ -266,7 +266,7 @@ public class LPNukkitPlugin extends AbstractLuckPermsPlugin {
final User user = getUserManager().getIfLoaded(player.getUniqueId());
if (user != null) {
- user.getCachedData().invalidateCaches();
+ user.getCachedData().invalidate();
getUserManager().unload(user);
}
}
diff --git a/pom.xml b/pom.xml
index 662fb7f9..b4479a4d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
me.lucko.luckperms
luckperms
- 4.1-SNAPSHOT
+ 4.2-SNAPSHOT
api
@@ -55,7 +55,7 @@
true
- 4.1
+ 4.2
${git.closest.tag.commit.count}
diff --git a/sponge/pom.xml b/sponge/pom.xml
index 06856600..5903a78c 100644
--- a/sponge/pom.xml
+++ b/sponge/pom.xml
@@ -5,7 +5,7 @@
luckperms
me.lucko.luckperms
- 4.1-SNAPSHOT
+ 4.2-SNAPSHOT
4.0.0
diff --git a/sponge/sponge-service-api6/pom.xml b/sponge/sponge-service-api6/pom.xml
index edfc024d..285c92a5 100644
--- a/sponge/sponge-service-api6/pom.xml
+++ b/sponge/sponge-service-api6/pom.xml
@@ -5,7 +5,7 @@
luckperms
me.lucko.luckperms
- 4.1-SNAPSHOT
+ 4.2-SNAPSHOT
../../pom.xml
4.0.0
diff --git a/sponge/sponge-service-api7/pom.xml b/sponge/sponge-service-api7/pom.xml
index dd134ae2..a3749c14 100644
--- a/sponge/sponge-service-api7/pom.xml
+++ b/sponge/sponge-service-api7/pom.xml
@@ -5,7 +5,7 @@
luckperms
me.lucko.luckperms
- 4.1-SNAPSHOT
+ 4.2-SNAPSHOT
../../pom.xml
4.0.0
diff --git a/sponge/sponge-service/pom.xml b/sponge/sponge-service/pom.xml
index dc4cc16a..f4295e57 100644
--- a/sponge/sponge-service/pom.xml
+++ b/sponge/sponge-service/pom.xml
@@ -5,7 +5,7 @@
luckperms
me.lucko.luckperms
- 4.1-SNAPSHOT
+ 4.2-SNAPSHOT
../../pom.xml
4.0.0
diff --git a/sponge/src/main/java/me/lucko/luckperms/sponge/service/calculated/CalculatedSubject.java b/sponge/src/main/java/me/lucko/luckperms/sponge/service/calculated/CalculatedSubject.java
index d56f905e..4dd88588 100644
--- a/sponge/src/main/java/me/lucko/luckperms/sponge/service/calculated/CalculatedSubject.java
+++ b/sponge/src/main/java/me/lucko/luckperms/sponge/service/calculated/CalculatedSubject.java
@@ -321,7 +321,7 @@ public abstract class CalculatedSubject implements LPSubject {
@Override
public void invalidateCaches() {
- this.cachedData.invalidateCaches();
+ this.cachedData.invalidate();
}
}
diff --git a/sponge/src/main/java/me/lucko/luckperms/sponge/service/internal/HolderSubject.java b/sponge/src/main/java/me/lucko/luckperms/sponge/service/internal/HolderSubject.java
index d247e4c1..0c6d72d2 100644
--- a/sponge/src/main/java/me/lucko/luckperms/sponge/service/internal/HolderSubject.java
+++ b/sponge/src/main/java/me/lucko/luckperms/sponge/service/internal/HolderSubject.java
@@ -161,7 +161,7 @@ public abstract class HolderSubject implements LPSub
@Override
public void invalidateCaches() {
// invalidate for all changes
- this.parent.getCachedData().invalidateCaches();
+ this.parent.getCachedData().invalidate();
}
}