diff --git a/api/src/main/java/me/lucko/luckperms/api/Datastore.java b/api/src/main/java/me/lucko/luckperms/api/Datastore.java
index c45b3d79..d43d111d 100644
--- a/api/src/main/java/me/lucko/luckperms/api/Datastore.java
+++ b/api/src/main/java/me/lucko/luckperms/api/Datastore.java
@@ -24,6 +24,7 @@ package me.lucko.luckperms.api;
import me.lucko.luckperms.api.data.Callback;
+import java.util.Set;
import java.util.UUID;
/**
@@ -90,7 +91,9 @@ public interface Datastore {
* @return true if the operation completed successfully.
* @throws NullPointerException if uuid or username is null
* @throws IllegalArgumentException if either of the parameters are invalid
+ * @deprecated functionality of this method is taken on by {@link #loadUser(UUID, String)}
*/
+ @Deprecated
boolean loadOrCreateUser(UUID uuid, String username);
/**
@@ -98,9 +101,21 @@ public interface Datastore {
* @param uuid the uuid of the user to load
* @return true if the user exists, and was loaded correctly.
* @throws NullPointerException if uuid is null
+ * @deprecated replaced by {@link #loadUser(UUID, String)}
*/
+ @Deprecated
boolean loadUser(UUID uuid);
+ /**
+ * Loads a user's data into the plugins internal storage.
+ * @param uuid the uuid of the user to load
+ * @param username the users username. (if you want to specify null
here, just input "null" as a string.)
+ * @return if the operation was performed successfully
+ * @throws NullPointerException if uuid or username is null
+ * @since 1.6
+ */
+ boolean loadUser(UUID uuid, String username);
+
/**
* Saves a user object into the datastore. You should call this after you make any changes to a user.
* @param user the user to save
@@ -110,6 +125,20 @@ public interface Datastore {
*/
boolean saveUser(User user);
+ /**
+ * Removes users from the datastore who are "default". This is called every time the plugin loads.
+ * @return true if the operation completed successfully
+ * @since 1.6
+ */
+ boolean cleanupUsers();
+
+ /**
+ * Gets a set user's UUIDs who are "unique", aren't just a member of the "default" group.
+ * @return a set of uuids, or null if the operation failed.
+ * @since 1.6
+ */
+ Set getUniqueUsers();
+
/**
* Creates and loads a group into the plugins internal storage
* @param name the name of the group
@@ -223,9 +252,14 @@ public interface Datastore {
interface Async {
void logAction(LogEntry entry, Callback callback);
void getLog(Callback callback);
+ @Deprecated
void loadOrCreateUser(UUID uuid, String username, Callback callback);
+ @Deprecated
void loadUser(UUID uuid, Callback callback);
+ void loadUser(UUID uuid, String username, Callback callback);
void saveUser(User user, Callback callback);
+ void cleanupUsers(Callback callback);
+ void getUniqueUsers(Callback> callback);
void createAndLoadGroup(String name, Callback callback);
void loadGroup(String name, Callback callback);
void loadAllGroups(Callback callback);
@@ -250,9 +284,14 @@ public interface Datastore {
interface Future {
java.util.concurrent.Future logAction(LogEntry entry);
java.util.concurrent.Future getLog();
+ @Deprecated
java.util.concurrent.Future loadOrCreateUser(UUID uuid, String username);
+ @Deprecated
java.util.concurrent.Future loadUser(UUID uuid);
+ java.util.concurrent.Future loadUser(UUID uuid, String username);
java.util.concurrent.Future saveUser(User user);
+ java.util.concurrent.Future cleanupUsers();
+ java.util.concurrent.Future> getUniqueUsers();
java.util.concurrent.Future createAndLoadGroup(String name);
java.util.concurrent.Future loadGroup(String name);
java.util.concurrent.Future loadAllGroups();
diff --git a/api/src/main/java/me/lucko/luckperms/api/LuckPermsApi.java b/api/src/main/java/me/lucko/luckperms/api/LuckPermsApi.java
index ee8533d4..33dc40b2 100644
--- a/api/src/main/java/me/lucko/luckperms/api/LuckPermsApi.java
+++ b/api/src/main/java/me/lucko/luckperms/api/LuckPermsApi.java
@@ -39,6 +39,12 @@ public interface LuckPermsApi {
*/
void runUpdateTask();
+ /**
+ * @return the version of the API running on the platform
+ * @since 1.6
+ */
+ double getApiVersion();
+
/**
* @return the version of the plugin running on the platform
*/
diff --git a/bukkit/src/main/java/me/lucko/luckperms/users/BukkitUserManager.java b/bukkit/src/main/java/me/lucko/luckperms/users/BukkitUserManager.java
index e2d19f92..95546bba 100644
--- a/bukkit/src/main/java/me/lucko/luckperms/users/BukkitUserManager.java
+++ b/bukkit/src/main/java/me/lucko/luckperms/users/BukkitUserManager.java
@@ -88,7 +88,7 @@ public class BukkitUserManager extends UserManager {
Set players = plugin.getServer().getOnlinePlayers().stream()
.map(p -> plugin.getUuidCache().getUUID(p.getUniqueId()))
.collect(Collectors.toSet());
- plugin.doAsync(() -> players.forEach(u -> plugin.getDatastore().loadUser(u)));
+ plugin.doAsync(() -> players.forEach(u -> plugin.getDatastore().loadUser(u, "null")));
});
}
}
diff --git a/bungee/src/main/java/me/lucko/luckperms/BungeeListener.java b/bungee/src/main/java/me/lucko/luckperms/BungeeListener.java
index f0ea870e..c796d123 100644
--- a/bungee/src/main/java/me/lucko/luckperms/BungeeListener.java
+++ b/bungee/src/main/java/me/lucko/luckperms/BungeeListener.java
@@ -97,7 +97,7 @@ public class BungeeListener extends AbstractListener implements Listener {
// We have to make a new user on this thread whilst the connection is being held, or we get concurrency issues as the Bukkit server
// and the BungeeCord server try to make a new user at the same time.
- plugin.getDatastore().loadOrCreateUser(cache.getUUID(c.getUniqueId()), c.getName());
+ plugin.getDatastore().loadUser(cache.getUUID(c.getUniqueId()), c.getName());
final long time = System.currentTimeMillis() - startTime;
if (time >= 1000) {
plugin.getLog().warn("Processing login for " + c.getName() + " took " + time + "ms.");
diff --git a/bungee/src/main/java/me/lucko/luckperms/users/BungeeUserManager.java b/bungee/src/main/java/me/lucko/luckperms/users/BungeeUserManager.java
index 8ff79af7..bb6f4ce7 100644
--- a/bungee/src/main/java/me/lucko/luckperms/users/BungeeUserManager.java
+++ b/bungee/src/main/java/me/lucko/luckperms/users/BungeeUserManager.java
@@ -64,6 +64,6 @@ public class BungeeUserManager extends UserManager {
public void updateAllUsers() {
plugin.getProxy().getPlayers().stream()
.map(p -> plugin.getUuidCache().getUUID(p.getUniqueId()))
- .forEach(u -> plugin.getDatastore().loadUser(u));
+ .forEach(u -> plugin.getDatastore().loadUser(u, "null"));
}
}
diff --git a/common/src/main/java/me/lucko/luckperms/api/implementation/ApiProvider.java b/common/src/main/java/me/lucko/luckperms/api/implementation/ApiProvider.java
index 8a46df6d..93e4d908 100644
--- a/common/src/main/java/me/lucko/luckperms/api/implementation/ApiProvider.java
+++ b/common/src/main/java/me/lucko/luckperms/api/implementation/ApiProvider.java
@@ -66,6 +66,11 @@ public class ApiProvider implements LuckPermsApi {
plugin.runUpdateTask();
}
+ @Override
+ public double getApiVersion() {
+ return 1.6;
+ }
+
@Override
public String getVersion() {
return plugin.getVersion();
diff --git a/common/src/main/java/me/lucko/luckperms/api/implementation/internal/DatastoreLink.java b/common/src/main/java/me/lucko/luckperms/api/implementation/internal/DatastoreLink.java
index 84265862..3687c488 100644
--- a/common/src/main/java/me/lucko/luckperms/api/implementation/internal/DatastoreLink.java
+++ b/common/src/main/java/me/lucko/luckperms/api/implementation/internal/DatastoreLink.java
@@ -30,8 +30,10 @@ import me.lucko.luckperms.LuckPermsPlugin;
import me.lucko.luckperms.api.*;
import me.lucko.luckperms.api.data.Callback;
+import java.util.Set;
import java.util.UUID;
import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
@@ -106,12 +108,17 @@ public class DatastoreLink implements Datastore {
@Override
public void loadOrCreateUser(@NonNull UUID uuid, @NonNull String username, Callback callback) {
- master.loadOrCreateUser(uuid, checkUsername(username), checkCallback(callback));
+ master.loadUser(uuid, checkUsername(username), checkCallback(callback));
}
@Override
public void loadUser(@NonNull UUID uuid, Callback callback) {
- master.loadUser(uuid, checkCallback(callback));
+ master.loadUser(uuid, "null", checkCallback(callback));
+ }
+
+ @Override
+ public void loadUser(@NonNull UUID uuid, @NonNull String username, Callback callback) {
+ master.loadUser(uuid, checkUsername(username), checkCallback(callback));
}
@Override
@@ -120,6 +127,16 @@ public class DatastoreLink implements Datastore {
master.saveUser(((UserLink) user).getMaster(), checkCallback(callback));
}
+ @Override
+ public void cleanupUsers(Callback callback) {
+ master.cleanupUsers(checkCallback(callback));
+ }
+
+ @Override
+ public void getUniqueUsers(Callback> callback) {
+ master.getUniqueUsers(checkCallback(callback));
+ }
+
@Override
public void createAndLoadGroup(@NonNull String name, Callback callback) {
master.createAndLoadGroup(checkName(name), checkCallback(callback));
@@ -204,12 +221,17 @@ public class DatastoreLink implements Datastore {
@Override
public boolean loadOrCreateUser(@NonNull UUID uuid, @NonNull String username) {
- return master.loadOrCreateUser(uuid, checkUsername(username));
+ return master.loadUser(uuid, checkUsername(username));
}
@Override
public boolean loadUser(@NonNull UUID uuid) {
- return master.loadUser(uuid);
+ return master.loadUser(uuid, "null");
+ }
+
+ @Override
+ public boolean loadUser(@NonNull UUID uuid, @NonNull String username) {
+ return master.loadUser(uuid, checkUsername(username));
}
@Override
@@ -218,6 +240,16 @@ public class DatastoreLink implements Datastore {
return master.saveUser(((UserLink) user).getMaster());
}
+ @Override
+ public boolean cleanupUsers() {
+ return master.cleanupUsers();
+ }
+
+ @Override
+ public Set getUniqueUsers() {
+ return master.getUniqueUsers();
+ }
+
@Override
public boolean createAndLoadGroup(@NonNull String name) {
return master.createAndLoadGroup(checkName(name));
@@ -307,14 +339,21 @@ public class DatastoreLink implements Datastore {
@Override
public java.util.concurrent.Future loadOrCreateUser(@NonNull UUID uuid, @NonNull String username) {
LPFuture lpf = new LPFuture<>();
- master.loadOrCreateUser(uuid, checkUsername(username), lpf);
+ master.loadUser(uuid, checkUsername(username), lpf);
return lpf;
}
@Override
public java.util.concurrent.Future loadUser(@NonNull UUID uuid) {
LPFuture lpf = new LPFuture<>();
- master.loadUser(uuid, lpf);
+ master.loadUser(uuid, "null", lpf);
+ return lpf;
+ }
+
+ @Override
+ public java.util.concurrent.Future loadUser(@NonNull UUID uuid, @NonNull String username) {
+ LPFuture lpf = new LPFuture<>();
+ master.loadUser(uuid, checkUsername(username), lpf);
return lpf;
}
@@ -326,6 +365,20 @@ public class DatastoreLink implements Datastore {
return lpf;
}
+ @Override
+ public java.util.concurrent.Future cleanupUsers() {
+ LPFuture lpf = new LPFuture<>();
+ master.cleanupUsers(lpf);
+ return lpf;
+ }
+
+ @Override
+ public java.util.concurrent.Future> getUniqueUsers() {
+ LPFuture> lpf = new LPFuture<>();
+ master.getUniqueUsers(lpf);
+ return lpf;
+ }
+
@Override
public java.util.concurrent.Future createAndLoadGroup(@NonNull String name) {
LPFuture lpf = new LPFuture<>();
diff --git a/common/src/main/java/me/lucko/luckperms/commands/migration/subcommands/MigrationBungeePerms.java b/common/src/main/java/me/lucko/luckperms/commands/migration/subcommands/MigrationBungeePerms.java
index 9cc38bf6..e996179a 100644
--- a/common/src/main/java/me/lucko/luckperms/commands/migration/subcommands/MigrationBungeePerms.java
+++ b/common/src/main/java/me/lucko/luckperms/commands/migration/subcommands/MigrationBungeePerms.java
@@ -188,7 +188,7 @@ public class MigrationBungeePerms extends SubCommand