Skip to content

Commit de42aa8

Browse files
committed
Fix permissions
1 parent f228b78 commit de42aa8

File tree

5 files changed

+78
-25
lines changed

5 files changed

+78
-25
lines changed

src/main/java/fr/gamecreep/basichomes/BasicHomes.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.bstats.bukkit.Metrics;
2222
import org.bstats.charts.SimplePie;
2323
import org.bukkit.configuration.file.FileConfiguration;
24+
import org.bukkit.entity.Player;
2425
import org.bukkit.permissions.PermissionAttachment;
2526
import org.bukkit.plugin.PluginManager;
2627
import org.bukkit.plugin.java.JavaPlugin;
@@ -43,6 +44,7 @@ public final class BasicHomes extends JavaPlugin {
4344
public void onEnable() {
4445
this.migrationsVerifier.verifyMigrations();
4546
this.loadConfig();
47+
this.loadPlayerPermissions();
4648
this.loadCommands();
4749
this.loadEvents();
4850
this.loadMetrics();
@@ -56,6 +58,12 @@ public void onDisable() {
5658
LoggerUtils.logInfo("Plugin successfully stopped !");
5759
}
5860

61+
private void loadPlayerPermissions() {
62+
for (Player player : getServer().getOnlinePlayers()) {
63+
this.permissionDataHandler.handlePlayerJoin(player);
64+
}
65+
}
66+
5967
private void loadCommands() {
6068
Objects.requireNonNull(super.getCommand("config")).setExecutor(new ConfigCommand(this));
6169
Objects.requireNonNull(super.getCommand("permissions")).setExecutor(new PermissionCommand(this));

src/main/java/fr/gamecreep/basichomes/commands/homes/GetHomes.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@
22

33
import fr.gamecreep.basichomes.BasicHomes;
44
import fr.gamecreep.basichomes.entities.SavedPosition;
5+
import fr.gamecreep.basichomes.entities.enums.Permission;
56
import fr.gamecreep.basichomes.entities.enums.PositionType;
67
import fr.gamecreep.basichomes.menus.home.HomeMenu;
78
import fr.gamecreep.basichomes.menus.home.HomeMenuFactory;
9+
import fr.gamecreep.basichomes.utils.ChatUtils;
810
import lombok.NonNull;
911
import org.bukkit.command.CommandSender;
1012
import org.bukkit.entity.Player;
@@ -21,6 +23,11 @@ public GetHomes(final BasicHomes plugin) {
2123

2224
public boolean onCommand(@NonNull final CommandSender commandSender) {
2325
if (commandSender instanceof Player playerSender) {
26+
if (!playerSender.hasPermission(Permission.USE_HOME.getName())) {
27+
ChatUtils.sendNoPermission(playerSender, Permission.USE_HOME);
28+
return true;
29+
}
30+
2431
final HomeMenuFactory factory = this.plugin.getHomeMenuFactory();
2532
final List<SavedPosition> homes = this.plugin.getPositionDataHandler().getAllByPlayer(PositionType.HOME, playerSender);
2633

src/main/java/fr/gamecreep/basichomes/commands/warps/GetWarps.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@
22

33
import fr.gamecreep.basichomes.BasicHomes;
44
import fr.gamecreep.basichomes.entities.SavedPosition;
5+
import fr.gamecreep.basichomes.entities.enums.Permission;
56
import fr.gamecreep.basichomes.entities.enums.PositionType;
67
import fr.gamecreep.basichomes.menus.warp.WarpMenu;
78
import fr.gamecreep.basichomes.menus.warp.WarpMenuFactory;
9+
import fr.gamecreep.basichomes.utils.ChatUtils;
810
import lombok.NonNull;
911
import org.bukkit.command.CommandSender;
1012
import org.bukkit.entity.Player;
@@ -21,6 +23,11 @@ public GetWarps(BasicHomes plugin) {
2123

2224
public boolean onCommand(@NonNull final CommandSender commandSender) {
2325
if (commandSender instanceof Player playerSender) {
26+
if (!playerSender.hasPermission(Permission.USE_WARP.getName())) {
27+
ChatUtils.sendNoPermission(playerSender, Permission.USE_WARP);
28+
return true;
29+
}
30+
2431
final WarpMenuFactory factory = this.plugin.getWarpMenuFactory();
2532
final List<SavedPosition> warps = this.plugin.getPositionDataHandler().getAll(PositionType.WARP);
2633

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
package fr.gamecreep.basichomes.events;
22

33
import fr.gamecreep.basichomes.BasicHomes;
4-
import lombok.NonNull;
54
import org.bukkit.event.EventHandler;
5+
import org.bukkit.event.EventPriority;
66
import org.bukkit.event.Listener;
77
import org.bukkit.event.player.PlayerJoinEvent;
8+
import org.bukkit.event.player.PlayerQuitEvent;
89

910
public class PermissionEvents implements Listener {
1011

@@ -14,8 +15,13 @@ public PermissionEvents(BasicHomes plugin) {
1415
this.plugin = plugin;
1516
}
1617

18+
@EventHandler(priority = EventPriority.LOWEST)
19+
private void onPlayerJoin(PlayerJoinEvent event) {
20+
this.plugin.getPermissionDataHandler().handlePlayerJoin(event.getPlayer());
21+
}
22+
1723
@EventHandler
18-
private void onPlayerJoin(@NonNull final PlayerJoinEvent event) {
19-
this.plugin.getPermissionDataHandler().applyPermissions(event.getPlayer());
24+
private void onPlayerQuit(PlayerQuitEvent event) {
25+
this.plugin.getPermissionDataHandler().handlePlayerQuit(event.getPlayer());
2026
}
2127
}

src/main/java/fr/gamecreep/basichomes/files/PermissionDataHandler.java

Lines changed: 47 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import fr.gamecreep.basichomes.entities.permissions.DefaultPermissions;
66
import fr.gamecreep.basichomes.entities.permissions.PermissionFile;
77
import fr.gamecreep.basichomes.entities.permissions.PlayerPermissions;
8+
import fr.gamecreep.basichomes.utils.LoggerUtils;
89
import lombok.NonNull;
910
import org.bukkit.entity.Player;
1011
import org.bukkit.permissions.PermissionAttachment;
@@ -27,7 +28,11 @@ public void setPermission(@NonNull final UUID playerId, @NonNull final String pe
2728
final PlayerPermissions entry = getOrCreatePlayerEntry(playerId);
2829
entry.getPermissions().put(permissionNode, value);
2930
this.dataStore.save();
30-
this.applyPermissions(playerId);
31+
32+
Player player = this.plugin.getServer().getPlayer(playerId);
33+
if (player != null) {
34+
this.refreshPermissions(player);
35+
}
3136
}
3237

3338
public void setDefaultPermission(@NonNull final DefaultPermissions.GroupPermission group,
@@ -43,7 +48,11 @@ public void removePermission(@NonNull final UUID playerId, @NonNull final String
4348
final PlayerPermissions entry = getOrCreatePlayerEntry(playerId);
4449
entry.getPermissions().remove(permissionNode);
4550
this.dataStore.save();
46-
this.applyPermissions(playerId);
51+
52+
Player player = this.plugin.getServer().getPlayer(playerId);
53+
if (player != null) {
54+
this.refreshPermissions(player);
55+
}
4756
}
4857

4958
public void removeDefaultPermission(@NonNull final DefaultPermissions.GroupPermission group,
@@ -138,36 +147,52 @@ public List<DefaultPermissions.GroupPermission> getPlayerGroups(@NonNull final P
138147
return groups;
139148
}
140149

141-
public void applyPermissions(@NonNull final Player player) {
142-
final UUID playerId = player.getUniqueId();
143-
144-
final PermissionAttachment oldAttachment = this.plugin.getPermissionAttachments().remove(playerId);
145-
if (oldAttachment != null) {
146-
player.removeAttachment(oldAttachment);
150+
private void applyDefaultPermissions() {
151+
for (final Player player : this.plugin.getServer().getOnlinePlayers()) {
152+
this.refreshPermissions(player);
147153
}
154+
}
155+
156+
public void refreshPermissions(@NonNull Player player) {
157+
UUID uuid = player.getUniqueId();
158+
PermissionAttachment attachment = this.plugin.getPermissionAttachments().get(uuid);
148159

149-
final PermissionAttachment newAttachment = player.addAttachment(this.plugin);
160+
if (attachment == null) {
161+
// Fallback: create a new attachment
162+
attachment = player.addAttachment(this.plugin);
163+
this.plugin.getPermissionAttachments().put(uuid, attachment);
164+
LoggerUtils.logInfo("Recreating permission attachment for player " + uuid);
165+
}
150166

151-
final List<DefaultPermissions.GroupPermission> groups = this.getPlayerGroups(player);
152-
for (final DefaultPermissions.GroupPermission group : groups) {
153-
this.getDefaultPermissions(group).forEach(newAttachment::setPermission);
167+
for (String key : new HashSet<>(attachment.getPermissions().keySet())) {
168+
attachment.unsetPermission(key);
154169
}
155170

156-
this.getPlayerPermissions(playerId).forEach(newAttachment::setPermission);
171+
for (DefaultPermissions.GroupPermission group : getPlayerGroups(player)) {
172+
getDefaultPermissions(group).forEach(attachment::setPermission);
173+
}
157174

158-
this.plugin.getPermissionAttachments().put(playerId, newAttachment);
175+
getPlayerPermissions(uuid).forEach(attachment::setPermission);
159176
}
160177

161-
public void applyPermissions(@NonNull final UUID playerId) {
162-
final Player player = this.plugin.getServer().getPlayer(playerId);
163-
if (player != null && player.isOnline()) {
164-
this.applyPermissions(player);
165-
}
178+
public void handlePlayerJoin(Player player) {
179+
PermissionAttachment attachment = player.addAttachment(this.plugin);
180+
this.plugin.getPermissionAttachments().put(player.getUniqueId(), attachment);
181+
182+
this.refreshPermissions(player);
166183
}
167184

168-
private void applyDefaultPermissions() {
169-
for (final Player player : this.plugin.getServer().getOnlinePlayers()) {
170-
this.applyPermissions(player);
185+
public void handlePlayerQuit(Player player) {
186+
UUID uuid = player.getUniqueId();
187+
PermissionAttachment att = this.plugin.getPermissionAttachments().remove(uuid);
188+
189+
if (att != null) {
190+
try {
191+
player.removeAttachment(att);
192+
} catch (IllegalArgumentException ignored) {
193+
LoggerUtils.logWarning("Unable to remove permission attachment for player " + uuid);
194+
}
171195
}
172196
}
197+
173198
}

0 commit comments

Comments
 (0)