From a5542051f4ca78d24bdda86bf31be36cc1726ca0 Mon Sep 17 00:00:00 2001 From: Gabriele C Date: Sun, 29 Oct 2017 19:35:23 +0100 Subject: [PATCH] Add a way to load user's permission data from the permission handler on demand. #1350 --- .../xephi/authme/listener/PlayerListener.java | 10 +++ .../authme/permission/PermissionsManager.java | 15 ++++ .../permission/handlers/LuckPermsHandler.java | 74 +++++++------------ .../handlers/PermissionHandler.java | 8 ++ .../authme/task/purge/PurgeExecutor.java | 5 ++ 5 files changed, 64 insertions(+), 48 deletions(-) diff --git a/src/main/java/fr/xephi/authme/listener/PlayerListener.java b/src/main/java/fr/xephi/authme/listener/PlayerListener.java index 8ad4a2fa2..d9eca0cbb 100644 --- a/src/main/java/fr/xephi/authme/listener/PlayerListener.java +++ b/src/main/java/fr/xephi/authme/listener/PlayerListener.java @@ -4,6 +4,7 @@ import fr.xephi.authme.data.auth.PlayerAuth; import fr.xephi.authme.datasource.DataSource; import fr.xephi.authme.message.MessageKey; import fr.xephi.authme.message.Messages; +import fr.xephi.authme.permission.PermissionsManager; import fr.xephi.authme.process.Management; import fr.xephi.authme.service.AntiBotService; import fr.xephi.authme.service.BukkitService; @@ -79,6 +80,8 @@ public class PlayerListener implements Listener { private ValidationService validationService; @Inject private JoinMessageService joinMessageService; + @Inject + private PermissionsManager permissionsManager; private static boolean isAsyncPlayerPreLoginEventCalled = false; @@ -234,6 +237,13 @@ public class PlayerListener implements Listener { return; } + // Keep pre-UUID compatibility + try { + permissionsManager.loadUserData(event.getUniqueId()); + } catch (NoSuchMethodError e) { + permissionsManager.loadUserData(name); + } + try { runOnJoinChecks(name, event.getAddress().getHostAddress()); } catch (FailedVerificationException e) { diff --git a/src/main/java/fr/xephi/authme/permission/PermissionsManager.java b/src/main/java/fr/xephi/authme/permission/PermissionsManager.java index 8f3ca797c..ad1a7454c 100644 --- a/src/main/java/fr/xephi/authme/permission/PermissionsManager.java +++ b/src/main/java/fr/xephi/authme/permission/PermissionsManager.java @@ -23,6 +23,7 @@ import javax.annotation.PostConstruct; import javax.inject.Inject; import java.util.Collection; import java.util.Collections; +import java.util.UUID; /** * PermissionsManager. @@ -425,4 +426,18 @@ public class PermissionsManager implements Reloadable { // Remove each group return removeGroups(player, groupNames); } + + public void loadUserData(UUID uuid) { + if(!isEnabled()) { + return; + } + handler.loadUserData(uuid); + } + + public void loadUserData(String name) { + if(!isEnabled()) { + return; + } + handler.loadUserData(name); + } } diff --git a/src/main/java/fr/xephi/authme/permission/handlers/LuckPermsHandler.java b/src/main/java/fr/xephi/authme/permission/handlers/LuckPermsHandler.java index 63e862524..4f5dcb370 100644 --- a/src/main/java/fr/xephi/authme/permission/handlers/LuckPermsHandler.java +++ b/src/main/java/fr/xephi/authme/permission/handlers/LuckPermsHandler.java @@ -11,9 +11,7 @@ import me.lucko.luckperms.api.Node; import me.lucko.luckperms.api.User; import me.lucko.luckperms.api.caching.PermissionData; import me.lucko.luckperms.api.caching.UserData; -import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; -import org.bukkit.entity.Player; import java.util.Collections; import java.util.List; @@ -43,46 +41,6 @@ public class LuckPermsHandler implements PermissionHandler { } } - private User getUser(String playerName) { - Player player = Bukkit.getPlayerExact(playerName); - if (player != null) { - return getUser(player); - } - - UUID uuid = null; - try { - uuid = luckPermsApi.getStorage().getUUID(playerName).get(1, TimeUnit.SECONDS); - } catch (InterruptedException | ExecutionException | TimeoutException e) { - e.printStackTrace(); - } - if (uuid == null) { - return null; - } - - return getUser(uuid); - } - - private User getUser(OfflinePlayer player) { - return getUser(player.getUniqueId()); - } - - private User getUser(UUID playerUuid) { - User user = luckPermsApi.getUser(playerUuid); - if (user == null) { - // user not loaded, we need to load them from the storage. - // this is a blocking call. - try { - luckPermsApi.getStorage().loadUser(playerUuid).get(1, TimeUnit.SECONDS); - } catch (InterruptedException | TimeoutException | ExecutionException e) { - e.printStackTrace(); - } - - // then grab a new instance - user = luckPermsApi.getUser(playerUuid); - } - return user; - } - private void saveUser(User user) { luckPermsApi.getStorage().saveUser(user) .thenAcceptAsync(wasSuccessful -> { @@ -100,7 +58,7 @@ public class LuckPermsHandler implements PermissionHandler { return false; } - User user = getUser(player); + User user = luckPermsApi.getUser(player.getName()); if (user == null) { return false; } @@ -123,7 +81,7 @@ public class LuckPermsHandler implements PermissionHandler { @Override public boolean hasPermissionOffline(String name, PermissionNode node) { - User user = getUser(name); + User user = luckPermsApi.getUser(name); if (user == null) { return false; } @@ -138,7 +96,7 @@ public class LuckPermsHandler implements PermissionHandler { @Override public boolean isInGroup(OfflinePlayer player, String group) { - User user = getUser(player); + User user = luckPermsApi.getUser(player.getName()); if (user == null) { return false; } @@ -152,7 +110,7 @@ public class LuckPermsHandler implements PermissionHandler { @Override public boolean removeFromGroup(OfflinePlayer player, String group) { - User user = getUser(player); + User user = luckPermsApi.getUser(player.getName()); if (user == null) { return false; } @@ -171,7 +129,7 @@ public class LuckPermsHandler implements PermissionHandler { @Override public boolean setGroup(OfflinePlayer player, String group) { - User user = getUser(player); + User user = luckPermsApi.getUser(player.getName()); if (user == null) { return false; } @@ -193,7 +151,7 @@ public class LuckPermsHandler implements PermissionHandler { @Override public List getGroups(OfflinePlayer player) { - User user = getUser(player); + User user = luckPermsApi.getUser(player.getName()); if (user == null) { return Collections.emptyList(); } @@ -223,4 +181,24 @@ public class LuckPermsHandler implements PermissionHandler { public PermissionsSystemType getPermissionSystem() { return PermissionsSystemType.LUCK_PERMS; } + + @Override + public void loadUserData(UUID uuid) { + try { + luckPermsApi.getStorage().loadUser(uuid).get(5, TimeUnit.SECONDS); + } catch (InterruptedException | ExecutionException | TimeoutException e) { + e.printStackTrace(); + } + } + + @Override + public void loadUserData(String name) { + try { + UUID uuid = luckPermsApi.getStorage().getUUID(name).get(5, TimeUnit.SECONDS); + loadUserData(uuid); + } catch (InterruptedException | ExecutionException | TimeoutException e) { + e.printStackTrace(); + } + } + } diff --git a/src/main/java/fr/xephi/authme/permission/handlers/PermissionHandler.java b/src/main/java/fr/xephi/authme/permission/handlers/PermissionHandler.java index 161b512c7..fe3f54057 100644 --- a/src/main/java/fr/xephi/authme/permission/handlers/PermissionHandler.java +++ b/src/main/java/fr/xephi/authme/permission/handlers/PermissionHandler.java @@ -6,6 +6,7 @@ import fr.xephi.authme.util.Utils; import org.bukkit.OfflinePlayer; import java.util.Collection; +import java.util.UUID; public interface PermissionHandler { @@ -105,4 +106,11 @@ public interface PermissionHandler { * @return The permission system. */ PermissionsSystemType getPermissionSystem(); + + default void loadUserData(UUID uuid) { + } + + default void loadUserData(String name) { + } + } diff --git a/src/main/java/fr/xephi/authme/task/purge/PurgeExecutor.java b/src/main/java/fr/xephi/authme/task/purge/PurgeExecutor.java index 22086e091..04b7f5cc6 100644 --- a/src/main/java/fr/xephi/authme/task/purge/PurgeExecutor.java +++ b/src/main/java/fr/xephi/authme/task/purge/PurgeExecutor.java @@ -197,6 +197,11 @@ public class PurgeExecutor { } for (OfflinePlayer offlinePlayer : cleared) { + try { + permissionsManager.loadUserData(offlinePlayer.getUniqueId()); + } catch (NoSuchMethodError e) { + permissionsManager.loadUserData(offlinePlayer.getName()); + } permissionsManager.removeAllGroups(offlinePlayer); }