mirror of
https://github.com/LuckPerms/LuckPerms.git
synced 2024-12-29 12:37:40 +01:00
Add config option to disable context calculators
This commit is contained in:
parent
9204848ffb
commit
594f50bee7
@ -551,6 +551,13 @@ apply-bukkit-attachment-permissions: true
|
|||||||
# | Extra settings | #
|
# | Extra settings | #
|
||||||
# +----------------------------------------------------------------------------------------------+ #
|
# +----------------------------------------------------------------------------------------------+ #
|
||||||
|
|
||||||
|
# A list of context calculators which will be skipped when calculating contexts.
|
||||||
|
#
|
||||||
|
# - You can disable context calculators by either:
|
||||||
|
# => specifying the Java class name used by the calculator (e.g. com.example.ExampleCalculator)
|
||||||
|
# => specifying a sub-section of the Java package used by the calculator (e.g. com.example)
|
||||||
|
disabled-context-calculators: []
|
||||||
|
|
||||||
# Allows you to set "aliases" for the worlds sent forward for context calculation.
|
# Allows you to set "aliases" for the worlds sent forward for context calculation.
|
||||||
#
|
#
|
||||||
# - These aliases are provided in addition to the real world name. Applied recursively.
|
# - These aliases are provided in addition to the real world name. Applied recursively.
|
||||||
|
@ -531,6 +531,13 @@ apply-bungee-config-permissions: false
|
|||||||
# | Extra settings | #
|
# | Extra settings | #
|
||||||
# +----------------------------------------------------------------------------------------------+ #
|
# +----------------------------------------------------------------------------------------------+ #
|
||||||
|
|
||||||
|
# A list of context calculators which will be skipped when calculating contexts.
|
||||||
|
#
|
||||||
|
# - You can disable context calculators by either:
|
||||||
|
# => specifying the Java class name used by the calculator (e.g. com.example.ExampleCalculator)
|
||||||
|
# => specifying a sub-section of the Java package used by the calculator (e.g. com.example)
|
||||||
|
disabled-context-calculators: []
|
||||||
|
|
||||||
# Allows you to set "aliases" for the worlds sent forward for context calculation.
|
# Allows you to set "aliases" for the worlds sent forward for context calculation.
|
||||||
#
|
#
|
||||||
# - These aliases are provided in addition to the real world name. Applied recursively.
|
# - These aliases are provided in addition to the real world name. Applied recursively.
|
||||||
|
@ -25,6 +25,8 @@
|
|||||||
|
|
||||||
package me.lucko.luckperms.common.command.tabcomplete;
|
package me.lucko.luckperms.common.command.tabcomplete;
|
||||||
|
|
||||||
|
import me.lucko.luckperms.common.util.Predicates;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
@ -46,7 +48,7 @@ public interface CompletionSupplier {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static CompletionSupplier startsWith(Supplier<Stream<String>> stringsSupplier) {
|
static CompletionSupplier startsWith(Supplier<Stream<String>> stringsSupplier) {
|
||||||
return partial -> stringsSupplier.get().filter(TabCompleter.startsWithIgnoreCase(partial)).collect(Collectors.toList());
|
return partial -> stringsSupplier.get().filter(Predicates.startsWithIgnoreCase(partial)).collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
static CompletionSupplier contains(String... strings) {
|
static CompletionSupplier contains(String... strings) {
|
||||||
@ -58,7 +60,7 @@ public interface CompletionSupplier {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static CompletionSupplier contains(Supplier<Stream<String>> stringsSupplier) {
|
static CompletionSupplier contains(Supplier<Stream<String>> stringsSupplier) {
|
||||||
return partial -> stringsSupplier.get().filter(TabCompleter.containsIgnoreCase(partial)).collect(Collectors.toList());
|
return partial -> stringsSupplier.get().filter(Predicates.containsIgnoreCase(partial)).collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
List<String> supplyCompletions(String partial);
|
List<String> supplyCompletions(String partial);
|
||||||
|
@ -29,9 +29,7 @@ import com.google.common.base.Preconditions;
|
|||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.function.Predicate;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Utility for computing tab completion results
|
* Utility for computing tab completion results
|
||||||
@ -99,22 +97,4 @@ public class TabCompleter {
|
|||||||
return this.suppliers.getOrDefault(position, CompletionSupplier.EMPTY).supplyCompletions(partial);
|
return this.suppliers.getOrDefault(position, CompletionSupplier.EMPTY).supplyCompletions(partial);
|
||||||
}
|
}
|
||||||
|
|
||||||
static Predicate<String> startsWithIgnoreCase(String prefix) {
|
|
||||||
return string -> {
|
|
||||||
if (string.length() < prefix.length()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return string.regionMatches(true, 0, prefix, 0, prefix.length());
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
static Predicate<String> containsIgnoreCase(String substring) {
|
|
||||||
return string -> {
|
|
||||||
if (string.length() < substring.length()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return string.toLowerCase(Locale.ROOT).contains(substring.toLowerCase(Locale.ROOT));
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -30,6 +30,7 @@ import com.google.common.base.Splitter;
|
|||||||
import me.lucko.luckperms.common.plugin.LuckPermsPlugin;
|
import me.lucko.luckperms.common.plugin.LuckPermsPlugin;
|
||||||
import me.lucko.luckperms.common.treeview.PermissionRegistry;
|
import me.lucko.luckperms.common.treeview.PermissionRegistry;
|
||||||
import me.lucko.luckperms.common.treeview.TreeNode;
|
import me.lucko.luckperms.common.treeview.TreeNode;
|
||||||
|
import me.lucko.luckperms.common.util.Predicates;
|
||||||
|
|
||||||
import net.luckperms.api.context.ImmutableContextSet;
|
import net.luckperms.api.context.ImmutableContextSet;
|
||||||
|
|
||||||
@ -90,7 +91,7 @@ public final class TabCompletions {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return root.getChildren().get().keySet().stream()
|
return root.getChildren().get().keySet().stream()
|
||||||
.filter(TabCompleter.startsWithIgnoreCase(incomplete))
|
.filter(Predicates.startsWithIgnoreCase(incomplete))
|
||||||
.map(s -> String.join(".", parts) + "." + s)
|
.map(s -> String.join(".", parts) + "." + s)
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
};
|
};
|
||||||
@ -112,7 +113,7 @@ public final class TabCompletions {
|
|||||||
String value = partial.substring(index + 1).trim();
|
String value = partial.substring(index + 1).trim();
|
||||||
Set<String> potentialValues = potentialContexts.getValues(key);
|
Set<String> potentialValues = potentialContexts.getValues(key);
|
||||||
return potentialValues.stream()
|
return potentialValues.stream()
|
||||||
.filter(TabCompleter.startsWithIgnoreCase(value))
|
.filter(Predicates.startsWithIgnoreCase(value))
|
||||||
.map(s -> key + "=" + s)
|
.map(s -> key + "=" + s)
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
};
|
};
|
||||||
|
@ -44,6 +44,7 @@ import me.lucko.luckperms.common.storage.StorageType;
|
|||||||
import me.lucko.luckperms.common.storage.implementation.split.SplitStorageType;
|
import me.lucko.luckperms.common.storage.implementation.split.SplitStorageType;
|
||||||
import me.lucko.luckperms.common.storage.misc.StorageCredentials;
|
import me.lucko.luckperms.common.storage.misc.StorageCredentials;
|
||||||
import me.lucko.luckperms.common.util.ImmutableCollectors;
|
import me.lucko.luckperms.common.util.ImmutableCollectors;
|
||||||
|
import me.lucko.luckperms.common.util.Predicates;
|
||||||
|
|
||||||
import net.luckperms.api.context.ContextSatisfyMode;
|
import net.luckperms.api.context.ContextSatisfyMode;
|
||||||
import net.luckperms.api.metastacking.DuplicateRemovalFunction;
|
import net.luckperms.api.metastacking.DuplicateRemovalFunction;
|
||||||
@ -64,6 +65,7 @@ import java.util.Map;
|
|||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
import java.util.function.Predicate;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
import java.util.regex.PatternSyntaxException;
|
import java.util.regex.PatternSyntaxException;
|
||||||
|
|
||||||
@ -515,6 +517,16 @@ public final class ConfigKeys {
|
|||||||
*/
|
*/
|
||||||
public static final ConfigKey<Boolean> FABRIC_INTEGRATED_SERVER_OWNER_BYPASSES_CHECKS = booleanKey("integrated-server-owner-bypasses-checks", true);
|
public static final ConfigKey<Boolean> FABRIC_INTEGRATED_SERVER_OWNER_BYPASSES_CHECKS = booleanKey("integrated-server-owner-bypasses-checks", true);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disabled context calculators
|
||||||
|
*/
|
||||||
|
public static final ConfigKey<Set<Predicate<String>>> DISABLED_CONTEXT_CALCULATORS = key(c -> {
|
||||||
|
return c.getStringList("disabled-context-calculators", ImmutableList.of())
|
||||||
|
.stream()
|
||||||
|
.map(Predicates::startsWithIgnoreCase)
|
||||||
|
.collect(ImmutableCollectors.toSet());
|
||||||
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The world rewrites map
|
* The world rewrites map
|
||||||
*/
|
*/
|
||||||
|
@ -42,8 +42,10 @@ import org.checkerframework.checker.nullness.qual.NonNull;
|
|||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Base implementation of {@link ContextManager} which caches content lookups.
|
* Base implementation of {@link ContextManager} which caches content lookups.
|
||||||
@ -116,6 +118,16 @@ public abstract class ContextManager<S, P extends S> {
|
|||||||
protected abstract void invalidateCache(S subject);
|
protected abstract void invalidateCache(S subject);
|
||||||
|
|
||||||
public void registerCalculator(ContextCalculator<? super S> calculator) {
|
public void registerCalculator(ContextCalculator<? super S> calculator) {
|
||||||
|
String calculatorClass = calculator.getClass().getName();
|
||||||
|
|
||||||
|
Set<Predicate<String>> disabledCalculators = this.plugin.getConfiguration().get(ConfigKeys.DISABLED_CONTEXT_CALCULATORS);
|
||||||
|
for (Predicate<String> disabledPattern : disabledCalculators) {
|
||||||
|
if (disabledPattern.test(calculatorClass)) {
|
||||||
|
this.plugin.getLogger().info("Ignoring registration of disabled context calculator: " + calculatorClass);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
this.calculators.add(calculator);
|
this.calculators.add(calculator);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -29,6 +29,7 @@ import com.google.common.collect.Range;
|
|||||||
|
|
||||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||||
|
|
||||||
|
import java.util.Locale;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -86,4 +87,22 @@ public final class Predicates {
|
|||||||
return t::equals;
|
return t::equals;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Predicate<String> startsWithIgnoreCase(String prefix) {
|
||||||
|
return string -> {
|
||||||
|
if (string.length() < prefix.length()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return string.regionMatches(true, 0, prefix, 0, prefix.length());
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Predicate<String> containsIgnoreCase(String substring) {
|
||||||
|
return string -> {
|
||||||
|
if (string.length() < substring.length()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return string.toLowerCase(Locale.ROOT).contains(substring.toLowerCase(Locale.ROOT));
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -114,18 +114,18 @@ public class ContextSetTest {
|
|||||||
@Test
|
@Test
|
||||||
public void testImmutableContainsAll() {
|
public void testImmutableContainsAll() {
|
||||||
ImmutableContextSetImpl set = (ImmutableContextSetImpl) new ImmutableContextSetImpl.BuilderImpl()
|
ImmutableContextSetImpl set = (ImmutableContextSetImpl) new ImmutableContextSetImpl.BuilderImpl()
|
||||||
.add("test", "a")
|
.add("aaa", "a")
|
||||||
.add("test", "b")
|
.add("aaa", "b")
|
||||||
.add("test", "c")
|
.add("aaa", "c")
|
||||||
.add("other", "a")
|
.add("bbb", "a")
|
||||||
.add("other", "b")
|
.add("bbb", "b")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
List<Consumer<ImmutableContextSet.Builder>> trueTests = ImmutableList.of(
|
List<Consumer<ImmutableContextSet.Builder>> trueTests = ImmutableList.of(
|
||||||
builder -> builder.add("test", "a").add("other", "a"),
|
builder -> builder.add("aaa", "a").add("bbb", "a"),
|
||||||
builder -> builder.add("test", "b").add("other", "a"),
|
builder -> builder.add("aaa", "b").add("bbb", "a"),
|
||||||
builder -> builder.add("test", "c").add("other", "a"),
|
builder -> builder.add("aaa", "c").add("bbb", "a"),
|
||||||
builder -> builder.add("test", "c").add("other", "b")
|
builder -> builder.add("aaa", "c").add("bbb", "b")
|
||||||
);
|
);
|
||||||
|
|
||||||
for (Consumer<ImmutableContextSet.Builder> test : trueTests) {
|
for (Consumer<ImmutableContextSet.Builder> test : trueTests) {
|
||||||
@ -138,10 +138,10 @@ public class ContextSetTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
List<Consumer<ImmutableContextSet.Builder>> falseTests = ImmutableList.of(
|
List<Consumer<ImmutableContextSet.Builder>> falseTests = ImmutableList.of(
|
||||||
builder -> builder.add("test", "a").add("other", "z"),
|
builder -> builder.add("aaa", "a").add("bbb", "z"),
|
||||||
builder -> builder.add("test", "b").add("other", "z"),
|
builder -> builder.add("aaa", "b").add("bbb", "z"),
|
||||||
builder -> builder.add("test", "b"),
|
builder -> builder.add("aaa", "b"),
|
||||||
builder -> builder.add("test", "c"),
|
builder -> builder.add("aaa", "c"),
|
||||||
builder -> {}
|
builder -> {}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -537,6 +537,13 @@ integrated-server-owner-bypasses-checks = true
|
|||||||
# | Extra settings | #
|
# | Extra settings | #
|
||||||
# +----------------------------------------------------------------------------------------------+ #
|
# +----------------------------------------------------------------------------------------------+ #
|
||||||
|
|
||||||
|
# A list of context calculators which will be skipped when calculating contexts.
|
||||||
|
#
|
||||||
|
# - You can disable context calculators by either:
|
||||||
|
# => specifying the Java class name used by the calculator (e.g. com.example.ExampleCalculator)
|
||||||
|
# => specifying a sub-section of the Java package used by the calculator (e.g. com.example)
|
||||||
|
disabled-context-calculators = []
|
||||||
|
|
||||||
# Allows you to set "aliases" for the worlds sent forward for context calculation.
|
# Allows you to set "aliases" for the worlds sent forward for context calculation.
|
||||||
#
|
#
|
||||||
# - These aliases are provided in addition to the real world name. Applied recursively.
|
# - These aliases are provided in addition to the real world name. Applied recursively.
|
||||||
|
@ -546,6 +546,13 @@ apply-nukkit-attachment-permissions: true
|
|||||||
# | Extra settings | #
|
# | Extra settings | #
|
||||||
# +----------------------------------------------------------------------------------------------+ #
|
# +----------------------------------------------------------------------------------------------+ #
|
||||||
|
|
||||||
|
# A list of context calculators which will be skipped when calculating contexts.
|
||||||
|
#
|
||||||
|
# - You can disable context calculators by either:
|
||||||
|
# => specifying the Java class name used by the calculator (e.g. com.example.ExampleCalculator)
|
||||||
|
# => specifying a sub-section of the Java package used by the calculator (e.g. com.example)
|
||||||
|
disabled-context-calculators: []
|
||||||
|
|
||||||
# Allows you to set "aliases" for the worlds sent forward for context calculation.
|
# Allows you to set "aliases" for the worlds sent forward for context calculation.
|
||||||
#
|
#
|
||||||
# - These aliases are provided in addition to the real world name. Applied recursively.
|
# - These aliases are provided in addition to the real world name. Applied recursively.
|
||||||
|
@ -547,6 +547,13 @@ apply-sponge-default-subjects=true
|
|||||||
# | Extra settings | #
|
# | Extra settings | #
|
||||||
# +----------------------------------------------------------------------------------------------+ #
|
# +----------------------------------------------------------------------------------------------+ #
|
||||||
|
|
||||||
|
# A list of context calculators which will be skipped when calculating contexts.
|
||||||
|
#
|
||||||
|
# - You can disable context calculators by either:
|
||||||
|
# => specifying the Java class name used by the calculator (e.g. com.example.ExampleCalculator)
|
||||||
|
# => specifying a sub-section of the Java package used by the calculator (e.g. com.example)
|
||||||
|
disabled-context-calculators = []
|
||||||
|
|
||||||
# Allows you to set "aliases" for the worlds sent forward for context calculation.
|
# Allows you to set "aliases" for the worlds sent forward for context calculation.
|
||||||
#
|
#
|
||||||
# - These aliases are provided in addition to the real world name. Applied recursively.
|
# - These aliases are provided in addition to the real world name. Applied recursively.
|
||||||
|
@ -517,6 +517,13 @@ apply-shorthand: true
|
|||||||
# | Extra settings | #
|
# | Extra settings | #
|
||||||
# +----------------------------------------------------------------------------------------------+ #
|
# +----------------------------------------------------------------------------------------------+ #
|
||||||
|
|
||||||
|
# A list of context calculators which will be skipped when calculating contexts.
|
||||||
|
#
|
||||||
|
# - You can disable context calculators by either:
|
||||||
|
# => specifying the Java class name used by the calculator (e.g. com.example.ExampleCalculator)
|
||||||
|
# => specifying a sub-section of the Java package used by the calculator (e.g. com.example)
|
||||||
|
disabled-context-calculators: []
|
||||||
|
|
||||||
# Allows you to set "aliases" for the worlds sent forward for context calculation.
|
# Allows you to set "aliases" for the worlds sent forward for context calculation.
|
||||||
#
|
#
|
||||||
# - These aliases are provided in addition to the real world name. Applied recursively.
|
# - These aliases are provided in addition to the real world name. Applied recursively.
|
||||||
|
Loading…
Reference in New Issue
Block a user