Changes for & release of API 2.14
This commit is contained in:
@@ -36,7 +36,7 @@ import me.lucko.luckperms.common.core.UuidCache;
|
||||
import me.lucko.luckperms.common.data.Importer;
|
||||
import me.lucko.luckperms.common.groups.GroupManager;
|
||||
import me.lucko.luckperms.common.messaging.RedisMessaging;
|
||||
import me.lucko.luckperms.common.storage.Datastore;
|
||||
import me.lucko.luckperms.common.storage.Storage;
|
||||
import me.lucko.luckperms.common.tracks.TrackManager;
|
||||
import me.lucko.luckperms.common.users.UserManager;
|
||||
import me.lucko.luckperms.common.utils.BufferedRequest;
|
||||
@@ -47,6 +47,7 @@ import java.io.File;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
/**
|
||||
* Main internal interface for LuckPerms plugins, providing the base for abstraction throughout the project.
|
||||
@@ -80,10 +81,10 @@ public interface LuckPermsPlugin {
|
||||
LPConfiguration getConfiguration();
|
||||
|
||||
/**
|
||||
* Gets the primary datastore instance. This is likely to be wrapped with extra layers for caching, etc.
|
||||
* @return the datastore
|
||||
* Gets the primary data storage instance. This is likely to be wrapped with extra layers for caching, etc.
|
||||
* @return the storage handler instance
|
||||
*/
|
||||
Datastore getDatastore();
|
||||
Storage getStorage();
|
||||
|
||||
/**
|
||||
* Gets the redis messaging instance if present. Could return null if redis is not enabled.
|
||||
@@ -158,6 +159,9 @@ public interface LuckPermsPlugin {
|
||||
*/
|
||||
void doSync(Runnable r);
|
||||
|
||||
Executor getSyncExecutor();
|
||||
Executor getAsyncExecutor();
|
||||
|
||||
/**
|
||||
* Execute a runnable asynchronously on a loop
|
||||
* @param r the task to run
|
||||
|
||||
@@ -71,7 +71,7 @@ public class ApiProvider implements LuckPermsApi {
|
||||
|
||||
@Override
|
||||
public double getApiVersion() {
|
||||
return 2.13;
|
||||
return 2.14;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -99,9 +99,20 @@ public class ApiProvider implements LuckPermsApi {
|
||||
return new LPConfigurationLink(plugin.getConfiguration());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Storage getStorage() {
|
||||
return new StorageLink(plugin, plugin.getStorage());
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
@Override
|
||||
public Datastore getDatastore() {
|
||||
return new DatastoreLink(plugin, plugin.getDatastore());
|
||||
return new DatastoreLink(plugin, plugin.getStorage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<MessagingService> getMessagingService() {
|
||||
return Optional.ofNullable(plugin.getRedisMessaging());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -27,26 +27,29 @@ import lombok.NonNull;
|
||||
import me.lucko.luckperms.api.*;
|
||||
import me.lucko.luckperms.api.data.Callback;
|
||||
import me.lucko.luckperms.common.LuckPermsPlugin;
|
||||
import me.lucko.luckperms.common.utils.AbstractFuture;
|
||||
import me.lucko.luckperms.common.storage.Storage;
|
||||
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
import static me.lucko.luckperms.common.api.internal.Utils.*;
|
||||
|
||||
/**
|
||||
* Provides a link between {@link Datastore} and {@link me.lucko.luckperms.common.storage.Datastore}
|
||||
* Provides a link between {@link Datastore} and {@link Storage}
|
||||
*
|
||||
* Note that this class only provides for the old deprecated interface, see {@link StorageLink} for the new one.
|
||||
*/
|
||||
@SuppressWarnings({"unused", "WeakerAccess"})
|
||||
@SuppressWarnings({"unused", "WeakerAccess", "deprecation"})
|
||||
public class DatastoreLink implements Datastore {
|
||||
|
||||
private final LuckPermsPlugin plugin;
|
||||
private final me.lucko.luckperms.common.storage.Datastore master;
|
||||
private final Storage master;
|
||||
private final Async async;
|
||||
private final Sync sync;
|
||||
private final Future future;
|
||||
|
||||
public DatastoreLink(@NonNull LuckPermsPlugin plugin, @NonNull me.lucko.luckperms.common.storage.Datastore master) {
|
||||
public DatastoreLink(@NonNull LuckPermsPlugin plugin, @NonNull Storage master) {
|
||||
this.plugin = plugin;
|
||||
this.master = master;
|
||||
this.async = new Async(master);
|
||||
@@ -54,12 +57,10 @@ public class DatastoreLink implements Datastore {
|
||||
this.future = new Future(master);
|
||||
}
|
||||
|
||||
private static <T> Callback<T> checkCallback(Callback<T> c) {
|
||||
// If no callback was given, just send an empty one
|
||||
if (c == null) {
|
||||
c = Callback.empty();
|
||||
private <T> void registerCallback(CompletableFuture<T> fut, Callback<T> c) {
|
||||
if (c != null) {
|
||||
fut.thenAcceptAsync(Callback.convertToConsumer(c), plugin.getSyncExecutor());
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -89,68 +90,68 @@ public class DatastoreLink implements Datastore {
|
||||
|
||||
@AllArgsConstructor
|
||||
public class Async implements Datastore.Async {
|
||||
private final me.lucko.luckperms.common.storage.Datastore master;
|
||||
private final me.lucko.luckperms.common.storage.Storage master;
|
||||
|
||||
@Override
|
||||
public void logAction(@NonNull LogEntry entry, Callback<Boolean> callback) {
|
||||
master.force().logAction(entry, checkCallback(callback));
|
||||
registerCallback(master.force().logAction(entry), callback);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getLog(Callback<Log> callback) {
|
||||
master.force().getLog(log -> callback.onComplete(new LogLink(log)));
|
||||
public void getLog(@NonNull Callback<Log> callback) {
|
||||
master.force().getLog().thenAcceptAsync(log -> callback.onComplete(new LogLink(log)), plugin.getSyncExecutor());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loadOrCreateUser(@NonNull UUID uuid, @NonNull String username, Callback<Boolean> callback) {
|
||||
master.force().loadUser(uuid, checkUsername(username), checkCallback(callback));
|
||||
registerCallback(master.force().loadUser(uuid, checkUsername(username)) , callback);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loadUser(@NonNull UUID uuid, Callback<Boolean> callback) {
|
||||
master.force().loadUser(uuid, "null", checkCallback(callback));
|
||||
registerCallback(master.force().loadUser(uuid, "null"), callback);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loadUser(@NonNull UUID uuid, @NonNull String username, Callback<Boolean> callback) {
|
||||
master.force().loadUser(uuid, checkUsername(username), checkCallback(callback));
|
||||
registerCallback(master.force().loadUser(uuid, checkUsername(username)), callback);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void saveUser(@NonNull User user, Callback<Boolean> callback) {
|
||||
checkUser(user);
|
||||
master.force().saveUser(((UserLink) user).getMaster(), checkCallback(callback));
|
||||
registerCallback(master.force().saveUser(((UserLink) user).getMaster()), callback);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void cleanupUsers(Callback<Boolean> callback) {
|
||||
master.force().cleanupUsers(checkCallback(callback));
|
||||
registerCallback(master.force().cleanupUsers(), callback);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getUniqueUsers(Callback<Set<UUID>> callback) {
|
||||
master.force().getUniqueUsers(checkCallback(callback));
|
||||
registerCallback(master.force().getUniqueUsers(), callback);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void createAndLoadGroup(@NonNull String name, Callback<Boolean> callback) {
|
||||
master.force().createAndLoadGroup(checkName(name), checkCallback(callback));
|
||||
registerCallback(master.force().createAndLoadGroup(checkName(name)), callback);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loadGroup(@NonNull String name, Callback<Boolean> callback) {
|
||||
master.force().loadGroup(checkName(name), checkCallback(callback));
|
||||
registerCallback(master.force().loadGroup(checkName(name)), callback);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loadAllGroups(Callback<Boolean> callback) {
|
||||
master.force().loadAllGroups(checkCallback(callback));
|
||||
registerCallback(master.force().loadAllGroups(), callback);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void saveGroup(@NonNull Group group, Callback<Boolean> callback) {
|
||||
checkGroup(group);
|
||||
master.force().saveGroup(((GroupLink) group).getMaster(), checkCallback(callback));
|
||||
registerCallback(master.force().saveGroup(((GroupLink) group).getMaster()), callback);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -159,59 +160,59 @@ public class DatastoreLink implements Datastore {
|
||||
if (group.getName().equalsIgnoreCase(plugin.getConfiguration().getDefaultGroupName())) {
|
||||
throw new IllegalArgumentException("Cannot delete the default group.");
|
||||
}
|
||||
master.force().deleteGroup(((GroupLink) group).getMaster(), checkCallback(callback));
|
||||
registerCallback(master.force().deleteGroup(((GroupLink) group).getMaster()), callback);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void createAndLoadTrack(@NonNull String name, Callback<Boolean> callback) {
|
||||
master.force().createAndLoadTrack(checkName(name), checkCallback(callback));
|
||||
registerCallback(master.force().createAndLoadTrack(checkName(name)), callback);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loadTrack(@NonNull String name, Callback<Boolean> callback) {
|
||||
master.force().loadTrack(checkName(name), checkCallback(callback));
|
||||
registerCallback(master.force().loadTrack(checkName(name)), callback);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loadAllTracks(Callback<Boolean> callback) {
|
||||
master.force().loadAllTracks(checkCallback(callback));
|
||||
registerCallback(master.force().loadAllTracks(), callback);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void saveTrack(@NonNull Track track, Callback<Boolean> callback) {
|
||||
checkTrack(track);
|
||||
master.force().saveTrack(((TrackLink) track).getMaster(), checkCallback(callback));
|
||||
registerCallback(master.force().saveTrack(((TrackLink) track).getMaster()), callback);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deleteTrack(@NonNull Track track, Callback<Boolean> callback) {
|
||||
checkTrack(track);
|
||||
master.force().deleteTrack(((TrackLink) track).getMaster(), checkCallback(callback));
|
||||
registerCallback(master.force().deleteTrack(((TrackLink) track).getMaster()), callback);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void saveUUIDData(@NonNull String username, @NonNull UUID uuid, Callback<Boolean> callback) {
|
||||
master.force().saveUUIDData(checkUsername(username), uuid, checkCallback(callback));
|
||||
registerCallback(master.force().saveUUIDData(checkUsername(username), uuid), callback);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getUUID(@NonNull String username, Callback<UUID> callback) {
|
||||
master.force().getUUID(checkUsername(username), checkCallback(callback));
|
||||
registerCallback(master.force().getUUID(checkUsername(username)), callback);
|
||||
}
|
||||
}
|
||||
|
||||
@AllArgsConstructor
|
||||
public class Sync implements Datastore.Sync {
|
||||
private final me.lucko.luckperms.common.storage.Datastore master;
|
||||
private final Storage master;
|
||||
|
||||
@Override
|
||||
public boolean logAction(@NonNull LogEntry entry) {
|
||||
return master.force().logAction(entry).getUnchecked();
|
||||
return master.force().logAction(entry).join();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Log getLog() {
|
||||
me.lucko.luckperms.common.data.Log log = master.force().getLog().getUnchecked();
|
||||
me.lucko.luckperms.common.data.Log log = master.force().getLog().join();
|
||||
if (log == null) {
|
||||
return null;
|
||||
}
|
||||
@@ -220,54 +221,54 @@ public class DatastoreLink implements Datastore {
|
||||
|
||||
@Override
|
||||
public boolean loadOrCreateUser(@NonNull UUID uuid, @NonNull String username) {
|
||||
return master.force().loadUser(uuid, checkUsername(username)).getUnchecked();
|
||||
return master.force().loadUser(uuid, checkUsername(username)).join();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean loadUser(@NonNull UUID uuid) {
|
||||
return master.force().loadUser(uuid, "null").getUnchecked();
|
||||
return master.force().loadUser(uuid, "null").join();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean loadUser(@NonNull UUID uuid, @NonNull String username) {
|
||||
return master.force().loadUser(uuid, checkUsername(username)).getUnchecked();
|
||||
return master.force().loadUser(uuid, checkUsername(username)).join();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean saveUser(@NonNull User user) {
|
||||
checkUser(user);
|
||||
return master.force().saveUser(((UserLink) user).getMaster()).getUnchecked();
|
||||
return master.force().saveUser(((UserLink) user).getMaster()).join();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean cleanupUsers() {
|
||||
return master.force().cleanupUsers().getUnchecked();
|
||||
return master.force().cleanupUsers().join();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<UUID> getUniqueUsers() {
|
||||
return master.force().getUniqueUsers().getUnchecked();
|
||||
return master.force().getUniqueUsers().join();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean createAndLoadGroup(@NonNull String name) {
|
||||
return master.force().createAndLoadGroup(checkName(name)).getUnchecked();
|
||||
return master.force().createAndLoadGroup(checkName(name)).join();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean loadGroup(@NonNull String name) {
|
||||
return master.force().loadGroup(checkName(name)).getUnchecked();
|
||||
return master.force().loadGroup(checkName(name)).join();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean loadAllGroups() {
|
||||
return master.force().loadAllGroups().getUnchecked();
|
||||
return master.force().loadAllGroups().join();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean saveGroup(@NonNull Group group) {
|
||||
checkGroup(group);
|
||||
return master.force().saveGroup(((GroupLink) group).getMaster()).getUnchecked();
|
||||
return master.force().saveGroup(((GroupLink) group).getMaster()).join();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -276,50 +277,50 @@ public class DatastoreLink implements Datastore {
|
||||
if (group.getName().equalsIgnoreCase(plugin.getConfiguration().getDefaultGroupName())) {
|
||||
throw new IllegalArgumentException("Cannot delete the default group.");
|
||||
}
|
||||
return master.force().deleteGroup(((GroupLink) group).getMaster()).getUnchecked();
|
||||
return master.force().deleteGroup(((GroupLink) group).getMaster()).join();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean createAndLoadTrack(@NonNull String name) {
|
||||
return master.force().createAndLoadTrack(checkName(name)).getUnchecked();
|
||||
return master.force().createAndLoadTrack(checkName(name)).join();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean loadTrack(@NonNull String name) {
|
||||
return master.force().loadTrack(checkName(name)).getUnchecked();
|
||||
return master.force().loadTrack(checkName(name)).join();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean loadAllTracks() {
|
||||
return master.force().loadAllTracks().getUnchecked();
|
||||
return master.force().loadAllTracks().join();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean saveTrack(@NonNull Track track) {
|
||||
checkTrack(track);
|
||||
return master.force().saveTrack(((TrackLink) track).getMaster()).getUnchecked();
|
||||
return master.force().saveTrack(((TrackLink) track).getMaster()).join();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean deleteTrack(@NonNull Track track) {
|
||||
checkTrack(track);
|
||||
return master.force().deleteTrack(((TrackLink) track).getMaster()).getUnchecked();
|
||||
return master.force().deleteTrack(((TrackLink) track).getMaster()).join();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean saveUUIDData(@NonNull String username, @NonNull UUID uuid) {
|
||||
return master.force().saveUUIDData(checkUsername(username), uuid).getUnchecked();
|
||||
return master.force().saveUUIDData(checkUsername(username), uuid).join();
|
||||
}
|
||||
|
||||
@Override
|
||||
public UUID getUUID(@NonNull String username) {
|
||||
return master.force().getUUID(checkUsername(username)).getUnchecked();
|
||||
return master.force().getUUID(checkUsername(username)).join();
|
||||
}
|
||||
}
|
||||
|
||||
@AllArgsConstructor
|
||||
public class Future implements Datastore.Future {
|
||||
private final me.lucko.luckperms.common.storage.Datastore master;
|
||||
private final Storage master;
|
||||
|
||||
@Override
|
||||
public java.util.concurrent.Future<Boolean> logAction(@NonNull LogEntry entry) {
|
||||
@@ -328,9 +329,7 @@ public class DatastoreLink implements Datastore {
|
||||
|
||||
@Override
|
||||
public java.util.concurrent.Future<Log> getLog() {
|
||||
AbstractFuture<Log> fut = new AbstractFuture<>();
|
||||
master.force().getLog(log -> fut.complete(new LogLink(log)));
|
||||
return fut;
|
||||
return master.force().getLog().thenApply(log -> log == null ? null : new LogLink(log));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+1
-1
@@ -103,7 +103,7 @@ public class LPConfigurationLink implements LPConfiguration {
|
||||
|
||||
@Override
|
||||
public boolean getDebugPermissionChecks() {
|
||||
return false; // Constant TODO depreciate this
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -0,0 +1,162 @@
|
||||
/*
|
||||
* Copyright (c) 2016 Lucko (Luck) <luck@lucko.me>
|
||||
*
|
||||
* 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.api.internal;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.NonNull;
|
||||
import me.lucko.luckperms.api.*;
|
||||
import me.lucko.luckperms.common.LuckPermsPlugin;
|
||||
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
import static me.lucko.luckperms.common.api.internal.Utils.*;
|
||||
|
||||
/**
|
||||
* Provides a link between {@link Storage} and {@link me.lucko.luckperms.common.storage.Storage}
|
||||
*/
|
||||
@AllArgsConstructor
|
||||
public class StorageLink implements Storage {
|
||||
private final LuckPermsPlugin plugin;
|
||||
private final me.lucko.luckperms.common.storage.Storage master;
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return master.getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAcceptingLogins() {
|
||||
return master.isAcceptingLogins();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Executor getSyncExecutor() {
|
||||
return plugin.getSyncExecutor();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Executor getAsyncExecutor() {
|
||||
return plugin.getAsyncExecutor();
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Boolean> logAction(@NonNull LogEntry entry) {
|
||||
return master.force().logAction(entry);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Log> getLog() {
|
||||
return master.force().getLog().thenApply(log -> log == null ? null : new LogLink(log));
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Boolean> loadUser(UUID uuid, String username) {
|
||||
return master.force().loadUser(uuid, checkUsername(username));
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Boolean> saveUser(User user) {
|
||||
checkUser(user);
|
||||
return master.force().saveUser(((UserLink) user).getMaster());
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Boolean> cleanupUsers() {
|
||||
return master.force().cleanupUsers();
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Set<UUID>> getUniqueUsers() {
|
||||
return master.force().getUniqueUsers();
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Boolean> createAndLoadGroup(String name) {
|
||||
return master.force().createAndLoadGroup(checkName(name));
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Boolean> loadGroup(String name) {
|
||||
return master.force().loadGroup(checkName(name));
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Boolean> loadAllGroups() {
|
||||
return master.force().loadAllGroups();
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Boolean> saveGroup(Group group) {
|
||||
checkGroup(group);
|
||||
return master.force().saveGroup(((GroupLink) group).getMaster());
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Boolean> deleteGroup(Group group) {
|
||||
checkGroup(group);
|
||||
if (group.getName().equalsIgnoreCase(plugin.getConfiguration().getDefaultGroupName())) {
|
||||
throw new IllegalArgumentException("Cannot delete the default group.");
|
||||
}
|
||||
return master.force().deleteGroup(((GroupLink) group).getMaster());
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Boolean> createAndLoadTrack(String name) {
|
||||
return master.force().createAndLoadTrack(checkName(name));
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Boolean> loadTrack(String name) {
|
||||
return master.force().loadTrack(checkName(name));
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Boolean> loadAllTracks() {
|
||||
return master.force().loadAllTracks();
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Boolean> saveTrack(Track track) {
|
||||
checkTrack(track);
|
||||
return master.force().saveTrack(((TrackLink) track).getMaster());
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Boolean> deleteTrack(Track track) {
|
||||
checkTrack(track);
|
||||
return master.force().deleteTrack(((TrackLink) track).getMaster());
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Boolean> saveUUIDData(String username, UUID uuid) {
|
||||
return master.force().saveUUIDData(checkUsername(username), uuid);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<UUID> getUUID(String username) {
|
||||
return master.force().getUUID(checkUsername(username));
|
||||
}
|
||||
}
|
||||
@@ -114,7 +114,7 @@ public abstract class SubCommand<T> extends Command<T, Void> {
|
||||
}
|
||||
|
||||
public static void save(User user, Sender sender, LuckPermsPlugin plugin) {
|
||||
boolean success = plugin.getDatastore().force().saveUser(user).getUnchecked();
|
||||
boolean success = plugin.getStorage().force().saveUser(user).join();
|
||||
user.getRefreshBuffer().requestDirectly();
|
||||
|
||||
if (success) {
|
||||
@@ -125,7 +125,7 @@ public abstract class SubCommand<T> extends Command<T, Void> {
|
||||
}
|
||||
|
||||
public static void save(Group group, Sender sender, LuckPermsPlugin plugin) {
|
||||
boolean success = plugin.getDatastore().force().saveGroup(group).getUnchecked();
|
||||
boolean success = plugin.getStorage().force().saveGroup(group).join();
|
||||
plugin.getUpdateTaskBuffer().requestDirectly();
|
||||
|
||||
if (success) {
|
||||
@@ -136,7 +136,7 @@ public abstract class SubCommand<T> extends Command<T, Void> {
|
||||
}
|
||||
|
||||
public static void save(Track track, Sender sender, LuckPermsPlugin plugin) {
|
||||
boolean success = plugin.getDatastore().force().saveTrack(track).getUnchecked();
|
||||
boolean success = plugin.getStorage().force().saveTrack(track).join();
|
||||
plugin.getUpdateTaskBuffer().requestDirectly();
|
||||
|
||||
if (success) {
|
||||
|
||||
+1
-1
@@ -46,7 +46,7 @@ public class HolderShowTracks<T extends PermissionHolder> extends SubCommand<T>
|
||||
|
||||
@Override
|
||||
public CommandResult execute(LuckPermsPlugin plugin, Sender sender, T holder, List<String> args, String label) throws CommandException {
|
||||
if (!plugin.getDatastore().loadAllTracks().getUnchecked()) {
|
||||
if (!plugin.getStorage().loadAllTracks().join()) {
|
||||
Message.TRACKS_LOAD_ERROR.send(sender);
|
||||
return CommandResult.LOADING_ERROR;
|
||||
}
|
||||
|
||||
+1
-1
@@ -61,7 +61,7 @@ public class ParentAdd extends SharedSubCommand {
|
||||
String server = ArgumentUtils.handleServer(1, args);
|
||||
String world = ArgumentUtils.handleWorld(2, args);
|
||||
|
||||
if (!plugin.getDatastore().loadGroup(groupName).getUnchecked()) {
|
||||
if (!plugin.getStorage().loadGroup(groupName).join()) {
|
||||
Message.GROUP_DOES_NOT_EXIST.send(sender);
|
||||
return CommandResult.INVALID_ARGS;
|
||||
}
|
||||
|
||||
+1
-1
@@ -64,7 +64,7 @@ public class ParentAddTemp extends SharedSubCommand {
|
||||
String server = ArgumentUtils.handleServer(2, args);
|
||||
String world = ArgumentUtils.handleWorld(3, args);
|
||||
|
||||
if (!plugin.getDatastore().loadGroup(groupName).getUnchecked()) {
|
||||
if (!plugin.getStorage().loadGroup(groupName).join()) {
|
||||
Message.GROUP_DOES_NOT_EXIST.send(sender);
|
||||
return CommandResult.INVALID_ARGS;
|
||||
}
|
||||
|
||||
+1
-1
@@ -62,7 +62,7 @@ public class ParentSet extends SharedSubCommand {
|
||||
String server = ArgumentUtils.handleServer(1, args);
|
||||
String world = ArgumentUtils.handleWorld(2, args);
|
||||
|
||||
if (!plugin.getDatastore().loadGroup(groupName).getUnchecked()) {
|
||||
if (!plugin.getStorage().loadGroup(groupName).join()) {
|
||||
Message.GROUP_DOES_NOT_EXIST.send(sender);
|
||||
return CommandResult.INVALID_ARGS;
|
||||
}
|
||||
|
||||
@@ -57,12 +57,12 @@ public class CreateGroup extends SingleCommand {
|
||||
return CommandResult.INVALID_ARGS;
|
||||
}
|
||||
|
||||
if (plugin.getDatastore().loadGroup(groupName).getUnchecked()) {
|
||||
if (plugin.getStorage().loadGroup(groupName).join()) {
|
||||
Message.GROUP_ALREADY_EXISTS.send(sender);
|
||||
return CommandResult.INVALID_ARGS;
|
||||
}
|
||||
|
||||
if (!plugin.getDatastore().createAndLoadGroup(groupName).getUnchecked()) {
|
||||
if (!plugin.getStorage().createAndLoadGroup(groupName).join()) {
|
||||
Message.CREATE_GROUP_ERROR.send(sender);
|
||||
return CommandResult.FAILURE;
|
||||
}
|
||||
|
||||
@@ -61,7 +61,7 @@ public class DeleteGroup extends SingleCommand {
|
||||
return CommandResult.INVALID_ARGS;
|
||||
}
|
||||
|
||||
if (!plugin.getDatastore().loadGroup(groupName).getUnchecked()) {
|
||||
if (!plugin.getStorage().loadGroup(groupName).join()) {
|
||||
Message.GROUP_DOES_NOT_EXIST.send(sender);
|
||||
return CommandResult.INVALID_ARGS;
|
||||
}
|
||||
@@ -72,7 +72,7 @@ public class DeleteGroup extends SingleCommand {
|
||||
return CommandResult.LOADING_ERROR;
|
||||
}
|
||||
|
||||
if (!plugin.getDatastore().deleteGroup(group).getUnchecked()) {
|
||||
if (!plugin.getStorage().deleteGroup(group).join()) {
|
||||
Message.DELETE_GROUP_ERROR.send(sender);
|
||||
return CommandResult.FAILURE;
|
||||
}
|
||||
|
||||
@@ -52,12 +52,12 @@ public class GroupClone extends SubCommand<Group> {
|
||||
return CommandResult.INVALID_ARGS;
|
||||
}
|
||||
|
||||
if (plugin.getDatastore().loadGroup(newGroupName).getUnchecked()) {
|
||||
if (plugin.getStorage().loadGroup(newGroupName).join()) {
|
||||
Message.GROUP_ALREADY_EXISTS.send(sender);
|
||||
return CommandResult.INVALID_ARGS;
|
||||
}
|
||||
|
||||
if (!plugin.getDatastore().createAndLoadGroup(newGroupName).getUnchecked()) {
|
||||
if (!plugin.getStorage().createAndLoadGroup(newGroupName).join()) {
|
||||
Message.CREATE_GROUP_ERROR.send(sender);
|
||||
return CommandResult.FAILURE;
|
||||
}
|
||||
|
||||
@@ -55,7 +55,7 @@ public class GroupMainCommand extends MainCommand<Group> {
|
||||
|
||||
@Override
|
||||
protected Group getTarget(String target, LuckPermsPlugin plugin, Sender sender) {
|
||||
if (!plugin.getDatastore().loadGroup(target).getUnchecked()) {
|
||||
if (!plugin.getStorage().loadGroup(target).join()) {
|
||||
Message.GROUP_NOT_FOUND.send(sender);
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -52,12 +52,12 @@ public class GroupRename extends SubCommand<Group> {
|
||||
return CommandResult.INVALID_ARGS;
|
||||
}
|
||||
|
||||
if (plugin.getDatastore().loadGroup(newGroupName).getUnchecked()) {
|
||||
if (plugin.getStorage().loadGroup(newGroupName).join()) {
|
||||
Message.GROUP_ALREADY_EXISTS.send(sender);
|
||||
return CommandResult.INVALID_ARGS;
|
||||
}
|
||||
|
||||
if (!plugin.getDatastore().createAndLoadGroup(newGroupName).getUnchecked()) {
|
||||
if (!plugin.getStorage().createAndLoadGroup(newGroupName).join()) {
|
||||
Message.CREATE_GROUP_ERROR.send(sender);
|
||||
return CommandResult.FAILURE;
|
||||
}
|
||||
@@ -68,7 +68,7 @@ public class GroupRename extends SubCommand<Group> {
|
||||
return CommandResult.LOADING_ERROR;
|
||||
}
|
||||
|
||||
if (!plugin.getDatastore().deleteGroup(group).getUnchecked()) {
|
||||
if (!plugin.getStorage().deleteGroup(group).join()) {
|
||||
Message.DELETE_GROUP_ERROR.send(sender);
|
||||
return CommandResult.FAILURE;
|
||||
}
|
||||
|
||||
@@ -43,7 +43,7 @@ public class ListGroups extends SingleCommand {
|
||||
|
||||
@Override
|
||||
public CommandResult execute(LuckPermsPlugin plugin, Sender sender, List<String> args, String label) {
|
||||
if (!plugin.getDatastore().loadAllGroups().getUnchecked()) {
|
||||
if (!plugin.getStorage().loadAllGroups().join()) {
|
||||
Message.GROUPS_LOAD_ERROR.send(sender);
|
||||
return CommandResult.LOADING_ERROR;
|
||||
}
|
||||
|
||||
@@ -52,7 +52,7 @@ public class LogMainCommand extends MainCommand<Log> {
|
||||
|
||||
@Override
|
||||
protected Log getTarget(String target, LuckPermsPlugin plugin, Sender sender) {
|
||||
Log log = plugin.getDatastore().getLog().getUnchecked();
|
||||
Log log = plugin.getStorage().getLog().join();
|
||||
|
||||
if (log == null) {
|
||||
Message.LOG_LOAD_ERROR.send(sender);
|
||||
|
||||
+1
-1
@@ -80,7 +80,7 @@ public class LogRecent extends SubCommand<Log> {
|
||||
return CommandResult.INVALID_ARGS;
|
||||
}
|
||||
|
||||
UUID uuid = plugin.getDatastore().getUUID(s).getUnchecked();
|
||||
UUID uuid = plugin.getStorage().getUUID(s).join();
|
||||
|
||||
if (uuid == null) {
|
||||
Message.USER_NOT_FOUND.send(sender);
|
||||
|
||||
+1
-1
@@ -82,7 +82,7 @@ public class LogUserHistory extends SubCommand<Log> {
|
||||
return CommandResult.INVALID_ARGS;
|
||||
}
|
||||
|
||||
UUID uuid1 = plugin.getDatastore().getUUID(user).getUnchecked();
|
||||
UUID uuid1 = plugin.getStorage().getUUID(user).join();
|
||||
|
||||
if (uuid1 == null) {
|
||||
Message.USER_NOT_FOUND.send(sender);
|
||||
|
||||
@@ -33,7 +33,7 @@ import me.lucko.luckperms.common.constants.Constants;
|
||||
import me.lucko.luckperms.common.constants.Message;
|
||||
import me.lucko.luckperms.common.constants.Permission;
|
||||
import me.lucko.luckperms.common.groups.Group;
|
||||
import me.lucko.luckperms.common.storage.Datastore;
|
||||
import me.lucko.luckperms.common.storage.Storage;
|
||||
import me.lucko.luckperms.common.tracks.Track;
|
||||
import me.lucko.luckperms.common.users.User;
|
||||
import me.lucko.luckperms.common.utils.Predicates;
|
||||
@@ -123,14 +123,14 @@ public class ExportCommand extends SingleCommand {
|
||||
|
||||
// Export users
|
||||
log.info("Export: Exporting all users. Finding a list of unique users to export.");
|
||||
Datastore ds = plugin.getDatastore();
|
||||
Set<UUID> users = ds.getUniqueUsers().getUnchecked();
|
||||
Storage ds = plugin.getStorage();
|
||||
Set<UUID> users = ds.getUniqueUsers().join();
|
||||
log.info("Export: Found " + users.size() + " unique users to export.");
|
||||
|
||||
int userCount = 0;
|
||||
for (UUID uuid : users) {
|
||||
userCount++;
|
||||
plugin.getDatastore().loadUser(uuid, "null").getUnchecked();
|
||||
plugin.getStorage().loadUser(uuid, "null").join();
|
||||
User user = plugin.getUserManager().get(uuid);
|
||||
|
||||
boolean inDefault = false;
|
||||
|
||||
@@ -46,7 +46,7 @@ public class InfoCommand extends SingleCommand {
|
||||
Message.INFO.send(sender,
|
||||
plugin.getVersion(),
|
||||
plugin.getType().getFriendlyName(),
|
||||
plugin.getDatastore().getName(),
|
||||
plugin.getStorage().getName(),
|
||||
c.getServer(),
|
||||
c.getSyncTime(),
|
||||
formatBoolean(c.isIncludingGlobalPerms()),
|
||||
|
||||
+1
-1
@@ -41,7 +41,7 @@ public class NetworkSyncCommand extends SingleCommand {
|
||||
@Override
|
||||
public CommandResult execute(LuckPermsPlugin plugin, Sender sender, List<String> args, String label) {
|
||||
Message.UPDATE_TASK_REQUEST.send(sender);
|
||||
plugin.getUpdateTaskBuffer().request().getUnchecked();
|
||||
plugin.getUpdateTaskBuffer().request().join();
|
||||
Message.UPDATE_TASK_COMPLETE_NETWORK.send(sender);
|
||||
|
||||
if (plugin.getRedisMessaging() != null) {
|
||||
|
||||
@@ -40,7 +40,7 @@ public class SyncCommand extends SingleCommand {
|
||||
@Override
|
||||
public CommandResult execute(LuckPermsPlugin plugin, Sender sender, List<String> args, String label) {
|
||||
Message.UPDATE_TASK_REQUEST.send(sender);
|
||||
plugin.getUpdateTaskBuffer().request().getUnchecked();
|
||||
plugin.getUpdateTaskBuffer().request().join();
|
||||
Message.UPDATE_TASK_COMPLETE.send(sender);
|
||||
return CommandResult.SUCCESS;
|
||||
}
|
||||
|
||||
@@ -57,12 +57,12 @@ public class CreateTrack extends SingleCommand {
|
||||
return CommandResult.INVALID_ARGS;
|
||||
}
|
||||
|
||||
if (plugin.getDatastore().loadTrack(trackName).getUnchecked()) {
|
||||
if (plugin.getStorage().loadTrack(trackName).join()) {
|
||||
Message.TRACK_ALREADY_EXISTS.send(sender);
|
||||
return CommandResult.INVALID_ARGS;
|
||||
}
|
||||
|
||||
if (!plugin.getDatastore().createAndLoadTrack(trackName).getUnchecked()) {
|
||||
if (!plugin.getStorage().createAndLoadTrack(trackName).join()) {
|
||||
Message.CREATE_TRACK_ERROR.send(sender);
|
||||
return CommandResult.FAILURE;
|
||||
}
|
||||
|
||||
@@ -55,7 +55,7 @@ public class DeleteTrack extends SingleCommand {
|
||||
}
|
||||
|
||||
String trackName = args.get(0).toLowerCase();
|
||||
if (!plugin.getDatastore().loadTrack(trackName).getUnchecked()) {
|
||||
if (!plugin.getStorage().loadTrack(trackName).join()) {
|
||||
Message.TRACK_DOES_NOT_EXIST.send(sender);
|
||||
return CommandResult.INVALID_ARGS;
|
||||
}
|
||||
@@ -66,7 +66,7 @@ public class DeleteTrack extends SingleCommand {
|
||||
return CommandResult.LOADING_ERROR;
|
||||
}
|
||||
|
||||
if (!plugin.getDatastore().deleteTrack(track).getUnchecked()) {
|
||||
if (!plugin.getStorage().deleteTrack(track).join()) {
|
||||
Message.DELETE_TRACK_ERROR.send(sender);
|
||||
return CommandResult.FAILURE;
|
||||
}
|
||||
|
||||
@@ -41,7 +41,7 @@ public class ListTracks extends SingleCommand {
|
||||
|
||||
@Override
|
||||
public CommandResult execute(LuckPermsPlugin plugin, Sender sender, List<String> args, String label) {
|
||||
if (!plugin.getDatastore().loadAllTracks().getUnchecked()) {
|
||||
if (!plugin.getStorage().loadAllTracks().join()) {
|
||||
Message.TRACKS_LOAD_ERROR.send(sender);
|
||||
return CommandResult.LOADING_ERROR;
|
||||
}
|
||||
|
||||
@@ -56,7 +56,7 @@ public class TrackAppend extends SubCommand<Track> {
|
||||
return CommandResult.INVALID_ARGS;
|
||||
}
|
||||
|
||||
if (!plugin.getDatastore().loadGroup(groupName).getUnchecked()) {
|
||||
if (!plugin.getStorage().loadGroup(groupName).join()) {
|
||||
Message.GROUP_DOES_NOT_EXIST.send(sender);
|
||||
return CommandResult.INVALID_ARGS;
|
||||
}
|
||||
|
||||
@@ -52,12 +52,12 @@ public class TrackClone extends SubCommand<Track> {
|
||||
return CommandResult.INVALID_ARGS;
|
||||
}
|
||||
|
||||
if (plugin.getDatastore().loadTrack(newTrackName).getUnchecked()) {
|
||||
if (plugin.getStorage().loadTrack(newTrackName).join()) {
|
||||
Message.TRACK_ALREADY_EXISTS.send(sender);
|
||||
return CommandResult.INVALID_ARGS;
|
||||
}
|
||||
|
||||
if (!plugin.getDatastore().createAndLoadTrack(newTrackName).getUnchecked()) {
|
||||
if (!plugin.getStorage().createAndLoadTrack(newTrackName).join()) {
|
||||
Message.CREATE_TRACK_ERROR.send(sender);
|
||||
return CommandResult.FAILURE;
|
||||
}
|
||||
|
||||
@@ -67,7 +67,7 @@ public class TrackInsert extends SubCommand<Track> {
|
||||
return CommandResult.INVALID_ARGS;
|
||||
}
|
||||
|
||||
if (!plugin.getDatastore().loadGroup(groupName).getUnchecked()) {
|
||||
if (!plugin.getStorage().loadGroup(groupName).join()) {
|
||||
Message.GROUP_DOES_NOT_EXIST.send(sender);
|
||||
return CommandResult.INVALID_ARGS;
|
||||
}
|
||||
|
||||
@@ -49,7 +49,7 @@ public class TrackMainCommand extends MainCommand<Track> {
|
||||
|
||||
@Override
|
||||
protected Track getTarget(String target, LuckPermsPlugin plugin, Sender sender) {
|
||||
if (!plugin.getDatastore().loadTrack(target).getUnchecked()) {
|
||||
if (!plugin.getStorage().loadTrack(target).join()) {
|
||||
Message.TRACK_NOT_FOUND.send(sender);
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -52,12 +52,12 @@ public class TrackRename extends SubCommand<Track> {
|
||||
return CommandResult.INVALID_ARGS;
|
||||
}
|
||||
|
||||
if (plugin.getDatastore().loadTrack(newTrackName).getUnchecked()) {
|
||||
if (plugin.getStorage().loadTrack(newTrackName).join()) {
|
||||
Message.TRACK_ALREADY_EXISTS.send(sender);
|
||||
return CommandResult.INVALID_ARGS;
|
||||
}
|
||||
|
||||
if (!plugin.getDatastore().createAndLoadTrack(newTrackName).getUnchecked()) {
|
||||
if (!plugin.getStorage().createAndLoadTrack(newTrackName).join()) {
|
||||
Message.CREATE_TRACK_ERROR.send(sender);
|
||||
return CommandResult.FAILURE;
|
||||
}
|
||||
@@ -68,7 +68,7 @@ public class TrackRename extends SubCommand<Track> {
|
||||
return CommandResult.LOADING_ERROR;
|
||||
}
|
||||
|
||||
if (!plugin.getDatastore().deleteTrack(track).getUnchecked()) {
|
||||
if (!plugin.getStorage().deleteTrack(track).join()) {
|
||||
Message.DELETE_TRACK_ERROR.send(sender);
|
||||
return CommandResult.FAILURE;
|
||||
}
|
||||
|
||||
@@ -72,7 +72,7 @@ public class UserDemote extends SubCommand<User> {
|
||||
return CommandResult.INVALID_ARGS;
|
||||
}
|
||||
|
||||
if (!plugin.getDatastore().loadTrack(trackName).getUnchecked()) {
|
||||
if (!plugin.getStorage().loadTrack(trackName).join()) {
|
||||
Message.TRACK_DOES_NOT_EXIST.send(sender);
|
||||
return CommandResult.INVALID_ARGS;
|
||||
}
|
||||
@@ -147,7 +147,7 @@ public class UserDemote extends SubCommand<User> {
|
||||
return CommandResult.STATE_ERROR;
|
||||
}
|
||||
|
||||
if (!plugin.getDatastore().loadGroup(previous).getUnchecked()) {
|
||||
if (!plugin.getStorage().loadGroup(previous).join()) {
|
||||
Message.USER_DEMOTE_ERROR_MALFORMED.send(sender, previous);
|
||||
return CommandResult.STATE_ERROR;
|
||||
}
|
||||
|
||||
@@ -67,7 +67,7 @@ public class UserMainCommand extends MainCommand<User> {
|
||||
return null;
|
||||
}
|
||||
|
||||
u = plugin.getDatastore().getUUID(target).getUnchecked();
|
||||
u = plugin.getStorage().getUUID(target).join();
|
||||
if (u == null) {
|
||||
Message.USER_NOT_FOUND.send(sender);
|
||||
return null;
|
||||
@@ -77,10 +77,10 @@ public class UserMainCommand extends MainCommand<User> {
|
||||
}
|
||||
}
|
||||
|
||||
String name = plugin.getDatastore().getName(u).getUnchecked();
|
||||
String name = plugin.getStorage().getName(u).join();
|
||||
if (name == null) name = "null";
|
||||
|
||||
if (!plugin.getDatastore().loadUser(u, name).getUnchecked()) {
|
||||
if (!plugin.getStorage().loadUser(u, name).join()) {
|
||||
Message.LOADING_ERROR.send(sender);
|
||||
}
|
||||
|
||||
|
||||
@@ -72,7 +72,7 @@ public class UserPromote extends SubCommand<User> {
|
||||
return CommandResult.INVALID_ARGS;
|
||||
}
|
||||
|
||||
if (!plugin.getDatastore().loadTrack(trackName).getUnchecked()) {
|
||||
if (!plugin.getStorage().loadTrack(trackName).join()) {
|
||||
Message.TRACK_DOES_NOT_EXIST.send(sender);
|
||||
return CommandResult.INVALID_ARGS;
|
||||
}
|
||||
@@ -147,7 +147,7 @@ public class UserPromote extends SubCommand<User> {
|
||||
return CommandResult.STATE_ERROR;
|
||||
}
|
||||
|
||||
if (!plugin.getDatastore().loadGroup(next).getUnchecked()) {
|
||||
if (!plugin.getStorage().loadGroup(next).join()) {
|
||||
Message.USER_PROMOTE_ERROR_MALFORMED.send(sender, next);
|
||||
return CommandResult.STATE_ERROR;
|
||||
}
|
||||
|
||||
+6
-6
@@ -32,7 +32,7 @@ import me.lucko.luckperms.common.commands.sender.Sender;
|
||||
import me.lucko.luckperms.common.constants.Message;
|
||||
import me.lucko.luckperms.common.constants.Permission;
|
||||
import me.lucko.luckperms.common.core.NodeFactory;
|
||||
import me.lucko.luckperms.common.storage.Datastore;
|
||||
import me.lucko.luckperms.common.storage.Storage;
|
||||
import me.lucko.luckperms.common.users.User;
|
||||
import me.lucko.luckperms.common.utils.Predicates;
|
||||
import me.lucko.luckperms.exceptions.ObjectAlreadyHasException;
|
||||
@@ -40,7 +40,7 @@ import me.lucko.luckperms.exceptions.ObjectLacksException;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
public class BulkEditGroup extends SubCommand<Datastore> {
|
||||
public class BulkEditGroup extends SubCommand<Storage> {
|
||||
public BulkEditGroup() {
|
||||
super("group", "Bulk edit group memberships", Permission.USER_BULKCHANGE, Predicates.not(4),
|
||||
Arg.list(
|
||||
@@ -53,7 +53,7 @@ public class BulkEditGroup extends SubCommand<Datastore> {
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommandResult execute(LuckPermsPlugin plugin, Sender sender, Datastore datastore, List<String> args, String label) throws CommandException {
|
||||
public CommandResult execute(LuckPermsPlugin plugin, Sender sender, Storage storage, List<String> args, String label) throws CommandException {
|
||||
String group = args.get(0);
|
||||
String type = args.get(1).toLowerCase();
|
||||
String from = args.get(2);
|
||||
@@ -67,10 +67,10 @@ public class BulkEditGroup extends SubCommand<Datastore> {
|
||||
return CommandResult.FAILURE;
|
||||
}
|
||||
|
||||
Set<UUID> uuids = datastore.getUniqueUsers().getUnchecked();
|
||||
Set<UUID> uuids = storage.getUniqueUsers().join();
|
||||
|
||||
for (UUID u : uuids) {
|
||||
plugin.getDatastore().loadUser(u, "null").getUnchecked();
|
||||
plugin.getStorage().loadUser(u, "null").join();
|
||||
User user = plugin.getUserManager().get(u);
|
||||
if (user == null) {
|
||||
continue;
|
||||
@@ -143,7 +143,7 @@ public class BulkEditGroup extends SubCommand<Datastore> {
|
||||
} catch (ObjectAlreadyHasException ignored) {}
|
||||
});
|
||||
|
||||
plugin.getDatastore().saveUser(user);
|
||||
plugin.getStorage().saveUser(user);
|
||||
plugin.getUserManager().cleanup(user);
|
||||
}
|
||||
|
||||
|
||||
+6
-6
@@ -32,7 +32,7 @@ import me.lucko.luckperms.common.commands.sender.Sender;
|
||||
import me.lucko.luckperms.common.constants.Message;
|
||||
import me.lucko.luckperms.common.constants.Permission;
|
||||
import me.lucko.luckperms.common.core.NodeFactory;
|
||||
import me.lucko.luckperms.common.storage.Datastore;
|
||||
import me.lucko.luckperms.common.storage.Storage;
|
||||
import me.lucko.luckperms.common.users.User;
|
||||
import me.lucko.luckperms.common.utils.Predicates;
|
||||
import me.lucko.luckperms.exceptions.ObjectAlreadyHasException;
|
||||
@@ -40,7 +40,7 @@ import me.lucko.luckperms.exceptions.ObjectLacksException;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
public class BulkEditPermission extends SubCommand<Datastore> {
|
||||
public class BulkEditPermission extends SubCommand<Storage> {
|
||||
public BulkEditPermission() {
|
||||
super("permission", "Bulk edit permissions", Permission.USER_BULKCHANGE, Predicates.not(4),
|
||||
Arg.list(
|
||||
@@ -53,7 +53,7 @@ public class BulkEditPermission extends SubCommand<Datastore> {
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommandResult execute(LuckPermsPlugin plugin, Sender sender, Datastore datastore, List<String> args, String label) throws CommandException {
|
||||
public CommandResult execute(LuckPermsPlugin plugin, Sender sender, Storage storage, List<String> args, String label) throws CommandException {
|
||||
String node = args.get(0);
|
||||
String type = args.get(1).toLowerCase();
|
||||
String from = args.get(2);
|
||||
@@ -67,10 +67,10 @@ public class BulkEditPermission extends SubCommand<Datastore> {
|
||||
return CommandResult.FAILURE;
|
||||
}
|
||||
|
||||
Set<UUID> uuids = datastore.getUniqueUsers().getUnchecked();
|
||||
Set<UUID> uuids = storage.getUniqueUsers().join();
|
||||
|
||||
for (UUID u : uuids) {
|
||||
plugin.getDatastore().loadUser(u, "null").getUnchecked();
|
||||
plugin.getStorage().loadUser(u, "null").join();
|
||||
User user = plugin.getUserManager().get(u);
|
||||
if (user == null) {
|
||||
continue;
|
||||
@@ -133,7 +133,7 @@ public class BulkEditPermission extends SubCommand<Datastore> {
|
||||
} catch (ObjectAlreadyHasException ignored) {}
|
||||
});
|
||||
|
||||
plugin.getDatastore().saveUser(user);
|
||||
plugin.getStorage().saveUser(user);
|
||||
plugin.getUserManager().cleanup(user);
|
||||
}
|
||||
|
||||
|
||||
+8
-8
@@ -27,17 +27,17 @@ import me.lucko.luckperms.common.LuckPermsPlugin;
|
||||
import me.lucko.luckperms.common.commands.Command;
|
||||
import me.lucko.luckperms.common.commands.MainCommand;
|
||||
import me.lucko.luckperms.common.commands.sender.Sender;
|
||||
import me.lucko.luckperms.common.storage.Datastore;
|
||||
import me.lucko.luckperms.common.storage.Storage;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class UsersBulkEditMainCommand extends MainCommand<Datastore> {
|
||||
public class UsersBulkEditMainCommand extends MainCommand<Storage> {
|
||||
|
||||
public UsersBulkEditMainCommand() {
|
||||
super("UsersBulkEdit", "User bulk edit commands", "/%s usersbulkedit", 1, ImmutableList.<Command<Datastore, ?>>builder()
|
||||
super("UsersBulkEdit", "User bulk edit commands", "/%s usersbulkedit", 1, ImmutableList.<Command<Storage, ?>>builder()
|
||||
.add(new BulkEditGroup())
|
||||
.add(new BulkEditPermission())
|
||||
.build()
|
||||
@@ -45,12 +45,12 @@ public class UsersBulkEditMainCommand extends MainCommand<Datastore> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Datastore getTarget(String target, LuckPermsPlugin plugin, Sender sender) {
|
||||
return plugin.getDatastore();
|
||||
protected Storage getTarget(String target, LuckPermsPlugin plugin, Sender sender) {
|
||||
return plugin.getStorage();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void cleanup(Datastore datastore, LuckPermsPlugin plugin) {
|
||||
protected void cleanup(Storage storage, LuckPermsPlugin plugin) {
|
||||
|
||||
}
|
||||
|
||||
@@ -61,7 +61,7 @@ public class UsersBulkEditMainCommand extends MainCommand<Datastore> {
|
||||
|
||||
@Override
|
||||
public List<String> tabComplete(LuckPermsPlugin plugin, Sender sender, List<String> args) {
|
||||
final List<Command<Datastore, ?>> subs = getSubCommands().stream()
|
||||
final List<Command<Storage, ?>> subs = getSubCommands().stream()
|
||||
.filter(s -> s.isAuthorized(sender))
|
||||
.collect(Collectors.toList());
|
||||
|
||||
@@ -78,7 +78,7 @@ public class UsersBulkEditMainCommand extends MainCommand<Datastore> {
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
Optional<Command<Datastore, ?>> o = subs.stream()
|
||||
Optional<Command<Storage, ?>> o = subs.stream()
|
||||
.filter(s -> s.getName().equalsIgnoreCase(args.get(0)))
|
||||
.limit(1)
|
||||
.findAny();
|
||||
|
||||
@@ -56,16 +56,16 @@ public enum Message {
|
||||
* Loading / Saving
|
||||
*/
|
||||
USER_NOT_FOUND("&bUser could not be found.", true),
|
||||
USER_SAVE_SUCCESS("&7(User data was saved to the datastore)", true),
|
||||
USER_SAVE_SUCCESS("&7(User data was saved to storage)", true),
|
||||
USER_SAVE_ERROR("There was an error whilst saving the user.", true),
|
||||
USER_CREATE_FAIL("There was an error whilst creating a new user.", true),
|
||||
|
||||
GROUP_NOT_FOUND("&bGroup could not be found.", true),
|
||||
GROUP_SAVE_SUCCESS("&7(Group data was saved to the datastore)", true),
|
||||
GROUP_SAVE_SUCCESS("&7(Group data was saved to storage)", true),
|
||||
GROUP_SAVE_ERROR("There was an error whilst saving the group.", true),
|
||||
|
||||
TRACK_NOT_FOUND("&bTrack could not be found.", true),
|
||||
TRACK_SAVE_SUCCESS("&7(Track data was saved to the datastore)", true),
|
||||
TRACK_SAVE_SUCCESS("&7(Track data was saved to storage)", true),
|
||||
TRACK_SAVE_ERROR("There was an error whilst saving the track.", true),
|
||||
|
||||
|
||||
|
||||
@@ -48,7 +48,7 @@ public class LogEntry extends me.lucko.luckperms.api.LogEntry {
|
||||
}
|
||||
|
||||
public void submit(LuckPermsPlugin plugin, Sender sender) {
|
||||
plugin.getDatastore().logAction(this);
|
||||
plugin.getStorage().logAction(this);
|
||||
|
||||
LogNotifyEvent event = new LogNotifyEvent(this);
|
||||
event.setCancelled(!plugin.getConfiguration().isLogNotify());
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
package me.lucko.luckperms.common.messaging;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import me.lucko.luckperms.api.MessagingService;
|
||||
import me.lucko.luckperms.common.LuckPermsPlugin;
|
||||
import redis.clients.jedis.Jedis;
|
||||
import redis.clients.jedis.JedisPool;
|
||||
@@ -38,7 +39,7 @@ import java.util.UUID;
|
||||
* Uses Redis to push/receive changes to/from other servers
|
||||
*/
|
||||
@RequiredArgsConstructor
|
||||
public class RedisMessaging {
|
||||
public class RedisMessaging implements MessagingService {
|
||||
private static final String CHANNEL = "luckperms";
|
||||
|
||||
private final LuckPermsPlugin plugin;
|
||||
@@ -70,6 +71,7 @@ public class RedisMessaging {
|
||||
jedisPool.destroy();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void pushUpdate() {
|
||||
plugin.doAsync(() -> {
|
||||
UUID id = sub.generateId();
|
||||
|
||||
@@ -36,14 +36,14 @@ public class ExpireTemporaryTask implements Runnable {
|
||||
boolean groupChanges = false;
|
||||
for (Group group : plugin.getGroupManager().getAll().values()) {
|
||||
if (group.auditTemporaryPermissions()) {
|
||||
plugin.getDatastore().saveGroup(group);
|
||||
plugin.getStorage().saveGroup(group);
|
||||
groupChanges = true;
|
||||
}
|
||||
}
|
||||
|
||||
for (User user : plugin.getUserManager().getAll().values()) {
|
||||
if (user.auditTemporaryPermissions()) {
|
||||
plugin.getDatastore().saveUser(user);
|
||||
plugin.getStorage().saveUser(user);
|
||||
if (!groupChanges) {
|
||||
user.getRefreshBuffer().request();
|
||||
}
|
||||
|
||||
@@ -41,14 +41,14 @@ public class UpdateTask implements Runnable {
|
||||
if (event.isCancelled()) return;
|
||||
|
||||
// Reload all groups
|
||||
plugin.getDatastore().loadAllGroups().getUnchecked();
|
||||
plugin.getStorage().loadAllGroups().join();
|
||||
String defaultGroup = plugin.getConfiguration().getDefaultGroupName();
|
||||
if (!plugin.getGroupManager().isLoaded(defaultGroup)) {
|
||||
plugin.getDatastore().createAndLoadGroup(defaultGroup).getUnchecked();
|
||||
plugin.getStorage().createAndLoadGroup(defaultGroup).join();
|
||||
}
|
||||
|
||||
// Reload all tracks
|
||||
plugin.getDatastore().loadAllTracks().getUnchecked();
|
||||
plugin.getStorage().loadAllTracks().join();
|
||||
|
||||
// Refresh all online users.
|
||||
plugin.getUserManager().updateAllUsers();
|
||||
|
||||
+27
-36
@@ -32,21 +32,19 @@ import me.lucko.luckperms.common.groups.Group;
|
||||
import me.lucko.luckperms.common.storage.backing.AbstractBacking;
|
||||
import me.lucko.luckperms.common.tracks.Track;
|
||||
import me.lucko.luckperms.common.users.User;
|
||||
import me.lucko.luckperms.common.utils.AbstractFuture;
|
||||
import me.lucko.luckperms.common.utils.LPFuture;
|
||||
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.Future;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
/**
|
||||
* Converts a {@link AbstractBacking} to use {@link Future}s
|
||||
* Converts a {@link AbstractBacking} to use {@link CompletableFuture}s
|
||||
*/
|
||||
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
|
||||
public class AbstractDatastore implements Datastore {
|
||||
public static Datastore wrap(LuckPermsPlugin plugin, AbstractBacking backing) {
|
||||
BufferedOutputDatastore bufferedDs = BufferedOutputDatastore.wrap(TolerantDatastore.wrap(new AbstractDatastore(backing)), 1000L);
|
||||
public class AbstractStorage implements Storage {
|
||||
public static Storage wrap(LuckPermsPlugin plugin, AbstractBacking backing) {
|
||||
BufferedOutputStorage bufferedDs = BufferedOutputStorage.wrap(TolerantStorage.wrap(new AbstractStorage(backing)), 1000L);
|
||||
plugin.doAsyncRepeating(bufferedDs, 10L);
|
||||
return bufferedDs;
|
||||
}
|
||||
@@ -54,112 +52,107 @@ public class AbstractDatastore implements Datastore {
|
||||
@Delegate(types = Delegated.class)
|
||||
private final AbstractBacking backing;
|
||||
|
||||
private <T> LPFuture<T> makeFuture(Supplier<T> supplier) {
|
||||
AbstractFuture<T> future = new AbstractFuture<>();
|
||||
backing.doAsync(() -> {
|
||||
T result = supplier.get();
|
||||
future.complete(result);
|
||||
});
|
||||
return future;
|
||||
private <T> CompletableFuture<T> makeFuture(Supplier<T> supplier) {
|
||||
return CompletableFuture.supplyAsync(supplier, backing.getPlugin().getAsyncExecutor());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Datastore force() {
|
||||
public Storage force() {
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public LPFuture<Boolean> logAction(LogEntry entry) {
|
||||
public CompletableFuture<Boolean> logAction(LogEntry entry) {
|
||||
return makeFuture(() -> backing.logAction(entry));
|
||||
}
|
||||
|
||||
@Override
|
||||
public LPFuture<Log> getLog() {
|
||||
public CompletableFuture<Log> getLog() {
|
||||
return makeFuture(backing::getLog);
|
||||
}
|
||||
|
||||
@Override
|
||||
public LPFuture<Boolean> loadUser(UUID uuid, String username) {
|
||||
public CompletableFuture<Boolean> loadUser(UUID uuid, String username) {
|
||||
return makeFuture(() -> backing.loadUser(uuid, username));
|
||||
}
|
||||
|
||||
@Override
|
||||
public LPFuture<Boolean> saveUser(User user) {
|
||||
public CompletableFuture<Boolean> saveUser(User user) {
|
||||
return makeFuture(() -> backing.saveUser(user));
|
||||
}
|
||||
|
||||
@Override
|
||||
public LPFuture<Boolean> cleanupUsers() {
|
||||
public CompletableFuture<Boolean> cleanupUsers() {
|
||||
return makeFuture(backing::cleanupUsers);
|
||||
}
|
||||
|
||||
@Override
|
||||
public LPFuture<Set<UUID>> getUniqueUsers() {
|
||||
public CompletableFuture<Set<UUID>> getUniqueUsers() {
|
||||
return makeFuture(backing::getUniqueUsers);
|
||||
}
|
||||
|
||||
@Override
|
||||
public LPFuture<Boolean> createAndLoadGroup(String name) {
|
||||
public CompletableFuture<Boolean> createAndLoadGroup(String name) {
|
||||
return makeFuture(() -> backing.createAndLoadGroup(name));
|
||||
}
|
||||
|
||||
@Override
|
||||
public LPFuture<Boolean> loadGroup(String name) {
|
||||
public CompletableFuture<Boolean> loadGroup(String name) {
|
||||
return makeFuture(() -> backing.loadGroup(name));
|
||||
}
|
||||
|
||||
@Override
|
||||
public LPFuture<Boolean> loadAllGroups() {
|
||||
public CompletableFuture<Boolean> loadAllGroups() {
|
||||
return makeFuture(backing::loadAllGroups);
|
||||
}
|
||||
|
||||
@Override
|
||||
public LPFuture<Boolean> saveGroup(Group group) {
|
||||
public CompletableFuture<Boolean> saveGroup(Group group) {
|
||||
return makeFuture(() -> backing.saveGroup(group));
|
||||
}
|
||||
|
||||
@Override
|
||||
public LPFuture<Boolean> deleteGroup(Group group) {
|
||||
public CompletableFuture<Boolean> deleteGroup(Group group) {
|
||||
return makeFuture(() -> backing.deleteGroup(group));
|
||||
}
|
||||
|
||||
@Override
|
||||
public LPFuture<Boolean> createAndLoadTrack(String name) {
|
||||
public CompletableFuture<Boolean> createAndLoadTrack(String name) {
|
||||
return makeFuture(() -> backing.createAndLoadTrack(name));
|
||||
}
|
||||
|
||||
@Override
|
||||
public LPFuture<Boolean> loadTrack(String name) {
|
||||
public CompletableFuture<Boolean> loadTrack(String name) {
|
||||
return makeFuture(() -> backing.loadTrack(name));
|
||||
}
|
||||
|
||||
@Override
|
||||
public LPFuture<Boolean> loadAllTracks() {
|
||||
public CompletableFuture<Boolean> loadAllTracks() {
|
||||
return makeFuture(backing::loadAllTracks);
|
||||
}
|
||||
|
||||
@Override
|
||||
public LPFuture<Boolean> saveTrack(Track track) {
|
||||
public CompletableFuture<Boolean> saveTrack(Track track) {
|
||||
return makeFuture(() -> backing.saveTrack(track));
|
||||
}
|
||||
|
||||
@Override
|
||||
public LPFuture<Boolean> deleteTrack(Track track) {
|
||||
public CompletableFuture<Boolean> deleteTrack(Track track) {
|
||||
return makeFuture(() -> backing.deleteTrack(track));
|
||||
}
|
||||
|
||||
@Override
|
||||
public LPFuture<Boolean> saveUUIDData(String username, UUID uuid) {
|
||||
public CompletableFuture<Boolean> saveUUIDData(String username, UUID uuid) {
|
||||
return makeFuture(() -> backing.saveUUIDData(username, uuid));
|
||||
}
|
||||
|
||||
@Override
|
||||
public LPFuture<UUID> getUUID(String username) {
|
||||
public CompletableFuture<UUID> getUUID(String username) {
|
||||
return makeFuture(() -> backing.getUUID(username));
|
||||
}
|
||||
|
||||
@Override
|
||||
public LPFuture<String> getName(UUID uuid) {
|
||||
public CompletableFuture<String> getName(UUID uuid) {
|
||||
return makeFuture(() -> backing.getName(uuid));
|
||||
}
|
||||
|
||||
@@ -167,8 +160,6 @@ public class AbstractDatastore implements Datastore {
|
||||
String getName();
|
||||
boolean isAcceptingLogins();
|
||||
void setAcceptingLogins(boolean b);
|
||||
void doAsync(Runnable r);
|
||||
void doSync(Runnable r);
|
||||
void init();
|
||||
void shutdown();
|
||||
}
|
||||
+20
-20
@@ -31,47 +31,47 @@ import me.lucko.luckperms.common.tracks.Track;
|
||||
import me.lucko.luckperms.common.users.User;
|
||||
import me.lucko.luckperms.common.users.UserIdentifier;
|
||||
import me.lucko.luckperms.common.utils.Buffer;
|
||||
import me.lucko.luckperms.common.utils.LPFuture;
|
||||
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
|
||||
public class BufferedOutputDatastore implements Datastore, Runnable {
|
||||
public static BufferedOutputDatastore wrap(Datastore datastore, long flushTime) {
|
||||
return new BufferedOutputDatastore(datastore, flushTime);
|
||||
public class BufferedOutputStorage implements Storage, Runnable {
|
||||
public static BufferedOutputStorage wrap(Storage storage, long flushTime) {
|
||||
return new BufferedOutputStorage(storage, flushTime);
|
||||
}
|
||||
|
||||
@Getter
|
||||
@Delegate(excludes = Exclude.class)
|
||||
private final Datastore backing;
|
||||
private final Storage backing;
|
||||
|
||||
private final long flushTime;
|
||||
|
||||
private final Buffer<User, Boolean> userOutputBuffer = new Buffer<User, Boolean>() {
|
||||
@Override
|
||||
public Boolean dequeue(User user) {
|
||||
return backing.saveUser(user).getUnchecked();
|
||||
return backing.saveUser(user).join();
|
||||
}
|
||||
};
|
||||
|
||||
private final Buffer<Group, Boolean> groupOutputBuffer = new Buffer<Group, Boolean>() {
|
||||
@Override
|
||||
public Boolean dequeue(Group group) {
|
||||
return backing.saveGroup(group).getUnchecked();
|
||||
return backing.saveGroup(group).join();
|
||||
}
|
||||
};
|
||||
|
||||
private final Buffer<Track, Boolean> trackOutputBuffer = new Buffer<Track, Boolean>() {
|
||||
@Override
|
||||
public Boolean dequeue(Track track) {
|
||||
return backing.saveTrack(track).getUnchecked();
|
||||
return backing.saveTrack(track).join();
|
||||
}
|
||||
};
|
||||
|
||||
private final Buffer<UserIdentifier, Boolean> uuidDataOutputBuffer = new Buffer<UserIdentifier, Boolean>() {
|
||||
@Override
|
||||
protected Boolean dequeue(UserIdentifier userIdentifier) {
|
||||
return backing.saveUUIDData(userIdentifier.getUsername(), userIdentifier.getUuid()).getUnchecked();
|
||||
return backing.saveUUIDData(userIdentifier.getUsername(), userIdentifier.getUuid()).join();
|
||||
}
|
||||
};
|
||||
|
||||
@@ -92,7 +92,7 @@ public class BufferedOutputDatastore implements Datastore, Runnable {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Datastore force() {
|
||||
public Storage force() {
|
||||
return backing;
|
||||
}
|
||||
|
||||
@@ -103,31 +103,31 @@ public class BufferedOutputDatastore implements Datastore, Runnable {
|
||||
}
|
||||
|
||||
@Override
|
||||
public LPFuture<Boolean> saveUser(User user) {
|
||||
public CompletableFuture<Boolean> saveUser(User user) {
|
||||
return userOutputBuffer.enqueue(user);
|
||||
}
|
||||
|
||||
@Override
|
||||
public LPFuture<Boolean> saveGroup(Group group) {
|
||||
public CompletableFuture<Boolean> saveGroup(Group group) {
|
||||
return groupOutputBuffer.enqueue(group);
|
||||
}
|
||||
|
||||
@Override
|
||||
public LPFuture<Boolean> saveTrack(Track track) {
|
||||
public CompletableFuture<Boolean> saveTrack(Track track) {
|
||||
return trackOutputBuffer.enqueue(track);
|
||||
}
|
||||
|
||||
@Override
|
||||
public LPFuture<Boolean> saveUUIDData(String username, UUID uuid) {
|
||||
public CompletableFuture<Boolean> saveUUIDData(String username, UUID uuid) {
|
||||
return uuidDataOutputBuffer.enqueue(UserIdentifier.of(uuid, username));
|
||||
}
|
||||
|
||||
private interface Exclude {
|
||||
Datastore force();
|
||||
LPFuture<Void> shutdown();
|
||||
LPFuture<Boolean> saveUser(User user);
|
||||
LPFuture<Boolean> saveGroup(Group group);
|
||||
LPFuture<Boolean> saveTrack(Track track);
|
||||
LPFuture<Boolean> saveUUIDData(String username, UUID uuid);
|
||||
Storage force();
|
||||
CompletableFuture<Void> shutdown();
|
||||
CompletableFuture<Boolean> saveUser(User user);
|
||||
CompletableFuture<Boolean> saveGroup(Group group);
|
||||
CompletableFuture<Boolean> saveTrack(Track track);
|
||||
CompletableFuture<Boolean> saveUUIDData(String username, UUID uuid);
|
||||
}
|
||||
}
|
||||
@@ -1,211 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2016 Lucko (Luck) <luck@lucko.me>
|
||||
*
|
||||
* 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 me.lucko.luckperms.api.LogEntry;
|
||||
import me.lucko.luckperms.api.data.Callback;
|
||||
import me.lucko.luckperms.common.data.Log;
|
||||
import me.lucko.luckperms.common.groups.Group;
|
||||
import me.lucko.luckperms.common.tracks.Track;
|
||||
import me.lucko.luckperms.common.users.User;
|
||||
import me.lucko.luckperms.common.utils.LPFuture;
|
||||
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
|
||||
public interface Datastore {
|
||||
|
||||
String getName();
|
||||
|
||||
boolean isAcceptingLogins();
|
||||
void setAcceptingLogins(boolean acceptingLogins);
|
||||
|
||||
/**
|
||||
* Execute a runnable asynchronously
|
||||
* @param r the task to run
|
||||
*/
|
||||
void doAsync(Runnable r);
|
||||
|
||||
/**
|
||||
* Execute a runnable synchronously
|
||||
* @param r the task to run
|
||||
*/
|
||||
void doSync(Runnable r);
|
||||
|
||||
Datastore force();
|
||||
|
||||
void init();
|
||||
void shutdown();
|
||||
LPFuture<Boolean> logAction(LogEntry entry);
|
||||
LPFuture<Log> getLog();
|
||||
LPFuture<Boolean> loadUser(UUID uuid, String username);
|
||||
LPFuture<Boolean> saveUser(User user);
|
||||
LPFuture<Boolean> cleanupUsers();
|
||||
LPFuture<Set<UUID>> getUniqueUsers();
|
||||
LPFuture<Boolean> createAndLoadGroup(String name);
|
||||
LPFuture<Boolean> loadGroup(String name);
|
||||
LPFuture<Boolean> loadAllGroups();
|
||||
LPFuture<Boolean> saveGroup(Group group);
|
||||
LPFuture<Boolean> deleteGroup(Group group);
|
||||
LPFuture<Boolean> createAndLoadTrack(String name);
|
||||
LPFuture<Boolean> loadTrack(String name);
|
||||
LPFuture<Boolean> loadAllTracks();
|
||||
LPFuture<Boolean> saveTrack(Track track);
|
||||
LPFuture<Boolean> deleteTrack(Track track);
|
||||
LPFuture<Boolean> saveUUIDData(String username, UUID uuid);
|
||||
LPFuture<UUID> getUUID(String username);
|
||||
LPFuture<String> getName(UUID uuid);
|
||||
|
||||
default void logAction(LogEntry entry, Callback<Boolean> callback) {
|
||||
doAsync(() -> {
|
||||
boolean result = logAction(entry).getUnchecked();
|
||||
doSync(() -> callback.onComplete(result));
|
||||
});
|
||||
}
|
||||
|
||||
default void getLog(Callback<Log> callback) {
|
||||
doAsync(() -> {
|
||||
Log result = getLog().getUnchecked();
|
||||
doSync(() -> callback.onComplete(result));
|
||||
});
|
||||
}
|
||||
|
||||
default void loadUser(UUID uuid, String username, Callback<Boolean> callback) {
|
||||
doAsync(() -> {
|
||||
boolean result = loadUser(uuid, username).getUnchecked();
|
||||
doSync(() -> callback.onComplete(result));
|
||||
});
|
||||
}
|
||||
|
||||
default void saveUser(User user, Callback<Boolean> callback) {
|
||||
doAsync(() -> {
|
||||
boolean result = saveUser(user).getUnchecked();
|
||||
doSync(() -> callback.onComplete(result));
|
||||
});
|
||||
}
|
||||
|
||||
default void cleanupUsers(Callback<Boolean> callback) {
|
||||
doAsync(() -> {
|
||||
boolean result = cleanupUsers().getUnchecked();
|
||||
doSync(() -> callback.onComplete(result));
|
||||
});
|
||||
}
|
||||
|
||||
default void getUniqueUsers(Callback<Set<UUID>> callback) {
|
||||
doAsync(() -> {
|
||||
Set<UUID> result = getUniqueUsers().getUnchecked();
|
||||
doSync(() -> callback.onComplete(result));
|
||||
});
|
||||
}
|
||||
|
||||
default void createAndLoadGroup(String name, Callback<Boolean> callback) {
|
||||
doAsync(() -> {
|
||||
boolean result = createAndLoadGroup(name).getUnchecked();
|
||||
doSync(() -> callback.onComplete(result));
|
||||
});
|
||||
}
|
||||
|
||||
default void loadGroup(String name, Callback<Boolean> callback) {
|
||||
doAsync(() -> {
|
||||
boolean result = loadGroup(name).getUnchecked();
|
||||
doSync(() -> callback.onComplete(result));
|
||||
});
|
||||
}
|
||||
|
||||
default void loadAllGroups(Callback<Boolean> callback) {
|
||||
doAsync(() -> {
|
||||
boolean result = loadAllGroups().getUnchecked();
|
||||
doSync(() -> callback.onComplete(result));
|
||||
});
|
||||
}
|
||||
|
||||
default void saveGroup(Group group, Callback<Boolean> callback) {
|
||||
doAsync(() -> {
|
||||
boolean result = saveGroup(group).getUnchecked();
|
||||
doSync(() -> callback.onComplete(result));
|
||||
});
|
||||
}
|
||||
|
||||
default void deleteGroup(Group group, Callback<Boolean> callback) {
|
||||
doAsync(() -> {
|
||||
boolean result = deleteGroup(group).getUnchecked();
|
||||
doSync(() -> callback.onComplete(result));
|
||||
});
|
||||
}
|
||||
|
||||
default void createAndLoadTrack(String name, Callback<Boolean> callback) {
|
||||
doAsync(() -> {
|
||||
boolean result = createAndLoadTrack(name).getUnchecked();
|
||||
doSync(() -> callback.onComplete(result));
|
||||
});
|
||||
}
|
||||
|
||||
default void loadTrack(String name, Callback<Boolean> callback) {
|
||||
doAsync(() -> {
|
||||
boolean result = loadTrack(name).getUnchecked();
|
||||
doSync(() -> callback.onComplete(result));
|
||||
});
|
||||
}
|
||||
|
||||
default void loadAllTracks(Callback<Boolean> callback) {
|
||||
doAsync(() -> {
|
||||
boolean result = loadAllTracks().getUnchecked();
|
||||
doSync(() -> callback.onComplete(result));
|
||||
});
|
||||
}
|
||||
|
||||
default void saveTrack(Track track, Callback<Boolean> callback) {
|
||||
doAsync(() -> {
|
||||
boolean result = saveTrack(track).getUnchecked();
|
||||
doSync(() -> callback.onComplete(result));
|
||||
});
|
||||
}
|
||||
|
||||
default void deleteTrack(Track track, Callback<Boolean> callback) {
|
||||
doAsync(() -> {
|
||||
boolean result = deleteTrack(track).getUnchecked();
|
||||
doSync(() -> callback.onComplete(result));
|
||||
});
|
||||
}
|
||||
|
||||
default void saveUUIDData(String username, UUID uuid, Callback<Boolean> callback) {
|
||||
doAsync(() -> {
|
||||
boolean result = saveUUIDData(username, uuid).getUnchecked();
|
||||
doSync(() -> callback.onComplete(result));
|
||||
});
|
||||
}
|
||||
|
||||
default void getUUID(String username, Callback<UUID> callback) {
|
||||
doAsync(() -> {
|
||||
UUID result = getUUID(username).getUnchecked();
|
||||
doSync(() -> callback.onComplete(result));
|
||||
});
|
||||
}
|
||||
|
||||
default void getName(UUID uuid, Callback<String> callback) {
|
||||
doAsync(() -> {
|
||||
String result = getName(uuid).getUnchecked();
|
||||
doSync(() -> callback.onComplete(result));
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
/*
|
||||
* Copyright (c) 2016 Lucko (Luck) <luck@lucko.me>
|
||||
*
|
||||
* 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 me.lucko.luckperms.api.LogEntry;
|
||||
import me.lucko.luckperms.common.data.Log;
|
||||
import me.lucko.luckperms.common.groups.Group;
|
||||
import me.lucko.luckperms.common.tracks.Track;
|
||||
import me.lucko.luckperms.common.users.User;
|
||||
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
/**
|
||||
* Main interface for all Storage providers.
|
||||
*/
|
||||
public interface Storage {
|
||||
|
||||
String getName();
|
||||
boolean isAcceptingLogins();
|
||||
void setAcceptingLogins(boolean acceptingLogins);
|
||||
Storage force();
|
||||
|
||||
void init();
|
||||
void shutdown();
|
||||
CompletableFuture<Boolean> logAction(LogEntry entry);
|
||||
CompletableFuture<Log> getLog();
|
||||
CompletableFuture<Boolean> loadUser(UUID uuid, String username);
|
||||
CompletableFuture<Boolean> saveUser(User user);
|
||||
CompletableFuture<Boolean> cleanupUsers();
|
||||
CompletableFuture<Set<UUID>> getUniqueUsers();
|
||||
CompletableFuture<Boolean> createAndLoadGroup(String name);
|
||||
CompletableFuture<Boolean> loadGroup(String name);
|
||||
CompletableFuture<Boolean> loadAllGroups();
|
||||
CompletableFuture<Boolean> saveGroup(Group group);
|
||||
CompletableFuture<Boolean> deleteGroup(Group group);
|
||||
CompletableFuture<Boolean> createAndLoadTrack(String name);
|
||||
CompletableFuture<Boolean> loadTrack(String name);
|
||||
CompletableFuture<Boolean> loadAllTracks();
|
||||
CompletableFuture<Boolean> saveTrack(Track track);
|
||||
CompletableFuture<Boolean> deleteTrack(Track track);
|
||||
CompletableFuture<Boolean> saveUUIDData(String username, UUID uuid);
|
||||
CompletableFuture<UUID> getUUID(String username);
|
||||
CompletableFuture<String> getName(UUID uuid);
|
||||
}
|
||||
@@ -37,8 +37,8 @@ import java.util.Set;
|
||||
public class StorageFactory {
|
||||
private static final Set<String> TYPES = ImmutableSet.of("json", "yaml", "flatfile", "mongodb", "mysql", "sqlite", "h2");
|
||||
|
||||
public static Datastore getDatastore(LuckPermsPlugin plugin, String defaultMethod) {
|
||||
Datastore datastore;
|
||||
public static Storage getInstance(LuckPermsPlugin plugin, String defaultMethod) {
|
||||
Storage storage;
|
||||
|
||||
plugin.getLog().info("Detecting storage method...");
|
||||
if (plugin.getConfiguration().isSplitStorage()) {
|
||||
@@ -63,7 +63,7 @@ public class StorageFactory {
|
||||
backing.put(type, backingFromString(type, plugin));
|
||||
}
|
||||
|
||||
datastore = AbstractDatastore.wrap(plugin, new SplitBacking(plugin, backing, types));
|
||||
storage = AbstractStorage.wrap(plugin, new SplitBacking(plugin, backing, types));
|
||||
|
||||
} else {
|
||||
String storageMethod = plugin.getConfiguration().getStorageMethod().toLowerCase();
|
||||
@@ -72,17 +72,17 @@ public class StorageFactory {
|
||||
storageMethod = defaultMethod;
|
||||
}
|
||||
|
||||
datastore = fromString(storageMethod, plugin);
|
||||
plugin.getLog().info("Using " + datastore.getName() + " as storage method.");
|
||||
storage = fromString(storageMethod, plugin);
|
||||
plugin.getLog().info("Using " + storage.getName() + " as storage method.");
|
||||
}
|
||||
|
||||
plugin.getLog().info("Initialising datastore...");
|
||||
datastore.init();
|
||||
return datastore;
|
||||
storage.init();
|
||||
return storage;
|
||||
}
|
||||
|
||||
private static Datastore fromString(String storageMethod, LuckPermsPlugin plugin) {
|
||||
return AbstractDatastore.wrap(plugin, backingFromString(storageMethod, plugin));
|
||||
private static Storage fromString(String storageMethod, LuckPermsPlugin plugin) {
|
||||
return AbstractStorage.wrap(plugin, backingFromString(storageMethod, plugin));
|
||||
}
|
||||
|
||||
private static AbstractBacking backingFromString(String method, LuckPermsPlugin plugin) {
|
||||
|
||||
+26
-28
@@ -30,30 +30,30 @@ import me.lucko.luckperms.common.data.Log;
|
||||
import me.lucko.luckperms.common.groups.Group;
|
||||
import me.lucko.luckperms.common.tracks.Track;
|
||||
import me.lucko.luckperms.common.users.User;
|
||||
import me.lucko.luckperms.common.utils.LPFuture;
|
||||
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.Phaser;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.TimeoutException;
|
||||
|
||||
/**
|
||||
* A Datastore wrapping that ensures all tasks are completed before {@link Datastore#shutdown()} is called.
|
||||
* A Datastore wrapping that ensures all tasks are completed before {@link Storage#shutdown()} is called.
|
||||
*/
|
||||
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
|
||||
public class TolerantDatastore implements Datastore {
|
||||
public static TolerantDatastore wrap(Datastore datastore) {
|
||||
return new TolerantDatastore(datastore);
|
||||
public class TolerantStorage implements Storage {
|
||||
public static TolerantStorage wrap(Storage storage) {
|
||||
return new TolerantStorage(storage);
|
||||
}
|
||||
|
||||
@Delegate(types = Delegated.class)
|
||||
private final Datastore backing;
|
||||
private final Storage backing;
|
||||
|
||||
private final Phaser phaser = new Phaser();
|
||||
|
||||
@Override
|
||||
public Datastore force() {
|
||||
public Storage force() {
|
||||
return this;
|
||||
}
|
||||
|
||||
@@ -70,7 +70,7 @@ public class TolerantDatastore implements Datastore {
|
||||
}
|
||||
|
||||
@Override
|
||||
public LPFuture<Boolean> logAction(LogEntry entry) {
|
||||
public CompletableFuture<Boolean> logAction(LogEntry entry) {
|
||||
phaser.register();
|
||||
try {
|
||||
return backing.logAction(entry);
|
||||
@@ -80,7 +80,7 @@ public class TolerantDatastore implements Datastore {
|
||||
}
|
||||
|
||||
@Override
|
||||
public LPFuture<Log> getLog() {
|
||||
public CompletableFuture<Log> getLog() {
|
||||
phaser.register();
|
||||
try {
|
||||
return backing.getLog();
|
||||
@@ -90,7 +90,7 @@ public class TolerantDatastore implements Datastore {
|
||||
}
|
||||
|
||||
@Override
|
||||
public LPFuture<Boolean> loadUser(UUID uuid, String username) {
|
||||
public CompletableFuture<Boolean> loadUser(UUID uuid, String username) {
|
||||
phaser.register();
|
||||
try {
|
||||
return backing.loadUser(uuid, username);
|
||||
@@ -100,7 +100,7 @@ public class TolerantDatastore implements Datastore {
|
||||
}
|
||||
|
||||
@Override
|
||||
public LPFuture<Boolean> saveUser(User user) {
|
||||
public CompletableFuture<Boolean> saveUser(User user) {
|
||||
phaser.register();
|
||||
try {
|
||||
return backing.saveUser(user);
|
||||
@@ -110,7 +110,7 @@ public class TolerantDatastore implements Datastore {
|
||||
}
|
||||
|
||||
@Override
|
||||
public LPFuture<Boolean> cleanupUsers() {
|
||||
public CompletableFuture<Boolean> cleanupUsers() {
|
||||
phaser.register();
|
||||
try {
|
||||
return backing.cleanupUsers();
|
||||
@@ -120,7 +120,7 @@ public class TolerantDatastore implements Datastore {
|
||||
}
|
||||
|
||||
@Override
|
||||
public LPFuture<Set<UUID>> getUniqueUsers() {
|
||||
public CompletableFuture<Set<UUID>> getUniqueUsers() {
|
||||
phaser.register();
|
||||
try {
|
||||
return backing.getUniqueUsers();
|
||||
@@ -130,7 +130,7 @@ public class TolerantDatastore implements Datastore {
|
||||
}
|
||||
|
||||
@Override
|
||||
public LPFuture<Boolean> createAndLoadGroup(String name) {
|
||||
public CompletableFuture<Boolean> createAndLoadGroup(String name) {
|
||||
phaser.register();
|
||||
try {
|
||||
return backing.createAndLoadGroup(name);
|
||||
@@ -140,7 +140,7 @@ public class TolerantDatastore implements Datastore {
|
||||
}
|
||||
|
||||
@Override
|
||||
public LPFuture<Boolean> loadGroup(String name) {
|
||||
public CompletableFuture<Boolean> loadGroup(String name) {
|
||||
phaser.register();
|
||||
try {
|
||||
return backing.loadGroup(name);
|
||||
@@ -150,7 +150,7 @@ public class TolerantDatastore implements Datastore {
|
||||
}
|
||||
|
||||
@Override
|
||||
public LPFuture<Boolean> loadAllGroups() {
|
||||
public CompletableFuture<Boolean> loadAllGroups() {
|
||||
phaser.register();
|
||||
try {
|
||||
return backing.loadAllGroups();
|
||||
@@ -160,7 +160,7 @@ public class TolerantDatastore implements Datastore {
|
||||
}
|
||||
|
||||
@Override
|
||||
public LPFuture<Boolean> saveGroup(Group group) {
|
||||
public CompletableFuture<Boolean> saveGroup(Group group) {
|
||||
phaser.register();
|
||||
try {
|
||||
return backing.saveGroup(group);
|
||||
@@ -170,7 +170,7 @@ public class TolerantDatastore implements Datastore {
|
||||
}
|
||||
|
||||
@Override
|
||||
public LPFuture<Boolean> deleteGroup(Group group) {
|
||||
public CompletableFuture<Boolean> deleteGroup(Group group) {
|
||||
phaser.register();
|
||||
try {
|
||||
return backing.deleteGroup(group);
|
||||
@@ -180,7 +180,7 @@ public class TolerantDatastore implements Datastore {
|
||||
}
|
||||
|
||||
@Override
|
||||
public LPFuture<Boolean> createAndLoadTrack(String name) {
|
||||
public CompletableFuture<Boolean> createAndLoadTrack(String name) {
|
||||
phaser.register();
|
||||
try {
|
||||
return backing.createAndLoadTrack(name);
|
||||
@@ -190,7 +190,7 @@ public class TolerantDatastore implements Datastore {
|
||||
}
|
||||
|
||||
@Override
|
||||
public LPFuture<Boolean> loadTrack(String name) {
|
||||
public CompletableFuture<Boolean> loadTrack(String name) {
|
||||
phaser.register();
|
||||
try {
|
||||
return backing.loadTrack(name);
|
||||
@@ -200,7 +200,7 @@ public class TolerantDatastore implements Datastore {
|
||||
}
|
||||
|
||||
@Override
|
||||
public LPFuture<Boolean> loadAllTracks() {
|
||||
public CompletableFuture<Boolean> loadAllTracks() {
|
||||
phaser.register();
|
||||
try {
|
||||
return backing.loadAllTracks();
|
||||
@@ -210,7 +210,7 @@ public class TolerantDatastore implements Datastore {
|
||||
}
|
||||
|
||||
@Override
|
||||
public LPFuture<Boolean> saveTrack(Track track) {
|
||||
public CompletableFuture<Boolean> saveTrack(Track track) {
|
||||
phaser.register();
|
||||
try {
|
||||
return backing.saveTrack(track);
|
||||
@@ -220,7 +220,7 @@ public class TolerantDatastore implements Datastore {
|
||||
}
|
||||
|
||||
@Override
|
||||
public LPFuture<Boolean> deleteTrack(Track track) {
|
||||
public CompletableFuture<Boolean> deleteTrack(Track track) {
|
||||
phaser.register();
|
||||
try {
|
||||
return backing.deleteTrack(track);
|
||||
@@ -230,7 +230,7 @@ public class TolerantDatastore implements Datastore {
|
||||
}
|
||||
|
||||
@Override
|
||||
public LPFuture<Boolean> saveUUIDData(String username, UUID uuid) {
|
||||
public CompletableFuture<Boolean> saveUUIDData(String username, UUID uuid) {
|
||||
phaser.register();
|
||||
try {
|
||||
return backing.saveUUIDData(username, uuid);
|
||||
@@ -240,7 +240,7 @@ public class TolerantDatastore implements Datastore {
|
||||
}
|
||||
|
||||
@Override
|
||||
public LPFuture<UUID> getUUID(String username) {
|
||||
public CompletableFuture<UUID> getUUID(String username) {
|
||||
phaser.register();
|
||||
try {
|
||||
return backing.getUUID(username);
|
||||
@@ -250,7 +250,7 @@ public class TolerantDatastore implements Datastore {
|
||||
}
|
||||
|
||||
@Override
|
||||
public LPFuture<String> getName(UUID uuid) {
|
||||
public CompletableFuture<String> getName(UUID uuid) {
|
||||
phaser.register();
|
||||
try {
|
||||
return backing.getName(uuid);
|
||||
@@ -263,8 +263,6 @@ public class TolerantDatastore implements Datastore {
|
||||
String getName();
|
||||
boolean isAcceptingLogins();
|
||||
void setAcceptingLogins(boolean b);
|
||||
void doAsync(Runnable r);
|
||||
void doSync(Runnable r);
|
||||
void init();
|
||||
}
|
||||
}
|
||||
+2
-16
@@ -38,6 +38,8 @@ import java.util.UUID;
|
||||
|
||||
@RequiredArgsConstructor(access = AccessLevel.PROTECTED)
|
||||
public abstract class AbstractBacking {
|
||||
|
||||
@Getter
|
||||
protected final LuckPermsPlugin plugin;
|
||||
|
||||
@Getter
|
||||
@@ -47,22 +49,6 @@ public abstract class AbstractBacking {
|
||||
@Setter
|
||||
private boolean acceptingLogins = false;
|
||||
|
||||
/**
|
||||
* Execute a runnable asynchronously
|
||||
* @param r the task to run
|
||||
*/
|
||||
public void doAsync(Runnable r) {
|
||||
plugin.doAsync(r);
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute a runnable synchronously
|
||||
* @param r the task to run
|
||||
*/
|
||||
public void doSync(Runnable r) {
|
||||
plugin.doSync(r);
|
||||
}
|
||||
|
||||
public abstract void init();
|
||||
public abstract void shutdown();
|
||||
public abstract boolean logAction(LogEntry entry);
|
||||
|
||||
@@ -24,7 +24,6 @@ package me.lucko.luckperms.common.users;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import me.lucko.luckperms.api.Node;
|
||||
import me.lucko.luckperms.api.data.Callback;
|
||||
import me.lucko.luckperms.common.LuckPermsPlugin;
|
||||
import me.lucko.luckperms.common.utils.AbstractManager;
|
||||
import me.lucko.luckperms.common.utils.Identifiable;
|
||||
@@ -81,7 +80,7 @@ public class UserManager extends AbstractManager<UserIdentifier, User> {
|
||||
} catch (ObjectAlreadyHasException ignored) {}
|
||||
|
||||
if (save) {
|
||||
plugin.getDatastore().saveUser(user, Callback.empty());
|
||||
plugin.getStorage().saveUser(user);
|
||||
}
|
||||
|
||||
return true;
|
||||
@@ -134,7 +133,7 @@ public class UserManager extends AbstractManager<UserIdentifier, User> {
|
||||
plugin.doAsync(() -> {
|
||||
for (UUID uuid : players) {
|
||||
UUID internal = plugin.getUuidCache().getUUID(uuid);
|
||||
plugin.getDatastore().loadUser(internal, "null").getUnchecked();
|
||||
plugin.getStorage().loadUser(internal, "null").join();
|
||||
User user = get(internal);
|
||||
user.getRefreshBuffer().request();
|
||||
}
|
||||
|
||||
@@ -1,72 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2016 Lucko (Luck) <luck@lucko.me>
|
||||
*
|
||||
* 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.utils;
|
||||
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.TimeoutException;
|
||||
|
||||
/**
|
||||
* Basic Future implementation
|
||||
* @param <R> the return type
|
||||
*/
|
||||
public class AbstractFuture<R> implements LPFuture<R> {
|
||||
private final CountDownLatch latch = new CountDownLatch(1);
|
||||
private R value;
|
||||
|
||||
public void complete(R r) {
|
||||
value = r;
|
||||
latch.countDown();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean cancel(boolean mayInterruptIfRunning) {
|
||||
// Not supported
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCancelled() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isDone() {
|
||||
return latch.getCount() == 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public R get() throws InterruptedException {
|
||||
latch.await();
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public R get(long timeout, TimeUnit unit) throws InterruptedException, TimeoutException {
|
||||
if (latch.await(timeout, unit)) {
|
||||
return value;
|
||||
} else {
|
||||
throw new TimeoutException();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -23,7 +23,6 @@
|
||||
package me.lucko.luckperms.common.utils;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import me.lucko.luckperms.api.data.Callback;
|
||||
import me.lucko.luckperms.api.event.events.UserFirstLoginEvent;
|
||||
import me.lucko.luckperms.common.LuckPermsPlugin;
|
||||
import me.lucko.luckperms.common.core.UuidCache;
|
||||
@@ -44,26 +43,26 @@ public class AbstractListener {
|
||||
|
||||
final UuidCache cache = plugin.getUuidCache();
|
||||
if (!cache.isOnlineMode()) {
|
||||
UUID uuid = plugin.getDatastore().force().getUUID(username).getUnchecked();
|
||||
UUID uuid = plugin.getStorage().force().getUUID(username).join();
|
||||
if (uuid != null) {
|
||||
cache.addToCache(u, uuid);
|
||||
} else {
|
||||
// No previous data for this player
|
||||
plugin.getApiProvider().fireEventAsync(new UserFirstLoginEvent(u, username));
|
||||
cache.addToCache(u, u);
|
||||
plugin.getDatastore().force().saveUUIDData(username, u, Callback.empty());
|
||||
plugin.getStorage().force().saveUUIDData(username, u);
|
||||
}
|
||||
} else {
|
||||
UUID uuid = plugin.getDatastore().force().getUUID(username).getUnchecked();
|
||||
UUID uuid = plugin.getStorage().force().getUUID(username).join();
|
||||
if (uuid == null) {
|
||||
plugin.getApiProvider().fireEventAsync(new UserFirstLoginEvent(u, username));
|
||||
}
|
||||
|
||||
// Online mode, no cache needed. This is just for name -> uuid lookup.
|
||||
plugin.getDatastore().force().saveUUIDData(username, u, Callback.empty());
|
||||
plugin.getStorage().force().saveUUIDData(username, u);
|
||||
}
|
||||
|
||||
plugin.getDatastore().force().loadUser(cache.getUUID(u), username).getUnchecked();
|
||||
plugin.getStorage().force().loadUser(cache.getUUID(u), username).join();
|
||||
User user = plugin.getUserManager().get(cache.getUUID(u));
|
||||
if (user == null) {
|
||||
plugin.getLog().warn("Failed to load user: " + username);
|
||||
@@ -78,7 +77,7 @@ public class AbstractListener {
|
||||
|
||||
// If they were given a default, persist the new assignments back to the storage.
|
||||
if (save) {
|
||||
plugin.getDatastore().force().saveUser(user).getUnchecked();
|
||||
plugin.getStorage().force().saveUser(user).join();
|
||||
}
|
||||
|
||||
user.setupData(false); // Pretty nasty calculation call. Sets up the caching system so data is ready when the user joins.
|
||||
|
||||
@@ -27,6 +27,7 @@ import lombok.*;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.ListIterator;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.locks.ReentrantLock;
|
||||
|
||||
/**
|
||||
@@ -42,7 +43,7 @@ public abstract class Buffer<T, R> implements Runnable {
|
||||
private final ReentrantLock lock = new ReentrantLock();
|
||||
private final List<BufferedObject<T, R>> buffer = new LinkedList<>();
|
||||
|
||||
public LPFuture<R> enqueue(@NonNull T t) {
|
||||
public CompletableFuture<R> enqueue(@NonNull T t) {
|
||||
lock.lock();
|
||||
try {
|
||||
ListIterator<BufferedObject<T, R>> it = buffer.listIterator();
|
||||
@@ -60,7 +61,7 @@ public abstract class Buffer<T, R> implements Runnable {
|
||||
}
|
||||
|
||||
if (o == null) {
|
||||
o = new BufferedObject<>(System.currentTimeMillis(), t, new AbstractFuture<R>());
|
||||
o = new BufferedObject<>(System.currentTimeMillis(), t, new CompletableFuture<R>());
|
||||
} else {
|
||||
o.setBufferTime(System.currentTimeMillis());
|
||||
}
|
||||
@@ -111,7 +112,7 @@ public abstract class Buffer<T, R> implements Runnable {
|
||||
@Setter
|
||||
private long bufferTime;
|
||||
private final T object;
|
||||
private final AbstractFuture<R> future;
|
||||
private final CompletableFuture<R> future;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,8 +26,9 @@ import lombok.Getter;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.Executor;
|
||||
import java.util.concurrent.locks.ReentrantLock;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
/**
|
||||
@@ -41,12 +42,12 @@ import java.util.function.Supplier;
|
||||
@RequiredArgsConstructor
|
||||
public abstract class BufferedRequest<T> {
|
||||
private final long bufferTimeMillis;
|
||||
private final Consumer<Runnable> executor;
|
||||
private final Executor executor;
|
||||
|
||||
private WeakReference<Processor<T>> processor = null;
|
||||
private ReentrantLock lock = new ReentrantLock();
|
||||
|
||||
public LPFuture<T> request() {
|
||||
public CompletableFuture<T> request() {
|
||||
lock.lock();
|
||||
try {
|
||||
if (processor != null) {
|
||||
@@ -57,7 +58,7 @@ public abstract class BufferedRequest<T> {
|
||||
}
|
||||
|
||||
Processor<T> p = new Processor<>(bufferTimeMillis, this::perform);
|
||||
executor.accept(p);
|
||||
executor.execute(p);
|
||||
processor = new WeakReference<>(p);
|
||||
return p.get();
|
||||
|
||||
@@ -82,7 +83,7 @@ public abstract class BufferedRequest<T> {
|
||||
|
||||
private final ReentrantLock lock = new ReentrantLock();
|
||||
private long executionTime;
|
||||
private final AbstractFuture<R> future = new AbstractFuture<>();
|
||||
private final CompletableFuture<R> future = new CompletableFuture<R>();
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
@@ -116,11 +117,11 @@ public abstract class BufferedRequest<T> {
|
||||
future.complete(result);
|
||||
}
|
||||
|
||||
public LPFuture<R> get() {
|
||||
public CompletableFuture<R> get() {
|
||||
return future;
|
||||
}
|
||||
|
||||
public LPFuture<R> getAndExtend() {
|
||||
public CompletableFuture<R> getAndExtend() {
|
||||
lock.lock();
|
||||
try {
|
||||
executionTime = System.currentTimeMillis() + delayMillis;
|
||||
|
||||
@@ -1,35 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2016 Lucko (Luck) <luck@lucko.me>
|
||||
*
|
||||
* 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.utils;
|
||||
|
||||
import com.google.common.util.concurrent.Futures;
|
||||
|
||||
import java.util.concurrent.Future;
|
||||
|
||||
public interface LPFuture<T> extends Future<T> {
|
||||
|
||||
default T getUnchecked() {
|
||||
return Futures.getUnchecked(this);
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user