Essentials/Essentials/src/main/java/com/earth2me/essentials/perm/impl/LuckPermsHandler.java

94 lines
3.5 KiB
Java

package com.earth2me.essentials.perm.impl;
import com.earth2me.essentials.Essentials;
import com.earth2me.essentials.User;
import net.luckperms.api.LuckPerms;
import net.luckperms.api.context.ContextCalculator;
import net.luckperms.api.context.ContextConsumer;
import net.luckperms.api.context.ContextSet;
import net.luckperms.api.context.ImmutableContextSet;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.plugin.RegisteredServiceProvider;
import java.util.HashSet;
import java.util.Set;
import java.util.function.Function;
import java.util.function.Supplier;
public class LuckPermsHandler extends ModernVaultHandler {
private LuckPerms luckPerms;
private Essentials ess;
private CombinedCalculator calculator;
@Override
public void registerContext(final String context, final Function<User, Iterable<String>> calculator, final Supplier<Iterable<String>> suggestions) {
if (this.calculator == null) {
this.calculator = new CombinedCalculator();
this.luckPerms.getContextManager().registerCalculator(this.calculator);
}
this.calculator.calculators.add(new Calculator(context, calculator, suggestions));
}
@Override
public void unregisterContexts() {
if (this.calculator != null) {
this.luckPerms.getContextManager().unregisterCalculator(this.calculator);
this.calculator = null;
}
}
@Override
public boolean tryProvider(Essentials ess) {
final RegisteredServiceProvider<LuckPerms> provider = Bukkit.getServicesManager().getRegistration(LuckPerms.class);
if (provider != null) {
this.luckPerms = provider.getProvider();
this.ess = ess;
}
return luckPerms != null && super.tryProvider(ess);
}
private static final class Calculator {
private final String id;
private final Function<User, Iterable<String>> function;
private final Supplier<Iterable<String>> suggestions;
private Calculator(String id, Function<User, Iterable<String>> function, Supplier<Iterable<String>> suggestions) {
this.id = id;
this.function = function;
this.suggestions = suggestions;
}
}
// By combining all calculators into one, we only need to make one call to ess.getUser().
private class CombinedCalculator implements ContextCalculator<Player> {
private final Set<Calculator> calculators = new HashSet<>();
@Override
public void calculate(final Player target, final ContextConsumer consumer) {
// If the player doesn't exist in the UserMap, just skip
// Ess will cause performance problems for permissions checks if it attempts to
// perform i/o to load the user data otherwise.
if (!ess.getUsers().getAllUserUUIDs().contains(target.getUniqueId())) {
return;
}
final User user = ess.getUsers().loadUncachedUser(target.getUniqueId());
for (Calculator calculator : this.calculators) {
calculator.function.apply(user).forEach(value -> consumer.accept(calculator.id, value));
}
}
@Override
public ContextSet estimatePotentialContexts() {
final ImmutableContextSet.Builder builder = ImmutableContextSet.builder();
for (Calculator calculator : this.calculators) {
calculator.suggestions.get().forEach(value -> builder.add(calculator.id, value));
}
return builder.build();
}
}
}