Skip to content

Commit

Permalink
Make player authentication async
Browse files Browse the repository at this point in the history
  • Loading branch information
Pequla committed Sep 9, 2023
1 parent 87f91b3 commit b81ed4f
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 45 deletions.
10 changes: 5 additions & 5 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

<groupId>com.samifying</groupId>
<artifactId>hidey-link</artifactId>
<version>1.1</version>
<version>1.2</version>
<packaging>jar</packaging>

<name>HideyLink</name>
Expand Down Expand Up @@ -68,7 +68,7 @@
<dependency>
<groupId>io.papermc.paper</groupId>
<artifactId>paper-api</artifactId>
<version>1.19.2-R0.1-SNAPSHOT</version>
<version>1.20.1-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
Expand All @@ -80,18 +80,18 @@
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<version>1.18.28</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.13.4</version>
<version>2.15.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.4.2</version>
<version>2.15.2</version>
</dependency>
</dependencies>

Expand Down
74 changes: 34 additions & 40 deletions src/main/java/com/samifying/hideylink/listener/LoginListener.java
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand All @@ -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");
Expand All @@ -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<User> future = manager.loadUser(player.getUniqueId());
future.thenAcceptAsync(user -> {

CompletableFuture<User> 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<User> 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);
}
});
}
}

0 comments on commit b81ed4f

Please sign in to comment.