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.datasource.DataSource;
import fr.xephi.authme.message.MessageKey; import fr.xephi.authme.message.MessageKey;
import fr.xephi.authme.message.Messages; import fr.xephi.authme.message.Messages;
import fr.xephi.authme.permission.PermissionsManager;
import fr.xephi.authme.process.Management; import fr.xephi.authme.process.Management;
import fr.xephi.authme.service.AntiBotService; import fr.xephi.authme.service.AntiBotService;
import fr.xephi.authme.service.BukkitService; import fr.xephi.authme.service.BukkitService;
@ -79,6 +80,8 @@ public class PlayerListener implements Listener {
private ValidationService validationService; private ValidationService validationService;
@Inject @Inject
private JoinMessageService joinMessageService; private JoinMessageService joinMessageService;
@Inject
private PermissionsManager permissionsManager;
private static boolean isAsyncPlayerPreLoginEventCalled = false; private static boolean isAsyncPlayerPreLoginEventCalled = false;
@ -234,6 +237,13 @@ public class PlayerListener implements Listener {
return; return;
} }
// Keep pre-UUID compatibility
try {
permissionsManager.loadUserData(event.getUniqueId());
} catch (NoSuchMethodError e) {
permissionsManager.loadUserData(name);
}
try { try {
runOnJoinChecks(name, event.getAddress().getHostAddress()); runOnJoinChecks(name, event.getAddress().getHostAddress());
} catch (FailedVerificationException e) { } catch (FailedVerificationException e) {

View File

@ -23,6 +23,7 @@ import javax.annotation.PostConstruct;
import javax.inject.Inject; import javax.inject.Inject;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.UUID;
/** /**
* PermissionsManager. * PermissionsManager.
@ -425,4 +426,18 @@ public class PermissionsManager implements Reloadable {
// Remove each group // Remove each group
return removeGroups(player, groupNames); 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.User;
import me.lucko.luckperms.api.caching.PermissionData; import me.lucko.luckperms.api.caching.PermissionData;
import me.lucko.luckperms.api.caching.UserData; import me.lucko.luckperms.api.caching.UserData;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import java.util.Collections; import java.util.Collections;
import java.util.List; 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) { private void saveUser(User user) {
luckPermsApi.getStorage().saveUser(user) luckPermsApi.getStorage().saveUser(user)
.thenAcceptAsync(wasSuccessful -> { .thenAcceptAsync(wasSuccessful -> {
@ -100,7 +58,7 @@ public class LuckPermsHandler implements PermissionHandler {
return false; return false;
} }
User user = getUser(player); User user = luckPermsApi.getUser(player.getName());
if (user == null) { if (user == null) {
return false; return false;
} }
@ -123,7 +81,7 @@ public class LuckPermsHandler implements PermissionHandler {
@Override @Override
public boolean hasPermissionOffline(String name, PermissionNode node) { public boolean hasPermissionOffline(String name, PermissionNode node) {
User user = getUser(name); User user = luckPermsApi.getUser(name);
if (user == null) { if (user == null) {
return false; return false;
} }
@ -138,7 +96,7 @@ public class LuckPermsHandler implements PermissionHandler {
@Override @Override
public boolean isInGroup(OfflinePlayer player, String group) { public boolean isInGroup(OfflinePlayer player, String group) {
User user = getUser(player); User user = luckPermsApi.getUser(player.getName());
if (user == null) { if (user == null) {
return false; return false;
} }
@ -152,7 +110,7 @@ public class LuckPermsHandler implements PermissionHandler {
@Override @Override
public boolean removeFromGroup(OfflinePlayer player, String group) { public boolean removeFromGroup(OfflinePlayer player, String group) {
User user = getUser(player); User user = luckPermsApi.getUser(player.getName());
if (user == null) { if (user == null) {
return false; return false;
} }
@ -171,7 +129,7 @@ public class LuckPermsHandler implements PermissionHandler {
@Override @Override
public boolean setGroup(OfflinePlayer player, String group) { public boolean setGroup(OfflinePlayer player, String group) {
User user = getUser(player); User user = luckPermsApi.getUser(player.getName());
if (user == null) { if (user == null) {
return false; return false;
} }
@ -193,7 +151,7 @@ public class LuckPermsHandler implements PermissionHandler {
@Override @Override
public List<String> getGroups(OfflinePlayer player) { public List<String> getGroups(OfflinePlayer player) {
User user = getUser(player); User user = luckPermsApi.getUser(player.getName());
if (user == null) { if (user == null) {
return Collections.emptyList(); return Collections.emptyList();
} }
@ -223,4 +181,24 @@ public class LuckPermsHandler implements PermissionHandler {
public PermissionsSystemType getPermissionSystem() { public PermissionsSystemType getPermissionSystem() {
return PermissionsSystemType.LUCK_PERMS; 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 org.bukkit.OfflinePlayer;
import java.util.Collection; import java.util.Collection;
import java.util.UUID;
public interface PermissionHandler { public interface PermissionHandler {
@ -105,4 +106,11 @@ public interface PermissionHandler {
* @return The permission system. * @return The permission system.
*/ */
PermissionsSystemType getPermissionSystem(); 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) { for (OfflinePlayer offlinePlayer : cleared) {
try {
permissionsManager.loadUserData(offlinePlayer.getUniqueId());
} catch (NoSuchMethodError e) {
permissionsManager.loadUserData(offlinePlayer.getName());
}
permissionsManager.removeAllGroups(offlinePlayer); permissionsManager.removeAllGroups(offlinePlayer);
} }