11package me .xginko .aef .utils .permissions ;
22
3+ import com .github .benmanes .caffeine .cache .Cache ;
4+ import com .github .benmanes .caffeine .cache .Caffeine ;
35import me .xginko .aef .utils .Crafty ;
46import me .xginko .aef .utils .enums .TriState ;
57import net .luckperms .api .LuckPerms ;
68import net .luckperms .api .model .user .User ;
79import net .luckperms .api .node .Node ;
810import org .bukkit .command .CommandSender ;
11+ import org .bukkit .entity .Player ;
12+ import org .bukkit .permissions .PermissionAttachmentInfo ;
913import org .bukkit .plugin .java .JavaPlugin ;
1014
15+ import java .time .Duration ;
16+ import java .util .Map ;
17+ import java .util .concurrent .ConcurrentHashMap ;
18+
1119public 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