+ * Copyright (c) contributors
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+package me.lucko.luckperms.api;
+
+/**
+ * The various lookup setting flags for {@link Contexts}.
+ *
+ * @since 4.2
+ */
+public enum LookupSetting {
+
+ /**
+ * If the target subject is OP
+ */
+ IS_OP,
+
+ /**
+ * If global or non-server-specific nodes should be applied
+ */
+ INCLUDE_NODES_SET_WITHOUT_SERVER,
+
+ /**
+ * If global or non-world-specific nodes should be applied
+ */
+ INCLUDE_NODES_SET_WITHOUT_WORLD,
+
+ /**
+ * If parent groups should be resolved
+ */
+ RESOLVE_INHERITANCE,
+
+ /**
+ * If global or non-server-specific group memberships should be applied
+ */
+ APPLY_PARENTS_SET_WITHOUT_SERVER,
+
+ /**
+ * If global or non-world-specific group memberships should be applied
+ */
+ APPLY_PARENTS_SET_WITHOUT_WORLD
+}
diff --git a/api/src/main/java/me/lucko/luckperms/api/caching/CachedData.java b/api/src/main/java/me/lucko/luckperms/api/caching/CachedData.java
index 255dc0f59..06485189d 100644
--- a/api/src/main/java/me/lucko/luckperms/api/caching/CachedData.java
+++ b/api/src/main/java/me/lucko/luckperms/api/caching/CachedData.java
@@ -36,12 +36,14 @@ import javax.annotation.Nonnull;
/**
* Holds cached permission and meta lookup data for a {@link PermissionHolder}.
*
- * All calls will account for inheritance, as well as any default data provided by
- * the platform. This calls are heavily cached and are therefore fast.
+ * All calls will account for inheritance, as well as any default data
+ * provided by the platform. This calls are heavily cached and are therefore
+ * fast.
*
- * For meta, both methods accepting {@link Contexts} and {@link MetaContexts} are provided. The only difference is that
- * the latter allows you to define how the meta stack should be structured internally. Where {@link Contexts} are passed, the
- * values from the configuration are used.
+ * For meta, both methods accepting {@link Contexts} and {@link MetaContexts}
+ * are provided. The only difference is that the latter allows you to define
+ * how the meta stack should be structured internally. Where {@link Contexts}
+ * are passed, the values from the configuration are used.
*
* @since 4.0
*/
diff --git a/api/src/main/java/me/lucko/luckperms/api/context/ContextCalculator.java b/api/src/main/java/me/lucko/luckperms/api/context/ContextCalculator.java
index 48d081fe5..6cfc04b11 100644
--- a/api/src/main/java/me/lucko/luckperms/api/context/ContextCalculator.java
+++ b/api/src/main/java/me/lucko/luckperms/api/context/ContextCalculator.java
@@ -28,7 +28,7 @@ package me.lucko.luckperms.api.context;
import javax.annotation.Nonnull;
/**
- * Calculates whether contexts are applicable to {@link T}
+ * Calculates whether contexts are applicable to a {@link T subject}.
*
* @param the subject type. Is ALWAYS the player class of the platform.
* @since 2.13
diff --git a/bukkit/src/main/java/me/lucko/luckperms/bukkit/calculators/BukkitCalculatorFactory.java b/bukkit/src/main/java/me/lucko/luckperms/bukkit/calculators/BukkitCalculatorFactory.java
index 2728c6500..07755aee2 100644
--- a/bukkit/src/main/java/me/lucko/luckperms/bukkit/calculators/BukkitCalculatorFactory.java
+++ b/bukkit/src/main/java/me/lucko/luckperms/bukkit/calculators/BukkitCalculatorFactory.java
@@ -28,6 +28,7 @@ package me.lucko.luckperms.bukkit.calculators;
import com.google.common.collect.ImmutableList;
import me.lucko.luckperms.api.Contexts;
+import me.lucko.luckperms.api.LookupSetting;
import me.lucko.luckperms.bukkit.LPBukkitPlugin;
import me.lucko.luckperms.bukkit.processors.ChildProcessor;
import me.lucko.luckperms.bukkit.processors.DefaultsProcessor;
@@ -67,7 +68,7 @@ public class BukkitCalculatorFactory extends AbstractCalculatorFactory {
}
if (this.plugin.getConfiguration().get(ConfigKeys.APPLY_BUKKIT_DEFAULT_PERMISSIONS) && metadata.getHolderType() == HolderType.USER) {
- processors.add(new DefaultsProcessor(this.plugin, contexts.isOp()));
+ processors.add(new DefaultsProcessor(this.plugin, contexts.hasSetting(LookupSetting.IS_OP)));
}
return registerCalculator(new PermissionCalculator(this.plugin, metadata, processors.build()));
diff --git a/bukkit/src/main/java/me/lucko/luckperms/bukkit/contexts/BukkitContextManager.java b/bukkit/src/main/java/me/lucko/luckperms/bukkit/contexts/BukkitContextManager.java
index 151ea48d4..810463bb5 100644
--- a/bukkit/src/main/java/me/lucko/luckperms/bukkit/contexts/BukkitContextManager.java
+++ b/bukkit/src/main/java/me/lucko/luckperms/bukkit/contexts/BukkitContextManager.java
@@ -40,7 +40,7 @@ public class BukkitContextManager extends AbstractContextManager {
@Override
public Contexts formContexts(Player subject, ImmutableContextSet contextSet) {
- return new Contexts(
+ return Contexts.of(
contextSet,
this.plugin.getConfiguration().get(ConfigKeys.INCLUDING_GLOBAL_PERMS),
this.plugin.getConfiguration().get(ConfigKeys.INCLUDING_GLOBAL_WORLD_PERMS),
diff --git a/bukkit/src/main/java/me/lucko/luckperms/bukkit/vault/VaultChatHook.java b/bukkit/src/main/java/me/lucko/luckperms/bukkit/vault/VaultChatHook.java
index 79a5dde1a..a337478e1 100644
--- a/bukkit/src/main/java/me/lucko/luckperms/bukkit/vault/VaultChatHook.java
+++ b/bukkit/src/main/java/me/lucko/luckperms/bukkit/vault/VaultChatHook.java
@@ -326,6 +326,6 @@ public class VaultChatHook extends AbstractVaultChat {
context.add(Contexts.WORLD_KEY, world.toLowerCase());
}
context.add(Contexts.SERVER_KEY, this.permissionHook.getVaultServer());
- return new Contexts(context.build(), this.permissionHook.isIncludeGlobal(), true, true, true, true, false);
+ return Contexts.of(context.build(), this.permissionHook.isIncludeGlobal(), true, true, true, true, false);
}
}
diff --git a/bukkit/src/main/java/me/lucko/luckperms/bukkit/vault/VaultPermissionHook.java b/bukkit/src/main/java/me/lucko/luckperms/bukkit/vault/VaultPermissionHook.java
index cb4017b58..bf319eecb 100644
--- a/bukkit/src/main/java/me/lucko/luckperms/bukkit/vault/VaultPermissionHook.java
+++ b/bukkit/src/main/java/me/lucko/luckperms/bukkit/vault/VaultPermissionHook.java
@@ -348,7 +348,7 @@ public class VaultPermissionHook extends AbstractVaultPermission {
}
}
- return new Contexts(context, isIncludeGlobal(), true, true, true, true, false);
+ return Contexts.of(context, isIncludeGlobal(), true, true, true, true, false);
}
// utility methods for modifying the state of PermissionHolders
diff --git a/bungee/src/main/java/me/lucko/luckperms/bungee/contexts/BungeeContextManager.java b/bungee/src/main/java/me/lucko/luckperms/bungee/contexts/BungeeContextManager.java
index 7330f81b4..57835bc30 100644
--- a/bungee/src/main/java/me/lucko/luckperms/bungee/contexts/BungeeContextManager.java
+++ b/bungee/src/main/java/me/lucko/luckperms/bungee/contexts/BungeeContextManager.java
@@ -40,7 +40,7 @@ public class BungeeContextManager extends AbstractContextManager
@Override
public Contexts formContexts(ProxiedPlayer subject, ImmutableContextSet contextSet) {
- return new Contexts(
+ return Contexts.of(
contextSet,
this.plugin.getConfiguration().get(ConfigKeys.INCLUDING_GLOBAL_PERMS),
this.plugin.getConfiguration().get(ConfigKeys.INCLUDING_GLOBAL_WORLD_PERMS),
diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/impl/misc/DebugCommand.java b/common/src/main/java/me/lucko/luckperms/common/commands/impl/misc/DebugCommand.java
index 75e886b21..00e20d9ba 100644
--- a/common/src/main/java/me/lucko/luckperms/common/commands/impl/misc/DebugCommand.java
+++ b/common/src/main/java/me/lucko/luckperms/common/commands/impl/misc/DebugCommand.java
@@ -29,6 +29,7 @@ import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import me.lucko.luckperms.api.Contexts;
+import me.lucko.luckperms.api.LookupSetting;
import me.lucko.luckperms.api.caching.MetaContexts;
import me.lucko.luckperms.api.context.ContextCalculator;
import me.lucko.luckperms.api.context.StaticContextCalculator;
@@ -215,14 +216,12 @@ public class DebugCommand extends SingleCommand {
return ret;
}
- private static JObject serializeContextsSettings(Contexts contexts) {
- return new JObject()
- .add("op", contexts.isOp())
- .add("includeGlobal", contexts.isIncludeGlobal())
- .add("includeGlobalWorld", contexts.isIncludeGlobalWorld())
- .add("applyGroups", contexts.isApplyGroups())
- .add("applyGlobalGroups", contexts.isApplyGlobalGroups())
- .add("applyGlobalWorldGroups", contexts.isApplyGlobalWorldGroups());
+ private static JArray serializeContextsSettings(Contexts contexts) {
+ JArray array = new JArray();
+ for (LookupSetting setting : contexts.getSettings()) {
+ array.add(setting.name());
+ }
+ return array;
}
private static JObject serializeMetaContextsSettings(MetaContexts metaContexts) {
diff --git a/common/src/main/java/me/lucko/luckperms/common/contexts/AbstractContextManager.java b/common/src/main/java/me/lucko/luckperms/common/contexts/AbstractContextManager.java
index d5d4867e4..176af2e74 100644
--- a/common/src/main/java/me/lucko/luckperms/common/contexts/AbstractContextManager.java
+++ b/common/src/main/java/me/lucko/luckperms/common/contexts/AbstractContextManager.java
@@ -147,7 +147,7 @@ public abstract class AbstractContextManager implements ContextManager {
@Override
public Contexts formContexts(ImmutableContextSet contextSet) {
- return new Contexts(
+ return Contexts.of(
contextSet,
this.plugin.getConfiguration().get(ConfigKeys.INCLUDING_GLOBAL_PERMS),
this.plugin.getConfiguration().get(ConfigKeys.INCLUDING_GLOBAL_WORLD_PERMS),
diff --git a/common/src/main/java/me/lucko/luckperms/common/inheritance/InheritanceGraph.java b/common/src/main/java/me/lucko/luckperms/common/inheritance/InheritanceGraph.java
index dc9b0279d..8175c1a3f 100644
--- a/common/src/main/java/me/lucko/luckperms/common/inheritance/InheritanceGraph.java
+++ b/common/src/main/java/me/lucko/luckperms/common/inheritance/InheritanceGraph.java
@@ -26,6 +26,7 @@
package me.lucko.luckperms.common.inheritance;
import me.lucko.luckperms.api.Contexts;
+import me.lucko.luckperms.api.LookupSetting;
import me.lucko.luckperms.api.Node;
import me.lucko.luckperms.common.graph.Graph;
import me.lucko.luckperms.common.graph.GraphTraversers;
@@ -95,7 +96,7 @@ public interface InheritanceGraph extends Graph {
List nodes = holder.getOwnGroupNodes(this.context.getContexts());
for (Node n : nodes) {
// effectively: if not (we're applying global groups or it's specific anyways)
- if (!((this.context.isApplyGlobalGroups() || n.isServerSpecific()) && (this.context.isApplyGlobalWorldGroups() || n.isWorldSpecific()))) {
+ if (!((this.context.hasSetting(LookupSetting.APPLY_PARENTS_SET_WITHOUT_SERVER) || n.isServerSpecific()) && (this.context.hasSetting(LookupSetting.APPLY_PARENTS_SET_WITHOUT_WORLD) || n.isWorldSpecific()))) {
continue;
}
diff --git a/common/src/main/java/me/lucko/luckperms/common/model/PermissionHolder.java b/common/src/main/java/me/lucko/luckperms/common/model/PermissionHolder.java
index 10e37343f..3eb7c9bfe 100644
--- a/common/src/main/java/me/lucko/luckperms/common/model/PermissionHolder.java
+++ b/common/src/main/java/me/lucko/luckperms/common/model/PermissionHolder.java
@@ -34,6 +34,7 @@ import com.google.common.collect.Multimap;
import me.lucko.luckperms.api.Contexts;
import me.lucko.luckperms.api.DataMutateResult;
import me.lucko.luckperms.api.LocalizedNode;
+import me.lucko.luckperms.api.LookupSetting;
import me.lucko.luckperms.api.Node;
import me.lucko.luckperms.api.NodeEqualityPredicate;
import me.lucko.luckperms.api.StandardNodeEquality;
@@ -422,7 +423,7 @@ public abstract class PermissionHolder {
private List getAllEntries(Contexts context) {
List entries = new LinkedList<>();
- if (context.isApplyGroups()) {
+ if (context.hasSetting(LookupSetting.RESOLVE_INHERITANCE)) {
accumulateInheritancesTo(entries, context);
} else {
for (Node n : getOwnNodes(context.getContexts())) {
@@ -431,10 +432,10 @@ public abstract class PermissionHolder {
}
}
- if (!context.isIncludeGlobal()) {
+ if (!context.hasSetting(LookupSetting.INCLUDE_NODES_SET_WITHOUT_SERVER)) {
entries.removeIf(n -> !n.isGroupNode() && !n.isServerSpecific());
}
- if (!context.isApplyGlobalWorldGroups()) {
+ if (!context.hasSetting(LookupSetting.INCLUDE_NODES_SET_WITHOUT_WORLD)) {
entries.removeIf(n -> !n.isGroupNode() && !n.isWorldSpecific());
}
@@ -507,7 +508,7 @@ public abstract class PermissionHolder {
if (!node.getValuePrimitive()) continue;
if (!node.isMeta() && !node.isPrefix() && !node.isSuffix()) continue;
- if (!((context.isIncludeGlobal() || node.isServerSpecific()) && (context.isIncludeGlobalWorld() || node.isWorldSpecific()))) {
+ if (!((context.hasSetting(LookupSetting.INCLUDE_NODES_SET_WITHOUT_SERVER) || node.isServerSpecific()) && (context.hasSetting(LookupSetting.INCLUDE_NODES_SET_WITHOUT_WORLD) || node.isWorldSpecific()))) {
continue;
}
diff --git a/nukkit/src/main/java/me/lucko/luckperms/nukkit/calculators/NukkitCalculatorFactory.java b/nukkit/src/main/java/me/lucko/luckperms/nukkit/calculators/NukkitCalculatorFactory.java
index e53dddddc..04ffb59af 100644
--- a/nukkit/src/main/java/me/lucko/luckperms/nukkit/calculators/NukkitCalculatorFactory.java
+++ b/nukkit/src/main/java/me/lucko/luckperms/nukkit/calculators/NukkitCalculatorFactory.java
@@ -28,6 +28,7 @@ package me.lucko.luckperms.nukkit.calculators;
import com.google.common.collect.ImmutableList;
import me.lucko.luckperms.api.Contexts;
+import me.lucko.luckperms.api.LookupSetting;
import me.lucko.luckperms.common.calculators.AbstractCalculatorFactory;
import me.lucko.luckperms.common.calculators.PermissionCalculator;
import me.lucko.luckperms.common.calculators.PermissionCalculatorMetadata;
@@ -67,7 +68,7 @@ public class NukkitCalculatorFactory extends AbstractCalculatorFactory {
}
if (this.plugin.getConfiguration().get(ConfigKeys.APPLY_NUKKIT_DEFAULT_PERMISSIONS) && metadata.getHolderType() == HolderType.USER) {
- processors.add(new DefaultsProcessor(this.plugin, contexts.isOp()));
+ processors.add(new DefaultsProcessor(this.plugin, contexts.hasSetting(LookupSetting.IS_OP)));
}
return registerCalculator(new PermissionCalculator(this.plugin, metadata, processors.build()));
diff --git a/nukkit/src/main/java/me/lucko/luckperms/nukkit/contexts/NukkitContextManager.java b/nukkit/src/main/java/me/lucko/luckperms/nukkit/contexts/NukkitContextManager.java
index 2e07d1163..8eab39aa6 100644
--- a/nukkit/src/main/java/me/lucko/luckperms/nukkit/contexts/NukkitContextManager.java
+++ b/nukkit/src/main/java/me/lucko/luckperms/nukkit/contexts/NukkitContextManager.java
@@ -40,7 +40,7 @@ public class NukkitContextManager extends AbstractContextManager {
@Override
public Contexts formContexts(Player subject, ImmutableContextSet contextSet) {
- return new Contexts(
+ return Contexts.of(
contextSet,
this.plugin.getConfiguration().get(ConfigKeys.INCLUDING_GLOBAL_PERMS),
this.plugin.getConfiguration().get(ConfigKeys.INCLUDING_GLOBAL_WORLD_PERMS),
diff --git a/sponge/src/main/java/me/lucko/luckperms/sponge/contexts/SpongeContextManager.java b/sponge/src/main/java/me/lucko/luckperms/sponge/contexts/SpongeContextManager.java
index 382de4256..5af67d898 100644
--- a/sponge/src/main/java/me/lucko/luckperms/sponge/contexts/SpongeContextManager.java
+++ b/sponge/src/main/java/me/lucko/luckperms/sponge/contexts/SpongeContextManager.java
@@ -40,7 +40,7 @@ public class SpongeContextManager extends AbstractContextManager {
@Override
public Contexts formContexts(Subject subject, ImmutableContextSet contextSet) {
- return new Contexts(
+ return Contexts.of(
contextSet,
this.plugin.getConfiguration().get(ConfigKeys.INCLUDING_GLOBAL_PERMS),
this.plugin.getConfiguration().get(ConfigKeys.INCLUDING_GLOBAL_WORLD_PERMS),