Skip to content

Commit 922c9e4

Browse files
committed
Improved offline permission query system
1 parent 69f3eda commit 922c9e4

File tree

9 files changed

+71
-107
lines changed

9 files changed

+71
-107
lines changed

bukkit/src/main/java/me/leoko/advancedban/bukkit/BukkitMethods.java

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import me.leoko.advancedban.manager.DatabaseManager;
99
import me.leoko.advancedban.manager.PunishmentManager;
1010
import me.leoko.advancedban.manager.UUIDManager;
11+
import me.leoko.advancedban.utils.Permissionable;
1112
import me.leoko.advancedban.utils.Punishment;
1213
import me.leoko.advancedban.utils.tabcompletion.TabCompleter;
1314
import org.bstats.bukkit.Metrics;
@@ -183,16 +184,12 @@ public boolean hasPerms(Object player, String perms) {
183184
}
184185

185186
@Override
186-
public boolean hasOfflinePerms(String name, String perms) {
187-
if (permissionVault == null)
188-
return false;
189-
187+
public Permissionable getOfflinePermissionPlayer(String name) {
190188
OfflinePlayer player = Bukkit.getOfflinePlayer(name);
189+
if(permissionVault == null || player == null || !player.hasPlayedBefore())
190+
return permission -> false;
191191

192-
if (player == null || !player.hasPlayedBefore())
193-
return false;
194-
195-
return permissionVault.apply(player, perms);
192+
return permission -> permissionVault.apply(player, permission);
196193
}
197194

198195
@SuppressWarnings("deprecation")

bungee/src/main/java/me/leoko/advancedban/bungee/BungeeMethods.java

Lines changed: 8 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@
1010
import me.leoko.advancedban.bungee.event.PunishmentEvent;
1111
import me.leoko.advancedban.bungee.event.RevokePunishmentEvent;
1212
import me.leoko.advancedban.bungee.listener.CommandReceiverBungee;
13-
import me.leoko.advancedban.bungee.utils.LuckPermsPermissionProvider;
14-
import me.leoko.advancedban.bungee.utils.OfflinePermissionProvider;
13+
import me.leoko.advancedban.bungee.utils.LuckPermsOfflineUser;
1514
import me.leoko.advancedban.manager.DatabaseManager;
1615
import me.leoko.advancedban.manager.PunishmentManager;
1716
import me.leoko.advancedban.manager.UUIDManager;
17+
import me.leoko.advancedban.utils.Permissionable;
1818
import me.leoko.advancedban.utils.Punishment;
1919
import me.leoko.advancedban.utils.tabcompletion.TabCompleter;
2020
import net.md_5.bungee.api.ChatColor;
@@ -52,13 +52,14 @@ public class BungeeMethods implements MethodInterface {
5252
private Configuration layouts;
5353
private Configuration mysql;
5454

55-
private OfflinePermissionProvider offlinePermissionProvider;
55+
private final boolean luckPermsSupport;
5656

5757
public BungeeMethods() {
5858
if (ProxyServer.getInstance().getPluginManager().getPlugin("LuckPerms") != null) {
59-
offlinePermissionProvider = new LuckPermsPermissionProvider();
59+
luckPermsSupport = true;
6060
log("[AdvancedBan] Offline permission support through LuckPerms active");
6161
} else {
62+
luckPermsSupport = false;
6263
log("[AdvancedBan] No offline permission support through LuckPerms");
6364
}
6465
}
@@ -185,22 +186,10 @@ public boolean hasPerms(Object player, String perms) {
185186
}
186187

187188
@Override
188-
public void requestOfflinePermissionPlayer(String name) {
189-
if(offlinePermissionProvider != null) {
190-
offlinePermissionProvider.requestOfflinePermissionPlayer(name);
191-
}
192-
}
189+
public Permissionable getOfflinePermissionPlayer(String name) {
190+
if(luckPermsSupport) return new LuckPermsOfflineUser(name);
193191

194-
@Override
195-
public void releaseOfflinePermissionPlayer(String name) {
196-
if(offlinePermissionProvider != null) {
197-
offlinePermissionProvider.releaseOfflinePermissionPlayer(name);
198-
}
199-
}
200-
201-
@Override
202-
public boolean hasOfflinePerms(String name, String perms) {
203-
return offlinePermissionProvider != null && offlinePermissionProvider.hasOfflinePerms(name, perms);
192+
return permission -> false;
204193
}
205194

206195
@Override
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package me.leoko.advancedban.bungee.utils;
2+
3+
import me.leoko.advancedban.utils.Permissionable;
4+
import net.luckperms.api.LuckPermsProvider;
5+
import net.luckperms.api.model.user.User;
6+
import net.luckperms.api.model.user.UserManager;
7+
8+
import java.util.UUID;
9+
10+
public class LuckPermsOfflineUser implements Permissionable {
11+
private User permissionUser;
12+
13+
public LuckPermsOfflineUser(String name) {
14+
final UserManager userManager = LuckPermsProvider.get().getUserManager();
15+
final UUID uuid = userManager.lookupUniqueId(name).join();
16+
if (uuid != null) {
17+
this.permissionUser = userManager.loadUser(uuid).join();
18+
}
19+
}
20+
21+
@Override
22+
public boolean hasPermission(String permission) {
23+
return permissionUser != null && permissionUser.getCachedData().getPermissionData().checkPermission(permission).asBoolean();
24+
}
25+
}

bungee/src/main/java/me/leoko/advancedban/bungee/utils/LuckPermsPermissionProvider.java

Lines changed: 0 additions & 42 deletions
This file was deleted.

bungee/src/main/java/me/leoko/advancedban/bungee/utils/OfflinePermissionProvider.java

Lines changed: 0 additions & 7 deletions
This file was deleted.

core/src/main/java/me/leoko/advancedban/MethodInterface.java

Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package me.leoko.advancedban;
22

3+
import me.leoko.advancedban.utils.Permissionable;
34
import me.leoko.advancedban.utils.Punishment;
45
import me.leoko.advancedban.utils.tabcompletion.TabCompleter;
56

@@ -151,27 +152,12 @@ public interface MethodInterface {
151152
boolean hasPerms(Object player, String perms);
152153

153154
/**
154-
* Load necessary permission data for an offline permission check
155+
* Get a Permissionable player that can be checked for offline permissions.
155156
*
156-
* @param name the player's name
157+
* @param name the name of the user
158+
* @return the offline permission user
157159
*/
158-
default void requestOfflinePermissionPlayer(String name){}
159-
160-
/**
161-
* Release cached permission data of a player after all requests are done
162-
*
163-
* @param name the player's name
164-
*/
165-
default void releaseOfflinePermissionPlayer(String name){}
166-
167-
/**
168-
* Check if an offline player has the given permission.
169-
*
170-
* @param name server intern identifier for player
171-
* @param perms the perms
172-
* @return the boolean
173-
*/
174-
boolean hasOfflinePerms(String name, String perms);
160+
Permissionable getOfflinePermissionPlayer(String name);
175161

176162
/**
177163
* Check whether player is online.
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package me.leoko.advancedban.utils;
2+
3+
/**
4+
* The Permissionable interface defines a way to query whether the implementing object has a certain permission.
5+
*/
6+
@FunctionalInterface
7+
public interface Permissionable {
8+
/**
9+
* Checks whether the implementing object has the given permission
10+
*
11+
* @param permission the permission to check
12+
* @return the result
13+
*/
14+
boolean hasPermission(String permission);
15+
}

core/src/main/java/me/leoko/advancedban/utils/commands/PunishmentProcessor.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import me.leoko.advancedban.manager.PunishmentManager;
77
import me.leoko.advancedban.manager.TimeManager;
88
import me.leoko.advancedban.utils.Command;
9+
import me.leoko.advancedban.utils.Permissionable;
910
import me.leoko.advancedban.utils.Punishment;
1011
import me.leoko.advancedban.utils.PunishmentType;
1112

@@ -118,17 +119,17 @@ private static boolean processExempt(String name, String target, Object sender,
118119
MethodInterface mi = Universal.get().getMethods();
119120
String dataName = name.toLowerCase();
120121

121-
boolean onlineExempt = false;
122+
boolean exempt = false;
122123
if (mi.isOnline(dataName)) {
123124
Object onlineTarget = mi.getPlayer(dataName);
124-
onlineExempt = canNotPunish((perms) -> mi.hasPerms(sender, perms), (perms) -> mi.hasPerms(onlineTarget, perms), type.getName());
125+
exempt = canNotPunish((perms) -> mi.hasPerms(sender, perms), (perms) -> mi.hasPerms(onlineTarget, perms), type.getName());
126+
} else {
127+
final Permissionable offlinePermissionPlayer = mi.getOfflinePermissionPlayer(name);
128+
exempt = Universal.get().isExemptPlayer(dataName) ||
129+
canNotPunish((perms) -> mi.hasPerms(sender, perms), offlinePermissionPlayer::hasPermission, type.getName());
125130
}
126131

127-
mi.requestOfflinePermissionPlayer(name);
128-
boolean offlineExempt = !onlineExempt && (Universal.get().isExemptPlayer(dataName) || canNotPunish((perms) -> mi.hasPerms(sender, perms), (perms) -> mi.hasOfflinePerms(name, perms), type.getName()));
129-
mi.releaseOfflinePermissionPlayer(name);
130-
131-
if (onlineExempt || offlineExempt) {
132+
if (exempt) {
132133
MessageManager.sendMessage(sender, type.getBasic().getName() + ".Exempt",
133134
true, "NAME", name);
134135
return true;

core/src/test/java/me/leoko/advancedban/TestMethods.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
package me.leoko.advancedban;
22

3+
import me.leoko.advancedban.utils.Permissionable;
34
import me.leoko.advancedban.utils.Punishment;
45
import me.leoko.advancedban.utils.tabcompletion.TabCompleter;
56

6-
import static org.junit.jupiter.api.Assertions.fail;
7-
87
import java.io.File;
98
import java.io.InputStreamReader;
109
import java.util.ArrayList;
1110
import java.util.List;
1211
import java.util.Objects;
1312

13+
import static org.junit.jupiter.api.Assertions.fail;
14+
1415
/**
1516
* Created by Leo on 07.08.2017.
1617
*/
1718
public class TestMethods implements MethodInterface {
18-
1919
private final File dataFolder;
2020

2121
public TestMethods(File dataFolder){
@@ -128,8 +128,8 @@ public boolean hasPerms(Object player, String perms) {
128128
}
129129

130130
@Override
131-
public boolean hasOfflinePerms(String name, String perms) {
132-
return false;
131+
public Permissionable getOfflinePermissionPlayer(String name) {
132+
return permission -> false;
133133
}
134134

135135
@Override

0 commit comments

Comments
 (0)