diff --git a/src/main/java/org/mvplugins/multiverse/core/commandtools/MVCommandPermissions.java b/src/main/java/org/mvplugins/multiverse/core/commandtools/MVCommandPermissions.java index bf0f84444..cec15b7c8 100644 --- a/src/main/java/org/mvplugins/multiverse/core/commandtools/MVCommandPermissions.java +++ b/src/main/java/org/mvplugins/multiverse/core/commandtools/MVCommandPermissions.java @@ -7,6 +7,7 @@ import org.jetbrains.annotations.NotNull; import org.jvnet.hk2.annotations.Service; import org.mvplugins.multiverse.core.permissions.CorePermissionsChecker; +import org.mvplugins.multiverse.core.permissions.PermissionUtils; import java.util.HashMap; import java.util.Locale; @@ -54,6 +55,6 @@ public void registerPermissionChecker(String id, Predicate checke boolean hasPermission(CommandIssuer issuer, String permission) { return Option.of(permissionsCheckMap.get(permission)) .map(checker -> checker.test(issuer)) - .getOrElse(() -> permissionsChecker.hasPermission(issuer.getIssuer(), permission)); + .getOrElse(() -> PermissionUtils.hasPermission(issuer.getIssuer(), permission)); } } diff --git a/src/main/java/org/mvplugins/multiverse/core/destination/DestinationsProvider.java b/src/main/java/org/mvplugins/multiverse/core/destination/DestinationsProvider.java index 2ad7ec44b..fea397854 100644 --- a/src/main/java/org/mvplugins/multiverse/core/destination/DestinationsProvider.java +++ b/src/main/java/org/mvplugins/multiverse/core/destination/DestinationsProvider.java @@ -13,6 +13,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jvnet.hk2.annotations.Service; +import org.mvplugins.multiverse.core.permissions.CorePermissions; /** * Provides destinations for teleportation. @@ -22,13 +23,13 @@ public class DestinationsProvider { private static final String SEPARATOR = ":"; private static final String PERMISSION_PREFIX = "multiverse.teleport."; - private final PluginManager pluginManager; private final Map> destinationMap; + private final CorePermissions corePermissions; @Inject - DestinationsProvider(@NotNull PluginManager pluginManager) { - this.pluginManager = pluginManager; + DestinationsProvider(@NotNull CorePermissions corePermissions) { this.destinationMap = new HashMap<>(); + this.corePermissions = corePermissions; } /** @@ -38,12 +39,7 @@ public class DestinationsProvider { */ public void registerDestination(@NotNull Destination destination) { this.destinationMap.put(destination.getIdentifier(), destination); - this.registerDestinationPerms(destination); - } - - private void registerDestinationPerms(@NotNull Destination destination) { - pluginManager.addPermission(new Permission(PERMISSION_PREFIX + "self." + destination.getIdentifier())); - pluginManager.addPermission(new Permission(PERMISSION_PREFIX + "other." + destination.getIdentifier())); + this.corePermissions.addDestinationPermissions(destination); } /** diff --git a/src/main/java/org/mvplugins/multiverse/core/permissions/CorePermissions.java b/src/main/java/org/mvplugins/multiverse/core/permissions/CorePermissions.java index 550e08c37..8e84adfb0 100644 --- a/src/main/java/org/mvplugins/multiverse/core/permissions/CorePermissions.java +++ b/src/main/java/org/mvplugins/multiverse/core/permissions/CorePermissions.java @@ -1,6 +1,19 @@ package org.mvplugins.multiverse.core.permissions; -final class CorePermissions { +import com.dumptruckman.minecraft.util.Logging; +import io.vavr.control.Try; +import jakarta.inject.Inject; +import org.bukkit.permissions.Permission; +import org.bukkit.plugin.PluginManager; +import org.jetbrains.annotations.NotNull; +import org.jvnet.hk2.annotations.Service; +import org.mvplugins.multiverse.core.destination.Destination; +import org.mvplugins.multiverse.core.world.MultiverseWorld; + +import static org.mvplugins.multiverse.core.permissions.PermissionUtils.concatPermission; + +@Service +public final class CorePermissions { /** * Permission to access a world. */ @@ -31,7 +44,51 @@ final class CorePermissions { */ static final String SPAWN = "multiverse.core.spawn"; - private CorePermissions() { - // Prevent instantiation as this is a static utility class + private final PluginManager pluginManager; + + @Inject + CorePermissions(PluginManager pluginManager) { + this.pluginManager = pluginManager; + } + + public Try addWorldPermissions(@NotNull MultiverseWorld world) { + return Try.run(() -> { + pluginManager.addPermission(new Permission(concatPermission(WORLD_ACCESS, world.getName()))); + pluginManager.addPermission(new Permission(concatPermission(WORLD_EXEMPT, world.getName()))); + pluginManager.addPermission(new Permission(concatPermission(GAMEMODE_BYPASS, world.getName()))); + pluginManager.addPermission(new Permission(concatPermission(PLAYERLIMIT_BYPASS, world.getName()))); + pluginManager.addPermission(new Permission(concatPermission(SPAWN, world.getName()))); + pluginManager.addPermission(new Permission(concatPermission(SPAWN, "self", world.getName()))); + pluginManager.addPermission(new Permission(concatPermission(SPAWN, "other", world.getName()))); + Logging.fine("Successfully registered permissions for world %s", world.getName()); + }); + } + + public Try removeWorldPermissions(@NotNull MultiverseWorld world) { + return Try.run(() -> { + pluginManager.removePermission(concatPermission(WORLD_ACCESS, world.getName())); + pluginManager.removePermission(concatPermission(WORLD_EXEMPT, world.getName())); + pluginManager.removePermission(concatPermission(GAMEMODE_BYPASS, world.getName())); + pluginManager.removePermission(concatPermission(PLAYERLIMIT_BYPASS, world.getName())); + pluginManager.removePermission(concatPermission(SPAWN, "self", world.getName())); + pluginManager.removePermission(concatPermission(SPAWN, "other", world.getName())); + Logging.fine("Successfully removed permissions for world %s", world.getName()); + }); + } + + public Try addDestinationPermissions(@NotNull Destination destination) { + return Try.run(() -> { + pluginManager.addPermission(new Permission(concatPermission(TELEPORT, "self", destination.getIdentifier()))); + pluginManager.addPermission(new Permission(concatPermission(TELEPORT, "other", destination.getIdentifier()))); + Logging.fine("Successfully registered permissions for destination %s", destination.getIdentifier()); + }); + } + + public Try removeDestinationPermissions(@NotNull Destination destination) { + return Try.run(() -> { + pluginManager.removePermission(concatPermission(TELEPORT, "self", destination.getIdentifier())); + pluginManager.removePermission(concatPermission(TELEPORT, "other", destination.getIdentifier())); + Logging.fine("Successfully removed permissions for destination %s", destination.getIdentifier()); + }); } } diff --git a/src/main/java/org/mvplugins/multiverse/core/permissions/CorePermissionsChecker.java b/src/main/java/org/mvplugins/multiverse/core/permissions/CorePermissionsChecker.java index c25c5faef..24af67420 100644 --- a/src/main/java/org/mvplugins/multiverse/core/permissions/CorePermissionsChecker.java +++ b/src/main/java/org/mvplugins/multiverse/core/permissions/CorePermissionsChecker.java @@ -14,6 +14,9 @@ import org.mvplugins.multiverse.core.world.LoadedMultiverseWorld; import org.mvplugins.multiverse.core.world.MultiverseWorld; +import static org.mvplugins.multiverse.core.permissions.PermissionUtils.concatPermission; +import static org.mvplugins.multiverse.core.permissions.PermissionUtils.hasPermission; + @Service public class CorePermissionsChecker { @@ -126,35 +129,4 @@ public boolean hasAnyTeleportPermission(CommandSender sender) { } return false; } - - /** - * Joins permissions with a dot. - * - * @param permission The permission - * @param child The string(s) to join - * @return The newly joined permission node. - */ - public String concatPermission(String permission, String... child) { - return permission + "." + String.join(".", child); - } - - /** - * Check and log if the sender has the permission. - * - * @param sender The sender - * @param permission The permission - * @return True if the sender has the permission, else false. - */ - public boolean hasPermission(CommandSender sender, String permission) { - if (sender.hasPermission(permission)) { - if (config.getDebugPermissions()) { - Logging.finer("Checking sender [%s] has permission [%s] : YES", sender.getName(), permission); - } - return true; - } - if (config.getDebugPermissions()) { - Logging.finer("Checking sender [%s] has permission [%s] : NO", sender.getName(), permission); - } - return false; - } } diff --git a/src/main/java/org/mvplugins/multiverse/core/permissions/PermissionUtils.java b/src/main/java/org/mvplugins/multiverse/core/permissions/PermissionUtils.java new file mode 100644 index 000000000..5f8984af6 --- /dev/null +++ b/src/main/java/org/mvplugins/multiverse/core/permissions/PermissionUtils.java @@ -0,0 +1,52 @@ +package org.mvplugins.multiverse.core.permissions; + +import com.dumptruckman.minecraft.util.Logging; +import org.bukkit.command.CommandSender; + +public final class PermissionUtils { + + private static boolean debugPermissions = false; + + private PermissionUtils() { + // Prevent instantiation + } + + public static boolean isDebugPermissions() { + return debugPermissions; + } + + public static void setDebugPermissions(boolean debugPermissions) { + PermissionUtils.debugPermissions = debugPermissions; + } + + /** + * Joins permissions with a dot. + * + * @param permission The permission + * @param child The string(s) to join + * @return The newly joined permission node. + */ + public static String concatPermission(String permission, String... child) { + return permission + "." + String.join(".", child); + } + + /** + * Check and log if the sender has the permission. + * + * @param sender The sender + * @param permission The permission + * @return True if the sender has the permission, else false. + */ + public static boolean hasPermission(CommandSender sender, String permission) { + if (sender.hasPermission(permission)) { + if (debugPermissions) { + Logging.finer("Checking sender [%s] has permission [%s] : YES", sender.getName(), permission); + } + return true; + } + if (debugPermissions) { + Logging.finer("Checking sender [%s] has permission [%s] : NO", sender.getName(), permission); + } + return false; + } +} diff --git a/src/main/java/org/mvplugins/multiverse/core/world/WorldManager.java b/src/main/java/org/mvplugins/multiverse/core/world/WorldManager.java index 83785537e..8447f56d7 100644 --- a/src/main/java/org/mvplugins/multiverse/core/world/WorldManager.java +++ b/src/main/java/org/mvplugins/multiverse/core/world/WorldManager.java @@ -29,6 +29,7 @@ import org.mvplugins.multiverse.core.api.LocationManipulation; import org.mvplugins.multiverse.core.event.MVWorldDeleteEvent; +import org.mvplugins.multiverse.core.permissions.CorePermissions; import org.mvplugins.multiverse.core.teleportation.AdvancedBlockSafety; import org.mvplugins.multiverse.core.utils.message.MessageReplacement; import org.mvplugins.multiverse.core.utils.result.Attempt; @@ -74,23 +75,22 @@ public class WorldManager { private final WorldsConfigManager worldsConfigManager; private final WorldNameChecker worldNameChecker; private final GeneratorProvider generatorProvider; - private final PlayerWorldTeleporter playerWorldActions; private final FilesManipulator filesManipulator; private final AdvancedBlockSafety blockSafety; private final LocationManipulation locationManipulation; private final PluginManager pluginManager; + private final CorePermissions corePermissions; @Inject WorldManager( @NotNull WorldsConfigManager worldsConfigManager, @NotNull WorldNameChecker worldNameChecker, @NotNull GeneratorProvider generatorProvider, - @NotNull PlayerWorldTeleporter playerWorldActions, @NotNull FilesManipulator filesManipulator, @NotNull AdvancedBlockSafety blockSafety, @NotNull LocationManipulation locationManipulation, - @NotNull PluginManager pluginManager) { - this.pluginManager = pluginManager; + @NotNull PluginManager pluginManager, + @NotNull CorePermissions corePermissions) { this.worldsMap = new HashMap<>(); this.loadedWorldsMap = new HashMap<>(); this.unloadTracker = new ArrayList<>(); @@ -99,10 +99,11 @@ public class WorldManager { this.worldsConfigManager = worldsConfigManager; this.worldNameChecker = worldNameChecker; this.generatorProvider = generatorProvider; - this.playerWorldActions = playerWorldActions; this.filesManipulator = filesManipulator; this.blockSafety = blockSafety; this.locationManipulation = locationManipulation; + this.pluginManager = pluginManager; + this.corePermissions = corePermissions; } /** @@ -134,10 +135,7 @@ private Try updateWorldsFromConfig() { private void loadNewWorldConfigs(Collection newWorldConfigs) { newWorldConfigs.forEach(worldConfig -> getWorld(worldConfig.getWorldName()) .peek(unloadedWorld -> unloadedWorld.setWorldConfig(worldConfig)) - .onEmpty(() -> { - MultiverseWorld mvWorld = new MultiverseWorld(worldConfig.getWorldName(), worldConfig); - worldsMap.put(mvWorld.getName(), mvWorld); - })); + .onEmpty(() -> newMultiverseWorld(worldConfig.getWorldName(), worldConfig))); } private void removeWorldsNotInConfigs(Collection removedWorlds) { @@ -276,6 +274,13 @@ private Attempt doImportWorld( : generator; } + private MultiverseWorld newMultiverseWorld(String worldName, WorldConfig worldConfig) { + MultiverseWorld mvWorld = new MultiverseWorld(worldName, worldConfig); + worldsMap.put(mvWorld.getName(), mvWorld); + corePermissions.addWorldPermissions(mvWorld); + return mvWorld; + } + /** * Creates a new loaded multiverseWorld from a bukkit world. * @@ -289,9 +294,7 @@ private LoadedMultiverseWorld newLoadedMultiverseWorld( worldConfig.setAdjustSpawn(adjustSpawn); worldConfig.setGenerator(generator == null ? "" : generator); - MultiverseWorld mvWorld = new MultiverseWorld(world.getName(), worldConfig); - worldsMap.put(mvWorld.getName(), mvWorld); - + MultiverseWorld mvWorld = newMultiverseWorld(world.getName(), worldConfig); LoadedMultiverseWorld loadedWorld = new LoadedMultiverseWorld( world, worldConfig, @@ -464,7 +467,7 @@ private Attempt removeWorldFromConfig(@NotNull Mult worldsMap.remove(world.getName()); worldsConfigManager.deleteWorldConfig(world.getName()); saveWorldsConfig(); - + corePermissions.removeWorldPermissions(world); return worldActionResult(world.getName()); }