Skip to content

Commit 4b1f04a

Browse files
committed
let luckperms only handle players
1 parent 382aa5b commit 4b1f04a

File tree

1 file changed

+54
-14
lines changed

1 file changed

+54
-14
lines changed
Lines changed: 54 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,30 @@
11
package me.xginko.aef.utils.permissions;
22

3+
import com.github.benmanes.caffeine.cache.Cache;
4+
import com.github.benmanes.caffeine.cache.Caffeine;
35
import me.xginko.aef.utils.Crafty;
46
import me.xginko.aef.utils.enums.TriState;
57
import net.luckperms.api.LuckPerms;
68
import net.luckperms.api.model.user.User;
79
import net.luckperms.api.node.Node;
810
import org.bukkit.command.CommandSender;
11+
import org.bukkit.entity.Player;
12+
import org.bukkit.permissions.PermissionAttachmentInfo;
913
import org.bukkit.plugin.java.JavaPlugin;
1014

15+
import java.time.Duration;
16+
import java.util.Map;
17+
import java.util.concurrent.ConcurrentHashMap;
18+
1119
public final class LuckPermsPermissionHandler implements PermissionHandler {
1220

1321
private final LuckPerms luckPerms;
22+
private final Map<CommandSender, Cache<String, TriState>> permissionCacheMap;
23+
private final Duration permissionCacheDuration;
1424

1525
LuckPermsPermissionHandler(JavaPlugin plugin) {
26+
permissionCacheDuration = Duration.ofSeconds(5);
27+
permissionCacheMap = new ConcurrentHashMap<>();
1628
luckPerms = plugin.getServer().getServicesManager().getRegistration(LuckPerms.class).getProvider();
1729
}
1830

@@ -23,25 +35,53 @@ public static boolean isSupported(JavaPlugin plugin) {
2335

2436
@Override
2537
public TriState permissionValue(CommandSender commandSender, String permission) {
26-
switch (luckPerms.getPlayerAdapter(CommandSender.class).getUser(commandSender).getCachedData().getPermissionData()
27-
.checkPermission(permission)) {
28-
case TRUE:
29-
return TriState.TRUE;
30-
case FALSE:
31-
return TriState.FALSE;
32-
default:
33-
return TriState.UNDEFINED;
38+
if (commandSender instanceof Player) {
39+
switch (luckPerms.getPlayerAdapter(Player.class).getUser((Player) commandSender).getCachedData().getPermissionData()
40+
.checkPermission(permission)) {
41+
case TRUE:
42+
return TriState.TRUE;
43+
case FALSE:
44+
return TriState.FALSE;
45+
default:
46+
return TriState.UNDEFINED;
47+
}
48+
} else {
49+
Cache<String, TriState> permCache = permissionCacheMap.computeIfAbsent(commandSender, sender ->
50+
Caffeine.newBuilder().expireAfterWrite(permissionCacheDuration).build());
51+
TriState value = permCache.getIfPresent(permission);
52+
if (value == null) {
53+
value = commandSender.isPermissionSet(permission) ? TriState.of(commandSender.hasPermission(permission)) : TriState.UNDEFINED;
54+
permCache.put(permission, value);
55+
}
56+
return value;
3457
}
3558
}
3659

3760
@Override
3861
public void setPermission(CommandSender commandSender, String permission, TriState state) {
39-
User luckPermsUser = luckPerms.getPlayerAdapter(CommandSender.class).getUser(commandSender);
40-
if (state == TriState.UNDEFINED) {
41-
luckPermsUser.data().remove(Node.builder(permission).build());
42-
} else {
43-
luckPermsUser.data().add(Node.builder(permission).value(state.toBoolean()).build());
62+
if (commandSender instanceof Player) {
63+
User luckPermsUser = luckPerms.getPlayerAdapter(Player.class).getUser((Player) commandSender);
64+
if (state == TriState.UNDEFINED) {
65+
luckPermsUser.data().remove(Node.builder(permission).build());
66+
} else {
67+
luckPermsUser.data().add(Node.builder(permission).value(state.toBoolean()).build());
68+
}
69+
luckPerms.getUserManager().saveUser(luckPermsUser);
70+
return;
71+
}
72+
73+
for (PermissionAttachmentInfo attachmentInfo : commandSender.getEffectivePermissions()) {
74+
if (attachmentInfo.getAttachment() == null) {
75+
continue;
76+
}
77+
78+
if (attachmentInfo.getPermission().equals(permission)) {
79+
if (state == TriState.UNDEFINED) {
80+
commandSender.removeAttachment(attachmentInfo.getAttachment());
81+
} else {
82+
commandSender.addAttachment(attachmentInfo.getAttachment().getPlugin(), permission, state.toBoolean());
83+
}
84+
}
4485
}
45-
luckPerms.getUserManager().saveUser(luckPermsUser);
4686
}
4787
}

0 commit comments

Comments
 (0)