From 6dba31b257170ceda73afac49fe28def7f4f9f0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20S=C3=B6derberg?= Date: Tue, 21 Jul 2020 14:28:54 +0200 Subject: [PATCH 01/16] Start working on the new permission system --- .../plotsquared/bukkit/BukkitPlatform.java | 10 +- .../bukkit/inject/PermissionModule.java | 52 +++++++++ .../permissions/BukkitPermissionHandler.java | 84 +++++++++++++++ .../permissions/VaultPermissionHandler.java | 102 ++++++++++++++++++ .../bukkit/player/BukkitOfflinePlayer.java | 14 ++- .../bukkit/player/BukkitPlayer.java | 22 ++-- .../bukkit/player/BukkitPlayerManager.java | 14 ++- .../plotsquared/bukkit/util/BukkitUtil.java | 2 +- .../com/plotsquared/core/PlotPlatform.java | 10 ++ .../permissions/ConsolePermissionProfile.java | 37 +++++++ .../permissions/NullPermissionProfile.java | 37 +++++++ .../core/permissions/PermissionHandler.java | 95 ++++++++++++++++ .../core/permissions/PermissionHolder.java | 43 ++++++++ .../core/permissions/PermissionProfile.java | 43 ++++++++ .../core/player/ConsolePlayer.java | 14 ++- .../core/player/OfflinePlotPlayer.java | 5 +- .../plotsquared/core/player/PlotPlayer.java | 17 ++- .../com/plotsquared/core/util/ChunkUtil.java | 25 +++++ .../com/plotsquared/core/util/MainUtil.java | 47 ++++++++ 19 files changed, 638 insertions(+), 35 deletions(-) create mode 100644 Bukkit/src/main/java/com/plotsquared/bukkit/inject/PermissionModule.java create mode 100644 Bukkit/src/main/java/com/plotsquared/bukkit/permissions/BukkitPermissionHandler.java create mode 100644 Bukkit/src/main/java/com/plotsquared/bukkit/permissions/VaultPermissionHandler.java create mode 100644 Core/src/main/java/com/plotsquared/core/permissions/ConsolePermissionProfile.java create mode 100644 Core/src/main/java/com/plotsquared/core/permissions/NullPermissionProfile.java create mode 100644 Core/src/main/java/com/plotsquared/core/permissions/PermissionHandler.java create mode 100644 Core/src/main/java/com/plotsquared/core/permissions/PermissionHolder.java create mode 100644 Core/src/main/java/com/plotsquared/core/permissions/PermissionProfile.java diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitPlatform.java b/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitPlatform.java index 01cf8114e..d83813d14 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitPlatform.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitPlatform.java @@ -33,6 +33,7 @@ import com.google.inject.Stage; import com.plotsquared.bukkit.generator.BukkitPlotGenerator; import com.plotsquared.bukkit.inject.BackupModule; import com.plotsquared.bukkit.inject.BukkitModule; +import com.plotsquared.bukkit.inject.PermissionModule; import com.plotsquared.bukkit.inject.WorldManagerModule; import com.plotsquared.bukkit.listener.ChunkListener; import com.plotsquared.bukkit.listener.EntitySpawnListener; @@ -245,8 +246,11 @@ import static com.plotsquared.core.util.ReflectionUtils.getRefClass; // We create the injector after PlotSquared has been initialized, so that we have access // to generated instances and settings - this.injector = Guice.createInjector(Stage.PRODUCTION, new WorldManagerModule(), new PlotSquaredModule(), - new BukkitModule(this), new BackupModule()); + this.injector = Guice.createInjector(Stage.PRODUCTION, new PermissionModule(), + new WorldManagerModule(), + new PlotSquaredModule(), + new BukkitModule(this), + new BackupModule()); this.injector.injectMembers(this); if (PremiumVerification.isPremium() && Settings.Enabled_Components.UPDATE_NOTIFICATIONS) { @@ -1140,7 +1144,7 @@ import static com.plotsquared.core.util.ReflectionUtils.getRefClass; return names; } - @Override public com.plotsquared.core.location.World getPlatformWorld(@Nonnull final String worldName) { + @Override @Nonnull public com.plotsquared.core.location.World getPlatformWorld(@Nonnull final String worldName) { return BukkitWorld.of(worldName); } diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/inject/PermissionModule.java b/Bukkit/src/main/java/com/plotsquared/bukkit/inject/PermissionModule.java new file mode 100644 index 000000000..b22cb3648 --- /dev/null +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/inject/PermissionModule.java @@ -0,0 +1,52 @@ +/* + * _____ _ _ _____ _ + * | __ \| | | | / ____| | | + * | |__) | | ___ | |_| (___ __ _ _ _ __ _ _ __ ___ __| | + * | ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` | + * | | | | (_) | |_ ____) | (_| | |_| | (_| | | | __/ (_| | + * |_| |_|\___/ \__|_____/ \__, |\__,_|\__,_|_| \___|\__,_| + * | | + * |_| + * PlotSquared plot management system for Minecraft + * Copyright (C) 2020 IntellectualSites + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.plotsquared.bukkit.inject; + +import com.google.inject.AbstractModule; +import com.google.inject.Provides; +import com.google.inject.Singleton; +import com.plotsquared.bukkit.permissions.BukkitPermissionHandler; +import com.plotsquared.bukkit.permissions.VaultPermissionHandler; +import com.plotsquared.core.permissions.PermissionHandler; +import net.milkbowl.vault.permission.Permission; +import org.bukkit.Bukkit; +import org.bukkit.plugin.RegisteredServiceProvider; + +public class PermissionModule extends AbstractModule { + + @Provides @Singleton PermissionHandler providePermissionHandler() { + try { + RegisteredServiceProvider permissionProvider = + Bukkit.getServer().getServicesManager().getRegistration(Permission.class); + if (permissionProvider != null) { + return new VaultPermissionHandler(); + } + } catch (final Exception ignored) { + } + return new BukkitPermissionHandler(); + } + +} diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/permissions/BukkitPermissionHandler.java b/Bukkit/src/main/java/com/plotsquared/bukkit/permissions/BukkitPermissionHandler.java new file mode 100644 index 000000000..bceecda3e --- /dev/null +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/permissions/BukkitPermissionHandler.java @@ -0,0 +1,84 @@ +/* + * _____ _ _ _____ _ + * | __ \| | | | / ____| | | + * | |__) | | ___ | |_| (___ __ _ _ _ __ _ _ __ ___ __| | + * | ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` | + * | | | | (_) | |_ ____) | (_| | |_| | (_| | | | __/ (_| | + * |_| |_|\___/ \__|_____/ \__, |\__,_|\__,_|_| \___|\__,_| + * | | + * |_| + * PlotSquared plot management system for Minecraft + * Copyright (C) 2020 IntellectualSites + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.plotsquared.bukkit.permissions; + +import com.plotsquared.bukkit.player.BukkitPlayer; +import com.plotsquared.core.permissions.ConsolePermissionProfile; +import com.plotsquared.core.permissions.PermissionHandler; +import com.plotsquared.core.permissions.PermissionProfile; +import com.plotsquared.core.player.ConsolePlayer; +import com.plotsquared.core.player.OfflinePlotPlayer; +import com.plotsquared.core.player.PlotPlayer; +import org.bukkit.entity.Player; + +import javax.annotation.Nonnull; +import java.lang.ref.WeakReference; +import java.util.EnumSet; +import java.util.Optional; +import java.util.Set; + +public class BukkitPermissionHandler implements PermissionHandler { + + @Override public void initialize() { + } + + @Nonnull @Override public Optional getPermissionProfile( + @Nonnull PlotPlayer playerPlotPlayer) { + if (playerPlotPlayer instanceof BukkitPlayer) { + final BukkitPlayer bukkitPlayer = (BukkitPlayer) playerPlotPlayer; + return Optional.of(new BukkitPermissionProfile(bukkitPlayer.getPlatformPlayer())); + } else if (playerPlotPlayer instanceof ConsolePlayer) { + return Optional.of(ConsolePermissionProfile.INSTANCE); + } + return Optional.empty(); + } + + @Nonnull @Override public Optional getPermissionProfile( + @Nonnull OfflinePlotPlayer offlinePlotPlayer) { + return Optional.empty(); + } + + @Nonnull @Override public Set getCapabilities() { + return EnumSet.of(PermissionHandlerCapability.ONLINE_PERMISSIONS); + } + + + private static final class BukkitPermissionProfile implements PermissionProfile { + + private final WeakReference playerReference; + + private BukkitPermissionProfile(@Nonnull final Player player) { + this.playerReference = new WeakReference<>(player); + } + + @Override public boolean hasPermission(@Nonnull final String permission) { + final Player player = this.playerReference.get(); + return player != null && player.hasPermission(permission); + } + + } + +} diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/permissions/VaultPermissionHandler.java b/Bukkit/src/main/java/com/plotsquared/bukkit/permissions/VaultPermissionHandler.java new file mode 100644 index 000000000..a7978e671 --- /dev/null +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/permissions/VaultPermissionHandler.java @@ -0,0 +1,102 @@ +/* + * _____ _ _ _____ _ + * | __ \| | | | / ____| | | + * | |__) | | ___ | |_| (___ __ _ _ _ __ _ _ __ ___ __| | + * | ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` | + * | | | | (_) | |_ ____) | (_| | |_| | (_| | | | __/ (_| | + * |_| |_|\___/ \__|_____/ \__, |\__,_|\__,_|_| \___|\__,_| + * | | + * |_| + * PlotSquared plot management system for Minecraft + * Copyright (C) 2020 IntellectualSites + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.plotsquared.bukkit.permissions; + +import com.plotsquared.bukkit.player.BukkitOfflinePlayer; +import com.plotsquared.bukkit.player.BukkitPlayer; +import com.plotsquared.core.permissions.ConsolePermissionProfile; +import com.plotsquared.core.permissions.PermissionHandler; +import com.plotsquared.core.permissions.PermissionProfile; +import com.plotsquared.core.player.ConsolePlayer; +import com.plotsquared.core.player.OfflinePlotPlayer; +import com.plotsquared.core.player.PlotPlayer; +import net.milkbowl.vault.permission.Permission; +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; +import org.bukkit.plugin.RegisteredServiceProvider; + +import javax.annotation.Nonnull; +import java.util.EnumSet; +import java.util.Optional; +import java.util.Set; + +public class VaultPermissionHandler implements PermissionHandler { + + private Permission permissions; + + @Override public void initialize() { + if (Bukkit.getServer().getPluginManager().getPlugin("Vault") == null) { + throw new IllegalStateException("Vault is not present on the server"); + } + RegisteredServiceProvider permissionProvider = + Bukkit.getServer().getServicesManager().getRegistration(Permission.class); + if (permissionProvider != null) { + this.permissions = permissionProvider.getProvider(); + } + } + + @Nonnull @Override public Optional getPermissionProfile( + @Nonnull PlotPlayer playerPlotPlayer) { + if (playerPlotPlayer instanceof BukkitPlayer) { + final BukkitPlayer bukkitPlayer = (BukkitPlayer) playerPlotPlayer; + return Optional.of(new VaultPermissionProfile(bukkitPlayer.getPlatformPlayer())); + } else if (playerPlotPlayer instanceof ConsolePlayer) { + return Optional.of(ConsolePermissionProfile.INSTANCE); + } + return Optional.empty(); + } + + @Nonnull @Override public Optional getPermissionProfile( + @Nonnull OfflinePlotPlayer offlinePlotPlayer) { + if (offlinePlotPlayer instanceof BukkitOfflinePlayer) { + return Optional.of(new VaultPermissionProfile(((BukkitOfflinePlayer) offlinePlotPlayer).player)); + } + return Optional.empty(); + } + + @Nonnull @Override public Set getCapabilities() { + return EnumSet.of(PermissionHandlerCapability.ONLINE_PERMISSIONS, PermissionHandlerCapability.OFFLINE_PERMISSIONS); + } + + + private final class VaultPermissionProfile implements PermissionProfile { + + private final OfflinePlayer offlinePlayer; + + private VaultPermissionProfile(@Nonnull final OfflinePlayer offlinePlayer) { + this.offlinePlayer = offlinePlayer; + } + + @Override public boolean hasPermission(@Nonnull final String permission) { + if (permissions == null) { + return false; + } + return permissions.playerHas(null, offlinePlayer, permission); + } + + } + +} diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitOfflinePlayer.java b/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitOfflinePlayer.java index 3aa5d12c3..e9c74dfb9 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitOfflinePlayer.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitOfflinePlayer.java @@ -25,6 +25,9 @@ */ package com.plotsquared.bukkit.player; +import com.plotsquared.core.permissions.NullPermissionProfile; +import com.plotsquared.core.permissions.PermissionHandler; +import com.plotsquared.core.permissions.PermissionProfile; import com.plotsquared.core.player.OfflinePlotPlayer; import org.bukkit.OfflinePlayer; import javax.annotation.Nonnull; @@ -34,6 +37,7 @@ import java.util.UUID; public class BukkitOfflinePlayer implements OfflinePlotPlayer { public final OfflinePlayer player; + private final PermissionProfile permissionProfile; /** * Please do not use this method. Instead use BukkitUtil.getPlayer(Player), @@ -41,8 +45,11 @@ public class BukkitOfflinePlayer implements OfflinePlotPlayer { * * @param player */ - public BukkitOfflinePlayer(OfflinePlayer player) { + public BukkitOfflinePlayer(@Nonnull final OfflinePlayer player, @Nonnull final + PermissionHandler permissionHandler) { this.player = player; + this.permissionProfile = permissionHandler.getPermissionProfile(this) + .orElse(NullPermissionProfile.INSTANCE); } @Nonnull @Override public UUID getUUID() { @@ -60,4 +67,9 @@ public class BukkitOfflinePlayer implements OfflinePlotPlayer { @Override public String getName() { return this.player.getName(); } + + @Override public boolean hasPermission(@Nonnull final String permission) { + return this.permissionProfile.hasPermission(permission); + } + } diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayer.java b/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayer.java index 15d9bacf8..0fcc50fb0 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayer.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayer.java @@ -32,6 +32,7 @@ import com.plotsquared.core.configuration.Captions; import com.plotsquared.core.configuration.Settings; import com.plotsquared.core.events.TeleportCause; import com.plotsquared.core.location.Location; +import com.plotsquared.core.permissions.PermissionHandler; import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.plot.PlotWeather; import com.plotsquared.core.plot.world.PlotAreaManager; @@ -83,19 +84,21 @@ public class BukkitPlayer extends PlotPlayer { * @param player Bukkit player instance */ public BukkitPlayer(@Nonnull final PlotAreaManager plotAreaManager, @Nonnull final EventDispatcher eventDispatcher, - @Nonnull final Player player, @Nullable final EconHandler econHandler) { - this(plotAreaManager, eventDispatcher, player, false, econHandler); + @Nonnull final Player player, @Nullable final EconHandler econHandler, @Nonnull final PermissionHandler permissionHandler) { + this(plotAreaManager, eventDispatcher, player, false, econHandler, permissionHandler); } public BukkitPlayer(@Nonnull final PlotAreaManager plotAreaManager, @Nonnull final EventDispatcher eventDispatcher, - @Nonnull final Player player, final boolean offline, @Nullable final EconHandler econHandler) { - this(plotAreaManager, eventDispatcher, player, offline, true, econHandler); + @Nonnull final Player player, final boolean offline, @Nullable final EconHandler econHandler, + @Nonnull final PermissionHandler permissionHandler) { + this(plotAreaManager, eventDispatcher, player, offline, true, econHandler, permissionHandler); } public BukkitPlayer(@Nonnull final PlotAreaManager plotAreaManager, @Nonnull final EventDispatcher eventDispatcher, @Nonnull final Player player, final boolean offline, - final boolean realPlayer, @Nullable final EconHandler econHandler) { - super(plotAreaManager, eventDispatcher, econHandler); + final boolean realPlayer, @Nullable final EconHandler econHandler, + @Nonnull final PermissionHandler permissionHandler) { + super(plotAreaManager, eventDispatcher, econHandler, permissionHandler); this.player = player; this.offline = offline; this.econHandler = econHandler; @@ -161,13 +164,6 @@ public class BukkitPlayer extends PlotPlayer { } } - @Override public boolean hasPermission(final String permission) { - if (this.offline && this.econHandler != null) { - return this.econHandler.hasPermission(getName(), permission); - } - return this.player.hasPermission(permission); - } - @Override public int hasPermissionRange(final String stub, final int range) { if (hasPermission(Captions.PERMISSION_ADMIN.getTranslated())) { return Integer.MAX_VALUE; diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayerManager.java b/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayerManager.java index 7238709e3..d05fafd7a 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayerManager.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayerManager.java @@ -27,6 +27,7 @@ package com.plotsquared.bukkit.player; import com.google.inject.Inject; import com.google.inject.Singleton; +import com.plotsquared.core.permissions.PermissionHandler; import com.plotsquared.core.plot.world.PlotAreaManager; import com.plotsquared.core.util.EconHandler; import com.plotsquared.core.util.EventDispatcher; @@ -46,13 +47,16 @@ import java.util.UUID; private final PlotAreaManager plotAreaManager; private final EventDispatcher eventDispatcher; private final EconHandler econHandler; + private final PermissionHandler permissionHandler; @Inject public BukkitPlayerManager(@Nonnull final PlotAreaManager plotAreaManager, @Nonnull final EventDispatcher eventDispatcher, - @Nullable final EconHandler econHandler) { + @Nullable final EconHandler econHandler, + @Nonnull final PermissionHandler permissionHandler) { this.plotAreaManager = plotAreaManager; this.eventDispatcher = eventDispatcher; this.econHandler = econHandler; + this.permissionHandler = permissionHandler; } @Nonnull @Override public BukkitPlayer getPlayer(@Nonnull final Player object) { @@ -60,7 +64,7 @@ import java.util.UUID; return getPlayer(object.getUniqueId()); } catch (final NoSuchPlayerException exception) { return new BukkitPlayer(this.plotAreaManager, this.eventDispatcher, object, - object.isOnline(), false, this.econHandler); + object.isOnline(), false, this.econHandler, this.permissionHandler); } } @@ -69,18 +73,18 @@ import java.util.UUID; if (player == null || !player.isOnline()) { throw new NoSuchPlayerException(uuid); } - return new BukkitPlayer(this.plotAreaManager, this.eventDispatcher, player, this.econHandler); + return new BukkitPlayer(this.plotAreaManager, this.eventDispatcher, player, this.econHandler, this.permissionHandler); } @Nullable @Override public BukkitOfflinePlayer getOfflinePlayer(@Nullable final UUID uuid) { if (uuid == null) { return null; } - return new BukkitOfflinePlayer(Bukkit.getOfflinePlayer(uuid)); + return new BukkitOfflinePlayer(Bukkit.getOfflinePlayer(uuid), this.permissionHandler); } @Nonnull @Override public BukkitOfflinePlayer getOfflinePlayer(@Nonnull final String username) { - return new BukkitOfflinePlayer(Bukkit.getOfflinePlayer(username)); + return new BukkitOfflinePlayer(Bukkit.getOfflinePlayer(username), this.permissionHandler); } } diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitUtil.java b/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitUtil.java index 5cbbf6cfc..1d88f9a6f 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitUtil.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitUtil.java @@ -131,7 +131,7 @@ import java.util.stream.Stream; final Player player = OfflinePlayerUtil.loadPlayer(op); player.loadData(); return new BukkitPlayer(PlotSquared.get().getPlotAreaManager(), - PlotSquared.get().getEventDispatcher(), player, true, PlotSquared.platform().getEconHandler()); + PlotSquared.get().getEventDispatcher(), player, true, PlotSquared.platform().getEconHandler(), PlotSquared.platform().getPermissionHandler()); } /** diff --git a/Core/src/main/java/com/plotsquared/core/PlotPlatform.java b/Core/src/main/java/com/plotsquared/core/PlotPlatform.java index dc3136372..c84bce2b9 100644 --- a/Core/src/main/java/com/plotsquared/core/PlotPlatform.java +++ b/Core/src/main/java/com/plotsquared/core/PlotPlatform.java @@ -33,6 +33,7 @@ import com.plotsquared.core.generator.HybridUtils; import com.plotsquared.core.generator.IndependentPlotGenerator; import com.plotsquared.core.inject.annotations.DefaultGenerator; import com.plotsquared.core.location.World; +import com.plotsquared.core.permissions.PermissionHandler; import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.queue.GlobalBlockQueue; import com.plotsquared.core.util.ChatManager; @@ -266,4 +267,13 @@ public interface PlotPlatform

extends ILogger { return getInjector().getInstance(ChunkManager.class); } + /** + * Get the {@link PermissionHandler} implementation for the platform + * + * @return Permission handler + */ + @Nonnull default PermissionHandler getPermissionHandler() { + return getInjector().getInstance(PermissionHandler.class); + } + } diff --git a/Core/src/main/java/com/plotsquared/core/permissions/ConsolePermissionProfile.java b/Core/src/main/java/com/plotsquared/core/permissions/ConsolePermissionProfile.java new file mode 100644 index 000000000..09857628c --- /dev/null +++ b/Core/src/main/java/com/plotsquared/core/permissions/ConsolePermissionProfile.java @@ -0,0 +1,37 @@ +/* + * _____ _ _ _____ _ + * | __ \| | | | / ____| | | + * | |__) | | ___ | |_| (___ __ _ _ _ __ _ _ __ ___ __| | + * | ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` | + * | | | | (_) | |_ ____) | (_| | |_| | (_| | | | __/ (_| | + * |_| |_|\___/ \__|_____/ \__, |\__,_|\__,_|_| \___|\__,_| + * | | + * |_| + * PlotSquared plot management system for Minecraft + * Copyright (C) 2020 IntellectualSites + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.plotsquared.core.permissions; + +import javax.annotation.Nonnull; + +public enum ConsolePermissionProfile implements PermissionProfile { + INSTANCE; + + @Override public boolean hasPermission(@Nonnull final String permission) { + return true; + } + +} diff --git a/Core/src/main/java/com/plotsquared/core/permissions/NullPermissionProfile.java b/Core/src/main/java/com/plotsquared/core/permissions/NullPermissionProfile.java new file mode 100644 index 000000000..b59b5a78d --- /dev/null +++ b/Core/src/main/java/com/plotsquared/core/permissions/NullPermissionProfile.java @@ -0,0 +1,37 @@ +/* + * _____ _ _ _____ _ + * | __ \| | | | / ____| | | + * | |__) | | ___ | |_| (___ __ _ _ _ __ _ _ __ ___ __| | + * | ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` | + * | | | | (_) | |_ ____) | (_| | |_| | (_| | | | __/ (_| | + * |_| |_|\___/ \__|_____/ \__, |\__,_|\__,_|_| \___|\__,_| + * | | + * |_| + * PlotSquared plot management system for Minecraft + * Copyright (C) 2020 IntellectualSites + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.plotsquared.core.permissions; + +import javax.annotation.Nonnull; + +public enum NullPermissionProfile implements PermissionProfile { + INSTANCE; + + @Override public boolean hasPermission(@Nonnull final String permission) { + return false; + } + +} diff --git a/Core/src/main/java/com/plotsquared/core/permissions/PermissionHandler.java b/Core/src/main/java/com/plotsquared/core/permissions/PermissionHandler.java new file mode 100644 index 000000000..c88537f69 --- /dev/null +++ b/Core/src/main/java/com/plotsquared/core/permissions/PermissionHandler.java @@ -0,0 +1,95 @@ +/* + * _____ _ _ _____ _ + * | __ \| | | | / ____| | | + * | |__) | | ___ | |_| (___ __ _ _ _ __ _ _ __ ___ __| | + * | ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` | + * | | | | (_) | |_ ____) | (_| | |_| | (_| | | | __/ (_| | + * |_| |_|\___/ \__|_____/ \__, |\__,_|\__,_|_| \___|\__,_| + * | | + * |_| + * PlotSquared plot management system for Minecraft + * Copyright (C) 2020 IntellectualSites + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.plotsquared.core.permissions; + +import com.plotsquared.core.player.OfflinePlotPlayer; +import com.plotsquared.core.player.PlotPlayer; + +import javax.annotation.Nonnull; +import java.util.Optional; +import java.util.Set; + +/** + * Permission handler + */ +public interface PermissionHandler { + + /** + * Initialize the permission handler + */ + void initialize(); + + /** + * Attempt to construct a permission profile for a plot player + * + * @param playerPlotPlayer Plot player + * @return Permission profile, if one was able to be constructed + */ + @Nonnull Optional getPermissionProfile( + @Nonnull PlotPlayer playerPlotPlayer); + + /** + * Attempt to construct a permission profile for an offline plot player + * + * @param offlinePlotPlayer Offline player + * @return Permission profile, if one was able to be constructed + */ + @Nonnull Optional getPermissionProfile( + @Nonnull OfflinePlotPlayer offlinePlotPlayer); + + /** + * Get all capabilities that the permission handler has + * + * @return Immutable set of capabilities + */ + @Nonnull Set getCapabilities(); + + /** + * Check whether or not the permission handler has a given capability + * + * @param capability Capability + * @return {@code true} if the handler has the capability, else {@code false} + */ + default boolean hasCapability(@Nonnull final PermissionHandlerCapability capability) { + return this.getCapabilities().contains(capability); + } + + + /** + * Permission handler capabilities + */ + enum PermissionHandlerCapability { + /** + * The ability to check for online (player) permissions + */ + ONLINE_PERMISSIONS, + /** + * The ability to check for offline (player) permissions + */ + OFFLINE_PERMISSIONS + } + +} diff --git a/Core/src/main/java/com/plotsquared/core/permissions/PermissionHolder.java b/Core/src/main/java/com/plotsquared/core/permissions/PermissionHolder.java new file mode 100644 index 000000000..a94bd0b39 --- /dev/null +++ b/Core/src/main/java/com/plotsquared/core/permissions/PermissionHolder.java @@ -0,0 +1,43 @@ +/* + * _____ _ _ _____ _ + * | __ \| | | | / ____| | | + * | |__) | | ___ | |_| (___ __ _ _ _ __ _ _ __ ___ __| | + * | ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` | + * | | | | (_) | |_ ____) | (_| | |_| | (_| | | | __/ (_| | + * |_| |_|\___/ \__|_____/ \__, |\__,_|\__,_|_| \___|\__,_| + * | | + * |_| + * PlotSquared plot management system for Minecraft + * Copyright (C) 2020 IntellectualSites + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.plotsquared.core.permissions; + +import javax.annotation.Nonnull; + +/** + * Any object which can hold permissions + */ +public interface PermissionHolder { + + /** + * Check if the permission holder has the given permission node + * + * @param permission Permission node + * @return {@code true} if the holder has the given permission node, else {@code false} + */ + boolean hasPermission(@Nonnull String permission); + +} diff --git a/Core/src/main/java/com/plotsquared/core/permissions/PermissionProfile.java b/Core/src/main/java/com/plotsquared/core/permissions/PermissionProfile.java new file mode 100644 index 000000000..912147980 --- /dev/null +++ b/Core/src/main/java/com/plotsquared/core/permissions/PermissionProfile.java @@ -0,0 +1,43 @@ +/* + * _____ _ _ _____ _ + * | __ \| | | | / ____| | | + * | |__) | | ___ | |_| (___ __ _ _ _ __ _ _ __ ___ __| | + * | ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` | + * | | | | (_) | |_ ____) | (_| | |_| | (_| | | | __/ (_| | + * |_| |_|\___/ \__|_____/ \__, |\__,_|\__,_|_| \___|\__,_| + * | | + * |_| + * PlotSquared plot management system for Minecraft + * Copyright (C) 2020 IntellectualSites + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.plotsquared.core.permissions; + +import javax.annotation.Nonnull; + +/** + * A permission profile that can be used to check for permissions + */ +public interface PermissionProfile { + + /** + * Check if the owner of the profile has a given permission + * + * @param permission Permission + * @return {@code true} if the owner has the given permission, else {@code false} + */ + boolean hasPermission(@Nonnull String permission); + +} diff --git a/Core/src/main/java/com/plotsquared/core/player/ConsolePlayer.java b/Core/src/main/java/com/plotsquared/core/player/ConsolePlayer.java index c6efe33cd..2c1e67c8f 100644 --- a/Core/src/main/java/com/plotsquared/core/player/ConsolePlayer.java +++ b/Core/src/main/java/com/plotsquared/core/player/ConsolePlayer.java @@ -32,6 +32,7 @@ import com.plotsquared.core.database.DBFunc; import com.plotsquared.core.events.TeleportCause; import com.plotsquared.core.inject.annotations.ConsoleActor; import com.plotsquared.core.location.Location; +import com.plotsquared.core.permissions.PermissionHandler; import com.plotsquared.core.plot.PlotArea; import com.plotsquared.core.plot.PlotWeather; import com.plotsquared.core.plot.world.PlotAreaManager; @@ -42,11 +43,11 @@ import com.sk89q.worldedit.regions.CuboidRegion; import com.sk89q.worldedit.world.gamemode.GameMode; import com.sk89q.worldedit.world.gamemode.GameModes; import com.sk89q.worldedit.world.item.ItemType; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.util.UUID; public class ConsolePlayer extends PlotPlayer { @@ -59,8 +60,9 @@ public class ConsolePlayer extends PlotPlayer { @Inject private ConsolePlayer(@Nonnull final PlotAreaManager plotAreaManager, @Nonnull final EventDispatcher eventDispatcher, @ConsoleActor @Nonnull final Actor actor, - @Nullable final EconHandler econHandler) { - super(plotAreaManager, eventDispatcher, econHandler); + @Nullable final EconHandler econHandler, + @Nonnull final PermissionHandler permissionHandler) { + super(plotAreaManager, eventDispatcher, econHandler, permissionHandler); this.actor = actor; final PlotArea[] areas = plotAreaManager.getAllPlotAreas(); final PlotArea area; @@ -121,10 +123,6 @@ public class ConsolePlayer extends PlotPlayer { return 0; } - @Override public boolean hasPermission(String permission) { - return true; - } - @Override public boolean isPermissionSet(String permission) { return true; } diff --git a/Core/src/main/java/com/plotsquared/core/player/OfflinePlotPlayer.java b/Core/src/main/java/com/plotsquared/core/player/OfflinePlotPlayer.java index f48079f67..92a0e6536 100644 --- a/Core/src/main/java/com/plotsquared/core/player/OfflinePlotPlayer.java +++ b/Core/src/main/java/com/plotsquared/core/player/OfflinePlotPlayer.java @@ -25,9 +25,11 @@ */ package com.plotsquared.core.player; +import com.plotsquared.core.permissions.PermissionHolder; + import java.util.UUID; -public interface OfflinePlotPlayer { +public interface OfflinePlotPlayer extends PermissionHolder { /** * Gets the {@code UUID} of this player @@ -57,4 +59,5 @@ public interface OfflinePlotPlayer { * @return the player name */ String getName(); + } diff --git a/Core/src/main/java/com/plotsquared/core/player/PlotPlayer.java b/Core/src/main/java/com/plotsquared/core/player/PlotPlayer.java index 6d2428d05..d3c4fd369 100644 --- a/Core/src/main/java/com/plotsquared/core/player/PlotPlayer.java +++ b/Core/src/main/java/com/plotsquared/core/player/PlotPlayer.java @@ -35,6 +35,9 @@ import com.plotsquared.core.configuration.Settings; import com.plotsquared.core.database.DBFunc; import com.plotsquared.core.events.TeleportCause; import com.plotsquared.core.location.Location; +import com.plotsquared.core.permissions.NullPermissionProfile; +import com.plotsquared.core.permissions.PermissionHandler; +import com.plotsquared.core.permissions.PermissionProfile; import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.PlotArea; import com.plotsquared.core.plot.PlotCluster; @@ -54,11 +57,11 @@ import com.plotsquared.core.util.task.TaskManager; import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.world.gamemode.GameMode; import com.sk89q.worldedit.world.item.ItemType; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.nio.ByteBuffer; import java.util.Collection; import java.util.Collections; @@ -95,11 +98,15 @@ public abstract class PlotPlayer

implements CommandCaller, OfflinePlotPlayer private final PlotAreaManager plotAreaManager; private final EventDispatcher eventDispatcher; private final EconHandler econHandler; + private final PermissionProfile permissionProfile; - public PlotPlayer(@Nonnull final PlotAreaManager plotAreaManager, @Nonnull final EventDispatcher eventDispatcher, @Nullable final EconHandler econHandler) { + public PlotPlayer(@Nonnull final PlotAreaManager plotAreaManager, @Nonnull final EventDispatcher eventDispatcher, @Nullable final EconHandler econHandler, + @Nonnull final PermissionHandler permissionHandler) { this.plotAreaManager = plotAreaManager; this.eventDispatcher = eventDispatcher; this.econHandler = econHandler; + this.permissionProfile = permissionHandler.getPermissionProfile(this).orElse( + NullPermissionProfile.INSTANCE); } public static PlotPlayer from(@Nonnull final T object) { @@ -147,6 +154,10 @@ public abstract class PlotPlayer

implements CommandCaller, OfflinePlotPlayer return PlotSquared.platform().wrapPlayer(player); } + @Override public final boolean hasPermission(@Nonnull final String permission) { + return this.permissionProfile.hasPermission(permission); + } + public abstract Actor toActor(); public abstract P getPlatformPlayer(); diff --git a/Core/src/main/java/com/plotsquared/core/util/ChunkUtil.java b/Core/src/main/java/com/plotsquared/core/util/ChunkUtil.java index 3e89c630a..6c1a1415d 100644 --- a/Core/src/main/java/com/plotsquared/core/util/ChunkUtil.java +++ b/Core/src/main/java/com/plotsquared/core/util/ChunkUtil.java @@ -1,3 +1,28 @@ +/* + * _____ _ _ _____ _ + * | __ \| | | | / ____| | | + * | |__) | | ___ | |_| (___ __ _ _ _ __ _ _ __ ___ __| | + * | ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` | + * | | | | (_) | |_ ____) | (_| | |_| | (_| | | | __/ (_| | + * |_| |_|\___/ \__|_____/ \__, |\__,_|\__,_|_| \___|\__,_| + * | | + * |_| + * PlotSquared plot management system for Minecraft + * Copyright (C) 2020 IntellectualSites + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package com.plotsquared.core.util; import lombok.experimental.UtilityClass; diff --git a/Core/src/main/java/com/plotsquared/core/util/MainUtil.java b/Core/src/main/java/com/plotsquared/core/util/MainUtil.java index 2a96b7120..010622813 100644 --- a/Core/src/main/java/com/plotsquared/core/util/MainUtil.java +++ b/Core/src/main/java/com/plotsquared/core/util/MainUtil.java @@ -44,6 +44,53 @@ import javax.annotation.Nonnull; private static final Logger logger = LoggerFactory.getLogger("P2/" + MainUtil.class.getSimpleName()); + /** + * Cache of mapping x,y,z coordinates to the chunk array
+ * - Used for efficient world generation
+ */ + public static short[][] x_loc; + public static short[][] y_loc; + public static short[][] z_loc; + public static short[][][] CACHE_I = null; + public static short[][][] CACHE_J = null; + + /** + * This cache is used for world generation and just saves a bit of calculation time when checking if something is in the plot area. + */ + public static void initCache() { + if (x_loc == null) { + x_loc = new short[16][4096]; + y_loc = new short[16][4096]; + z_loc = new short[16][4096]; + for (int i = 0; i < 16; i++) { + int i4 = i << 4; + for (int j = 0; j < 4096; j++) { + int y = i4 + (j >> 8); + int a = j - ((y & 0xF) << 8); + int z1 = a >> 4; + int x1 = a - (z1 << 4); + x_loc[i][j] = (short) x1; + y_loc[i][j] = (short) y; + z_loc[i][j] = (short) z1; + } + } + } + if (CACHE_I == null) { + CACHE_I = new short[256][16][16]; + CACHE_J = new short[256][16][16]; + for (int x = 0; x < 16; x++) { + for (int z = 0; z < 16; z++) { + for (int y = 0; y < 256; y++) { + short i = (short) (y >> 4); + short j = (short) ((y & 0xF) << 8 | z << 4 | x); + CACHE_I[y][x][z] = i; + CACHE_J[y][x][z] = j; + } + } + } + } + } + /** * Send a message to the player. * From 532f2caa37da43252a72b7c2098ce2d5ed3051cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20S=C3=B6derberg?= Date: Wed, 22 Jul 2020 12:06:56 +0200 Subject: [PATCH 02/16] Make VaultPermissionHandler extent BukkitPermissionHandler --- .../permissions/VaultPermissionHandler.java | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/permissions/VaultPermissionHandler.java b/Bukkit/src/main/java/com/plotsquared/bukkit/permissions/VaultPermissionHandler.java index a7978e671..ec2724e6a 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/permissions/VaultPermissionHandler.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/permissions/VaultPermissionHandler.java @@ -26,13 +26,8 @@ package com.plotsquared.bukkit.permissions; import com.plotsquared.bukkit.player.BukkitOfflinePlayer; -import com.plotsquared.bukkit.player.BukkitPlayer; -import com.plotsquared.core.permissions.ConsolePermissionProfile; -import com.plotsquared.core.permissions.PermissionHandler; import com.plotsquared.core.permissions.PermissionProfile; -import com.plotsquared.core.player.ConsolePlayer; import com.plotsquared.core.player.OfflinePlotPlayer; -import com.plotsquared.core.player.PlotPlayer; import net.milkbowl.vault.permission.Permission; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; @@ -43,7 +38,7 @@ import java.util.EnumSet; import java.util.Optional; import java.util.Set; -public class VaultPermissionHandler implements PermissionHandler { +public class VaultPermissionHandler extends BukkitPermissionHandler { private Permission permissions; @@ -58,17 +53,6 @@ public class VaultPermissionHandler implements PermissionHandler { } } - @Nonnull @Override public Optional getPermissionProfile( - @Nonnull PlotPlayer playerPlotPlayer) { - if (playerPlotPlayer instanceof BukkitPlayer) { - final BukkitPlayer bukkitPlayer = (BukkitPlayer) playerPlotPlayer; - return Optional.of(new VaultPermissionProfile(bukkitPlayer.getPlatformPlayer())); - } else if (playerPlotPlayer instanceof ConsolePlayer) { - return Optional.of(ConsolePermissionProfile.INSTANCE); - } - return Optional.empty(); - } - @Nonnull @Override public Optional getPermissionProfile( @Nonnull OfflinePlotPlayer offlinePlotPlayer) { if (offlinePlotPlayer instanceof BukkitOfflinePlayer) { From 9d6744ec152b2427ac8c981616874b4b376e5028 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20S=C3=B6derberg?= Date: Wed, 22 Jul 2020 12:35:48 +0200 Subject: [PATCH 03/16] Get rid of PermHandler --- .../plotsquared/bukkit/BukkitPlatform.java | 7 +-- .../bukkit/inject/BukkitModule.java | 25 ++------ .../bukkit/inject/PermissionModule.java | 6 +- .../permissions/BukkitPermissionHandler.java | 4 +- .../permissions/VaultPermissionHandler.java | 31 ++++++++-- .../bukkit/player/BukkitOfflinePlayer.java | 6 +- .../bukkit/player/BukkitPlayer.java | 9 ++- .../bukkit/util/BukkitEconHandler.java | 23 +------ .../bukkit/util/BukkitPermHandler.java | 60 ------------------- .../com/plotsquared/core/command/Auto.java | 9 ++- .../com/plotsquared/core/command/Command.java | 3 +- .../core/command/CommandCaller.java | 10 +--- .../permissions/ConsolePermissionProfile.java | 4 +- .../permissions/NullPermissionProfile.java | 4 +- .../core/permissions/PermissionHandler.java | 6 +- .../core/permissions/PermissionHolder.java | 59 ++++++++++++++++-- .../core/permissions/PermissionProfile.java | 16 ++++- .../core/player/ConsolePlayer.java | 4 -- .../plotsquared/core/player/PlotPlayer.java | 30 +--------- .../plotsquared/core/util/EconHandler.java | 12 ---- .../plotsquared/core/util/PermHandler.java | 37 ------------ .../plotsquared/core/util/Permissions.java | 27 +++++---- 22 files changed, 152 insertions(+), 240 deletions(-) delete mode 100644 Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitPermHandler.java delete mode 100644 Core/src/main/java/com/plotsquared/core/util/PermHandler.java diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitPlatform.java b/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitPlatform.java index d83813d14..8a9831f22 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitPlatform.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitPlatform.java @@ -103,7 +103,6 @@ import com.plotsquared.core.util.ConsoleColors; import com.plotsquared.core.util.EconHandler; import com.plotsquared.core.util.EventDispatcher; import com.plotsquared.core.util.FileUtils; -import com.plotsquared.core.util.PermHandler; import com.plotsquared.core.util.PlatformWorldManager; import com.plotsquared.core.util.PremiumVerification; import com.plotsquared.core.util.ReflectionUtils; @@ -181,7 +180,6 @@ import static com.plotsquared.core.util.ReflectionUtils.getRefClass; private boolean methodUnloadSetup = false; private boolean metricsStarted; private EconHandler econ; - private PermHandler perm; @Getter private Injector injector; @@ -340,10 +338,7 @@ import static com.plotsquared.core.util.ReflectionUtils.getRefClass; // Economy if (Settings.Enabled_Components.ECONOMY) { TaskManager.runTask(() -> { - final PermHandler permHandler = getInjector().getInstance(PermHandler.class); - if (permHandler != null) { - permHandler.init(); - } + this.getPermissionHandler().initialize(); final EconHandler econHandler = getInjector().getInstance(EconHandler.class); if (econHandler != null) { econHandler.init(); diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/inject/BukkitModule.java b/Bukkit/src/main/java/com/plotsquared/bukkit/inject/BukkitModule.java index b558aee4f..7599358bd 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/inject/BukkitModule.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/inject/BukkitModule.java @@ -29,7 +29,6 @@ import com.google.inject.AbstractModule; import com.google.inject.Provides; import com.google.inject.Singleton; import com.google.inject.assistedinject.FactoryModuleBuilder; -import com.google.inject.util.Providers; import com.plotsquared.bukkit.BukkitPlatform; import com.plotsquared.bukkit.player.BukkitPlayerManager; import com.plotsquared.bukkit.queue.BukkitLocalQueue; @@ -37,12 +36,9 @@ import com.plotsquared.bukkit.schematic.BukkitSchematicHandler; import com.plotsquared.bukkit.util.BukkitChunkManager; import com.plotsquared.bukkit.util.BukkitEconHandler; import com.plotsquared.bukkit.util.BukkitInventoryUtil; -import com.plotsquared.bukkit.util.BukkitPermHandler; import com.plotsquared.bukkit.util.BukkitRegionManager; import com.plotsquared.bukkit.util.BukkitSetupUtils; import com.plotsquared.bukkit.util.BukkitUtil; -import com.plotsquared.bukkit.util.task.PaperTimeConverter; -import com.plotsquared.bukkit.util.task.SpigotTimeConverter; import com.plotsquared.core.PlotPlatform; import com.plotsquared.core.configuration.Settings; import com.plotsquared.core.generator.HybridGen; @@ -58,7 +54,6 @@ import com.plotsquared.core.queue.QueueProvider; import com.plotsquared.core.util.ChunkManager; import com.plotsquared.core.util.EconHandler; import com.plotsquared.core.util.InventoryUtil; -import com.plotsquared.core.util.PermHandler; import com.plotsquared.core.util.PlayerManager; import com.plotsquared.core.util.RegionManager; import com.plotsquared.core.util.SchematicHandler; @@ -70,7 +65,9 @@ import lombok.RequiredArgsConstructor; import org.bukkit.Bukkit; import org.bukkit.command.ConsoleCommandSender; import org.bukkit.plugin.java.JavaPlugin; + import javax.annotation.Nonnull; +import javax.annotation.Nullable; @RequiredArgsConstructor public class BukkitModule extends AbstractModule { @@ -93,7 +90,6 @@ import javax.annotation.Nonnull; bind(ChunkManager.class).to(BukkitChunkManager.class); bind(RegionManager.class).to(BukkitRegionManager.class); bind(SchematicHandler.class).to(BukkitSchematicHandler.class); - this.setupVault(); if (Settings.Enabled_Components.WORLDS) { bind(PlotAreaManager.class).to(SinglePlotAreaManager.class); } else { @@ -102,25 +98,14 @@ import javax.annotation.Nonnull; install(new FactoryModuleBuilder().build(HybridPlotWorldFactory.class)); } - private void setupVault() { + @Provides @Singleton @Nullable EconHandler provideEconHandler() { if (Bukkit.getPluginManager().isPluginEnabled("Vault")) { - BukkitPermHandler bukkitPermHandler = null; try { - bukkitPermHandler = new BukkitPermHandler(); - bind(PermHandler.class).toInstance(bukkitPermHandler); + return new BukkitEconHandler(); } catch (final Exception ignored) { - bind(PermHandler.class).toProvider(Providers.of(null)); } - try { - final BukkitEconHandler bukkitEconHandler = new BukkitEconHandler(bukkitPermHandler); - bind(EconHandler.class).toInstance(bukkitEconHandler); - } catch (final Exception ignored) { - bind(EconHandler.class).toProvider(Providers.of(null)); - } - } else { - bind(PermHandler.class).toProvider(Providers.of(null)); - bind(EconHandler.class).toProvider(Providers.of(null)); } + return null; } } diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/inject/PermissionModule.java b/Bukkit/src/main/java/com/plotsquared/bukkit/inject/PermissionModule.java index b22cb3648..de42d884a 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/inject/PermissionModule.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/inject/PermissionModule.java @@ -31,17 +31,13 @@ import com.google.inject.Singleton; import com.plotsquared.bukkit.permissions.BukkitPermissionHandler; import com.plotsquared.bukkit.permissions.VaultPermissionHandler; import com.plotsquared.core.permissions.PermissionHandler; -import net.milkbowl.vault.permission.Permission; import org.bukkit.Bukkit; -import org.bukkit.plugin.RegisteredServiceProvider; public class PermissionModule extends AbstractModule { @Provides @Singleton PermissionHandler providePermissionHandler() { try { - RegisteredServiceProvider permissionProvider = - Bukkit.getServer().getServicesManager().getRegistration(Permission.class); - if (permissionProvider != null) { + if (Bukkit.getPluginManager().isPluginEnabled("Vault")) { return new VaultPermissionHandler(); } } catch (final Exception ignored) { diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/permissions/BukkitPermissionHandler.java b/Bukkit/src/main/java/com/plotsquared/bukkit/permissions/BukkitPermissionHandler.java index bceecda3e..6aca7ea62 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/permissions/BukkitPermissionHandler.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/permissions/BukkitPermissionHandler.java @@ -35,6 +35,7 @@ import com.plotsquared.core.player.PlotPlayer; import org.bukkit.entity.Player; import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.lang.ref.WeakReference; import java.util.EnumSet; import java.util.Optional; @@ -74,7 +75,8 @@ public class BukkitPermissionHandler implements PermissionHandler { this.playerReference = new WeakReference<>(player); } - @Override public boolean hasPermission(@Nonnull final String permission) { + @Override public boolean hasPermission(@Nullable final String world, + @Nonnull final String permission) { final Player player = this.playerReference.get(); return player != null && player.hasPermission(permission); } diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/permissions/VaultPermissionHandler.java b/Bukkit/src/main/java/com/plotsquared/bukkit/permissions/VaultPermissionHandler.java index ec2724e6a..b7b08a49f 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/permissions/VaultPermissionHandler.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/permissions/VaultPermissionHandler.java @@ -26,19 +26,25 @@ package com.plotsquared.bukkit.permissions; import com.plotsquared.bukkit.player.BukkitOfflinePlayer; +import com.plotsquared.bukkit.player.BukkitPlayer; +import com.plotsquared.core.permissions.ConsolePermissionProfile; +import com.plotsquared.core.permissions.PermissionHandler; import com.plotsquared.core.permissions.PermissionProfile; +import com.plotsquared.core.player.ConsolePlayer; import com.plotsquared.core.player.OfflinePlotPlayer; +import com.plotsquared.core.player.PlotPlayer; import net.milkbowl.vault.permission.Permission; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.plugin.RegisteredServiceProvider; import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.util.EnumSet; import java.util.Optional; import java.util.Set; -public class VaultPermissionHandler extends BukkitPermissionHandler { +public class VaultPermissionHandler implements PermissionHandler { private Permission permissions; @@ -53,6 +59,17 @@ public class VaultPermissionHandler extends BukkitPermissionHandler { } } + @Nonnull @Override public Optional getPermissionProfile( + @Nonnull PlotPlayer playerPlotPlayer) { + if (playerPlotPlayer instanceof BukkitPlayer) { + final BukkitPlayer bukkitPlayer = (BukkitPlayer) playerPlotPlayer; + return Optional.of(new VaultPermissionProfile(bukkitPlayer.getPlatformPlayer())); + } else if (playerPlotPlayer instanceof ConsolePlayer) { + return Optional.of(ConsolePermissionProfile.INSTANCE); + } + return Optional.empty(); + } + @Nonnull @Override public Optional getPermissionProfile( @Nonnull OfflinePlotPlayer offlinePlotPlayer) { if (offlinePlotPlayer instanceof BukkitOfflinePlayer) { @@ -62,7 +79,9 @@ public class VaultPermissionHandler extends BukkitPermissionHandler { } @Nonnull @Override public Set getCapabilities() { - return EnumSet.of(PermissionHandlerCapability.ONLINE_PERMISSIONS, PermissionHandlerCapability.OFFLINE_PERMISSIONS); + return EnumSet.of(PermissionHandlerCapability.PER_WORLD_PERMISSIONS, + PermissionHandlerCapability.ONLINE_PERMISSIONS, + PermissionHandlerCapability.OFFLINE_PERMISSIONS); } @@ -74,11 +93,15 @@ public class VaultPermissionHandler extends BukkitPermissionHandler { this.offlinePlayer = offlinePlayer; } - @Override public boolean hasPermission(@Nonnull final String permission) { + @Override public boolean hasPermission(@Nullable final String world, + @Nonnull final String permission) { if (permissions == null) { return false; } - return permissions.playerHas(null, offlinePlayer, permission); + if (world == null && offlinePlayer instanceof BukkitPlayer) { + return permissions.playerHas(((BukkitPlayer) offlinePlayer).getPlatformPlayer(), permission); + } + return permissions.playerHas(world, offlinePlayer, permission); } } diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitOfflinePlayer.java b/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitOfflinePlayer.java index e9c74dfb9..9226c5847 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitOfflinePlayer.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitOfflinePlayer.java @@ -31,6 +31,7 @@ import com.plotsquared.core.permissions.PermissionProfile; import com.plotsquared.core.player.OfflinePlotPlayer; import org.bukkit.OfflinePlayer; import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.util.UUID; @@ -68,8 +69,9 @@ public class BukkitOfflinePlayer implements OfflinePlotPlayer { return this.player.getName(); } - @Override public boolean hasPermission(@Nonnull final String permission) { - return this.permissionProfile.hasPermission(permission); + @Override public boolean hasPermission(@Nullable final String world, + @Nonnull final String permission) { + return this.permissionProfile.hasPermission(world, permission); } } diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayer.java b/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayer.java index 0fcc50fb0..1415c2840 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayer.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayer.java @@ -54,6 +54,8 @@ import org.bukkit.event.EventException; import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.permissions.PermissionAttachmentInfo; import org.bukkit.plugin.RegisteredListener; + +import javax.annotation.Nonnegative; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -164,7 +166,8 @@ public class BukkitPlayer extends PlotPlayer { } } - @Override public int hasPermissionRange(final String stub, final int range) { + @Override @Nonnegative public int hasPermissionRange(@Nonnull final String stub, + @Nonnegative final int range) { if (hasPermission(Captions.PERMISSION_ADMIN.getTranslated())) { return Integer.MAX_VALUE; } @@ -224,10 +227,6 @@ public class BukkitPlayer extends PlotPlayer { return max; } - @Override public boolean isPermissionSet(final String permission) { - return this.player.isPermissionSet(permission); - } - @Override public void sendMessage(String message) { message = message.replace('\u2010', '%').replace('\u2020', '&').replace('\u2030', '&'); if (!StringMan.isEqual(this.getMeta("lastMessage"), message) || ( diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitEconHandler.java b/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitEconHandler.java index c7356c13b..470fbbfbb 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitEconHandler.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitEconHandler.java @@ -25,31 +25,21 @@ */ package com.plotsquared.bukkit.util; -import com.google.inject.Inject; import com.google.inject.Singleton; import com.plotsquared.bukkit.player.BukkitOfflinePlayer; import com.plotsquared.bukkit.player.BukkitPlayer; import com.plotsquared.core.player.OfflinePlotPlayer; import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.util.EconHandler; -import com.plotsquared.core.util.PermHandler; import net.milkbowl.vault.economy.Economy; import org.bukkit.Bukkit; import org.bukkit.plugin.RegisteredServiceProvider; -import javax.annotation.Nullable; @Singleton public class BukkitEconHandler extends EconHandler { private Economy econ; - private final PermHandler permHandler; - - @Inject public BukkitEconHandler(@Nullable final PermHandler permHandler) { - this.permHandler = permHandler; - } - - @Override - public boolean init() { + @Override public boolean init() { if (this.econ == null) { setupEconomy(); } @@ -87,17 +77,6 @@ import javax.annotation.Nullable; this.econ.depositPlayer(((BukkitOfflinePlayer) player).player, amount); } - /** - * @deprecated Use {@link PermHandler#hasPermission(String, String, String)} instead - */ - @Deprecated @Override public boolean hasPermission(String world, String player, String perm) { - if (this.permHandler != null) { - return this.permHandler.hasPermission(world, player, perm); - } else { - return false; - } - } - @Override public double getBalance(PlotPlayer player) { return this.econ.getBalance(player.getName()); } diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitPermHandler.java b/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitPermHandler.java deleted file mode 100644 index 8987e3527..000000000 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitPermHandler.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * _____ _ _ _____ _ - * | __ \| | | | / ____| | | - * | |__) | | ___ | |_| (___ __ _ _ _ __ _ _ __ ___ __| | - * | ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` | - * | | | | (_) | |_ ____) | (_| | |_| | (_| | | | __/ (_| | - * |_| |_|\___/ \__|_____/ \__, |\__,_|\__,_|_| \___|\__,_| - * | | - * |_| - * PlotSquared plot management system for Minecraft - * Copyright (C) 2020 IntellectualSites - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package com.plotsquared.bukkit.util; - -import com.google.inject.Singleton; -import com.plotsquared.core.util.PermHandler; -import net.milkbowl.vault.permission.Permission; -import org.bukkit.Bukkit; -import org.bukkit.plugin.RegisteredServiceProvider; - -@Singleton public class BukkitPermHandler extends PermHandler { - - private Permission perms; - - @Override - public boolean init() { - if (this.perms == null) { - setupPermissions(); - } - return this.perms != null; - } - - private void setupPermissions() { - if (Bukkit.getServer().getPluginManager().getPlugin("Vault") == null) { - return; - } - RegisteredServiceProvider permissionProvider = - Bukkit.getServer().getServicesManager().getRegistration(Permission.class); - if (permissionProvider != null) { - this.perms = permissionProvider.getProvider(); - } - } - - @Override public boolean hasPermission(String world, String player, String perm) { - return this.perms.playerHas(world, Bukkit.getOfflinePlayer(player), perm); - } -} diff --git a/Core/src/main/java/com/plotsquared/core/command/Auto.java b/Core/src/main/java/com/plotsquared/core/command/Auto.java index ea6a6cf6c..211f5f22f 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Auto.java +++ b/Core/src/main/java/com/plotsquared/core/command/Auto.java @@ -37,6 +37,7 @@ import com.plotsquared.core.events.PlayerAutoPlotEvent; import com.plotsquared.core.events.PlotAutoMergeEvent; import com.plotsquared.core.events.Result; import com.plotsquared.core.events.TeleportCause; +import com.plotsquared.core.permissions.PermissionHandler; import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.PlotArea; @@ -175,9 +176,11 @@ public class Auto extends SubCommand { @Override public boolean onCommand(final PlotPlayer player, String[] args) { PlotArea plotarea = player.getApplicablePlotArea(); if (plotarea == null) { - if (this.econHandler != null) { - for (PlotArea area : this.plotAreaManager.getAllPlotAreas()) { - if (this.econHandler.hasPermission(area.getWorldName(), player.getName(), "plots.auto")) { + final PermissionHandler permissionHandler = PlotSquared.platform().getPermissionHandler(); + if (permissionHandler.hasCapability( + PermissionHandler.PermissionHandlerCapability.PER_WORLD_PERMISSIONS)) { + for (final PlotArea area : this.plotAreaManager.getAllPlotAreas()) { + if (player.hasPermission(area.getWorldName(), "plots.auto")) { if (plotarea != null) { plotarea = null; break; diff --git a/Core/src/main/java/com/plotsquared/core/command/Command.java b/Core/src/main/java/com/plotsquared/core/command/Command.java index a0dbe9079..60512dd5a 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Command.java +++ b/Core/src/main/java/com/plotsquared/core/command/Command.java @@ -35,6 +35,7 @@ import com.plotsquared.core.util.StringComparison; import com.plotsquared.core.util.StringMan; import com.plotsquared.core.util.task.RunnableVal2; import com.plotsquared.core.util.task.RunnableVal3; +import com.plotsquared.core.permissions.PermissionHolder; import lombok.SneakyThrows; import javax.annotation.Nonnull; @@ -158,7 +159,7 @@ public abstract class Command { return this.allCommands; } - public boolean hasConfirmation(CommandCaller player) { + public boolean hasConfirmation(PermissionHolder player) { return this.confirmation && !player.hasPermission(getPermission() + ".confirm.bypass"); } diff --git a/Core/src/main/java/com/plotsquared/core/command/CommandCaller.java b/Core/src/main/java/com/plotsquared/core/command/CommandCaller.java index b26eed517..f7a6c6885 100644 --- a/Core/src/main/java/com/plotsquared/core/command/CommandCaller.java +++ b/Core/src/main/java/com/plotsquared/core/command/CommandCaller.java @@ -34,14 +34,6 @@ public interface CommandCaller { */ void sendMessage(String message); - /** - * Check the player's permissions. Will be cached if permission caching is enabled. - * - * @param permission the name of the permission - */ - boolean hasPermission(String permission); - - boolean isPermissionSet(String permission); - RequiredType getSuperCaller(); + } diff --git a/Core/src/main/java/com/plotsquared/core/permissions/ConsolePermissionProfile.java b/Core/src/main/java/com/plotsquared/core/permissions/ConsolePermissionProfile.java index 09857628c..783f605a7 100644 --- a/Core/src/main/java/com/plotsquared/core/permissions/ConsolePermissionProfile.java +++ b/Core/src/main/java/com/plotsquared/core/permissions/ConsolePermissionProfile.java @@ -26,11 +26,13 @@ package com.plotsquared.core.permissions; import javax.annotation.Nonnull; +import javax.annotation.Nullable; public enum ConsolePermissionProfile implements PermissionProfile { INSTANCE; - @Override public boolean hasPermission(@Nonnull final String permission) { + @Override public boolean hasPermission(@Nullable final String world, + @Nonnull final String permission) { return true; } diff --git a/Core/src/main/java/com/plotsquared/core/permissions/NullPermissionProfile.java b/Core/src/main/java/com/plotsquared/core/permissions/NullPermissionProfile.java index b59b5a78d..fbf7d8a03 100644 --- a/Core/src/main/java/com/plotsquared/core/permissions/NullPermissionProfile.java +++ b/Core/src/main/java/com/plotsquared/core/permissions/NullPermissionProfile.java @@ -26,11 +26,13 @@ package com.plotsquared.core.permissions; import javax.annotation.Nonnull; +import javax.annotation.Nullable; public enum NullPermissionProfile implements PermissionProfile { INSTANCE; - @Override public boolean hasPermission(@Nonnull final String permission) { + @Override public boolean hasPermission(@Nullable final String world, + @Nonnull final String permission) { return false; } diff --git a/Core/src/main/java/com/plotsquared/core/permissions/PermissionHandler.java b/Core/src/main/java/com/plotsquared/core/permissions/PermissionHandler.java index c88537f69..4a273c743 100644 --- a/Core/src/main/java/com/plotsquared/core/permissions/PermissionHandler.java +++ b/Core/src/main/java/com/plotsquared/core/permissions/PermissionHandler.java @@ -89,7 +89,11 @@ public interface PermissionHandler { /** * The ability to check for offline (player) permissions */ - OFFLINE_PERMISSIONS + OFFLINE_PERMISSIONS, + /** + * Per world permissions + */ + PER_WORLD_PERMISSIONS } } diff --git a/Core/src/main/java/com/plotsquared/core/permissions/PermissionHolder.java b/Core/src/main/java/com/plotsquared/core/permissions/PermissionHolder.java index a94bd0b39..abff13262 100644 --- a/Core/src/main/java/com/plotsquared/core/permissions/PermissionHolder.java +++ b/Core/src/main/java/com/plotsquared/core/permissions/PermissionHolder.java @@ -25,7 +25,12 @@ */ package com.plotsquared.core.permissions; +import com.plotsquared.core.configuration.Captions; +import com.plotsquared.core.configuration.Settings; + +import javax.annotation.Nonnegative; import javax.annotation.Nonnull; +import javax.annotation.Nullable; /** * Any object which can hold permissions @@ -33,11 +38,57 @@ import javax.annotation.Nonnull; public interface PermissionHolder { /** - * Check if the permission holder has the given permission node + * Check if the owner of the profile has a given (global) permission * - * @param permission Permission node - * @return {@code true} if the holder has the given permission node, else {@code false} + * @param permission Permission + * @return {@code true} if the owner has the given permission, else {@code false} */ - boolean hasPermission(@Nonnull String permission); + default boolean hasPermission(@Nonnull final String permission) { + return hasPermission(null ,permission); + } + + /** + * Check the the highest permission a PlotPlayer has within a specified range.
+ * - Excessively high values will lag
+ * - The default range that is checked is {@link Settings.Limit#MAX_PLOTS}
+ * + * @param stub The permission stub to check e.g. for `plots.plot.#` the stub is `plots.plot` + * @param range The range to check + * @return The highest permission they have within that range + */ + @Nonnegative default int hasPermissionRange(@Nonnull final String stub, + @Nonnegative final int range) { + if (hasPermission(Captions.PERMISSION_ADMIN.getTranslated())) { + return Integer.MAX_VALUE; + } + String[] nodes = stub.split("\\."); + StringBuilder builder = new StringBuilder(); + for (int i = 0; i < (nodes.length - 1); i++) { + builder.append(nodes[i]).append("."); + if (!stub.equals(builder + Captions.PERMISSION_STAR.getTranslated())) { + if (hasPermission(builder + Captions.PERMISSION_STAR.getTranslated())) { + return Integer.MAX_VALUE; + } + } + } + if (hasPermission(stub + ".*")) { + return Integer.MAX_VALUE; + } + for (int i = range; i > 0; i--) { + if (hasPermission(stub + "." + i)) { + return i; + } + } + return 0; + } + + /** + * Check if the owner of the profile has a given permission + * + * @param world World name + * @param permission Permission + * @return {@code true} if the owner has the given permission, else {@code false} + */ + boolean hasPermission(@Nullable final String world, @Nonnull String permission); } diff --git a/Core/src/main/java/com/plotsquared/core/permissions/PermissionProfile.java b/Core/src/main/java/com/plotsquared/core/permissions/PermissionProfile.java index 912147980..b7aad8e63 100644 --- a/Core/src/main/java/com/plotsquared/core/permissions/PermissionProfile.java +++ b/Core/src/main/java/com/plotsquared/core/permissions/PermissionProfile.java @@ -26,6 +26,7 @@ package com.plotsquared.core.permissions; import javax.annotation.Nonnull; +import javax.annotation.Nullable; /** * A permission profile that can be used to check for permissions @@ -33,11 +34,22 @@ import javax.annotation.Nonnull; public interface PermissionProfile { /** - * Check if the owner of the profile has a given permission + * Check if the owner of the profile has a given (global) permission * * @param permission Permission * @return {@code true} if the owner has the given permission, else {@code false} */ - boolean hasPermission(@Nonnull String permission); + default boolean hasPermission(@Nonnull final String permission) { + return hasPermission(null ,permission); + } + + /** + * Check if the owner of the profile has a given permission + * + * @param world World name + * @param permission Permission + * @return {@code true} if the owner has the given permission, else {@code false} + */ + boolean hasPermission(@Nullable final String world, @Nonnull String permission); } diff --git a/Core/src/main/java/com/plotsquared/core/player/ConsolePlayer.java b/Core/src/main/java/com/plotsquared/core/player/ConsolePlayer.java index 2c1e67c8f..437e86491 100644 --- a/Core/src/main/java/com/plotsquared/core/player/ConsolePlayer.java +++ b/Core/src/main/java/com/plotsquared/core/player/ConsolePlayer.java @@ -123,10 +123,6 @@ public class ConsolePlayer extends PlotPlayer { return 0; } - @Override public boolean isPermissionSet(String permission) { - return true; - } - @Override public void sendMessage(String message) { logger.info(message); } diff --git a/Core/src/main/java/com/plotsquared/core/player/PlotPlayer.java b/Core/src/main/java/com/plotsquared/core/player/PlotPlayer.java index d3c4fd369..666d5be7b 100644 --- a/Core/src/main/java/com/plotsquared/core/player/PlotPlayer.java +++ b/Core/src/main/java/com/plotsquared/core/player/PlotPlayer.java @@ -154,8 +154,9 @@ public abstract class PlotPlayer

implements CommandCaller, OfflinePlotPlayer return PlotSquared.platform().wrapPlayer(player); } - @Override public final boolean hasPermission(@Nonnull final String permission) { - return this.permissionProfile.hasPermission(permission); + @Override public final boolean hasPermission(@Nullable final String world, + @Nonnull final String permission) { + return this.permissionProfile.hasPermission(world, permission); } public abstract Actor toActor(); @@ -257,31 +258,6 @@ public abstract class PlotPlayer

implements CommandCaller, OfflinePlotPlayer return Permissions.hasPermissionRange(this, "plots.cluster", Settings.Limit.MAX_PLOTS); } - public int hasPermissionRange(String stub, int range) { - if (hasPermission(Captions.PERMISSION_ADMIN.getTranslated())) { - return Integer.MAX_VALUE; - } - String[] nodes = stub.split("\\."); - StringBuilder builder = new StringBuilder(); - for (int i = 0; i < (nodes.length - 1); i++) { - builder.append(nodes[i]).append("."); - if (!stub.equals(builder + Captions.PERMISSION_STAR.getTranslated())) { - if (hasPermission(builder + Captions.PERMISSION_STAR.getTranslated())) { - return Integer.MAX_VALUE; - } - } - } - if (hasPermission(stub + ".*")) { - return Integer.MAX_VALUE; - } - for (int i = range; i > 0; i--) { - if (hasPermission(stub + "." + i)) { - return i; - } - } - return 0; - } - /** * Get the number of plots this player owns. * diff --git a/Core/src/main/java/com/plotsquared/core/util/EconHandler.java b/Core/src/main/java/com/plotsquared/core/util/EconHandler.java index 69363079f..508fe8f57 100644 --- a/Core/src/main/java/com/plotsquared/core/util/EconHandler.java +++ b/Core/src/main/java/com/plotsquared/core/util/EconHandler.java @@ -48,16 +48,4 @@ public abstract class EconHandler { public abstract void depositMoney(OfflinePlotPlayer player, double amount); - /** - * @deprecated Use {@link PermHandler#hasPermission(String, String, String)} instead - */ - @Deprecated public abstract boolean hasPermission(String world, String player, String perm); - - /** - * @deprecated Use {@link PermHandler#hasPermission(String, String)} instead - */ - @Deprecated public boolean hasPermission(String player, String perm) { - return hasPermission(null, player, perm); - } - } diff --git a/Core/src/main/java/com/plotsquared/core/util/PermHandler.java b/Core/src/main/java/com/plotsquared/core/util/PermHandler.java deleted file mode 100644 index 1dec45fd4..000000000 --- a/Core/src/main/java/com/plotsquared/core/util/PermHandler.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * _____ _ _ _____ _ - * | __ \| | | | / ____| | | - * | |__) | | ___ | |_| (___ __ _ _ _ __ _ _ __ ___ __| | - * | ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` | - * | | | | (_) | |_ ____) | (_| | |_| | (_| | | | __/ (_| | - * |_| |_|\___/ \__|_____/ \__, |\__,_|\__,_|_| \___|\__,_| - * | | - * |_| - * PlotSquared plot management system for Minecraft - * Copyright (C) 2020 IntellectualSites - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package com.plotsquared.core.util; - -public abstract class PermHandler { - - public abstract boolean init(); - - public abstract boolean hasPermission(String world, String player, String perm); - - public boolean hasPermission(String player, String perm) { - return hasPermission(null, player, perm); - } -} diff --git a/Core/src/main/java/com/plotsquared/core/util/Permissions.java b/Core/src/main/java/com/plotsquared/core/util/Permissions.java index 34754e7c8..7e3b4622f 100644 --- a/Core/src/main/java/com/plotsquared/core/util/Permissions.java +++ b/Core/src/main/java/com/plotsquared/core/util/Permissions.java @@ -29,6 +29,7 @@ import com.plotsquared.core.command.CommandCaller; import com.plotsquared.core.configuration.Captions; import com.plotsquared.core.configuration.Settings; import com.plotsquared.core.player.PlotPlayer; +import com.plotsquared.core.permissions.PermissionHolder; import java.util.HashMap; @@ -39,7 +40,7 @@ import java.util.HashMap; */ public class Permissions { - public static boolean hasPermission(PlotPlayer player, Captions caption, boolean notify) { + public static boolean hasPermission(PlotPlayer player, Captions caption, boolean notify) { return hasPermission(player, caption.getTranslated(), notify); } @@ -50,7 +51,7 @@ public class Permissions { * @param caption * @return */ - public static boolean hasPermission(PlotPlayer player, Captions caption) { + public static boolean hasPermission(PlotPlayer player, Captions caption) { return hasPermission(player, caption.getTranslated()); } @@ -63,7 +64,7 @@ public class Permissions { */ public static boolean hasPermission(PlotPlayer player, String permission) { if (!Settings.Enabled_Components.PERMISSION_CACHE) { - return hasPermission((CommandCaller) player, permission); + return hasPermission((PermissionHolder) player, permission); } HashMap map = player.getMeta("perm"); if (map != null) { @@ -75,7 +76,7 @@ public class Permissions { map = new HashMap<>(); player.setMeta("perm", map); } - boolean result = hasPermission((CommandCaller) player, permission); + boolean result = hasPermission((PermissionHolder) player, permission); map.put(permission, result); return result; } @@ -87,12 +88,12 @@ public class Permissions { * @param permission * @return */ - public static boolean hasPermission(CommandCaller caller, String permission) { + public static boolean hasPermission(PermissionHolder caller, String permission) { if (caller.hasPermission(permission)) { return true; - } else if (caller.isPermissionSet(permission)) { + }/* TODO: DECIDE WHAT TO DO HERE; else if (caller.isPermissionSet(permission)) { return false; - } + }*/ if (caller.hasPermission(Captions.PERMISSION_ADMIN.getTranslated())) { return true; } @@ -105,9 +106,9 @@ public class Permissions { if (!permission.equals(combined)) { if (caller.hasPermission(combined)) { return true; - } else if (caller.isPermissionSet(combined)) { + }/* TODO: DECIDE WHAT TO DO HERE; else if (caller.isPermissionSet(combined)) { return false; - } + }*/ } } return false; @@ -121,7 +122,7 @@ public class Permissions { * @param notify * @return */ - public static boolean hasPermission(PlotPlayer player, String permission, boolean notify) { + public static boolean hasPermission(PlotPlayer player, String permission, boolean notify) { if (!hasPermission(player, permission)) { if (notify) { MainUtil.sendMessage(player, Captions.NO_PERMISSION_EVENT, permission); @@ -131,7 +132,7 @@ public class Permissions { return true; } - public static int hasPermissionRange(PlotPlayer player, Captions perm, int range) { + public static int hasPermissionRange(PlotPlayer player, Captions perm, int range) { return hasPermissionRange(player, perm.getTranslated(), range); } @@ -140,12 +141,12 @@ public class Permissions { * - Excessively high values will lag
* - The default range that is checked is {@link Settings.Limit#MAX_PLOTS}
* - * @param player + * @param player Player to check for * @param stub The permission stub to check e.g. for `plots.plot.#` the stub is `plots.plot` * @param range The range to check * @return The highest permission they have within that range */ - public static int hasPermissionRange(PlotPlayer player, String stub, int range) { + public static int hasPermissionRange(PlotPlayer player, String stub, int range) { return player.hasPermissionRange(stub, range); } } From 7fc8238fb0bed84cdcab625d2f0ca35e9e5d8b77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20S=C3=B6derberg?= Date: Thu, 23 Jul 2020 12:47:00 +0200 Subject: [PATCH 04/16] Remove construction of fake player entities for offline players. --- .../plotsquared/bukkit/BukkitPlatform.java | 36 +---- .../bukkit/player/BukkitOfflinePlayer.java | 12 +- .../bukkit/player/BukkitPlayer.java | 19 +-- .../bukkit/player/BukkitPlayerManager.java | 6 +- .../plotsquared/bukkit/util/BukkitUtil.java | 32 ----- .../bukkit/util/OfflinePlayerUtil.java | 133 ------------------ .../java/com/plotsquared/core/PlotAPI.java | 12 +- .../com/plotsquared/core/PlotPlatform.java | 11 +- .../com/plotsquared/core/command/Buy.java | 2 +- .../core/listener/PlotListener.java | 4 +- .../core/listener/WESubscriber.java | 3 +- .../core/player/ConsolePlayer.java | 6 +- .../core/player/OfflinePlotPlayer.java | 11 +- .../plotsquared/core/player/PlotPlayer.java | 14 -- .../java/com/plotsquared/core/plot/Plot.java | 13 +- .../core/plot/expiration/ExpireManager.java | 4 +- .../com/plotsquared/core/util/WorldUtil.java | 8 -- 17 files changed, 40 insertions(+), 286 deletions(-) delete mode 100644 Bukkit/src/main/java/com/plotsquared/bukkit/util/OfflinePlayerUtil.java diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitPlatform.java b/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitPlatform.java index 8a9831f22..684c3f438 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitPlatform.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitPlatform.java @@ -570,7 +570,8 @@ import static com.plotsquared.core.util.ReflectionUtils.getRefClass; } final Plot plot = area.getOwnedPlot(id); if (plot != null) { - if (!plot.getFlag(ServerPlotFlag.class) || PlotPlayer.wrap(plot.getOwner()) == null) { + if (!plot.getFlag(ServerPlotFlag.class) || PlotSquared.platform().getPlayerManager() + .getPlayerIfExists(plot.getOwner()) == null) { if (world.getKeepSpawnInMemory()) { world.setKeepSpawnInMemory(false); return; @@ -1078,39 +1079,6 @@ import static com.plotsquared.core.util.ReflectionUtils.getRefClass; } } - /** - * Attempt to retrieve a {@link PlotPlayer} from a player identifier. - * This method accepts: - * - {@link Player} objects, - * - {@link OfflinePlayer} objects, - * - {@link String} usernames for online players, and - * - {@link UUID} UUIDs for online players - *

- * In the case of offline players, a fake {@link Player} instance will be created. - * This is a rather expensive operation, and should be avoided if possible. - * - * @param player The player to convert to a PlotPlayer - * @return The plot player instance that corresponds to the identifier, or null - * if no such player object could be created - */ - @Override @Nullable public PlotPlayer wrapPlayer(final Object player) { - if (player instanceof Player) { - return BukkitUtil.adapt((Player) player); - } - if (player instanceof OfflinePlayer) { - return BukkitUtil.adapt((OfflinePlayer) player); - } - if (player instanceof String) { - return (PlotPlayer) PlotSquared.platform().getPlayerManager() - .getPlayerIfExists((String) player); - } - if (player instanceof UUID) { - return (PlotPlayer) PlotSquared.platform().getPlayerManager() - .getPlayerIfExists((UUID) player); - } - return null; - } - @Override public String getNMSPackage() { final String name = Bukkit.getServer().getClass().getPackage().getName(); return name.substring(name.lastIndexOf('.') + 1); diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitOfflinePlayer.java b/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitOfflinePlayer.java index 9226c5847..799fbf2b1 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitOfflinePlayer.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitOfflinePlayer.java @@ -30,6 +30,8 @@ import com.plotsquared.core.permissions.PermissionHandler; import com.plotsquared.core.permissions.PermissionProfile; import com.plotsquared.core.player.OfflinePlotPlayer; import org.bukkit.OfflinePlayer; + +import javax.annotation.Nonnegative; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -43,8 +45,6 @@ public class BukkitOfflinePlayer implements OfflinePlotPlayer { /** * Please do not use this method. Instead use BukkitUtil.getPlayer(Player), * as it caches player objects. - * - * @param player */ public BukkitOfflinePlayer(@Nonnull final OfflinePlayer player, @Nonnull final PermissionHandler permissionHandler) { @@ -57,12 +57,8 @@ public class BukkitOfflinePlayer implements OfflinePlotPlayer { return this.player.getUniqueId(); } - @Override public long getLastPlayed() { - return this.player.getLastPlayed(); - } - - @Override public boolean isOnline() { - return this.player.isOnline(); + @Override @Nonnegative public long getLastPlayed() { + return this.player.getLastSeen(); } @Override public String getName() { diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayer.java b/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayer.java index 1415c2840..b66eed10f 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayer.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayer.java @@ -75,10 +75,8 @@ public class BukkitPlayer extends PlotPlayer { private final EconHandler econHandler; public final Player player; - private boolean offline; private String name; - /** *

Please do not use this method. Instead use * BukkitUtil.getPlayer(Player), as it caches player objects.

@@ -90,19 +88,12 @@ public class BukkitPlayer extends PlotPlayer { this(plotAreaManager, eventDispatcher, player, false, econHandler, permissionHandler); } - public BukkitPlayer(@Nonnull final PlotAreaManager plotAreaManager, @Nonnull final EventDispatcher eventDispatcher, - @Nonnull final Player player, final boolean offline, @Nullable final EconHandler econHandler, - @Nonnull final PermissionHandler permissionHandler) { - this(plotAreaManager, eventDispatcher, player, offline, true, econHandler, permissionHandler); - } - public BukkitPlayer(@Nonnull final PlotAreaManager plotAreaManager, @Nonnull final - EventDispatcher eventDispatcher, @Nonnull final Player player, final boolean offline, + EventDispatcher eventDispatcher, @Nonnull final Player player, final boolean realPlayer, @Nullable final EconHandler econHandler, @Nonnull final PermissionHandler permissionHandler) { super(plotAreaManager, eventDispatcher, econHandler, permissionHandler); this.player = player; - this.offline = offline; this.econHandler = econHandler; if (realPlayer) { super.populatePersistentMetaMap(); @@ -130,8 +121,8 @@ public class BukkitPlayer extends PlotPlayer { return player.getUniqueId(); } - @Override public long getLastPlayed() { - return this.player.getLastPlayed(); + @Override @Nonnegative public long getLastPlayed() { + return this.player.getLastSeen(); } @Override public boolean canTeleport(@Nonnull final Location location) { @@ -255,10 +246,6 @@ public class BukkitPlayer extends PlotPlayer { return this.name; } - @Override public boolean isOnline() { - return !this.offline && this.player.isOnline(); - } - @Override public void setCompassTarget(Location location) { this.player.setCompassTarget( new org.bukkit.Location(BukkitUtil.getWorld(location.getWorldName()), location.getX(), diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayerManager.java b/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayerManager.java index d05fafd7a..78af765a2 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayerManager.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayerManager.java @@ -60,11 +60,13 @@ import java.util.UUID; } @Nonnull @Override public BukkitPlayer getPlayer(@Nonnull final Player object) { + if (!object.isOnline()) { + throw new NoSuchPlayerException(object.getUniqueId()); + } try { return getPlayer(object.getUniqueId()); } catch (final NoSuchPlayerException exception) { - return new BukkitPlayer(this.plotAreaManager, this.eventDispatcher, object, - object.isOnline(), false, this.econHandler, this.permissionHandler); + return new BukkitPlayer(this.plotAreaManager, this.eventDispatcher, object, false, this.econHandler, this.permissionHandler); } } diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitUtil.java b/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitUtil.java index 1d88f9a6f..3537c25a2 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitUtil.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitUtil.java @@ -53,7 +53,6 @@ import io.papermc.lib.PaperLib; import org.bukkit.Bukkit; import org.bukkit.Chunk; import org.bukkit.Material; -import org.bukkit.OfflinePlayer; import org.bukkit.World; import org.bukkit.block.Biome; import org.bukkit.block.Block; @@ -101,7 +100,6 @@ import java.util.Collection; import java.util.HashSet; import java.util.Objects; import java.util.Set; -import java.util.UUID; import java.util.function.Consumer; import java.util.function.IntConsumer; import java.util.stream.Stream; @@ -116,24 +114,6 @@ import java.util.stream.Stream; super(regionManager); } - /** - * Get a {@link PlotPlayer} from an {@link OfflinePlayer}. If the player is - * online, it returns a complete player. If the player is offline, it creates - * a fake player - * - * @param op Offline player - * @return Plot player instance - */ - @Nonnull public static PlotPlayer adapt(@Nonnull final OfflinePlayer op) { - if (op.isOnline()) { - return adapt(Objects.requireNonNull(op.getPlayer())); - } - final Player player = OfflinePlayerUtil.loadPlayer(op); - player.loadData(); - return new BukkitPlayer(PlotSquared.get().getPlotAreaManager(), - PlotSquared.get().getEventDispatcher(), player, true, PlotSquared.platform().getEconHandler(), PlotSquared.platform().getPermissionHandler()); - } - /** * Turn a Bukkit {@link Player} into a PlotSquared {@link PlotPlayer} * @@ -214,18 +194,6 @@ import java.util.stream.Stream; } } - /** - * Gets the PlotPlayer for a UUID. The PlotPlayer is usually cached and - * will provide useful functions relating to players. - * - * @param uuid the uuid to wrap - * @return a {@code PlotPlayer} - * @see PlotPlayer#wrap(Object) - */ - @Override @Nonnull public PlotPlayer getPlayer(@Nonnull final UUID uuid) { - return PlotPlayer.wrap(Bukkit.getOfflinePlayer(uuid)); - } - @Override public boolean isBlockSame(@Nonnull final BlockState block1, @Nonnull final BlockState block2) { if (block1.equals(block2)) { diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/util/OfflinePlayerUtil.java b/Bukkit/src/main/java/com/plotsquared/bukkit/util/OfflinePlayerUtil.java deleted file mode 100644 index 41ae4dedd..000000000 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/util/OfflinePlayerUtil.java +++ /dev/null @@ -1,133 +0,0 @@ -/* - * _____ _ _ _____ _ - * | __ \| | | | / ____| | | - * | |__) | | ___ | |_| (___ __ _ _ _ __ _ _ __ ___ __| | - * | ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` | - * | | | | (_) | |_ ____) | (_| | |_| | (_| | | | __/ (_| | - * |_| |_|\___/ \__|_____/ \__, |\__,_|\__,_|_| \___|\__,_| - * | | - * |_| - * PlotSquared plot management system for Minecraft - * Copyright (C) 2020 IntellectualSites - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package com.plotsquared.bukkit.util; - -import org.bukkit.Bukkit; -import org.bukkit.OfflinePlayer; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Player; - -import java.lang.reflect.Constructor; -import java.lang.reflect.Method; -import java.util.UUID; - -import static com.plotsquared.core.util.ReflectionUtils.callConstructor; -import static com.plotsquared.core.util.ReflectionUtils.callMethod; -import static com.plotsquared.core.util.ReflectionUtils.getCbClass; -import static com.plotsquared.core.util.ReflectionUtils.getField; -import static com.plotsquared.core.util.ReflectionUtils.getNmsClass; -import static com.plotsquared.core.util.ReflectionUtils.getUtilClass; -import static com.plotsquared.core.util.ReflectionUtils.makeConstructor; -import static com.plotsquared.core.util.ReflectionUtils.makeField; -import static com.plotsquared.core.util.ReflectionUtils.makeMethod; - -public class OfflinePlayerUtil { - - public static Player loadPlayer(OfflinePlayer player) { - if (player == null) { - return null; - } - if (player instanceof Player) { - return (Player) player; - } - return loadPlayer(player.getUniqueId(), player.getName()); - } - - private static Player loadPlayer(UUID id, String name) { - Object server = getMinecraftServer(); - Object interactManager = newPlayerInteractManager(); - Object worldServer = getWorldServer(); - Object profile = newGameProfile(id, name); - Class entityPlayerClass = getNmsClass("EntityPlayer"); - Constructor entityPlayerConstructor = - makeConstructor(entityPlayerClass, getNmsClass("MinecraftServer"), - getNmsClass("WorldServer"), getUtilClass("com.mojang.authlib.GameProfile"), - getNmsClass("PlayerInteractManager")); - Object entityPlayer = - callConstructor(entityPlayerConstructor, server, worldServer, profile, interactManager); - return (Player) getBukkitEntity(entityPlayer); - } - - private static Object newGameProfile(UUID id, String name) { - Class gameProfileClass = getUtilClass("com.mojang.authlib.GameProfile"); - if (gameProfileClass == null) { //Before uuids - return name; - } - Constructor gameProfileConstructor = - makeConstructor(gameProfileClass, UUID.class, String.class); - if (gameProfileConstructor == null) { //Version has string constructor - gameProfileConstructor = makeConstructor(gameProfileClass, String.class, String.class); - return callConstructor(gameProfileConstructor, id.toString(), name); - } else { //Version has uuid constructor - return callConstructor(gameProfileConstructor, id, name); - } - } - - private static Object newPlayerInteractManager() { - Object worldServer = getWorldServer(); - Class playerInteractClass = getNmsClass("PlayerInteractManager"); - Class worldClass = getNmsClass("World"); - Constructor c = makeConstructor(playerInteractClass, worldClass); - if (c == null) { - c = makeConstructor(playerInteractClass, getNmsClass("WorldServer")); - } - return callConstructor(c, worldServer); - } - - public static Object getWorldServerNew() { - Object server = getMinecraftServer(); - Class minecraftServerClass = getNmsClass("MinecraftServer"); - Class dimensionManager = getNmsClass("DimensionManager"); - Object overworld = getField(makeField(dimensionManager, "OVERWORLD"), null); - Method getWorldServer = - makeMethod(minecraftServerClass, "getWorldServer", dimensionManager); - return callMethod(getWorldServer, server, overworld); - } - - private static Object getWorldServer() { - Object server = getMinecraftServer(); - Class minecraftServerClass = getNmsClass("MinecraftServer"); - Method getWorldServer = makeMethod(minecraftServerClass, "getWorldServer", int.class); - Object o; - try { - o = callMethod(getWorldServer, server, 0); - } catch (final RuntimeException e) { - o = getWorldServerNew(); - } - return o; - } - - //NMS Utils - - private static Object getMinecraftServer() { - return callMethod(makeMethod(getCbClass("CraftServer"), "getServer"), Bukkit.getServer()); - } - - private static Entity getBukkitEntity(Object o) { - Method getBukkitEntity = makeMethod(o.getClass(), "getBukkitEntity"); - return callMethod(getBukkitEntity, o); - } -} diff --git a/Core/src/main/java/com/plotsquared/core/PlotAPI.java b/Core/src/main/java/com/plotsquared/core/PlotAPI.java index 9a83aae5e..1450a3f4e 100644 --- a/Core/src/main/java/com/plotsquared/core/PlotAPI.java +++ b/Core/src/main/java/com/plotsquared/core/PlotAPI.java @@ -39,6 +39,8 @@ import com.plotsquared.core.util.SchematicHandler; import com.plotsquared.core.util.query.PlotQuery; import lombok.NoArgsConstructor; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.util.Collections; import java.util.Set; import java.util.UUID; @@ -178,10 +180,9 @@ import java.util.UUID; * * @param uuid the uuid of the player to wrap * @return a {@code PlotPlayer} - * @see PlotPlayer#wrap(Object) */ - public PlotPlayer wrapPlayer(UUID uuid) { - return PlotPlayer.wrap(uuid); + @Nullable public PlotPlayer wrapPlayer(@Nonnull final UUID uuid) { + return PlotSquared.platform().getPlayerManager().getPlayerIfExists(uuid); } /** @@ -189,10 +190,9 @@ import java.util.UUID; * * @param player the player to wrap * @return a {@code PlotPlayer} - * @see PlotPlayer#wrap(Object) */ - public PlotPlayer wrapPlayer(String player) { - return PlotPlayer.wrap(player); + @Nullable public PlotPlayer wrapPlayer(@Nonnull final String player) { + return PlotSquared.platform().getPlayerManager().getPlayerIfExists(player); } /** diff --git a/Core/src/main/java/com/plotsquared/core/PlotPlatform.java b/Core/src/main/java/com/plotsquared/core/PlotPlatform.java index c84bce2b9..51f5ff6e1 100644 --- a/Core/src/main/java/com/plotsquared/core/PlotPlatform.java +++ b/Core/src/main/java/com/plotsquared/core/PlotPlatform.java @@ -27,6 +27,7 @@ package com.plotsquared.core; import com.google.inject.Injector; import com.google.inject.Key; +import com.google.inject.TypeLiteral; import com.plotsquared.core.backup.BackupManager; import com.plotsquared.core.generator.GeneratorWrapper; import com.plotsquared.core.generator.HybridUtils; @@ -80,14 +81,6 @@ public interface PlotPlatform

extends ILogger { */ File getWorldContainer(); - /** - * Wraps a player into a PlotPlayer object. - * - * @param player The player to convert to a PlotPlayer - * @return A PlotPlayer - */ - @Nullable PlotPlayer

wrapPlayer(Object player); - /** * Completely shuts down the plugin. */ @@ -186,7 +179,7 @@ public interface PlotPlatform

extends ILogger { * @return Player manager */ @Nonnull default PlayerManager, ? extends P> getPlayerManager() { - return getInjector().getInstance(PlayerManager.class); + return getInjector().getInstance(Key.get(new TypeLiteral, ? extends P>>() {})); } /** diff --git a/Core/src/main/java/com/plotsquared/core/command/Buy.java b/Core/src/main/java/com/plotsquared/core/command/Buy.java index 88f4dd4af..8fe688834 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Buy.java +++ b/Core/src/main/java/com/plotsquared/core/command/Buy.java @@ -93,7 +93,7 @@ public class Buy extends Command { this.econHandler.depositMoney(PlotSquared.platform().getPlayerManager().getOfflinePlayer(plot.getOwnerAbs()), price); - PlotPlayer owner = PlotSquared.platform().getPlayerManager().getPlayerIfExists(plot.getOwnerAbs()); + PlotPlayer owner = PlotSquared.platform().getPlayerManager().getPlayerIfExists(plot.getOwnerAbs()); if (owner != null) { Captions.PLOT_SOLD.send(owner, plot.getId(), player.getName(), price); } diff --git a/Core/src/main/java/com/plotsquared/core/listener/PlotListener.java b/Core/src/main/java/com/plotsquared/core/listener/PlotListener.java index 2579976a4..c9fe94e41 100644 --- a/Core/src/main/java/com/plotsquared/core/listener/PlotListener.java +++ b/Core/src/main/java/com/plotsquared/core/listener/PlotListener.java @@ -94,7 +94,7 @@ public class PlotListener { ++value.count; if (value.count == value.interval) { value.count = 0; - PlotPlayer player = PlotPlayer.wrap(entry.getKey()); + final PlotPlayer player = PlotSquared.platform().getPlayerManager().getPlayerIfExists(entry.getKey()); if (player == null) { iterator.remove(); continue; @@ -114,7 +114,7 @@ public class PlotListener { ++value.count; if (value.count == value.interval) { value.count = 0; - PlotPlayer player = PlotSquared.platform().getWorldUtil().getPlayer(entry.getKey()); + final PlotPlayer player = PlotSquared.platform().getPlayerManager().getPlayerIfExists(entry.getKey()); if (player == null) { iterator.remove(); continue; diff --git a/Core/src/main/java/com/plotsquared/core/listener/WESubscriber.java b/Core/src/main/java/com/plotsquared/core/listener/WESubscriber.java index 4ae1c5c1f..7cfbd2751 100644 --- a/Core/src/main/java/com/plotsquared/core/listener/WESubscriber.java +++ b/Core/src/main/java/com/plotsquared/core/listener/WESubscriber.java @@ -26,6 +26,7 @@ package com.plotsquared.core.listener; import com.google.inject.Inject; +import com.plotsquared.core.PlotSquared; import com.plotsquared.core.configuration.Captions; import com.plotsquared.core.configuration.Settings; import com.plotsquared.core.player.PlotPlayer; @@ -72,7 +73,7 @@ public class WESubscriber { Actor actor = event.getActor(); if (actor != null && actor.isPlayer()) { String name = actor.getName(); - PlotPlayer plotPlayer = PlotPlayer.wrap(name); + final PlotPlayer plotPlayer = PlotSquared.platform().getPlayerManager().getPlayerIfExists(name); Set mask; if (plotPlayer == null) { Player player = (Player) actor; diff --git a/Core/src/main/java/com/plotsquared/core/player/ConsolePlayer.java b/Core/src/main/java/com/plotsquared/core/player/ConsolePlayer.java index 437e86491..60fbf7415 100644 --- a/Core/src/main/java/com/plotsquared/core/player/ConsolePlayer.java +++ b/Core/src/main/java/com/plotsquared/core/player/ConsolePlayer.java @@ -120,7 +120,7 @@ public class ConsolePlayer extends PlotPlayer { } @Override public long getLastPlayed() { - return 0; + return System.currentTimeMillis(); } @Override public void sendMessage(String message) { @@ -132,10 +132,6 @@ public class ConsolePlayer extends PlotPlayer { setMeta(META_LOCATION, location); } - @Override public boolean isOnline() { - return true; - } - @Override public String getName() { return "*"; } diff --git a/Core/src/main/java/com/plotsquared/core/player/OfflinePlotPlayer.java b/Core/src/main/java/com/plotsquared/core/player/OfflinePlotPlayer.java index 92a0e6536..24d83514a 100644 --- a/Core/src/main/java/com/plotsquared/core/player/OfflinePlotPlayer.java +++ b/Core/src/main/java/com/plotsquared/core/player/OfflinePlotPlayer.java @@ -27,6 +27,7 @@ package com.plotsquared.core.player; import com.plotsquared.core.permissions.PermissionHolder; +import javax.annotation.Nonnegative; import java.util.UUID; public interface OfflinePlotPlayer extends PermissionHolder { @@ -42,16 +43,8 @@ public interface OfflinePlotPlayer extends PermissionHolder { * Gets the time in milliseconds when the player was last seen online. * * @return the time in milliseconds when last online - * @deprecated This method may be inconsistent across platforms. The javadoc may be wrong depending on which platform is used. */ - @SuppressWarnings("DeprecatedIsStillUsed") @Deprecated long getLastPlayed(); - - /** - * Checks if this player is online. - * - * @return {@code true} if this player is online - */ - boolean isOnline(); + @Nonnegative long getLastPlayed(); /** * Gets the name of this player. diff --git a/Core/src/main/java/com/plotsquared/core/player/PlotPlayer.java b/Core/src/main/java/com/plotsquared/core/player/PlotPlayer.java index 666d5be7b..27680b26a 100644 --- a/Core/src/main/java/com/plotsquared/core/player/PlotPlayer.java +++ b/Core/src/main/java/com/plotsquared/core/player/PlotPlayer.java @@ -140,20 +140,6 @@ public abstract class PlotPlayer

implements CommandCaller, OfflinePlotPlayer return players; } - /** - * Efficiently wrap a Player, or OfflinePlayer object to get a PlotPlayer (or fetch if it's already cached)
- * - Accepts sponge/bukkit Player (online) - * - Accepts player name (online) - * - Accepts UUID - * - Accepts bukkit OfflinePlayer (offline) - * - * @param player Player object to wrap - * @return Wrapped player - */ - public static PlotPlayer wrap(Object player) { - return PlotSquared.platform().wrapPlayer(player); - } - @Override public final boolean hasPermission(@Nullable final String world, @Nonnull final String permission) { return this.permissionProfile.hasPermission(world, permission); diff --git a/Core/src/main/java/com/plotsquared/core/plot/Plot.java b/Core/src/main/java/com/plotsquared/core/plot/Plot.java index 918388008..d4fe6ba6b 100644 --- a/Core/src/main/java/com/plotsquared/core/plot/Plot.java +++ b/Core/src/main/java/com/plotsquared/core/plot/Plot.java @@ -1926,11 +1926,16 @@ public class Plot { DBFunc.createPlotAndSettings(this, () -> { PlotArea plotworld = Plot.this.area; if (notify && plotworld.isAutoMerge()) { - PlotPlayer player = this.worldUtil.getPlayer(uuid); + final PlotPlayer player = PlotSquared.platform().getPlayerManager() + .getPlayerIfExists(uuid); + PlotMergeEvent event = this.eventDispatcher .callMerge(this, Direction.ALL, Integer.MAX_VALUE, player); + if (event.getEventResult() == Result.DENY) { - sendMessage(player, Captions.EVENT_DENIED, "Auto merge on claim"); + if (player != null) { + sendMessage(player, Captions.EVENT_DENIED, "Auto merge on claim"); + } return; } Plot.this.autoMerge(event.getDir(), event.getMax(), uuid, true); @@ -3083,10 +3088,10 @@ public class Plot { if (!TaskManager.removeFromTeleportQueue(name)) { return; } - if (player.isOnline()) { + try { MainUtil.sendMessage(player, Captions.TELEPORTED_TO_PLOT); player.teleport(location, cause); - } + } catch (final Exception ignored) {} }, TaskTime.seconds(Settings.Teleport.DELAY)); resultConsumer.accept(true); }; diff --git a/Core/src/main/java/com/plotsquared/core/plot/expiration/ExpireManager.java b/Core/src/main/java/com/plotsquared/core/plot/expiration/ExpireManager.java index 2a3514540..1171bef87 100644 --- a/Core/src/main/java/com/plotsquared/core/plot/expiration/ExpireManager.java +++ b/Core/src/main/java/com/plotsquared/core/plot/expiration/ExpireManager.java @@ -418,13 +418,13 @@ public class ExpireManager { } } for (UUID helper : plot.getTrusted()) { - PlotPlayer player = PlotSquared.platform().getPlayerManager().getPlayerIfExists(helper); + PlotPlayer player = PlotSquared.platform().getPlayerManager().getPlayerIfExists(helper); if (player != null) { MainUtil.sendMessage(player, Captions.PLOT_REMOVED_USER, plot.toString()); } } for (UUID helper : plot.getMembers()) { - PlotPlayer player = PlotSquared.platform().getPlayerManager().getPlayerIfExists(helper); + PlotPlayer player = PlotSquared.platform().getPlayerManager().getPlayerIfExists(helper); if (player != null) { MainUtil.sendMessage(player, Captions.PLOT_REMOVED_USER, plot.toString()); } diff --git a/Core/src/main/java/com/plotsquared/core/util/WorldUtil.java b/Core/src/main/java/com/plotsquared/core/util/WorldUtil.java index 81d5e2f11..e478bfdb8 100644 --- a/Core/src/main/java/com/plotsquared/core/util/WorldUtil.java +++ b/Core/src/main/java/com/plotsquared/core/util/WorldUtil.java @@ -328,14 +328,6 @@ public abstract class WorldUtil { */ public abstract boolean isBlockSame(@Nonnull BlockState block1, @Nonnull BlockState block2); - /** - * Get a player object for the player with the given UUID - * - * @param uuid Player UUID - * @return Player object - */ - @Nonnull public abstract PlotPlayer getPlayer(@Nonnull UUID uuid); - /** * Get the player health * From b3a63123fda4a4041dd788c3023c3281a2950574 Mon Sep 17 00:00:00 2001 From: N0tMyFaultOG Date: Thu, 23 Jul 2020 14:03:56 +0200 Subject: [PATCH 05/16] Fix dependencies --- Bukkit/build.gradle | 2 ++ Bukkit/pom.xml | 2 +- Core/build.gradle | 2 ++ Core/pom.xml | 12 ++++++++++++ 4 files changed, 17 insertions(+), 1 deletion(-) diff --git a/Bukkit/build.gradle b/Bukkit/build.gradle index 8e32904c5..3bb9f863e 100644 --- a/Bukkit/build.gradle +++ b/Bukkit/build.gradle @@ -106,6 +106,8 @@ shadowJar { include(dependency("javax.annotation:javax-annotation-api")) include(dependency('org.apache.logging.log4j:log4j-slf4j-impl')) include(dependency('org.slf4j:slf4j-api')) + include(dependency('javax.inject:javax.inject:1')) + include(dependency('aopalliance:aopalliance:1.0')) } relocate('net.kyori.text', 'com.plotsquared.formatting.text') diff --git a/Bukkit/pom.xml b/Bukkit/pom.xml index d4848ae84..b9e6fbb23 100644 --- a/Bukkit/pom.xml +++ b/Bukkit/pom.xml @@ -51,7 +51,7 @@ io.papermc paperlib - 1.0.2 + 1.0.4 compile diff --git a/Core/build.gradle b/Core/build.gradle index 9743bc080..bd0fa55f0 100644 --- a/Core/build.gradle +++ b/Core/build.gradle @@ -20,6 +20,8 @@ dependencies { compile("com.google.inject:guice:4.2.3") compile("com.google.inject.extensions:guice-assistedinject:4.2.3") compile group: 'com.google.code.findbugs', name: 'annotations', version: '3.0.1' + compile group: 'javax.inject', name: 'javax.inject', version: '1' + compile group: 'aopalliance', name: 'aopalliance', version: '1.0' // logging implementation("org.apache.logging.log4j:log4j-slf4j-impl:2.8.1") } diff --git a/Core/pom.xml b/Core/pom.xml index ac6a4ef60..05142d3a8 100644 --- a/Core/pom.xml +++ b/Core/pom.xml @@ -36,6 +36,18 @@ 3.0.1 compile + + javax.inject + javax.inject + 1 + compile + + + aopalliance + aopalliance + 1.0 + compile + org.projectlombok lombok From cfd71457d28217ca8c1d034adf81f36b45d46b93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20S=C3=B6derberg?= Date: Sun, 19 Jul 2020 14:49:26 +0200 Subject: [PATCH 06/16] Clean up BlockUtil --- .../com/plotsquared/core/util/BlockUtil.java | 58 ++++++++++++++++--- 1 file changed, 49 insertions(+), 9 deletions(-) diff --git a/Core/src/main/java/com/plotsquared/core/util/BlockUtil.java b/Core/src/main/java/com/plotsquared/core/util/BlockUtil.java index a0f4e4f50..6d4c4079a 100644 --- a/Core/src/main/java/com/plotsquared/core/util/BlockUtil.java +++ b/Core/src/main/java/com/plotsquared/core/util/BlockUtil.java @@ -35,13 +35,20 @@ import com.sk89q.worldedit.world.block.BlockType; import com.sk89q.worldedit.world.block.BlockTypes; import com.sk89q.worldedit.world.block.FuzzyBlockState; import com.sk89q.worldedit.world.registry.LegacyMapper; + +import javax.annotation.Nonnegative; import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.util.Map; +/** + * {@link BlockState} related utility methods + */ public final class BlockUtil { - private static ParserContext PARSER_CONTEXT = new ParserContext(); - private static InputParser PARSER; + + private static final ParserContext PARSER_CONTEXT = new ParserContext(); + private static final InputParser PARSER; static { PARSER_CONTEXT.setRestricted(false); @@ -53,15 +60,35 @@ public final class BlockUtil { private BlockUtil() { } - public static BlockState get(int id) { + /** + * Get a {@link BlockState} from a legacy id + * + * @param id Legacy ID + * @return Block state, or {@code null} + */ + @Nullable public static BlockState get(@Nonnegative final int id) { return LegacyMapper.getInstance().getBlockFromLegacy(id); } - public static BlockState get(int id, int data) { + /** + * Get a {@link BlockState} from a legacy id-data pair + * + * @param id Legacy ID + * @param data Legacy data + * @return Block state, or {@code null} + */ + @Nullable public static BlockState get(@Nonnegative final int id, final int data) { return LegacyMapper.getInstance().getBlockFromLegacy(id, data); } - public static BlockState get(String id) { + /** + * Get a {@link BlockState} from its ID + * + * @param id String or integer ID + * @return Parsed block state, or {@code null} if none + * could be parsed + */ + @Nullable public static BlockState get(@Nonnull String id) { if (id.length() == 1 && id.charAt(0) == '*') { return FuzzyBlockState.builder().type(BlockTypes.AIR).build(); } @@ -90,16 +117,29 @@ public final class BlockUtil { } } - public static BlockState[] parse(String commaDelimited) { - String[] split = commaDelimited.split(",(?![^\\(\\[]*[\\]\\)])"); - BlockState[] result = new BlockState[split.length]; + /** + * Parse a comma delimited list of block states + * + * @param commaDelimited List of block states + * @return Parsed block states + */ + @Nonnull public static BlockState[] parse(@Nonnull final String commaDelimited) { + final String[] split = commaDelimited.split(",(?![^\\(\\[]*[\\]\\)])"); + final BlockState[] result = new BlockState[split.length]; for (int i = 0; i < split.length; i++) { result[i] = get(split[i]); } return result; } - public static BlockState deserialize(@Nonnull final Map map) { + /** + * Deserialize a serialized {@link BlockState} + * + * @param map Serialized block state + * @return Deserialized block state, or {@code null} if the map is + * not a properly serialized block state + */ + @Nullable public static BlockState deserialize(@Nonnull final Map map) { if (map.containsKey("material")) { final Object object = map.get("material"); return get(object.toString()); From 17d358f8fe432bb9866bd3b83deae8a49d3e4c3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20S=C3=B6derberg?= Date: Thu, 23 Jul 2020 14:11:34 +0200 Subject: [PATCH 07/16] Fix plot ID issues --- .../com/plotsquared/core/plot/PlotId.java | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/Core/src/main/java/com/plotsquared/core/plot/PlotId.java b/Core/src/main/java/com/plotsquared/core/plot/PlotId.java index 27004ba3c..d74d7aeec 100644 --- a/Core/src/main/java/com/plotsquared/core/plot/PlotId.java +++ b/Core/src/main/java/com/plotsquared/core/plot/PlotId.java @@ -36,7 +36,7 @@ import java.util.Iterator; * Plot (X,Y) tuples for plot locations * within a plot area */ -public class PlotId { +public final class PlotId { private final int x; private final int y; @@ -48,7 +48,7 @@ public class PlotId { * @param x The plot x coordinate * @param y The plot y coordinate */ - private PlotId(int x, int y) { + private PlotId(final int x, final int y) { this.x = x; this.y = y; this.hash = (this.getX() << 16) | (this.getY() & 0xFFFF); @@ -61,20 +61,21 @@ public class PlotId { * @param y The plot y coordinate */ @Nonnull public static PlotId of(final int x, final int y) { - return PlotId.of(x, y); + return new PlotId(x, y); } /** * Get a Plot Id based on a string * * @param string to create id from - * @return the PlotId representation of the arguement + * @return the PlotId representation of the argument * @throws IllegalArgumentException if the string does not contain a valid PlotId */ - @Nonnull public static PlotId fromString(@Nonnull String string) { - PlotId plot = fromStringOrNull(string); - if (plot == null) + @Nonnull public static PlotId fromString(@Nonnull final String string) { + final PlotId plot = fromStringOrNull(string); + if (plot == null) { throw new IllegalArgumentException("Cannot create PlotID. String invalid."); + } return plot; } @@ -84,8 +85,8 @@ public class PlotId { * @param string ID string * @return Plot ID, or {@code null} if none could be parsed */ - @Nullable public static PlotId fromStringOrNull(@Nonnull String string) { - String[] parts = string.split("[;,.]"); + @Nullable public static PlotId fromStringOrNull(@Nonnull final String string) { + final String[] parts = string.split("[;,.]"); if (parts.length < 2) { return null; } @@ -94,7 +95,7 @@ public class PlotId { try { x = Integer.parseInt(parts[0]); y = Integer.parseInt(parts[1]); - } catch (NumberFormatException ignored) { + } catch (final NumberFormatException ignored) { return null; } return of(x, y); @@ -126,7 +127,7 @@ public class PlotId { * @return X component */ public int getX() { - return this.getX(); + return this.x; } /** @@ -135,7 +136,7 @@ public class PlotId { * @return Y component */ public int getY() { - return this.getY(); + return this.y; } /** @@ -144,8 +145,8 @@ public class PlotId { * @return Next plot ID */ @Nonnull public PlotId getNextId() { - int absX = Math.abs(x); - int absY = Math.abs(y); + final int absX = Math.abs(x); + final int absY = Math.abs(y); if (absX > absY) { if (x > 0) { return PlotId.of(x, y + 1); From b9a8846ee9ab61036e848cbc21680be97142cbea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20S=C3=B6derberg?= Date: Thu, 23 Jul 2020 14:56:06 +0200 Subject: [PATCH 08/16] Fix WorldManager injection --- .../src/main/java/com/plotsquared/bukkit/BukkitPlatform.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitPlatform.java b/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitPlatform.java index 684c3f438..defd335e3 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitPlatform.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitPlatform.java @@ -30,6 +30,7 @@ import com.google.inject.Inject; import com.google.inject.Injector; import com.google.inject.Key; import com.google.inject.Stage; +import com.google.inject.TypeLiteral; import com.plotsquared.bukkit.generator.BukkitPlotGenerator; import com.plotsquared.bukkit.inject.BackupModule; import com.plotsquared.bukkit.inject.BukkitModule; @@ -1111,4 +1112,8 @@ import static com.plotsquared.core.util.ReflectionUtils.getRefClass; return BukkitWorld.of(worldName); } + @Override @Nonnull public PlatformWorldManager getWorldManager() { + return getInjector().getInstance(Key.get(new TypeLiteral>() {})); + } + } From bfbb81030fa4483ac4223d5ab32028e4212d6408 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20S=C3=B6derberg?= Date: Tue, 21 Jul 2020 14:28:54 +0200 Subject: [PATCH 09/16] Start working on the new permission system --- .../plotsquared/bukkit/BukkitPlatform.java | 8 +- .../bukkit/inject/PermissionModule.java | 52 +++++++++ .../permissions/BukkitPermissionHandler.java | 84 +++++++++++++++ .../permissions/VaultPermissionHandler.java | 102 ++++++++++++++++++ .../bukkit/player/BukkitOfflinePlayer.java | 14 ++- .../bukkit/player/BukkitPlayer.java | 22 ++-- .../bukkit/player/BukkitPlayerManager.java | 14 ++- .../plotsquared/bukkit/util/BukkitUtil.java | 2 +- .../com/plotsquared/core/PlotPlatform.java | 10 ++ .../permissions/ConsolePermissionProfile.java | 37 +++++++ .../permissions/NullPermissionProfile.java | 37 +++++++ .../core/permissions/PermissionHandler.java | 95 ++++++++++++++++ .../core/permissions/PermissionHolder.java | 43 ++++++++ .../core/permissions/PermissionProfile.java | 43 ++++++++ .../core/player/ConsolePlayer.java | 14 ++- .../core/player/OfflinePlotPlayer.java | 5 +- .../plotsquared/core/player/PlotPlayer.java | 17 ++- .../com/plotsquared/core/util/ChunkUtil.java | 25 +++++ .../com/plotsquared/core/util/MainUtil.java | 47 ++++++++ 19 files changed, 637 insertions(+), 34 deletions(-) create mode 100644 Bukkit/src/main/java/com/plotsquared/bukkit/inject/PermissionModule.java create mode 100644 Bukkit/src/main/java/com/plotsquared/bukkit/permissions/BukkitPermissionHandler.java create mode 100644 Bukkit/src/main/java/com/plotsquared/bukkit/permissions/VaultPermissionHandler.java create mode 100644 Core/src/main/java/com/plotsquared/core/permissions/ConsolePermissionProfile.java create mode 100644 Core/src/main/java/com/plotsquared/core/permissions/NullPermissionProfile.java create mode 100644 Core/src/main/java/com/plotsquared/core/permissions/PermissionHandler.java create mode 100644 Core/src/main/java/com/plotsquared/core/permissions/PermissionHolder.java create mode 100644 Core/src/main/java/com/plotsquared/core/permissions/PermissionProfile.java diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitPlatform.java b/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitPlatform.java index bb27113c5..030e30ce1 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitPlatform.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitPlatform.java @@ -34,6 +34,7 @@ import com.google.inject.TypeLiteral; import com.plotsquared.bukkit.generator.BukkitPlotGenerator; import com.plotsquared.bukkit.inject.BackupModule; import com.plotsquared.bukkit.inject.BukkitModule; +import com.plotsquared.bukkit.inject.PermissionModule; import com.plotsquared.bukkit.inject.WorldManagerModule; import com.plotsquared.bukkit.listener.ChunkListener; import com.plotsquared.bukkit.listener.EntitySpawnListener; @@ -248,8 +249,11 @@ import static com.plotsquared.core.util.ReflectionUtils.getRefClass; // We create the injector after PlotSquared has been initialized, so that we have access // to generated instances and settings - this.injector = Guice.createInjector(Stage.PRODUCTION, new WorldManagerModule(), new PlotSquaredModule(), - new BukkitModule(this), new BackupModule()); + this.injector = Guice.createInjector(Stage.PRODUCTION, new PermissionModule(), + new WorldManagerModule(), + new PlotSquaredModule(), + new BukkitModule(this), + new BackupModule()); this.injector.injectMembers(this); if (PremiumVerification.isPremium() && Settings.Enabled_Components.UPDATE_NOTIFICATIONS) { diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/inject/PermissionModule.java b/Bukkit/src/main/java/com/plotsquared/bukkit/inject/PermissionModule.java new file mode 100644 index 000000000..b22cb3648 --- /dev/null +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/inject/PermissionModule.java @@ -0,0 +1,52 @@ +/* + * _____ _ _ _____ _ + * | __ \| | | | / ____| | | + * | |__) | | ___ | |_| (___ __ _ _ _ __ _ _ __ ___ __| | + * | ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` | + * | | | | (_) | |_ ____) | (_| | |_| | (_| | | | __/ (_| | + * |_| |_|\___/ \__|_____/ \__, |\__,_|\__,_|_| \___|\__,_| + * | | + * |_| + * PlotSquared plot management system for Minecraft + * Copyright (C) 2020 IntellectualSites + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.plotsquared.bukkit.inject; + +import com.google.inject.AbstractModule; +import com.google.inject.Provides; +import com.google.inject.Singleton; +import com.plotsquared.bukkit.permissions.BukkitPermissionHandler; +import com.plotsquared.bukkit.permissions.VaultPermissionHandler; +import com.plotsquared.core.permissions.PermissionHandler; +import net.milkbowl.vault.permission.Permission; +import org.bukkit.Bukkit; +import org.bukkit.plugin.RegisteredServiceProvider; + +public class PermissionModule extends AbstractModule { + + @Provides @Singleton PermissionHandler providePermissionHandler() { + try { + RegisteredServiceProvider permissionProvider = + Bukkit.getServer().getServicesManager().getRegistration(Permission.class); + if (permissionProvider != null) { + return new VaultPermissionHandler(); + } + } catch (final Exception ignored) { + } + return new BukkitPermissionHandler(); + } + +} diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/permissions/BukkitPermissionHandler.java b/Bukkit/src/main/java/com/plotsquared/bukkit/permissions/BukkitPermissionHandler.java new file mode 100644 index 000000000..bceecda3e --- /dev/null +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/permissions/BukkitPermissionHandler.java @@ -0,0 +1,84 @@ +/* + * _____ _ _ _____ _ + * | __ \| | | | / ____| | | + * | |__) | | ___ | |_| (___ __ _ _ _ __ _ _ __ ___ __| | + * | ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` | + * | | | | (_) | |_ ____) | (_| | |_| | (_| | | | __/ (_| | + * |_| |_|\___/ \__|_____/ \__, |\__,_|\__,_|_| \___|\__,_| + * | | + * |_| + * PlotSquared plot management system for Minecraft + * Copyright (C) 2020 IntellectualSites + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.plotsquared.bukkit.permissions; + +import com.plotsquared.bukkit.player.BukkitPlayer; +import com.plotsquared.core.permissions.ConsolePermissionProfile; +import com.plotsquared.core.permissions.PermissionHandler; +import com.plotsquared.core.permissions.PermissionProfile; +import com.plotsquared.core.player.ConsolePlayer; +import com.plotsquared.core.player.OfflinePlotPlayer; +import com.plotsquared.core.player.PlotPlayer; +import org.bukkit.entity.Player; + +import javax.annotation.Nonnull; +import java.lang.ref.WeakReference; +import java.util.EnumSet; +import java.util.Optional; +import java.util.Set; + +public class BukkitPermissionHandler implements PermissionHandler { + + @Override public void initialize() { + } + + @Nonnull @Override public Optional getPermissionProfile( + @Nonnull PlotPlayer playerPlotPlayer) { + if (playerPlotPlayer instanceof BukkitPlayer) { + final BukkitPlayer bukkitPlayer = (BukkitPlayer) playerPlotPlayer; + return Optional.of(new BukkitPermissionProfile(bukkitPlayer.getPlatformPlayer())); + } else if (playerPlotPlayer instanceof ConsolePlayer) { + return Optional.of(ConsolePermissionProfile.INSTANCE); + } + return Optional.empty(); + } + + @Nonnull @Override public Optional getPermissionProfile( + @Nonnull OfflinePlotPlayer offlinePlotPlayer) { + return Optional.empty(); + } + + @Nonnull @Override public Set getCapabilities() { + return EnumSet.of(PermissionHandlerCapability.ONLINE_PERMISSIONS); + } + + + private static final class BukkitPermissionProfile implements PermissionProfile { + + private final WeakReference playerReference; + + private BukkitPermissionProfile(@Nonnull final Player player) { + this.playerReference = new WeakReference<>(player); + } + + @Override public boolean hasPermission(@Nonnull final String permission) { + final Player player = this.playerReference.get(); + return player != null && player.hasPermission(permission); + } + + } + +} diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/permissions/VaultPermissionHandler.java b/Bukkit/src/main/java/com/plotsquared/bukkit/permissions/VaultPermissionHandler.java new file mode 100644 index 000000000..a7978e671 --- /dev/null +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/permissions/VaultPermissionHandler.java @@ -0,0 +1,102 @@ +/* + * _____ _ _ _____ _ + * | __ \| | | | / ____| | | + * | |__) | | ___ | |_| (___ __ _ _ _ __ _ _ __ ___ __| | + * | ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` | + * | | | | (_) | |_ ____) | (_| | |_| | (_| | | | __/ (_| | + * |_| |_|\___/ \__|_____/ \__, |\__,_|\__,_|_| \___|\__,_| + * | | + * |_| + * PlotSquared plot management system for Minecraft + * Copyright (C) 2020 IntellectualSites + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.plotsquared.bukkit.permissions; + +import com.plotsquared.bukkit.player.BukkitOfflinePlayer; +import com.plotsquared.bukkit.player.BukkitPlayer; +import com.plotsquared.core.permissions.ConsolePermissionProfile; +import com.plotsquared.core.permissions.PermissionHandler; +import com.plotsquared.core.permissions.PermissionProfile; +import com.plotsquared.core.player.ConsolePlayer; +import com.plotsquared.core.player.OfflinePlotPlayer; +import com.plotsquared.core.player.PlotPlayer; +import net.milkbowl.vault.permission.Permission; +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; +import org.bukkit.plugin.RegisteredServiceProvider; + +import javax.annotation.Nonnull; +import java.util.EnumSet; +import java.util.Optional; +import java.util.Set; + +public class VaultPermissionHandler implements PermissionHandler { + + private Permission permissions; + + @Override public void initialize() { + if (Bukkit.getServer().getPluginManager().getPlugin("Vault") == null) { + throw new IllegalStateException("Vault is not present on the server"); + } + RegisteredServiceProvider permissionProvider = + Bukkit.getServer().getServicesManager().getRegistration(Permission.class); + if (permissionProvider != null) { + this.permissions = permissionProvider.getProvider(); + } + } + + @Nonnull @Override public Optional getPermissionProfile( + @Nonnull PlotPlayer playerPlotPlayer) { + if (playerPlotPlayer instanceof BukkitPlayer) { + final BukkitPlayer bukkitPlayer = (BukkitPlayer) playerPlotPlayer; + return Optional.of(new VaultPermissionProfile(bukkitPlayer.getPlatformPlayer())); + } else if (playerPlotPlayer instanceof ConsolePlayer) { + return Optional.of(ConsolePermissionProfile.INSTANCE); + } + return Optional.empty(); + } + + @Nonnull @Override public Optional getPermissionProfile( + @Nonnull OfflinePlotPlayer offlinePlotPlayer) { + if (offlinePlotPlayer instanceof BukkitOfflinePlayer) { + return Optional.of(new VaultPermissionProfile(((BukkitOfflinePlayer) offlinePlotPlayer).player)); + } + return Optional.empty(); + } + + @Nonnull @Override public Set getCapabilities() { + return EnumSet.of(PermissionHandlerCapability.ONLINE_PERMISSIONS, PermissionHandlerCapability.OFFLINE_PERMISSIONS); + } + + + private final class VaultPermissionProfile implements PermissionProfile { + + private final OfflinePlayer offlinePlayer; + + private VaultPermissionProfile(@Nonnull final OfflinePlayer offlinePlayer) { + this.offlinePlayer = offlinePlayer; + } + + @Override public boolean hasPermission(@Nonnull final String permission) { + if (permissions == null) { + return false; + } + return permissions.playerHas(null, offlinePlayer, permission); + } + + } + +} diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitOfflinePlayer.java b/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitOfflinePlayer.java index 3aa5d12c3..e9c74dfb9 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitOfflinePlayer.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitOfflinePlayer.java @@ -25,6 +25,9 @@ */ package com.plotsquared.bukkit.player; +import com.plotsquared.core.permissions.NullPermissionProfile; +import com.plotsquared.core.permissions.PermissionHandler; +import com.plotsquared.core.permissions.PermissionProfile; import com.plotsquared.core.player.OfflinePlotPlayer; import org.bukkit.OfflinePlayer; import javax.annotation.Nonnull; @@ -34,6 +37,7 @@ import java.util.UUID; public class BukkitOfflinePlayer implements OfflinePlotPlayer { public final OfflinePlayer player; + private final PermissionProfile permissionProfile; /** * Please do not use this method. Instead use BukkitUtil.getPlayer(Player), @@ -41,8 +45,11 @@ public class BukkitOfflinePlayer implements OfflinePlotPlayer { * * @param player */ - public BukkitOfflinePlayer(OfflinePlayer player) { + public BukkitOfflinePlayer(@Nonnull final OfflinePlayer player, @Nonnull final + PermissionHandler permissionHandler) { this.player = player; + this.permissionProfile = permissionHandler.getPermissionProfile(this) + .orElse(NullPermissionProfile.INSTANCE); } @Nonnull @Override public UUID getUUID() { @@ -60,4 +67,9 @@ public class BukkitOfflinePlayer implements OfflinePlotPlayer { @Override public String getName() { return this.player.getName(); } + + @Override public boolean hasPermission(@Nonnull final String permission) { + return this.permissionProfile.hasPermission(permission); + } + } diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayer.java b/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayer.java index 15d9bacf8..0fcc50fb0 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayer.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayer.java @@ -32,6 +32,7 @@ import com.plotsquared.core.configuration.Captions; import com.plotsquared.core.configuration.Settings; import com.plotsquared.core.events.TeleportCause; import com.plotsquared.core.location.Location; +import com.plotsquared.core.permissions.PermissionHandler; import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.plot.PlotWeather; import com.plotsquared.core.plot.world.PlotAreaManager; @@ -83,19 +84,21 @@ public class BukkitPlayer extends PlotPlayer { * @param player Bukkit player instance */ public BukkitPlayer(@Nonnull final PlotAreaManager plotAreaManager, @Nonnull final EventDispatcher eventDispatcher, - @Nonnull final Player player, @Nullable final EconHandler econHandler) { - this(plotAreaManager, eventDispatcher, player, false, econHandler); + @Nonnull final Player player, @Nullable final EconHandler econHandler, @Nonnull final PermissionHandler permissionHandler) { + this(plotAreaManager, eventDispatcher, player, false, econHandler, permissionHandler); } public BukkitPlayer(@Nonnull final PlotAreaManager plotAreaManager, @Nonnull final EventDispatcher eventDispatcher, - @Nonnull final Player player, final boolean offline, @Nullable final EconHandler econHandler) { - this(plotAreaManager, eventDispatcher, player, offline, true, econHandler); + @Nonnull final Player player, final boolean offline, @Nullable final EconHandler econHandler, + @Nonnull final PermissionHandler permissionHandler) { + this(plotAreaManager, eventDispatcher, player, offline, true, econHandler, permissionHandler); } public BukkitPlayer(@Nonnull final PlotAreaManager plotAreaManager, @Nonnull final EventDispatcher eventDispatcher, @Nonnull final Player player, final boolean offline, - final boolean realPlayer, @Nullable final EconHandler econHandler) { - super(plotAreaManager, eventDispatcher, econHandler); + final boolean realPlayer, @Nullable final EconHandler econHandler, + @Nonnull final PermissionHandler permissionHandler) { + super(plotAreaManager, eventDispatcher, econHandler, permissionHandler); this.player = player; this.offline = offline; this.econHandler = econHandler; @@ -161,13 +164,6 @@ public class BukkitPlayer extends PlotPlayer { } } - @Override public boolean hasPermission(final String permission) { - if (this.offline && this.econHandler != null) { - return this.econHandler.hasPermission(getName(), permission); - } - return this.player.hasPermission(permission); - } - @Override public int hasPermissionRange(final String stub, final int range) { if (hasPermission(Captions.PERMISSION_ADMIN.getTranslated())) { return Integer.MAX_VALUE; diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayerManager.java b/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayerManager.java index 7238709e3..d05fafd7a 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayerManager.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayerManager.java @@ -27,6 +27,7 @@ package com.plotsquared.bukkit.player; import com.google.inject.Inject; import com.google.inject.Singleton; +import com.plotsquared.core.permissions.PermissionHandler; import com.plotsquared.core.plot.world.PlotAreaManager; import com.plotsquared.core.util.EconHandler; import com.plotsquared.core.util.EventDispatcher; @@ -46,13 +47,16 @@ import java.util.UUID; private final PlotAreaManager plotAreaManager; private final EventDispatcher eventDispatcher; private final EconHandler econHandler; + private final PermissionHandler permissionHandler; @Inject public BukkitPlayerManager(@Nonnull final PlotAreaManager plotAreaManager, @Nonnull final EventDispatcher eventDispatcher, - @Nullable final EconHandler econHandler) { + @Nullable final EconHandler econHandler, + @Nonnull final PermissionHandler permissionHandler) { this.plotAreaManager = plotAreaManager; this.eventDispatcher = eventDispatcher; this.econHandler = econHandler; + this.permissionHandler = permissionHandler; } @Nonnull @Override public BukkitPlayer getPlayer(@Nonnull final Player object) { @@ -60,7 +64,7 @@ import java.util.UUID; return getPlayer(object.getUniqueId()); } catch (final NoSuchPlayerException exception) { return new BukkitPlayer(this.plotAreaManager, this.eventDispatcher, object, - object.isOnline(), false, this.econHandler); + object.isOnline(), false, this.econHandler, this.permissionHandler); } } @@ -69,18 +73,18 @@ import java.util.UUID; if (player == null || !player.isOnline()) { throw new NoSuchPlayerException(uuid); } - return new BukkitPlayer(this.plotAreaManager, this.eventDispatcher, player, this.econHandler); + return new BukkitPlayer(this.plotAreaManager, this.eventDispatcher, player, this.econHandler, this.permissionHandler); } @Nullable @Override public BukkitOfflinePlayer getOfflinePlayer(@Nullable final UUID uuid) { if (uuid == null) { return null; } - return new BukkitOfflinePlayer(Bukkit.getOfflinePlayer(uuid)); + return new BukkitOfflinePlayer(Bukkit.getOfflinePlayer(uuid), this.permissionHandler); } @Nonnull @Override public BukkitOfflinePlayer getOfflinePlayer(@Nonnull final String username) { - return new BukkitOfflinePlayer(Bukkit.getOfflinePlayer(username)); + return new BukkitOfflinePlayer(Bukkit.getOfflinePlayer(username), this.permissionHandler); } } diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitUtil.java b/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitUtil.java index 5cbbf6cfc..1d88f9a6f 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitUtil.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitUtil.java @@ -131,7 +131,7 @@ import java.util.stream.Stream; final Player player = OfflinePlayerUtil.loadPlayer(op); player.loadData(); return new BukkitPlayer(PlotSquared.get().getPlotAreaManager(), - PlotSquared.get().getEventDispatcher(), player, true, PlotSquared.platform().getEconHandler()); + PlotSquared.get().getEventDispatcher(), player, true, PlotSquared.platform().getEconHandler(), PlotSquared.platform().getPermissionHandler()); } /** diff --git a/Core/src/main/java/com/plotsquared/core/PlotPlatform.java b/Core/src/main/java/com/plotsquared/core/PlotPlatform.java index dc3136372..c84bce2b9 100644 --- a/Core/src/main/java/com/plotsquared/core/PlotPlatform.java +++ b/Core/src/main/java/com/plotsquared/core/PlotPlatform.java @@ -33,6 +33,7 @@ import com.plotsquared.core.generator.HybridUtils; import com.plotsquared.core.generator.IndependentPlotGenerator; import com.plotsquared.core.inject.annotations.DefaultGenerator; import com.plotsquared.core.location.World; +import com.plotsquared.core.permissions.PermissionHandler; import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.queue.GlobalBlockQueue; import com.plotsquared.core.util.ChatManager; @@ -266,4 +267,13 @@ public interface PlotPlatform

extends ILogger { return getInjector().getInstance(ChunkManager.class); } + /** + * Get the {@link PermissionHandler} implementation for the platform + * + * @return Permission handler + */ + @Nonnull default PermissionHandler getPermissionHandler() { + return getInjector().getInstance(PermissionHandler.class); + } + } diff --git a/Core/src/main/java/com/plotsquared/core/permissions/ConsolePermissionProfile.java b/Core/src/main/java/com/plotsquared/core/permissions/ConsolePermissionProfile.java new file mode 100644 index 000000000..09857628c --- /dev/null +++ b/Core/src/main/java/com/plotsquared/core/permissions/ConsolePermissionProfile.java @@ -0,0 +1,37 @@ +/* + * _____ _ _ _____ _ + * | __ \| | | | / ____| | | + * | |__) | | ___ | |_| (___ __ _ _ _ __ _ _ __ ___ __| | + * | ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` | + * | | | | (_) | |_ ____) | (_| | |_| | (_| | | | __/ (_| | + * |_| |_|\___/ \__|_____/ \__, |\__,_|\__,_|_| \___|\__,_| + * | | + * |_| + * PlotSquared plot management system for Minecraft + * Copyright (C) 2020 IntellectualSites + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.plotsquared.core.permissions; + +import javax.annotation.Nonnull; + +public enum ConsolePermissionProfile implements PermissionProfile { + INSTANCE; + + @Override public boolean hasPermission(@Nonnull final String permission) { + return true; + } + +} diff --git a/Core/src/main/java/com/plotsquared/core/permissions/NullPermissionProfile.java b/Core/src/main/java/com/plotsquared/core/permissions/NullPermissionProfile.java new file mode 100644 index 000000000..b59b5a78d --- /dev/null +++ b/Core/src/main/java/com/plotsquared/core/permissions/NullPermissionProfile.java @@ -0,0 +1,37 @@ +/* + * _____ _ _ _____ _ + * | __ \| | | | / ____| | | + * | |__) | | ___ | |_| (___ __ _ _ _ __ _ _ __ ___ __| | + * | ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` | + * | | | | (_) | |_ ____) | (_| | |_| | (_| | | | __/ (_| | + * |_| |_|\___/ \__|_____/ \__, |\__,_|\__,_|_| \___|\__,_| + * | | + * |_| + * PlotSquared plot management system for Minecraft + * Copyright (C) 2020 IntellectualSites + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.plotsquared.core.permissions; + +import javax.annotation.Nonnull; + +public enum NullPermissionProfile implements PermissionProfile { + INSTANCE; + + @Override public boolean hasPermission(@Nonnull final String permission) { + return false; + } + +} diff --git a/Core/src/main/java/com/plotsquared/core/permissions/PermissionHandler.java b/Core/src/main/java/com/plotsquared/core/permissions/PermissionHandler.java new file mode 100644 index 000000000..c88537f69 --- /dev/null +++ b/Core/src/main/java/com/plotsquared/core/permissions/PermissionHandler.java @@ -0,0 +1,95 @@ +/* + * _____ _ _ _____ _ + * | __ \| | | | / ____| | | + * | |__) | | ___ | |_| (___ __ _ _ _ __ _ _ __ ___ __| | + * | ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` | + * | | | | (_) | |_ ____) | (_| | |_| | (_| | | | __/ (_| | + * |_| |_|\___/ \__|_____/ \__, |\__,_|\__,_|_| \___|\__,_| + * | | + * |_| + * PlotSquared plot management system for Minecraft + * Copyright (C) 2020 IntellectualSites + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.plotsquared.core.permissions; + +import com.plotsquared.core.player.OfflinePlotPlayer; +import com.plotsquared.core.player.PlotPlayer; + +import javax.annotation.Nonnull; +import java.util.Optional; +import java.util.Set; + +/** + * Permission handler + */ +public interface PermissionHandler { + + /** + * Initialize the permission handler + */ + void initialize(); + + /** + * Attempt to construct a permission profile for a plot player + * + * @param playerPlotPlayer Plot player + * @return Permission profile, if one was able to be constructed + */ + @Nonnull Optional getPermissionProfile( + @Nonnull PlotPlayer playerPlotPlayer); + + /** + * Attempt to construct a permission profile for an offline plot player + * + * @param offlinePlotPlayer Offline player + * @return Permission profile, if one was able to be constructed + */ + @Nonnull Optional getPermissionProfile( + @Nonnull OfflinePlotPlayer offlinePlotPlayer); + + /** + * Get all capabilities that the permission handler has + * + * @return Immutable set of capabilities + */ + @Nonnull Set getCapabilities(); + + /** + * Check whether or not the permission handler has a given capability + * + * @param capability Capability + * @return {@code true} if the handler has the capability, else {@code false} + */ + default boolean hasCapability(@Nonnull final PermissionHandlerCapability capability) { + return this.getCapabilities().contains(capability); + } + + + /** + * Permission handler capabilities + */ + enum PermissionHandlerCapability { + /** + * The ability to check for online (player) permissions + */ + ONLINE_PERMISSIONS, + /** + * The ability to check for offline (player) permissions + */ + OFFLINE_PERMISSIONS + } + +} diff --git a/Core/src/main/java/com/plotsquared/core/permissions/PermissionHolder.java b/Core/src/main/java/com/plotsquared/core/permissions/PermissionHolder.java new file mode 100644 index 000000000..a94bd0b39 --- /dev/null +++ b/Core/src/main/java/com/plotsquared/core/permissions/PermissionHolder.java @@ -0,0 +1,43 @@ +/* + * _____ _ _ _____ _ + * | __ \| | | | / ____| | | + * | |__) | | ___ | |_| (___ __ _ _ _ __ _ _ __ ___ __| | + * | ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` | + * | | | | (_) | |_ ____) | (_| | |_| | (_| | | | __/ (_| | + * |_| |_|\___/ \__|_____/ \__, |\__,_|\__,_|_| \___|\__,_| + * | | + * |_| + * PlotSquared plot management system for Minecraft + * Copyright (C) 2020 IntellectualSites + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.plotsquared.core.permissions; + +import javax.annotation.Nonnull; + +/** + * Any object which can hold permissions + */ +public interface PermissionHolder { + + /** + * Check if the permission holder has the given permission node + * + * @param permission Permission node + * @return {@code true} if the holder has the given permission node, else {@code false} + */ + boolean hasPermission(@Nonnull String permission); + +} diff --git a/Core/src/main/java/com/plotsquared/core/permissions/PermissionProfile.java b/Core/src/main/java/com/plotsquared/core/permissions/PermissionProfile.java new file mode 100644 index 000000000..912147980 --- /dev/null +++ b/Core/src/main/java/com/plotsquared/core/permissions/PermissionProfile.java @@ -0,0 +1,43 @@ +/* + * _____ _ _ _____ _ + * | __ \| | | | / ____| | | + * | |__) | | ___ | |_| (___ __ _ _ _ __ _ _ __ ___ __| | + * | ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` | + * | | | | (_) | |_ ____) | (_| | |_| | (_| | | | __/ (_| | + * |_| |_|\___/ \__|_____/ \__, |\__,_|\__,_|_| \___|\__,_| + * | | + * |_| + * PlotSquared plot management system for Minecraft + * Copyright (C) 2020 IntellectualSites + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.plotsquared.core.permissions; + +import javax.annotation.Nonnull; + +/** + * A permission profile that can be used to check for permissions + */ +public interface PermissionProfile { + + /** + * Check if the owner of the profile has a given permission + * + * @param permission Permission + * @return {@code true} if the owner has the given permission, else {@code false} + */ + boolean hasPermission(@Nonnull String permission); + +} diff --git a/Core/src/main/java/com/plotsquared/core/player/ConsolePlayer.java b/Core/src/main/java/com/plotsquared/core/player/ConsolePlayer.java index c6efe33cd..2c1e67c8f 100644 --- a/Core/src/main/java/com/plotsquared/core/player/ConsolePlayer.java +++ b/Core/src/main/java/com/plotsquared/core/player/ConsolePlayer.java @@ -32,6 +32,7 @@ import com.plotsquared.core.database.DBFunc; import com.plotsquared.core.events.TeleportCause; import com.plotsquared.core.inject.annotations.ConsoleActor; import com.plotsquared.core.location.Location; +import com.plotsquared.core.permissions.PermissionHandler; import com.plotsquared.core.plot.PlotArea; import com.plotsquared.core.plot.PlotWeather; import com.plotsquared.core.plot.world.PlotAreaManager; @@ -42,11 +43,11 @@ import com.sk89q.worldedit.regions.CuboidRegion; import com.sk89q.worldedit.world.gamemode.GameMode; import com.sk89q.worldedit.world.gamemode.GameModes; import com.sk89q.worldedit.world.item.ItemType; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.util.UUID; public class ConsolePlayer extends PlotPlayer { @@ -59,8 +60,9 @@ public class ConsolePlayer extends PlotPlayer { @Inject private ConsolePlayer(@Nonnull final PlotAreaManager plotAreaManager, @Nonnull final EventDispatcher eventDispatcher, @ConsoleActor @Nonnull final Actor actor, - @Nullable final EconHandler econHandler) { - super(plotAreaManager, eventDispatcher, econHandler); + @Nullable final EconHandler econHandler, + @Nonnull final PermissionHandler permissionHandler) { + super(plotAreaManager, eventDispatcher, econHandler, permissionHandler); this.actor = actor; final PlotArea[] areas = plotAreaManager.getAllPlotAreas(); final PlotArea area; @@ -121,10 +123,6 @@ public class ConsolePlayer extends PlotPlayer { return 0; } - @Override public boolean hasPermission(String permission) { - return true; - } - @Override public boolean isPermissionSet(String permission) { return true; } diff --git a/Core/src/main/java/com/plotsquared/core/player/OfflinePlotPlayer.java b/Core/src/main/java/com/plotsquared/core/player/OfflinePlotPlayer.java index f48079f67..92a0e6536 100644 --- a/Core/src/main/java/com/plotsquared/core/player/OfflinePlotPlayer.java +++ b/Core/src/main/java/com/plotsquared/core/player/OfflinePlotPlayer.java @@ -25,9 +25,11 @@ */ package com.plotsquared.core.player; +import com.plotsquared.core.permissions.PermissionHolder; + import java.util.UUID; -public interface OfflinePlotPlayer { +public interface OfflinePlotPlayer extends PermissionHolder { /** * Gets the {@code UUID} of this player @@ -57,4 +59,5 @@ public interface OfflinePlotPlayer { * @return the player name */ String getName(); + } diff --git a/Core/src/main/java/com/plotsquared/core/player/PlotPlayer.java b/Core/src/main/java/com/plotsquared/core/player/PlotPlayer.java index 6d2428d05..d3c4fd369 100644 --- a/Core/src/main/java/com/plotsquared/core/player/PlotPlayer.java +++ b/Core/src/main/java/com/plotsquared/core/player/PlotPlayer.java @@ -35,6 +35,9 @@ import com.plotsquared.core.configuration.Settings; import com.plotsquared.core.database.DBFunc; import com.plotsquared.core.events.TeleportCause; import com.plotsquared.core.location.Location; +import com.plotsquared.core.permissions.NullPermissionProfile; +import com.plotsquared.core.permissions.PermissionHandler; +import com.plotsquared.core.permissions.PermissionProfile; import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.PlotArea; import com.plotsquared.core.plot.PlotCluster; @@ -54,11 +57,11 @@ import com.plotsquared.core.util.task.TaskManager; import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.world.gamemode.GameMode; import com.sk89q.worldedit.world.item.ItemType; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.nio.ByteBuffer; import java.util.Collection; import java.util.Collections; @@ -95,11 +98,15 @@ public abstract class PlotPlayer

implements CommandCaller, OfflinePlotPlayer private final PlotAreaManager plotAreaManager; private final EventDispatcher eventDispatcher; private final EconHandler econHandler; + private final PermissionProfile permissionProfile; - public PlotPlayer(@Nonnull final PlotAreaManager plotAreaManager, @Nonnull final EventDispatcher eventDispatcher, @Nullable final EconHandler econHandler) { + public PlotPlayer(@Nonnull final PlotAreaManager plotAreaManager, @Nonnull final EventDispatcher eventDispatcher, @Nullable final EconHandler econHandler, + @Nonnull final PermissionHandler permissionHandler) { this.plotAreaManager = plotAreaManager; this.eventDispatcher = eventDispatcher; this.econHandler = econHandler; + this.permissionProfile = permissionHandler.getPermissionProfile(this).orElse( + NullPermissionProfile.INSTANCE); } public static PlotPlayer from(@Nonnull final T object) { @@ -147,6 +154,10 @@ public abstract class PlotPlayer

implements CommandCaller, OfflinePlotPlayer return PlotSquared.platform().wrapPlayer(player); } + @Override public final boolean hasPermission(@Nonnull final String permission) { + return this.permissionProfile.hasPermission(permission); + } + public abstract Actor toActor(); public abstract P getPlatformPlayer(); diff --git a/Core/src/main/java/com/plotsquared/core/util/ChunkUtil.java b/Core/src/main/java/com/plotsquared/core/util/ChunkUtil.java index 3e89c630a..6c1a1415d 100644 --- a/Core/src/main/java/com/plotsquared/core/util/ChunkUtil.java +++ b/Core/src/main/java/com/plotsquared/core/util/ChunkUtil.java @@ -1,3 +1,28 @@ +/* + * _____ _ _ _____ _ + * | __ \| | | | / ____| | | + * | |__) | | ___ | |_| (___ __ _ _ _ __ _ _ __ ___ __| | + * | ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` | + * | | | | (_) | |_ ____) | (_| | |_| | (_| | | | __/ (_| | + * |_| |_|\___/ \__|_____/ \__, |\__,_|\__,_|_| \___|\__,_| + * | | + * |_| + * PlotSquared plot management system for Minecraft + * Copyright (C) 2020 IntellectualSites + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package com.plotsquared.core.util; import lombok.experimental.UtilityClass; diff --git a/Core/src/main/java/com/plotsquared/core/util/MainUtil.java b/Core/src/main/java/com/plotsquared/core/util/MainUtil.java index 2a96b7120..010622813 100644 --- a/Core/src/main/java/com/plotsquared/core/util/MainUtil.java +++ b/Core/src/main/java/com/plotsquared/core/util/MainUtil.java @@ -44,6 +44,53 @@ import javax.annotation.Nonnull; private static final Logger logger = LoggerFactory.getLogger("P2/" + MainUtil.class.getSimpleName()); + /** + * Cache of mapping x,y,z coordinates to the chunk array
+ * - Used for efficient world generation
+ */ + public static short[][] x_loc; + public static short[][] y_loc; + public static short[][] z_loc; + public static short[][][] CACHE_I = null; + public static short[][][] CACHE_J = null; + + /** + * This cache is used for world generation and just saves a bit of calculation time when checking if something is in the plot area. + */ + public static void initCache() { + if (x_loc == null) { + x_loc = new short[16][4096]; + y_loc = new short[16][4096]; + z_loc = new short[16][4096]; + for (int i = 0; i < 16; i++) { + int i4 = i << 4; + for (int j = 0; j < 4096; j++) { + int y = i4 + (j >> 8); + int a = j - ((y & 0xF) << 8); + int z1 = a >> 4; + int x1 = a - (z1 << 4); + x_loc[i][j] = (short) x1; + y_loc[i][j] = (short) y; + z_loc[i][j] = (short) z1; + } + } + } + if (CACHE_I == null) { + CACHE_I = new short[256][16][16]; + CACHE_J = new short[256][16][16]; + for (int x = 0; x < 16; x++) { + for (int z = 0; z < 16; z++) { + for (int y = 0; y < 256; y++) { + short i = (short) (y >> 4); + short j = (short) ((y & 0xF) << 8 | z << 4 | x); + CACHE_I[y][x][z] = i; + CACHE_J[y][x][z] = j; + } + } + } + } + } + /** * Send a message to the player. * From b302bb93798493317442dcd6fca6a38e0692258a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20S=C3=B6derberg?= Date: Wed, 22 Jul 2020 12:06:56 +0200 Subject: [PATCH 10/16] Make VaultPermissionHandler extent BukkitPermissionHandler --- .../permissions/VaultPermissionHandler.java | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/permissions/VaultPermissionHandler.java b/Bukkit/src/main/java/com/plotsquared/bukkit/permissions/VaultPermissionHandler.java index a7978e671..ec2724e6a 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/permissions/VaultPermissionHandler.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/permissions/VaultPermissionHandler.java @@ -26,13 +26,8 @@ package com.plotsquared.bukkit.permissions; import com.plotsquared.bukkit.player.BukkitOfflinePlayer; -import com.plotsquared.bukkit.player.BukkitPlayer; -import com.plotsquared.core.permissions.ConsolePermissionProfile; -import com.plotsquared.core.permissions.PermissionHandler; import com.plotsquared.core.permissions.PermissionProfile; -import com.plotsquared.core.player.ConsolePlayer; import com.plotsquared.core.player.OfflinePlotPlayer; -import com.plotsquared.core.player.PlotPlayer; import net.milkbowl.vault.permission.Permission; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; @@ -43,7 +38,7 @@ import java.util.EnumSet; import java.util.Optional; import java.util.Set; -public class VaultPermissionHandler implements PermissionHandler { +public class VaultPermissionHandler extends BukkitPermissionHandler { private Permission permissions; @@ -58,17 +53,6 @@ public class VaultPermissionHandler implements PermissionHandler { } } - @Nonnull @Override public Optional getPermissionProfile( - @Nonnull PlotPlayer playerPlotPlayer) { - if (playerPlotPlayer instanceof BukkitPlayer) { - final BukkitPlayer bukkitPlayer = (BukkitPlayer) playerPlotPlayer; - return Optional.of(new VaultPermissionProfile(bukkitPlayer.getPlatformPlayer())); - } else if (playerPlotPlayer instanceof ConsolePlayer) { - return Optional.of(ConsolePermissionProfile.INSTANCE); - } - return Optional.empty(); - } - @Nonnull @Override public Optional getPermissionProfile( @Nonnull OfflinePlotPlayer offlinePlotPlayer) { if (offlinePlotPlayer instanceof BukkitOfflinePlayer) { From 5fda3e976581a9a8db9b973fdfa2247896ec256d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20S=C3=B6derberg?= Date: Wed, 22 Jul 2020 12:35:48 +0200 Subject: [PATCH 11/16] Get rid of PermHandler --- .../plotsquared/bukkit/BukkitPlatform.java | 7 +-- .../bukkit/inject/BukkitModule.java | 25 ++------ .../bukkit/inject/PermissionModule.java | 6 +- .../permissions/BukkitPermissionHandler.java | 4 +- .../permissions/VaultPermissionHandler.java | 31 ++++++++-- .../bukkit/player/BukkitOfflinePlayer.java | 6 +- .../bukkit/player/BukkitPlayer.java | 9 ++- .../bukkit/util/BukkitEconHandler.java | 23 +------ .../bukkit/util/BukkitPermHandler.java | 60 ------------------- .../com/plotsquared/core/command/Auto.java | 9 ++- .../com/plotsquared/core/command/Command.java | 3 +- .../core/command/CommandCaller.java | 10 +--- .../permissions/ConsolePermissionProfile.java | 4 +- .../permissions/NullPermissionProfile.java | 4 +- .../core/permissions/PermissionHandler.java | 6 +- .../core/permissions/PermissionHolder.java | 59 ++++++++++++++++-- .../core/permissions/PermissionProfile.java | 16 ++++- .../core/player/ConsolePlayer.java | 4 -- .../plotsquared/core/player/PlotPlayer.java | 30 +--------- .../plotsquared/core/util/EconHandler.java | 12 ---- .../plotsquared/core/util/PermHandler.java | 37 ------------ .../plotsquared/core/util/Permissions.java | 27 +++++---- 22 files changed, 152 insertions(+), 240 deletions(-) delete mode 100644 Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitPermHandler.java delete mode 100644 Core/src/main/java/com/plotsquared/core/util/PermHandler.java diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitPlatform.java b/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitPlatform.java index 030e30ce1..a31faeb2b 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitPlatform.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitPlatform.java @@ -105,7 +105,6 @@ import com.plotsquared.core.util.ConsoleColors; import com.plotsquared.core.util.EconHandler; import com.plotsquared.core.util.EventDispatcher; import com.plotsquared.core.util.FileUtils; -import com.plotsquared.core.util.PermHandler; import com.plotsquared.core.util.PlatformWorldManager; import com.plotsquared.core.util.PlayerManager; import com.plotsquared.core.util.PremiumVerification; @@ -184,7 +183,6 @@ import static com.plotsquared.core.util.ReflectionUtils.getRefClass; private boolean methodUnloadSetup = false; private boolean metricsStarted; private EconHandler econ; - private PermHandler perm; @Getter private Injector injector; @@ -343,10 +341,7 @@ import static com.plotsquared.core.util.ReflectionUtils.getRefClass; // Economy if (Settings.Enabled_Components.ECONOMY) { TaskManager.runTask(() -> { - final PermHandler permHandler = getInjector().getInstance(PermHandler.class); - if (permHandler != null) { - permHandler.init(); - } + this.getPermissionHandler().initialize(); final EconHandler econHandler = getInjector().getInstance(EconHandler.class); if (econHandler != null) { econHandler.init(); diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/inject/BukkitModule.java b/Bukkit/src/main/java/com/plotsquared/bukkit/inject/BukkitModule.java index b558aee4f..7599358bd 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/inject/BukkitModule.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/inject/BukkitModule.java @@ -29,7 +29,6 @@ import com.google.inject.AbstractModule; import com.google.inject.Provides; import com.google.inject.Singleton; import com.google.inject.assistedinject.FactoryModuleBuilder; -import com.google.inject.util.Providers; import com.plotsquared.bukkit.BukkitPlatform; import com.plotsquared.bukkit.player.BukkitPlayerManager; import com.plotsquared.bukkit.queue.BukkitLocalQueue; @@ -37,12 +36,9 @@ import com.plotsquared.bukkit.schematic.BukkitSchematicHandler; import com.plotsquared.bukkit.util.BukkitChunkManager; import com.plotsquared.bukkit.util.BukkitEconHandler; import com.plotsquared.bukkit.util.BukkitInventoryUtil; -import com.plotsquared.bukkit.util.BukkitPermHandler; import com.plotsquared.bukkit.util.BukkitRegionManager; import com.plotsquared.bukkit.util.BukkitSetupUtils; import com.plotsquared.bukkit.util.BukkitUtil; -import com.plotsquared.bukkit.util.task.PaperTimeConverter; -import com.plotsquared.bukkit.util.task.SpigotTimeConverter; import com.plotsquared.core.PlotPlatform; import com.plotsquared.core.configuration.Settings; import com.plotsquared.core.generator.HybridGen; @@ -58,7 +54,6 @@ import com.plotsquared.core.queue.QueueProvider; import com.plotsquared.core.util.ChunkManager; import com.plotsquared.core.util.EconHandler; import com.plotsquared.core.util.InventoryUtil; -import com.plotsquared.core.util.PermHandler; import com.plotsquared.core.util.PlayerManager; import com.plotsquared.core.util.RegionManager; import com.plotsquared.core.util.SchematicHandler; @@ -70,7 +65,9 @@ import lombok.RequiredArgsConstructor; import org.bukkit.Bukkit; import org.bukkit.command.ConsoleCommandSender; import org.bukkit.plugin.java.JavaPlugin; + import javax.annotation.Nonnull; +import javax.annotation.Nullable; @RequiredArgsConstructor public class BukkitModule extends AbstractModule { @@ -93,7 +90,6 @@ import javax.annotation.Nonnull; bind(ChunkManager.class).to(BukkitChunkManager.class); bind(RegionManager.class).to(BukkitRegionManager.class); bind(SchematicHandler.class).to(BukkitSchematicHandler.class); - this.setupVault(); if (Settings.Enabled_Components.WORLDS) { bind(PlotAreaManager.class).to(SinglePlotAreaManager.class); } else { @@ -102,25 +98,14 @@ import javax.annotation.Nonnull; install(new FactoryModuleBuilder().build(HybridPlotWorldFactory.class)); } - private void setupVault() { + @Provides @Singleton @Nullable EconHandler provideEconHandler() { if (Bukkit.getPluginManager().isPluginEnabled("Vault")) { - BukkitPermHandler bukkitPermHandler = null; try { - bukkitPermHandler = new BukkitPermHandler(); - bind(PermHandler.class).toInstance(bukkitPermHandler); + return new BukkitEconHandler(); } catch (final Exception ignored) { - bind(PermHandler.class).toProvider(Providers.of(null)); } - try { - final BukkitEconHandler bukkitEconHandler = new BukkitEconHandler(bukkitPermHandler); - bind(EconHandler.class).toInstance(bukkitEconHandler); - } catch (final Exception ignored) { - bind(EconHandler.class).toProvider(Providers.of(null)); - } - } else { - bind(PermHandler.class).toProvider(Providers.of(null)); - bind(EconHandler.class).toProvider(Providers.of(null)); } + return null; } } diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/inject/PermissionModule.java b/Bukkit/src/main/java/com/plotsquared/bukkit/inject/PermissionModule.java index b22cb3648..de42d884a 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/inject/PermissionModule.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/inject/PermissionModule.java @@ -31,17 +31,13 @@ import com.google.inject.Singleton; import com.plotsquared.bukkit.permissions.BukkitPermissionHandler; import com.plotsquared.bukkit.permissions.VaultPermissionHandler; import com.plotsquared.core.permissions.PermissionHandler; -import net.milkbowl.vault.permission.Permission; import org.bukkit.Bukkit; -import org.bukkit.plugin.RegisteredServiceProvider; public class PermissionModule extends AbstractModule { @Provides @Singleton PermissionHandler providePermissionHandler() { try { - RegisteredServiceProvider permissionProvider = - Bukkit.getServer().getServicesManager().getRegistration(Permission.class); - if (permissionProvider != null) { + if (Bukkit.getPluginManager().isPluginEnabled("Vault")) { return new VaultPermissionHandler(); } } catch (final Exception ignored) { diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/permissions/BukkitPermissionHandler.java b/Bukkit/src/main/java/com/plotsquared/bukkit/permissions/BukkitPermissionHandler.java index bceecda3e..6aca7ea62 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/permissions/BukkitPermissionHandler.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/permissions/BukkitPermissionHandler.java @@ -35,6 +35,7 @@ import com.plotsquared.core.player.PlotPlayer; import org.bukkit.entity.Player; import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.lang.ref.WeakReference; import java.util.EnumSet; import java.util.Optional; @@ -74,7 +75,8 @@ public class BukkitPermissionHandler implements PermissionHandler { this.playerReference = new WeakReference<>(player); } - @Override public boolean hasPermission(@Nonnull final String permission) { + @Override public boolean hasPermission(@Nullable final String world, + @Nonnull final String permission) { final Player player = this.playerReference.get(); return player != null && player.hasPermission(permission); } diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/permissions/VaultPermissionHandler.java b/Bukkit/src/main/java/com/plotsquared/bukkit/permissions/VaultPermissionHandler.java index ec2724e6a..b7b08a49f 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/permissions/VaultPermissionHandler.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/permissions/VaultPermissionHandler.java @@ -26,19 +26,25 @@ package com.plotsquared.bukkit.permissions; import com.plotsquared.bukkit.player.BukkitOfflinePlayer; +import com.plotsquared.bukkit.player.BukkitPlayer; +import com.plotsquared.core.permissions.ConsolePermissionProfile; +import com.plotsquared.core.permissions.PermissionHandler; import com.plotsquared.core.permissions.PermissionProfile; +import com.plotsquared.core.player.ConsolePlayer; import com.plotsquared.core.player.OfflinePlotPlayer; +import com.plotsquared.core.player.PlotPlayer; import net.milkbowl.vault.permission.Permission; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.plugin.RegisteredServiceProvider; import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.util.EnumSet; import java.util.Optional; import java.util.Set; -public class VaultPermissionHandler extends BukkitPermissionHandler { +public class VaultPermissionHandler implements PermissionHandler { private Permission permissions; @@ -53,6 +59,17 @@ public class VaultPermissionHandler extends BukkitPermissionHandler { } } + @Nonnull @Override public Optional getPermissionProfile( + @Nonnull PlotPlayer playerPlotPlayer) { + if (playerPlotPlayer instanceof BukkitPlayer) { + final BukkitPlayer bukkitPlayer = (BukkitPlayer) playerPlotPlayer; + return Optional.of(new VaultPermissionProfile(bukkitPlayer.getPlatformPlayer())); + } else if (playerPlotPlayer instanceof ConsolePlayer) { + return Optional.of(ConsolePermissionProfile.INSTANCE); + } + return Optional.empty(); + } + @Nonnull @Override public Optional getPermissionProfile( @Nonnull OfflinePlotPlayer offlinePlotPlayer) { if (offlinePlotPlayer instanceof BukkitOfflinePlayer) { @@ -62,7 +79,9 @@ public class VaultPermissionHandler extends BukkitPermissionHandler { } @Nonnull @Override public Set getCapabilities() { - return EnumSet.of(PermissionHandlerCapability.ONLINE_PERMISSIONS, PermissionHandlerCapability.OFFLINE_PERMISSIONS); + return EnumSet.of(PermissionHandlerCapability.PER_WORLD_PERMISSIONS, + PermissionHandlerCapability.ONLINE_PERMISSIONS, + PermissionHandlerCapability.OFFLINE_PERMISSIONS); } @@ -74,11 +93,15 @@ public class VaultPermissionHandler extends BukkitPermissionHandler { this.offlinePlayer = offlinePlayer; } - @Override public boolean hasPermission(@Nonnull final String permission) { + @Override public boolean hasPermission(@Nullable final String world, + @Nonnull final String permission) { if (permissions == null) { return false; } - return permissions.playerHas(null, offlinePlayer, permission); + if (world == null && offlinePlayer instanceof BukkitPlayer) { + return permissions.playerHas(((BukkitPlayer) offlinePlayer).getPlatformPlayer(), permission); + } + return permissions.playerHas(world, offlinePlayer, permission); } } diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitOfflinePlayer.java b/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitOfflinePlayer.java index e9c74dfb9..9226c5847 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitOfflinePlayer.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitOfflinePlayer.java @@ -31,6 +31,7 @@ import com.plotsquared.core.permissions.PermissionProfile; import com.plotsquared.core.player.OfflinePlotPlayer; import org.bukkit.OfflinePlayer; import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.util.UUID; @@ -68,8 +69,9 @@ public class BukkitOfflinePlayer implements OfflinePlotPlayer { return this.player.getName(); } - @Override public boolean hasPermission(@Nonnull final String permission) { - return this.permissionProfile.hasPermission(permission); + @Override public boolean hasPermission(@Nullable final String world, + @Nonnull final String permission) { + return this.permissionProfile.hasPermission(world, permission); } } diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayer.java b/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayer.java index 0fcc50fb0..1415c2840 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayer.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayer.java @@ -54,6 +54,8 @@ import org.bukkit.event.EventException; import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.permissions.PermissionAttachmentInfo; import org.bukkit.plugin.RegisteredListener; + +import javax.annotation.Nonnegative; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -164,7 +166,8 @@ public class BukkitPlayer extends PlotPlayer { } } - @Override public int hasPermissionRange(final String stub, final int range) { + @Override @Nonnegative public int hasPermissionRange(@Nonnull final String stub, + @Nonnegative final int range) { if (hasPermission(Captions.PERMISSION_ADMIN.getTranslated())) { return Integer.MAX_VALUE; } @@ -224,10 +227,6 @@ public class BukkitPlayer extends PlotPlayer { return max; } - @Override public boolean isPermissionSet(final String permission) { - return this.player.isPermissionSet(permission); - } - @Override public void sendMessage(String message) { message = message.replace('\u2010', '%').replace('\u2020', '&').replace('\u2030', '&'); if (!StringMan.isEqual(this.getMeta("lastMessage"), message) || ( diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitEconHandler.java b/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitEconHandler.java index c7356c13b..470fbbfbb 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitEconHandler.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitEconHandler.java @@ -25,31 +25,21 @@ */ package com.plotsquared.bukkit.util; -import com.google.inject.Inject; import com.google.inject.Singleton; import com.plotsquared.bukkit.player.BukkitOfflinePlayer; import com.plotsquared.bukkit.player.BukkitPlayer; import com.plotsquared.core.player.OfflinePlotPlayer; import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.util.EconHandler; -import com.plotsquared.core.util.PermHandler; import net.milkbowl.vault.economy.Economy; import org.bukkit.Bukkit; import org.bukkit.plugin.RegisteredServiceProvider; -import javax.annotation.Nullable; @Singleton public class BukkitEconHandler extends EconHandler { private Economy econ; - private final PermHandler permHandler; - - @Inject public BukkitEconHandler(@Nullable final PermHandler permHandler) { - this.permHandler = permHandler; - } - - @Override - public boolean init() { + @Override public boolean init() { if (this.econ == null) { setupEconomy(); } @@ -87,17 +77,6 @@ import javax.annotation.Nullable; this.econ.depositPlayer(((BukkitOfflinePlayer) player).player, amount); } - /** - * @deprecated Use {@link PermHandler#hasPermission(String, String, String)} instead - */ - @Deprecated @Override public boolean hasPermission(String world, String player, String perm) { - if (this.permHandler != null) { - return this.permHandler.hasPermission(world, player, perm); - } else { - return false; - } - } - @Override public double getBalance(PlotPlayer player) { return this.econ.getBalance(player.getName()); } diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitPermHandler.java b/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitPermHandler.java deleted file mode 100644 index 8987e3527..000000000 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitPermHandler.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * _____ _ _ _____ _ - * | __ \| | | | / ____| | | - * | |__) | | ___ | |_| (___ __ _ _ _ __ _ _ __ ___ __| | - * | ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` | - * | | | | (_) | |_ ____) | (_| | |_| | (_| | | | __/ (_| | - * |_| |_|\___/ \__|_____/ \__, |\__,_|\__,_|_| \___|\__,_| - * | | - * |_| - * PlotSquared plot management system for Minecraft - * Copyright (C) 2020 IntellectualSites - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package com.plotsquared.bukkit.util; - -import com.google.inject.Singleton; -import com.plotsquared.core.util.PermHandler; -import net.milkbowl.vault.permission.Permission; -import org.bukkit.Bukkit; -import org.bukkit.plugin.RegisteredServiceProvider; - -@Singleton public class BukkitPermHandler extends PermHandler { - - private Permission perms; - - @Override - public boolean init() { - if (this.perms == null) { - setupPermissions(); - } - return this.perms != null; - } - - private void setupPermissions() { - if (Bukkit.getServer().getPluginManager().getPlugin("Vault") == null) { - return; - } - RegisteredServiceProvider permissionProvider = - Bukkit.getServer().getServicesManager().getRegistration(Permission.class); - if (permissionProvider != null) { - this.perms = permissionProvider.getProvider(); - } - } - - @Override public boolean hasPermission(String world, String player, String perm) { - return this.perms.playerHas(world, Bukkit.getOfflinePlayer(player), perm); - } -} diff --git a/Core/src/main/java/com/plotsquared/core/command/Auto.java b/Core/src/main/java/com/plotsquared/core/command/Auto.java index ea6a6cf6c..211f5f22f 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Auto.java +++ b/Core/src/main/java/com/plotsquared/core/command/Auto.java @@ -37,6 +37,7 @@ import com.plotsquared.core.events.PlayerAutoPlotEvent; import com.plotsquared.core.events.PlotAutoMergeEvent; import com.plotsquared.core.events.Result; import com.plotsquared.core.events.TeleportCause; +import com.plotsquared.core.permissions.PermissionHandler; import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.PlotArea; @@ -175,9 +176,11 @@ public class Auto extends SubCommand { @Override public boolean onCommand(final PlotPlayer player, String[] args) { PlotArea plotarea = player.getApplicablePlotArea(); if (plotarea == null) { - if (this.econHandler != null) { - for (PlotArea area : this.plotAreaManager.getAllPlotAreas()) { - if (this.econHandler.hasPermission(area.getWorldName(), player.getName(), "plots.auto")) { + final PermissionHandler permissionHandler = PlotSquared.platform().getPermissionHandler(); + if (permissionHandler.hasCapability( + PermissionHandler.PermissionHandlerCapability.PER_WORLD_PERMISSIONS)) { + for (final PlotArea area : this.plotAreaManager.getAllPlotAreas()) { + if (player.hasPermission(area.getWorldName(), "plots.auto")) { if (plotarea != null) { plotarea = null; break; diff --git a/Core/src/main/java/com/plotsquared/core/command/Command.java b/Core/src/main/java/com/plotsquared/core/command/Command.java index a0dbe9079..60512dd5a 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Command.java +++ b/Core/src/main/java/com/plotsquared/core/command/Command.java @@ -35,6 +35,7 @@ import com.plotsquared.core.util.StringComparison; import com.plotsquared.core.util.StringMan; import com.plotsquared.core.util.task.RunnableVal2; import com.plotsquared.core.util.task.RunnableVal3; +import com.plotsquared.core.permissions.PermissionHolder; import lombok.SneakyThrows; import javax.annotation.Nonnull; @@ -158,7 +159,7 @@ public abstract class Command { return this.allCommands; } - public boolean hasConfirmation(CommandCaller player) { + public boolean hasConfirmation(PermissionHolder player) { return this.confirmation && !player.hasPermission(getPermission() + ".confirm.bypass"); } diff --git a/Core/src/main/java/com/plotsquared/core/command/CommandCaller.java b/Core/src/main/java/com/plotsquared/core/command/CommandCaller.java index b26eed517..f7a6c6885 100644 --- a/Core/src/main/java/com/plotsquared/core/command/CommandCaller.java +++ b/Core/src/main/java/com/plotsquared/core/command/CommandCaller.java @@ -34,14 +34,6 @@ public interface CommandCaller { */ void sendMessage(String message); - /** - * Check the player's permissions. Will be cached if permission caching is enabled. - * - * @param permission the name of the permission - */ - boolean hasPermission(String permission); - - boolean isPermissionSet(String permission); - RequiredType getSuperCaller(); + } diff --git a/Core/src/main/java/com/plotsquared/core/permissions/ConsolePermissionProfile.java b/Core/src/main/java/com/plotsquared/core/permissions/ConsolePermissionProfile.java index 09857628c..783f605a7 100644 --- a/Core/src/main/java/com/plotsquared/core/permissions/ConsolePermissionProfile.java +++ b/Core/src/main/java/com/plotsquared/core/permissions/ConsolePermissionProfile.java @@ -26,11 +26,13 @@ package com.plotsquared.core.permissions; import javax.annotation.Nonnull; +import javax.annotation.Nullable; public enum ConsolePermissionProfile implements PermissionProfile { INSTANCE; - @Override public boolean hasPermission(@Nonnull final String permission) { + @Override public boolean hasPermission(@Nullable final String world, + @Nonnull final String permission) { return true; } diff --git a/Core/src/main/java/com/plotsquared/core/permissions/NullPermissionProfile.java b/Core/src/main/java/com/plotsquared/core/permissions/NullPermissionProfile.java index b59b5a78d..fbf7d8a03 100644 --- a/Core/src/main/java/com/plotsquared/core/permissions/NullPermissionProfile.java +++ b/Core/src/main/java/com/plotsquared/core/permissions/NullPermissionProfile.java @@ -26,11 +26,13 @@ package com.plotsquared.core.permissions; import javax.annotation.Nonnull; +import javax.annotation.Nullable; public enum NullPermissionProfile implements PermissionProfile { INSTANCE; - @Override public boolean hasPermission(@Nonnull final String permission) { + @Override public boolean hasPermission(@Nullable final String world, + @Nonnull final String permission) { return false; } diff --git a/Core/src/main/java/com/plotsquared/core/permissions/PermissionHandler.java b/Core/src/main/java/com/plotsquared/core/permissions/PermissionHandler.java index c88537f69..4a273c743 100644 --- a/Core/src/main/java/com/plotsquared/core/permissions/PermissionHandler.java +++ b/Core/src/main/java/com/plotsquared/core/permissions/PermissionHandler.java @@ -89,7 +89,11 @@ public interface PermissionHandler { /** * The ability to check for offline (player) permissions */ - OFFLINE_PERMISSIONS + OFFLINE_PERMISSIONS, + /** + * Per world permissions + */ + PER_WORLD_PERMISSIONS } } diff --git a/Core/src/main/java/com/plotsquared/core/permissions/PermissionHolder.java b/Core/src/main/java/com/plotsquared/core/permissions/PermissionHolder.java index a94bd0b39..abff13262 100644 --- a/Core/src/main/java/com/plotsquared/core/permissions/PermissionHolder.java +++ b/Core/src/main/java/com/plotsquared/core/permissions/PermissionHolder.java @@ -25,7 +25,12 @@ */ package com.plotsquared.core.permissions; +import com.plotsquared.core.configuration.Captions; +import com.plotsquared.core.configuration.Settings; + +import javax.annotation.Nonnegative; import javax.annotation.Nonnull; +import javax.annotation.Nullable; /** * Any object which can hold permissions @@ -33,11 +38,57 @@ import javax.annotation.Nonnull; public interface PermissionHolder { /** - * Check if the permission holder has the given permission node + * Check if the owner of the profile has a given (global) permission * - * @param permission Permission node - * @return {@code true} if the holder has the given permission node, else {@code false} + * @param permission Permission + * @return {@code true} if the owner has the given permission, else {@code false} */ - boolean hasPermission(@Nonnull String permission); + default boolean hasPermission(@Nonnull final String permission) { + return hasPermission(null ,permission); + } + + /** + * Check the the highest permission a PlotPlayer has within a specified range.
+ * - Excessively high values will lag
+ * - The default range that is checked is {@link Settings.Limit#MAX_PLOTS}
+ * + * @param stub The permission stub to check e.g. for `plots.plot.#` the stub is `plots.plot` + * @param range The range to check + * @return The highest permission they have within that range + */ + @Nonnegative default int hasPermissionRange(@Nonnull final String stub, + @Nonnegative final int range) { + if (hasPermission(Captions.PERMISSION_ADMIN.getTranslated())) { + return Integer.MAX_VALUE; + } + String[] nodes = stub.split("\\."); + StringBuilder builder = new StringBuilder(); + for (int i = 0; i < (nodes.length - 1); i++) { + builder.append(nodes[i]).append("."); + if (!stub.equals(builder + Captions.PERMISSION_STAR.getTranslated())) { + if (hasPermission(builder + Captions.PERMISSION_STAR.getTranslated())) { + return Integer.MAX_VALUE; + } + } + } + if (hasPermission(stub + ".*")) { + return Integer.MAX_VALUE; + } + for (int i = range; i > 0; i--) { + if (hasPermission(stub + "." + i)) { + return i; + } + } + return 0; + } + + /** + * Check if the owner of the profile has a given permission + * + * @param world World name + * @param permission Permission + * @return {@code true} if the owner has the given permission, else {@code false} + */ + boolean hasPermission(@Nullable final String world, @Nonnull String permission); } diff --git a/Core/src/main/java/com/plotsquared/core/permissions/PermissionProfile.java b/Core/src/main/java/com/plotsquared/core/permissions/PermissionProfile.java index 912147980..b7aad8e63 100644 --- a/Core/src/main/java/com/plotsquared/core/permissions/PermissionProfile.java +++ b/Core/src/main/java/com/plotsquared/core/permissions/PermissionProfile.java @@ -26,6 +26,7 @@ package com.plotsquared.core.permissions; import javax.annotation.Nonnull; +import javax.annotation.Nullable; /** * A permission profile that can be used to check for permissions @@ -33,11 +34,22 @@ import javax.annotation.Nonnull; public interface PermissionProfile { /** - * Check if the owner of the profile has a given permission + * Check if the owner of the profile has a given (global) permission * * @param permission Permission * @return {@code true} if the owner has the given permission, else {@code false} */ - boolean hasPermission(@Nonnull String permission); + default boolean hasPermission(@Nonnull final String permission) { + return hasPermission(null ,permission); + } + + /** + * Check if the owner of the profile has a given permission + * + * @param world World name + * @param permission Permission + * @return {@code true} if the owner has the given permission, else {@code false} + */ + boolean hasPermission(@Nullable final String world, @Nonnull String permission); } diff --git a/Core/src/main/java/com/plotsquared/core/player/ConsolePlayer.java b/Core/src/main/java/com/plotsquared/core/player/ConsolePlayer.java index 2c1e67c8f..437e86491 100644 --- a/Core/src/main/java/com/plotsquared/core/player/ConsolePlayer.java +++ b/Core/src/main/java/com/plotsquared/core/player/ConsolePlayer.java @@ -123,10 +123,6 @@ public class ConsolePlayer extends PlotPlayer { return 0; } - @Override public boolean isPermissionSet(String permission) { - return true; - } - @Override public void sendMessage(String message) { logger.info(message); } diff --git a/Core/src/main/java/com/plotsquared/core/player/PlotPlayer.java b/Core/src/main/java/com/plotsquared/core/player/PlotPlayer.java index d3c4fd369..666d5be7b 100644 --- a/Core/src/main/java/com/plotsquared/core/player/PlotPlayer.java +++ b/Core/src/main/java/com/plotsquared/core/player/PlotPlayer.java @@ -154,8 +154,9 @@ public abstract class PlotPlayer

implements CommandCaller, OfflinePlotPlayer return PlotSquared.platform().wrapPlayer(player); } - @Override public final boolean hasPermission(@Nonnull final String permission) { - return this.permissionProfile.hasPermission(permission); + @Override public final boolean hasPermission(@Nullable final String world, + @Nonnull final String permission) { + return this.permissionProfile.hasPermission(world, permission); } public abstract Actor toActor(); @@ -257,31 +258,6 @@ public abstract class PlotPlayer

implements CommandCaller, OfflinePlotPlayer return Permissions.hasPermissionRange(this, "plots.cluster", Settings.Limit.MAX_PLOTS); } - public int hasPermissionRange(String stub, int range) { - if (hasPermission(Captions.PERMISSION_ADMIN.getTranslated())) { - return Integer.MAX_VALUE; - } - String[] nodes = stub.split("\\."); - StringBuilder builder = new StringBuilder(); - for (int i = 0; i < (nodes.length - 1); i++) { - builder.append(nodes[i]).append("."); - if (!stub.equals(builder + Captions.PERMISSION_STAR.getTranslated())) { - if (hasPermission(builder + Captions.PERMISSION_STAR.getTranslated())) { - return Integer.MAX_VALUE; - } - } - } - if (hasPermission(stub + ".*")) { - return Integer.MAX_VALUE; - } - for (int i = range; i > 0; i--) { - if (hasPermission(stub + "." + i)) { - return i; - } - } - return 0; - } - /** * Get the number of plots this player owns. * diff --git a/Core/src/main/java/com/plotsquared/core/util/EconHandler.java b/Core/src/main/java/com/plotsquared/core/util/EconHandler.java index 69363079f..508fe8f57 100644 --- a/Core/src/main/java/com/plotsquared/core/util/EconHandler.java +++ b/Core/src/main/java/com/plotsquared/core/util/EconHandler.java @@ -48,16 +48,4 @@ public abstract class EconHandler { public abstract void depositMoney(OfflinePlotPlayer player, double amount); - /** - * @deprecated Use {@link PermHandler#hasPermission(String, String, String)} instead - */ - @Deprecated public abstract boolean hasPermission(String world, String player, String perm); - - /** - * @deprecated Use {@link PermHandler#hasPermission(String, String)} instead - */ - @Deprecated public boolean hasPermission(String player, String perm) { - return hasPermission(null, player, perm); - } - } diff --git a/Core/src/main/java/com/plotsquared/core/util/PermHandler.java b/Core/src/main/java/com/plotsquared/core/util/PermHandler.java deleted file mode 100644 index 1dec45fd4..000000000 --- a/Core/src/main/java/com/plotsquared/core/util/PermHandler.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * _____ _ _ _____ _ - * | __ \| | | | / ____| | | - * | |__) | | ___ | |_| (___ __ _ _ _ __ _ _ __ ___ __| | - * | ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` | - * | | | | (_) | |_ ____) | (_| | |_| | (_| | | | __/ (_| | - * |_| |_|\___/ \__|_____/ \__, |\__,_|\__,_|_| \___|\__,_| - * | | - * |_| - * PlotSquared plot management system for Minecraft - * Copyright (C) 2020 IntellectualSites - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package com.plotsquared.core.util; - -public abstract class PermHandler { - - public abstract boolean init(); - - public abstract boolean hasPermission(String world, String player, String perm); - - public boolean hasPermission(String player, String perm) { - return hasPermission(null, player, perm); - } -} diff --git a/Core/src/main/java/com/plotsquared/core/util/Permissions.java b/Core/src/main/java/com/plotsquared/core/util/Permissions.java index 34754e7c8..7e3b4622f 100644 --- a/Core/src/main/java/com/plotsquared/core/util/Permissions.java +++ b/Core/src/main/java/com/plotsquared/core/util/Permissions.java @@ -29,6 +29,7 @@ import com.plotsquared.core.command.CommandCaller; import com.plotsquared.core.configuration.Captions; import com.plotsquared.core.configuration.Settings; import com.plotsquared.core.player.PlotPlayer; +import com.plotsquared.core.permissions.PermissionHolder; import java.util.HashMap; @@ -39,7 +40,7 @@ import java.util.HashMap; */ public class Permissions { - public static boolean hasPermission(PlotPlayer player, Captions caption, boolean notify) { + public static boolean hasPermission(PlotPlayer player, Captions caption, boolean notify) { return hasPermission(player, caption.getTranslated(), notify); } @@ -50,7 +51,7 @@ public class Permissions { * @param caption * @return */ - public static boolean hasPermission(PlotPlayer player, Captions caption) { + public static boolean hasPermission(PlotPlayer player, Captions caption) { return hasPermission(player, caption.getTranslated()); } @@ -63,7 +64,7 @@ public class Permissions { */ public static boolean hasPermission(PlotPlayer player, String permission) { if (!Settings.Enabled_Components.PERMISSION_CACHE) { - return hasPermission((CommandCaller) player, permission); + return hasPermission((PermissionHolder) player, permission); } HashMap map = player.getMeta("perm"); if (map != null) { @@ -75,7 +76,7 @@ public class Permissions { map = new HashMap<>(); player.setMeta("perm", map); } - boolean result = hasPermission((CommandCaller) player, permission); + boolean result = hasPermission((PermissionHolder) player, permission); map.put(permission, result); return result; } @@ -87,12 +88,12 @@ public class Permissions { * @param permission * @return */ - public static boolean hasPermission(CommandCaller caller, String permission) { + public static boolean hasPermission(PermissionHolder caller, String permission) { if (caller.hasPermission(permission)) { return true; - } else if (caller.isPermissionSet(permission)) { + }/* TODO: DECIDE WHAT TO DO HERE; else if (caller.isPermissionSet(permission)) { return false; - } + }*/ if (caller.hasPermission(Captions.PERMISSION_ADMIN.getTranslated())) { return true; } @@ -105,9 +106,9 @@ public class Permissions { if (!permission.equals(combined)) { if (caller.hasPermission(combined)) { return true; - } else if (caller.isPermissionSet(combined)) { + }/* TODO: DECIDE WHAT TO DO HERE; else if (caller.isPermissionSet(combined)) { return false; - } + }*/ } } return false; @@ -121,7 +122,7 @@ public class Permissions { * @param notify * @return */ - public static boolean hasPermission(PlotPlayer player, String permission, boolean notify) { + public static boolean hasPermission(PlotPlayer player, String permission, boolean notify) { if (!hasPermission(player, permission)) { if (notify) { MainUtil.sendMessage(player, Captions.NO_PERMISSION_EVENT, permission); @@ -131,7 +132,7 @@ public class Permissions { return true; } - public static int hasPermissionRange(PlotPlayer player, Captions perm, int range) { + public static int hasPermissionRange(PlotPlayer player, Captions perm, int range) { return hasPermissionRange(player, perm.getTranslated(), range); } @@ -140,12 +141,12 @@ public class Permissions { * - Excessively high values will lag
* - The default range that is checked is {@link Settings.Limit#MAX_PLOTS}
* - * @param player + * @param player Player to check for * @param stub The permission stub to check e.g. for `plots.plot.#` the stub is `plots.plot` * @param range The range to check * @return The highest permission they have within that range */ - public static int hasPermissionRange(PlotPlayer player, String stub, int range) { + public static int hasPermissionRange(PlotPlayer player, String stub, int range) { return player.hasPermissionRange(stub, range); } } From 2154e237ff9f221ca02588de285050767956fec5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20S=C3=B6derberg?= Date: Thu, 23 Jul 2020 12:47:00 +0200 Subject: [PATCH 12/16] Remove construction of fake player entities for offline players. --- .../plotsquared/bukkit/BukkitPlatform.java | 36 +---- .../bukkit/player/BukkitOfflinePlayer.java | 12 +- .../bukkit/player/BukkitPlayer.java | 19 +-- .../bukkit/player/BukkitPlayerManager.java | 6 +- .../plotsquared/bukkit/util/BukkitUtil.java | 32 ----- .../bukkit/util/OfflinePlayerUtil.java | 133 ------------------ .../java/com/plotsquared/core/PlotAPI.java | 12 +- .../com/plotsquared/core/PlotPlatform.java | 11 +- .../com/plotsquared/core/command/Buy.java | 2 +- .../core/listener/PlotListener.java | 4 +- .../core/listener/WESubscriber.java | 3 +- .../core/player/ConsolePlayer.java | 6 +- .../core/player/OfflinePlotPlayer.java | 11 +- .../plotsquared/core/player/PlotPlayer.java | 14 -- .../java/com/plotsquared/core/plot/Plot.java | 13 +- .../core/plot/expiration/ExpireManager.java | 4 +- .../com/plotsquared/core/util/WorldUtil.java | 8 -- 17 files changed, 40 insertions(+), 286 deletions(-) delete mode 100644 Bukkit/src/main/java/com/plotsquared/bukkit/util/OfflinePlayerUtil.java diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitPlatform.java b/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitPlatform.java index a31faeb2b..3c39850e7 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitPlatform.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitPlatform.java @@ -573,7 +573,8 @@ import static com.plotsquared.core.util.ReflectionUtils.getRefClass; } final Plot plot = area.getOwnedPlot(id); if (plot != null) { - if (!plot.getFlag(ServerPlotFlag.class) || PlotPlayer.wrap(plot.getOwner()) == null) { + if (!plot.getFlag(ServerPlotFlag.class) || PlotSquared.platform().getPlayerManager() + .getPlayerIfExists(plot.getOwner()) == null) { if (world.getKeepSpawnInMemory()) { world.setKeepSpawnInMemory(false); return; @@ -1081,39 +1082,6 @@ import static com.plotsquared.core.util.ReflectionUtils.getRefClass; } } - /** - * Attempt to retrieve a {@link PlotPlayer} from a player identifier. - * This method accepts: - * - {@link Player} objects, - * - {@link OfflinePlayer} objects, - * - {@link String} usernames for online players, and - * - {@link UUID} UUIDs for online players - *

- * In the case of offline players, a fake {@link Player} instance will be created. - * This is a rather expensive operation, and should be avoided if possible. - * - * @param player The player to convert to a PlotPlayer - * @return The plot player instance that corresponds to the identifier, or null - * if no such player object could be created - */ - @Override @Nullable public PlotPlayer wrapPlayer(final Object player) { - if (player instanceof Player) { - return BukkitUtil.adapt((Player) player); - } - if (player instanceof OfflinePlayer) { - return BukkitUtil.adapt((OfflinePlayer) player); - } - if (player instanceof String) { - return (PlotPlayer) PlotSquared.platform().getPlayerManager() - .getPlayerIfExists((String) player); - } - if (player instanceof UUID) { - return (PlotPlayer) PlotSquared.platform().getPlayerManager() - .getPlayerIfExists((UUID) player); - } - return null; - } - @Override public String getNMSPackage() { final String name = Bukkit.getServer().getClass().getPackage().getName(); return name.substring(name.lastIndexOf('.') + 1); diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitOfflinePlayer.java b/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitOfflinePlayer.java index 9226c5847..799fbf2b1 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitOfflinePlayer.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitOfflinePlayer.java @@ -30,6 +30,8 @@ import com.plotsquared.core.permissions.PermissionHandler; import com.plotsquared.core.permissions.PermissionProfile; import com.plotsquared.core.player.OfflinePlotPlayer; import org.bukkit.OfflinePlayer; + +import javax.annotation.Nonnegative; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -43,8 +45,6 @@ public class BukkitOfflinePlayer implements OfflinePlotPlayer { /** * Please do not use this method. Instead use BukkitUtil.getPlayer(Player), * as it caches player objects. - * - * @param player */ public BukkitOfflinePlayer(@Nonnull final OfflinePlayer player, @Nonnull final PermissionHandler permissionHandler) { @@ -57,12 +57,8 @@ public class BukkitOfflinePlayer implements OfflinePlotPlayer { return this.player.getUniqueId(); } - @Override public long getLastPlayed() { - return this.player.getLastPlayed(); - } - - @Override public boolean isOnline() { - return this.player.isOnline(); + @Override @Nonnegative public long getLastPlayed() { + return this.player.getLastSeen(); } @Override public String getName() { diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayer.java b/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayer.java index 1415c2840..b66eed10f 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayer.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayer.java @@ -75,10 +75,8 @@ public class BukkitPlayer extends PlotPlayer { private final EconHandler econHandler; public final Player player; - private boolean offline; private String name; - /** *

Please do not use this method. Instead use * BukkitUtil.getPlayer(Player), as it caches player objects.

@@ -90,19 +88,12 @@ public class BukkitPlayer extends PlotPlayer { this(plotAreaManager, eventDispatcher, player, false, econHandler, permissionHandler); } - public BukkitPlayer(@Nonnull final PlotAreaManager plotAreaManager, @Nonnull final EventDispatcher eventDispatcher, - @Nonnull final Player player, final boolean offline, @Nullable final EconHandler econHandler, - @Nonnull final PermissionHandler permissionHandler) { - this(plotAreaManager, eventDispatcher, player, offline, true, econHandler, permissionHandler); - } - public BukkitPlayer(@Nonnull final PlotAreaManager plotAreaManager, @Nonnull final - EventDispatcher eventDispatcher, @Nonnull final Player player, final boolean offline, + EventDispatcher eventDispatcher, @Nonnull final Player player, final boolean realPlayer, @Nullable final EconHandler econHandler, @Nonnull final PermissionHandler permissionHandler) { super(plotAreaManager, eventDispatcher, econHandler, permissionHandler); this.player = player; - this.offline = offline; this.econHandler = econHandler; if (realPlayer) { super.populatePersistentMetaMap(); @@ -130,8 +121,8 @@ public class BukkitPlayer extends PlotPlayer { return player.getUniqueId(); } - @Override public long getLastPlayed() { - return this.player.getLastPlayed(); + @Override @Nonnegative public long getLastPlayed() { + return this.player.getLastSeen(); } @Override public boolean canTeleport(@Nonnull final Location location) { @@ -255,10 +246,6 @@ public class BukkitPlayer extends PlotPlayer { return this.name; } - @Override public boolean isOnline() { - return !this.offline && this.player.isOnline(); - } - @Override public void setCompassTarget(Location location) { this.player.setCompassTarget( new org.bukkit.Location(BukkitUtil.getWorld(location.getWorldName()), location.getX(), diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayerManager.java b/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayerManager.java index d05fafd7a..78af765a2 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayerManager.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayerManager.java @@ -60,11 +60,13 @@ import java.util.UUID; } @Nonnull @Override public BukkitPlayer getPlayer(@Nonnull final Player object) { + if (!object.isOnline()) { + throw new NoSuchPlayerException(object.getUniqueId()); + } try { return getPlayer(object.getUniqueId()); } catch (final NoSuchPlayerException exception) { - return new BukkitPlayer(this.plotAreaManager, this.eventDispatcher, object, - object.isOnline(), false, this.econHandler, this.permissionHandler); + return new BukkitPlayer(this.plotAreaManager, this.eventDispatcher, object, false, this.econHandler, this.permissionHandler); } } diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitUtil.java b/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitUtil.java index 1d88f9a6f..3537c25a2 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitUtil.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitUtil.java @@ -53,7 +53,6 @@ import io.papermc.lib.PaperLib; import org.bukkit.Bukkit; import org.bukkit.Chunk; import org.bukkit.Material; -import org.bukkit.OfflinePlayer; import org.bukkit.World; import org.bukkit.block.Biome; import org.bukkit.block.Block; @@ -101,7 +100,6 @@ import java.util.Collection; import java.util.HashSet; import java.util.Objects; import java.util.Set; -import java.util.UUID; import java.util.function.Consumer; import java.util.function.IntConsumer; import java.util.stream.Stream; @@ -116,24 +114,6 @@ import java.util.stream.Stream; super(regionManager); } - /** - * Get a {@link PlotPlayer} from an {@link OfflinePlayer}. If the player is - * online, it returns a complete player. If the player is offline, it creates - * a fake player - * - * @param op Offline player - * @return Plot player instance - */ - @Nonnull public static PlotPlayer adapt(@Nonnull final OfflinePlayer op) { - if (op.isOnline()) { - return adapt(Objects.requireNonNull(op.getPlayer())); - } - final Player player = OfflinePlayerUtil.loadPlayer(op); - player.loadData(); - return new BukkitPlayer(PlotSquared.get().getPlotAreaManager(), - PlotSquared.get().getEventDispatcher(), player, true, PlotSquared.platform().getEconHandler(), PlotSquared.platform().getPermissionHandler()); - } - /** * Turn a Bukkit {@link Player} into a PlotSquared {@link PlotPlayer} * @@ -214,18 +194,6 @@ import java.util.stream.Stream; } } - /** - * Gets the PlotPlayer for a UUID. The PlotPlayer is usually cached and - * will provide useful functions relating to players. - * - * @param uuid the uuid to wrap - * @return a {@code PlotPlayer} - * @see PlotPlayer#wrap(Object) - */ - @Override @Nonnull public PlotPlayer getPlayer(@Nonnull final UUID uuid) { - return PlotPlayer.wrap(Bukkit.getOfflinePlayer(uuid)); - } - @Override public boolean isBlockSame(@Nonnull final BlockState block1, @Nonnull final BlockState block2) { if (block1.equals(block2)) { diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/util/OfflinePlayerUtil.java b/Bukkit/src/main/java/com/plotsquared/bukkit/util/OfflinePlayerUtil.java deleted file mode 100644 index 41ae4dedd..000000000 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/util/OfflinePlayerUtil.java +++ /dev/null @@ -1,133 +0,0 @@ -/* - * _____ _ _ _____ _ - * | __ \| | | | / ____| | | - * | |__) | | ___ | |_| (___ __ _ _ _ __ _ _ __ ___ __| | - * | ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` | - * | | | | (_) | |_ ____) | (_| | |_| | (_| | | | __/ (_| | - * |_| |_|\___/ \__|_____/ \__, |\__,_|\__,_|_| \___|\__,_| - * | | - * |_| - * PlotSquared plot management system for Minecraft - * Copyright (C) 2020 IntellectualSites - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package com.plotsquared.bukkit.util; - -import org.bukkit.Bukkit; -import org.bukkit.OfflinePlayer; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Player; - -import java.lang.reflect.Constructor; -import java.lang.reflect.Method; -import java.util.UUID; - -import static com.plotsquared.core.util.ReflectionUtils.callConstructor; -import static com.plotsquared.core.util.ReflectionUtils.callMethod; -import static com.plotsquared.core.util.ReflectionUtils.getCbClass; -import static com.plotsquared.core.util.ReflectionUtils.getField; -import static com.plotsquared.core.util.ReflectionUtils.getNmsClass; -import static com.plotsquared.core.util.ReflectionUtils.getUtilClass; -import static com.plotsquared.core.util.ReflectionUtils.makeConstructor; -import static com.plotsquared.core.util.ReflectionUtils.makeField; -import static com.plotsquared.core.util.ReflectionUtils.makeMethod; - -public class OfflinePlayerUtil { - - public static Player loadPlayer(OfflinePlayer player) { - if (player == null) { - return null; - } - if (player instanceof Player) { - return (Player) player; - } - return loadPlayer(player.getUniqueId(), player.getName()); - } - - private static Player loadPlayer(UUID id, String name) { - Object server = getMinecraftServer(); - Object interactManager = newPlayerInteractManager(); - Object worldServer = getWorldServer(); - Object profile = newGameProfile(id, name); - Class entityPlayerClass = getNmsClass("EntityPlayer"); - Constructor entityPlayerConstructor = - makeConstructor(entityPlayerClass, getNmsClass("MinecraftServer"), - getNmsClass("WorldServer"), getUtilClass("com.mojang.authlib.GameProfile"), - getNmsClass("PlayerInteractManager")); - Object entityPlayer = - callConstructor(entityPlayerConstructor, server, worldServer, profile, interactManager); - return (Player) getBukkitEntity(entityPlayer); - } - - private static Object newGameProfile(UUID id, String name) { - Class gameProfileClass = getUtilClass("com.mojang.authlib.GameProfile"); - if (gameProfileClass == null) { //Before uuids - return name; - } - Constructor gameProfileConstructor = - makeConstructor(gameProfileClass, UUID.class, String.class); - if (gameProfileConstructor == null) { //Version has string constructor - gameProfileConstructor = makeConstructor(gameProfileClass, String.class, String.class); - return callConstructor(gameProfileConstructor, id.toString(), name); - } else { //Version has uuid constructor - return callConstructor(gameProfileConstructor, id, name); - } - } - - private static Object newPlayerInteractManager() { - Object worldServer = getWorldServer(); - Class playerInteractClass = getNmsClass("PlayerInteractManager"); - Class worldClass = getNmsClass("World"); - Constructor c = makeConstructor(playerInteractClass, worldClass); - if (c == null) { - c = makeConstructor(playerInteractClass, getNmsClass("WorldServer")); - } - return callConstructor(c, worldServer); - } - - public static Object getWorldServerNew() { - Object server = getMinecraftServer(); - Class minecraftServerClass = getNmsClass("MinecraftServer"); - Class dimensionManager = getNmsClass("DimensionManager"); - Object overworld = getField(makeField(dimensionManager, "OVERWORLD"), null); - Method getWorldServer = - makeMethod(minecraftServerClass, "getWorldServer", dimensionManager); - return callMethod(getWorldServer, server, overworld); - } - - private static Object getWorldServer() { - Object server = getMinecraftServer(); - Class minecraftServerClass = getNmsClass("MinecraftServer"); - Method getWorldServer = makeMethod(minecraftServerClass, "getWorldServer", int.class); - Object o; - try { - o = callMethod(getWorldServer, server, 0); - } catch (final RuntimeException e) { - o = getWorldServerNew(); - } - return o; - } - - //NMS Utils - - private static Object getMinecraftServer() { - return callMethod(makeMethod(getCbClass("CraftServer"), "getServer"), Bukkit.getServer()); - } - - private static Entity getBukkitEntity(Object o) { - Method getBukkitEntity = makeMethod(o.getClass(), "getBukkitEntity"); - return callMethod(getBukkitEntity, o); - } -} diff --git a/Core/src/main/java/com/plotsquared/core/PlotAPI.java b/Core/src/main/java/com/plotsquared/core/PlotAPI.java index 9a83aae5e..1450a3f4e 100644 --- a/Core/src/main/java/com/plotsquared/core/PlotAPI.java +++ b/Core/src/main/java/com/plotsquared/core/PlotAPI.java @@ -39,6 +39,8 @@ import com.plotsquared.core.util.SchematicHandler; import com.plotsquared.core.util.query.PlotQuery; import lombok.NoArgsConstructor; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.util.Collections; import java.util.Set; import java.util.UUID; @@ -178,10 +180,9 @@ import java.util.UUID; * * @param uuid the uuid of the player to wrap * @return a {@code PlotPlayer} - * @see PlotPlayer#wrap(Object) */ - public PlotPlayer wrapPlayer(UUID uuid) { - return PlotPlayer.wrap(uuid); + @Nullable public PlotPlayer wrapPlayer(@Nonnull final UUID uuid) { + return PlotSquared.platform().getPlayerManager().getPlayerIfExists(uuid); } /** @@ -189,10 +190,9 @@ import java.util.UUID; * * @param player the player to wrap * @return a {@code PlotPlayer} - * @see PlotPlayer#wrap(Object) */ - public PlotPlayer wrapPlayer(String player) { - return PlotPlayer.wrap(player); + @Nullable public PlotPlayer wrapPlayer(@Nonnull final String player) { + return PlotSquared.platform().getPlayerManager().getPlayerIfExists(player); } /** diff --git a/Core/src/main/java/com/plotsquared/core/PlotPlatform.java b/Core/src/main/java/com/plotsquared/core/PlotPlatform.java index c84bce2b9..51f5ff6e1 100644 --- a/Core/src/main/java/com/plotsquared/core/PlotPlatform.java +++ b/Core/src/main/java/com/plotsquared/core/PlotPlatform.java @@ -27,6 +27,7 @@ package com.plotsquared.core; import com.google.inject.Injector; import com.google.inject.Key; +import com.google.inject.TypeLiteral; import com.plotsquared.core.backup.BackupManager; import com.plotsquared.core.generator.GeneratorWrapper; import com.plotsquared.core.generator.HybridUtils; @@ -80,14 +81,6 @@ public interface PlotPlatform

extends ILogger { */ File getWorldContainer(); - /** - * Wraps a player into a PlotPlayer object. - * - * @param player The player to convert to a PlotPlayer - * @return A PlotPlayer - */ - @Nullable PlotPlayer

wrapPlayer(Object player); - /** * Completely shuts down the plugin. */ @@ -186,7 +179,7 @@ public interface PlotPlatform

extends ILogger { * @return Player manager */ @Nonnull default PlayerManager, ? extends P> getPlayerManager() { - return getInjector().getInstance(PlayerManager.class); + return getInjector().getInstance(Key.get(new TypeLiteral, ? extends P>>() {})); } /** diff --git a/Core/src/main/java/com/plotsquared/core/command/Buy.java b/Core/src/main/java/com/plotsquared/core/command/Buy.java index 88f4dd4af..8fe688834 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Buy.java +++ b/Core/src/main/java/com/plotsquared/core/command/Buy.java @@ -93,7 +93,7 @@ public class Buy extends Command { this.econHandler.depositMoney(PlotSquared.platform().getPlayerManager().getOfflinePlayer(plot.getOwnerAbs()), price); - PlotPlayer owner = PlotSquared.platform().getPlayerManager().getPlayerIfExists(plot.getOwnerAbs()); + PlotPlayer owner = PlotSquared.platform().getPlayerManager().getPlayerIfExists(plot.getOwnerAbs()); if (owner != null) { Captions.PLOT_SOLD.send(owner, plot.getId(), player.getName(), price); } diff --git a/Core/src/main/java/com/plotsquared/core/listener/PlotListener.java b/Core/src/main/java/com/plotsquared/core/listener/PlotListener.java index 2579976a4..c9fe94e41 100644 --- a/Core/src/main/java/com/plotsquared/core/listener/PlotListener.java +++ b/Core/src/main/java/com/plotsquared/core/listener/PlotListener.java @@ -94,7 +94,7 @@ public class PlotListener { ++value.count; if (value.count == value.interval) { value.count = 0; - PlotPlayer player = PlotPlayer.wrap(entry.getKey()); + final PlotPlayer player = PlotSquared.platform().getPlayerManager().getPlayerIfExists(entry.getKey()); if (player == null) { iterator.remove(); continue; @@ -114,7 +114,7 @@ public class PlotListener { ++value.count; if (value.count == value.interval) { value.count = 0; - PlotPlayer player = PlotSquared.platform().getWorldUtil().getPlayer(entry.getKey()); + final PlotPlayer player = PlotSquared.platform().getPlayerManager().getPlayerIfExists(entry.getKey()); if (player == null) { iterator.remove(); continue; diff --git a/Core/src/main/java/com/plotsquared/core/listener/WESubscriber.java b/Core/src/main/java/com/plotsquared/core/listener/WESubscriber.java index 4ae1c5c1f..7cfbd2751 100644 --- a/Core/src/main/java/com/plotsquared/core/listener/WESubscriber.java +++ b/Core/src/main/java/com/plotsquared/core/listener/WESubscriber.java @@ -26,6 +26,7 @@ package com.plotsquared.core.listener; import com.google.inject.Inject; +import com.plotsquared.core.PlotSquared; import com.plotsquared.core.configuration.Captions; import com.plotsquared.core.configuration.Settings; import com.plotsquared.core.player.PlotPlayer; @@ -72,7 +73,7 @@ public class WESubscriber { Actor actor = event.getActor(); if (actor != null && actor.isPlayer()) { String name = actor.getName(); - PlotPlayer plotPlayer = PlotPlayer.wrap(name); + final PlotPlayer plotPlayer = PlotSquared.platform().getPlayerManager().getPlayerIfExists(name); Set mask; if (plotPlayer == null) { Player player = (Player) actor; diff --git a/Core/src/main/java/com/plotsquared/core/player/ConsolePlayer.java b/Core/src/main/java/com/plotsquared/core/player/ConsolePlayer.java index 437e86491..60fbf7415 100644 --- a/Core/src/main/java/com/plotsquared/core/player/ConsolePlayer.java +++ b/Core/src/main/java/com/plotsquared/core/player/ConsolePlayer.java @@ -120,7 +120,7 @@ public class ConsolePlayer extends PlotPlayer { } @Override public long getLastPlayed() { - return 0; + return System.currentTimeMillis(); } @Override public void sendMessage(String message) { @@ -132,10 +132,6 @@ public class ConsolePlayer extends PlotPlayer { setMeta(META_LOCATION, location); } - @Override public boolean isOnline() { - return true; - } - @Override public String getName() { return "*"; } diff --git a/Core/src/main/java/com/plotsquared/core/player/OfflinePlotPlayer.java b/Core/src/main/java/com/plotsquared/core/player/OfflinePlotPlayer.java index 92a0e6536..24d83514a 100644 --- a/Core/src/main/java/com/plotsquared/core/player/OfflinePlotPlayer.java +++ b/Core/src/main/java/com/plotsquared/core/player/OfflinePlotPlayer.java @@ -27,6 +27,7 @@ package com.plotsquared.core.player; import com.plotsquared.core.permissions.PermissionHolder; +import javax.annotation.Nonnegative; import java.util.UUID; public interface OfflinePlotPlayer extends PermissionHolder { @@ -42,16 +43,8 @@ public interface OfflinePlotPlayer extends PermissionHolder { * Gets the time in milliseconds when the player was last seen online. * * @return the time in milliseconds when last online - * @deprecated This method may be inconsistent across platforms. The javadoc may be wrong depending on which platform is used. */ - @SuppressWarnings("DeprecatedIsStillUsed") @Deprecated long getLastPlayed(); - - /** - * Checks if this player is online. - * - * @return {@code true} if this player is online - */ - boolean isOnline(); + @Nonnegative long getLastPlayed(); /** * Gets the name of this player. diff --git a/Core/src/main/java/com/plotsquared/core/player/PlotPlayer.java b/Core/src/main/java/com/plotsquared/core/player/PlotPlayer.java index 666d5be7b..27680b26a 100644 --- a/Core/src/main/java/com/plotsquared/core/player/PlotPlayer.java +++ b/Core/src/main/java/com/plotsquared/core/player/PlotPlayer.java @@ -140,20 +140,6 @@ public abstract class PlotPlayer

implements CommandCaller, OfflinePlotPlayer return players; } - /** - * Efficiently wrap a Player, or OfflinePlayer object to get a PlotPlayer (or fetch if it's already cached)
- * - Accepts sponge/bukkit Player (online) - * - Accepts player name (online) - * - Accepts UUID - * - Accepts bukkit OfflinePlayer (offline) - * - * @param player Player object to wrap - * @return Wrapped player - */ - public static PlotPlayer wrap(Object player) { - return PlotSquared.platform().wrapPlayer(player); - } - @Override public final boolean hasPermission(@Nullable final String world, @Nonnull final String permission) { return this.permissionProfile.hasPermission(world, permission); diff --git a/Core/src/main/java/com/plotsquared/core/plot/Plot.java b/Core/src/main/java/com/plotsquared/core/plot/Plot.java index 918388008..d4fe6ba6b 100644 --- a/Core/src/main/java/com/plotsquared/core/plot/Plot.java +++ b/Core/src/main/java/com/plotsquared/core/plot/Plot.java @@ -1926,11 +1926,16 @@ public class Plot { DBFunc.createPlotAndSettings(this, () -> { PlotArea plotworld = Plot.this.area; if (notify && plotworld.isAutoMerge()) { - PlotPlayer player = this.worldUtil.getPlayer(uuid); + final PlotPlayer player = PlotSquared.platform().getPlayerManager() + .getPlayerIfExists(uuid); + PlotMergeEvent event = this.eventDispatcher .callMerge(this, Direction.ALL, Integer.MAX_VALUE, player); + if (event.getEventResult() == Result.DENY) { - sendMessage(player, Captions.EVENT_DENIED, "Auto merge on claim"); + if (player != null) { + sendMessage(player, Captions.EVENT_DENIED, "Auto merge on claim"); + } return; } Plot.this.autoMerge(event.getDir(), event.getMax(), uuid, true); @@ -3083,10 +3088,10 @@ public class Plot { if (!TaskManager.removeFromTeleportQueue(name)) { return; } - if (player.isOnline()) { + try { MainUtil.sendMessage(player, Captions.TELEPORTED_TO_PLOT); player.teleport(location, cause); - } + } catch (final Exception ignored) {} }, TaskTime.seconds(Settings.Teleport.DELAY)); resultConsumer.accept(true); }; diff --git a/Core/src/main/java/com/plotsquared/core/plot/expiration/ExpireManager.java b/Core/src/main/java/com/plotsquared/core/plot/expiration/ExpireManager.java index 2a3514540..1171bef87 100644 --- a/Core/src/main/java/com/plotsquared/core/plot/expiration/ExpireManager.java +++ b/Core/src/main/java/com/plotsquared/core/plot/expiration/ExpireManager.java @@ -418,13 +418,13 @@ public class ExpireManager { } } for (UUID helper : plot.getTrusted()) { - PlotPlayer player = PlotSquared.platform().getPlayerManager().getPlayerIfExists(helper); + PlotPlayer player = PlotSquared.platform().getPlayerManager().getPlayerIfExists(helper); if (player != null) { MainUtil.sendMessage(player, Captions.PLOT_REMOVED_USER, plot.toString()); } } for (UUID helper : plot.getMembers()) { - PlotPlayer player = PlotSquared.platform().getPlayerManager().getPlayerIfExists(helper); + PlotPlayer player = PlotSquared.platform().getPlayerManager().getPlayerIfExists(helper); if (player != null) { MainUtil.sendMessage(player, Captions.PLOT_REMOVED_USER, plot.toString()); } diff --git a/Core/src/main/java/com/plotsquared/core/util/WorldUtil.java b/Core/src/main/java/com/plotsquared/core/util/WorldUtil.java index 81d5e2f11..e478bfdb8 100644 --- a/Core/src/main/java/com/plotsquared/core/util/WorldUtil.java +++ b/Core/src/main/java/com/plotsquared/core/util/WorldUtil.java @@ -328,14 +328,6 @@ public abstract class WorldUtil { */ public abstract boolean isBlockSame(@Nonnull BlockState block1, @Nonnull BlockState block2); - /** - * Get a player object for the player with the given UUID - * - * @param uuid Player UUID - * @return Player object - */ - @Nonnull public abstract PlotPlayer getPlayer(@Nonnull UUID uuid); - /** * Get the player health * From a7de76d15001ccee5828cc76d29c0595e5dc0d32 Mon Sep 17 00:00:00 2001 From: N0tMyFaultOG Date: Thu, 23 Jul 2020 14:03:56 +0200 Subject: [PATCH 13/16] Fix dependencies --- Bukkit/build.gradle | 2 ++ Bukkit/pom.xml | 2 +- Core/build.gradle | 2 ++ Core/pom.xml | 12 ++++++++++++ 4 files changed, 17 insertions(+), 1 deletion(-) diff --git a/Bukkit/build.gradle b/Bukkit/build.gradle index 8e32904c5..3bb9f863e 100644 --- a/Bukkit/build.gradle +++ b/Bukkit/build.gradle @@ -106,6 +106,8 @@ shadowJar { include(dependency("javax.annotation:javax-annotation-api")) include(dependency('org.apache.logging.log4j:log4j-slf4j-impl')) include(dependency('org.slf4j:slf4j-api')) + include(dependency('javax.inject:javax.inject:1')) + include(dependency('aopalliance:aopalliance:1.0')) } relocate('net.kyori.text', 'com.plotsquared.formatting.text') diff --git a/Bukkit/pom.xml b/Bukkit/pom.xml index d4848ae84..b9e6fbb23 100644 --- a/Bukkit/pom.xml +++ b/Bukkit/pom.xml @@ -51,7 +51,7 @@ io.papermc paperlib - 1.0.2 + 1.0.4 compile diff --git a/Core/build.gradle b/Core/build.gradle index 9743bc080..bd0fa55f0 100644 --- a/Core/build.gradle +++ b/Core/build.gradle @@ -20,6 +20,8 @@ dependencies { compile("com.google.inject:guice:4.2.3") compile("com.google.inject.extensions:guice-assistedinject:4.2.3") compile group: 'com.google.code.findbugs', name: 'annotations', version: '3.0.1' + compile group: 'javax.inject', name: 'javax.inject', version: '1' + compile group: 'aopalliance', name: 'aopalliance', version: '1.0' // logging implementation("org.apache.logging.log4j:log4j-slf4j-impl:2.8.1") } diff --git a/Core/pom.xml b/Core/pom.xml index ac6a4ef60..05142d3a8 100644 --- a/Core/pom.xml +++ b/Core/pom.xml @@ -36,6 +36,18 @@ 3.0.1 compile + + javax.inject + javax.inject + 1 + compile + + + aopalliance + aopalliance + 1.0 + compile + org.projectlombok lombok From d8e80daa9349ca3ff11130e8f4c586f0f43816a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20S=C3=B6derberg?= Date: Thu, 23 Jul 2020 15:40:43 +0200 Subject: [PATCH 14/16] Fix annoying guice injection issue --- .../main/java/com/plotsquared/bukkit/BukkitPlatform.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitPlatform.java b/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitPlatform.java index 3c39850e7..7af971ea7 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitPlatform.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitPlatform.java @@ -124,7 +124,6 @@ import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Chunk; import org.bukkit.Location; -import org.bukkit.OfflinePlayer; import org.bukkit.World; import org.bukkit.command.PluginCommand; import org.bukkit.entity.Entity; @@ -1118,8 +1117,9 @@ import static com.plotsquared.core.util.ReflectionUtils.getRefClass; return getInjector().getInstance(Key.get(new TypeLiteral>() {})); } - @Override @Nonnull public PlayerManager, ? extends Player> getPlayerManager() { - return getInjector().getInstance(Key.get(new TypeLiteral>() {})); + @Override @Nonnull @SuppressWarnings("ALL") + public PlayerManager, ? extends Player> getPlayerManager() { + return (PlayerManager) getInjector().getInstance(PlayerManager.class); } } From c9c62a10830f5ac4d7ef5f26c9f69416f994f569 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20S=C3=B6derberg?= Date: Fri, 24 Jul 2020 12:44:04 +0200 Subject: [PATCH 15/16] Remove dumb permission mess. --- .../core/permissions/PermissionHolder.java | 2 +- .../plotsquared/core/util/Permissions.java | 81 +++---------------- .../plotsquared/core/util/PlayerManager.java | 2 +- 3 files changed, 15 insertions(+), 70 deletions(-) diff --git a/Core/src/main/java/com/plotsquared/core/permissions/PermissionHolder.java b/Core/src/main/java/com/plotsquared/core/permissions/PermissionHolder.java index abff13262..7f42c24f0 100644 --- a/Core/src/main/java/com/plotsquared/core/permissions/PermissionHolder.java +++ b/Core/src/main/java/com/plotsquared/core/permissions/PermissionHolder.java @@ -89,6 +89,6 @@ public interface PermissionHolder { * @param permission Permission * @return {@code true} if the owner has the given permission, else {@code false} */ - boolean hasPermission(@Nullable final String world, @Nonnull String permission); + boolean hasPermission(@Nullable String world, @Nonnull String permission); } diff --git a/Core/src/main/java/com/plotsquared/core/util/Permissions.java b/Core/src/main/java/com/plotsquared/core/util/Permissions.java index 24256da11..256dbb212 100644 --- a/Core/src/main/java/com/plotsquared/core/util/Permissions.java +++ b/Core/src/main/java/com/plotsquared/core/util/Permissions.java @@ -25,16 +25,13 @@ */ package com.plotsquared.core.util; -import com.plotsquared.core.command.CommandCaller; +import com.plotsquared.core.configuration.Caption; import com.plotsquared.core.configuration.Captions; import com.plotsquared.core.configuration.Settings; -import com.plotsquared.core.player.MetaDataAccess; -import com.plotsquared.core.player.PlayerMetaDataKeys; -import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.permissions.PermissionHolder; +import com.plotsquared.core.player.PlotPlayer; -import java.util.HashMap; -import java.util.Map; +import javax.annotation.Nonnull; /** * The Permissions class handles checking user permissions.
@@ -48,75 +45,23 @@ public class Permissions { } /** - * Check if a player has a permission (Captions class helps keep track of permissions). + * Check if the owner of the profile has a given (global) permission * - * @param player - * @param caption - * @return + * @param permission Permission + * @return {@code true} if the owner has the given permission, else {@code false} */ - public static boolean hasPermission(PlotPlayer player, Captions caption) { - return hasPermission(player, caption.getTranslated()); + public static boolean hasPermission(@Nonnull final PermissionHolder caller, @Nonnull final Caption permission) { + return caller.hasPermission(permission.getTranslated()); } /** - * Check if a {@link PlotPlayer} has a permission. + * Check if the owner of the profile has a given (global) permission * - * @param player - * @param permission - * @return + * @param permission Permission + * @return {@code true} if the owner has the given permission, else {@code false} */ - public static boolean hasPermission(PlotPlayer player, String permission) { - if (!Settings.Enabled_Components.PERMISSION_CACHE) { - return hasPermission((PermissionHolder) player, permission); - } - try (final MetaDataAccess> mapAccess = - player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_PERMISSIONS)) { - Map map = mapAccess.get().orElse(null); - if (map != null) { - final Boolean result = map.get(permission); - if (result != null) { - return result; - } - } else { - mapAccess.set((map = new HashMap<>())); - } - boolean result = hasPermission((PermissionHolder) player, permission); - map.put(permission, result); - return result; - } - } - - /** - * Check if a {@code CommandCaller} has a permission. - * - * @param caller - * @param permission - * @return - */ - public static boolean hasPermission(PermissionHolder caller, String permission) { - if (caller.hasPermission(permission)) { - return true; - }/* TODO: DECIDE WHAT TO DO HERE; else if (caller.isPermissionSet(permission)) { - return false; - }*/ - if (caller.hasPermission(Captions.PERMISSION_ADMIN.getTranslated())) { - return true; - } - permission = permission.toLowerCase().replaceAll("^[^a-z|0-9|\\.|_|-]", ""); - String[] nodes = permission.split("\\."); - StringBuilder n = new StringBuilder(); - for (int i = 0; i <= (nodes.length - 1); i++) { - n.append(nodes[i] + "."); - String combined = n + Captions.PERMISSION_STAR.getTranslated(); - if (!permission.equals(combined)) { - if (caller.hasPermission(combined)) { - return true; - }/* TODO: DECIDE WHAT TO DO HERE; else if (caller.isPermissionSet(combined)) { - return false; - }*/ - } - } - return false; + public static boolean hasPermission(@Nonnull final PermissionHolder caller, @Nonnull final String permission) { + return caller.hasPermission(permission); } /** diff --git a/Core/src/main/java/com/plotsquared/core/util/PlayerManager.java b/Core/src/main/java/com/plotsquared/core/util/PlayerManager.java index e316d6c19..cfe666569 100644 --- a/Core/src/main/java/com/plotsquared/core/util/PlayerManager.java +++ b/Core/src/main/java/com/plotsquared/core/util/PlayerManager.java @@ -239,7 +239,7 @@ public abstract class PlayerManager

, T> { /** * Get a plot player from a platform player object. This method requires - * that the caller actually knows that the player exists. + * that the caller actually knows that the player exists and is online. *

* The method will throw an exception if there is no such * player online. From fe7a57b2b7a40ede27fb08525ce65d1666599723 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20S=C3=B6derberg?= Date: Fri, 24 Jul 2020 12:48:45 +0200 Subject: [PATCH 16/16] Remove mainutil cache workaround --- .../com/plotsquared/core/util/MainUtil.java | 47 ------------------- 1 file changed, 47 deletions(-) diff --git a/Core/src/main/java/com/plotsquared/core/util/MainUtil.java b/Core/src/main/java/com/plotsquared/core/util/MainUtil.java index 010622813..2a96b7120 100644 --- a/Core/src/main/java/com/plotsquared/core/util/MainUtil.java +++ b/Core/src/main/java/com/plotsquared/core/util/MainUtil.java @@ -44,53 +44,6 @@ import javax.annotation.Nonnull; private static final Logger logger = LoggerFactory.getLogger("P2/" + MainUtil.class.getSimpleName()); - /** - * Cache of mapping x,y,z coordinates to the chunk array
- * - Used for efficient world generation
- */ - public static short[][] x_loc; - public static short[][] y_loc; - public static short[][] z_loc; - public static short[][][] CACHE_I = null; - public static short[][][] CACHE_J = null; - - /** - * This cache is used for world generation and just saves a bit of calculation time when checking if something is in the plot area. - */ - public static void initCache() { - if (x_loc == null) { - x_loc = new short[16][4096]; - y_loc = new short[16][4096]; - z_loc = new short[16][4096]; - for (int i = 0; i < 16; i++) { - int i4 = i << 4; - for (int j = 0; j < 4096; j++) { - int y = i4 + (j >> 8); - int a = j - ((y & 0xF) << 8); - int z1 = a >> 4; - int x1 = a - (z1 << 4); - x_loc[i][j] = (short) x1; - y_loc[i][j] = (short) y; - z_loc[i][j] = (short) z1; - } - } - } - if (CACHE_I == null) { - CACHE_I = new short[256][16][16]; - CACHE_J = new short[256][16][16]; - for (int x = 0; x < 16; x++) { - for (int z = 0; z < 16; z++) { - for (int y = 0; y < 256; y++) { - short i = (short) (y >> 4); - short j = (short) ((y & 0xF) << 8 | z << 4 | x); - CACHE_I[y][x][z] = i; - CACHE_J[y][x][z] = j; - } - } - } - } - } - /** * Send a message to the player. *