Add a way to load user's permission data from the permission handler on demand.

#1350
This commit is contained in:
Gabriele C 2017-10-29 19:35:23 +01:00
parent 316f8fc642
commit a5542051f4
5 changed files with 64 additions and 48 deletions

View File

@ -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) {

View File

@ -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);
}
}

View File

@ -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<String> 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();
}
}
}

View File

@ -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) {
}
}

View File

@ -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);
}