diff --git a/pom.xml b/pom.xml index 22527eb..4d4b3f0 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.samifying hidey-link - 1.1 + 1.2 jar HideyLink @@ -68,7 +68,7 @@ io.papermc.paper paper-api - 1.19.2-R0.1-SNAPSHOT + 1.20.1-R0.1-SNAPSHOT provided @@ -80,18 +80,18 @@ org.projectlombok lombok - 1.18.24 + 1.18.28 provided com.fasterxml.jackson.core jackson-core - 2.13.4 + 2.15.2 com.fasterxml.jackson.core jackson-databind - 2.13.4.2 + 2.15.2 diff --git a/src/main/java/com/samifying/hideylink/listener/LoginListener.java b/src/main/java/com/samifying/hideylink/listener/LoginListener.java index c1e09cb..247d92b 100644 --- a/src/main/java/com/samifying/hideylink/listener/LoginListener.java +++ b/src/main/java/com/samifying/hideylink/listener/LoginListener.java @@ -9,30 +9,30 @@ import net.luckperms.api.model.user.User; import net.luckperms.api.model.user.UserManager; import net.luckperms.api.node.Node; +import net.luckperms.api.node.NodeEqualityPredicate; import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerLoginEvent; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; +import java.util.UUID; import java.util.concurrent.CompletableFuture; import java.util.logging.Logger; public class LoginListener implements Listener { private final HideyLink plugin; - private final LuckPerms perms; + private final UserManager manager; private final HttpClient client; private final ObjectMapper mapper; public LoginListener(HideyLink plugin, LuckPerms perms) { this.plugin = plugin; - this.perms = perms; + this.manager = perms.getUserManager(); // Registering http client this.client = HttpClient.newBuilder() @@ -45,19 +45,18 @@ public LoginListener(HideyLink plugin, LuckPerms perms) { mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); } - @EventHandler(priority = EventPriority.LOWEST) - public void onPlayerLogin(PlayerLoginEvent event) { + @EventHandler + public void onAsyncPlayerPreLogin(AsyncPlayerPreLoginEvent event) { try { - Player player = event.getPlayer(); + UUID uuid = event.getUniqueId(); // Skip if the player is banned if (plugin.getServer().getBannedPlayers().stream().anyMatch(p -> - p.getUniqueId().equals(player.getUniqueId()))) { + p.getUniqueId().equals(uuid))) { return; } // Retrieving properties - String uuid = player.getUniqueId().toString(); FileConfiguration config = plugin.getConfig(); String guild = config.getString("auth.guild"); String role = config.getString("auth.role"); @@ -79,60 +78,55 @@ public void onPlayerLogin(PlayerLoginEvent event) { DataModel model = mapper.readValue(rsp.body(), DataModel.class); // Managing the permissions - new Thread(() -> { - managePermission(player, model.isSupporter(), "group.supporter"); - managePermission(player, model.isModerator(), "group.moderator"); - }, "PermissionManagerThread").start(); + managePermission(uuid, event.getName(), model.isSupporter(), "group.supporter"); + managePermission(uuid, event.getName(), model.isModerator(), "group.moderator"); // Saving data to cache - plugin.getPlayers().put(player.getUniqueId(), model); - plugin.getLogger().info("Player " + player.getName() + " authenticated as " + model.getName()); + plugin.getPlayers().put(uuid, model); + plugin.getLogger().info("Player " + event.getName() + " authenticated as " + model.getName()); return; } // Backend exception if (rsp.statusCode() == 500) { ErrorModel model = mapper.readValue(rsp.body(), ErrorModel.class); - plugin.getLogger().info("Player " + player.getName() + " was rejected"); + plugin.getLogger().info("Player " + event.getName() + " was rejected"); throw new RuntimeException(model.getMessage()); } // General exception throw new RuntimeException("Authorization failed"); } catch (Exception e) { - event.disallow(PlayerLoginEvent.Result.KICK_OTHER, + event.disallow(AsyncPlayerPreLoginEvent.Result.KICK_OTHER, e.getClass().getSimpleName() + ": " + e.getMessage()); } } - private void managePermission(Player player, boolean isAllowed, String group) { + private void managePermission(UUID uuid, String name, boolean isAllowed, String group) { Logger logger = plugin.getLogger(); - UserManager manager = perms.getUserManager(); - - // Player has the group - if (player.hasPermission(group)) { - if (!isAllowed) { - // Player is not allowed to have that permission - CompletableFuture future = manager.loadUser(player.getUniqueId()); - future.thenAcceptAsync(user -> { + + CompletableFuture future = manager.loadUser(uuid); + future.thenAcceptAsync(user -> { + Node groupNode = Node.builder(group).build(); + + // Player has the group + if (user.data().contains(groupNode, NodeEqualityPredicate.EXACT).asBoolean()) { + if (!isAllowed) { user.data().remove(Node.builder(group).build()); manager.saveUser(user); - }); - logger.info("Group permission " + group + " was removed from " + player.getName()); - } + logger.info("Group permission " + group + " was removed from " + name); + } - // Player is allowed and has the group - return; - } + // Player is allowed and has the group + return; + } - // Player is allowed but does not have the group - if (isAllowed) { - CompletableFuture future = manager.loadUser(player.getUniqueId()); - future.thenAcceptAsync(user -> { + // Player is allowed but does not have the group + if (isAllowed) { user.data().add(Node.builder(group).build()); manager.saveUser(user); - }); - logger.info("Group permission " + group + " was added to " + player.getName()); - } + logger.info("Group permission " + group + " was added to " + name); + } + }); } }