diff --git a/Essentials/pom.xml b/Essentials/pom.xml index 98be2eb86..e18d0b618 100644 --- a/Essentials/pom.xml +++ b/Essentials/pom.xml @@ -54,6 +54,12 @@ 1.7 provided + + net.luckperms + api + 5.0 + provided + io.papermc paperlib diff --git a/Essentials/src/com/earth2me/essentials/Essentials.java b/Essentials/src/com/earth2me/essentials/Essentials.java index 7a9a957c6..95b13c971 100644 --- a/Essentials/src/com/earth2me/essentials/Essentials.java +++ b/Essentials/src/com/earth2me/essentials/Essentials.java @@ -391,6 +391,9 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials { if (backup != null) { backup.stopTask(); } + + this.getPermissionsHandler().unregisterContexts(); + Economy.setEss(null); Trade.closeLog(); getUserMap().getUUIDMap().shutdown(); diff --git a/Essentials/src/com/earth2me/essentials/EssentialsPluginListener.java b/Essentials/src/com/earth2me/essentials/EssentialsPluginListener.java index d7543cdc8..ddda2343f 100644 --- a/Essentials/src/com/earth2me/essentials/EssentialsPluginListener.java +++ b/Essentials/src/com/earth2me/essentials/EssentialsPluginListener.java @@ -36,6 +36,7 @@ public class EssentialsPluginListener implements Listener, IConf { if (event.getPlugin().getName().equals("EssentialsChat")) { ess.getSettings().setEssentialsChatActive(false); } + ess.getPermissionsHandler().checkPermissions(); ess.getAlternativeCommandsHandler().removePlugin(event.getPlugin()); // Check to see if the plugin thats being disabled is the one we are using if (ess.getPaymentMethod() != null && Methods.hasMethod() && Methods.checkDisabled(event.getPlugin())) { diff --git a/Essentials/src/com/earth2me/essentials/perm/IPermissionsHandler.java b/Essentials/src/com/earth2me/essentials/perm/IPermissionsHandler.java index e0d50a10d..f5cccf740 100644 --- a/Essentials/src/com/earth2me/essentials/perm/IPermissionsHandler.java +++ b/Essentials/src/com/earth2me/essentials/perm/IPermissionsHandler.java @@ -3,6 +3,8 @@ package com.earth2me.essentials.perm; import org.bukkit.entity.Player; import java.util.List; +import java.util.function.Function; +import java.util.function.Supplier; public interface IPermissionsHandler { @@ -23,5 +25,9 @@ public interface IPermissionsHandler { String getSuffix(Player base); + void registerContext(String context, Function> calculator, Supplier> suggestions); + + void unregisterContexts(); + boolean tryProvider(); } diff --git a/Essentials/src/com/earth2me/essentials/perm/PermissionsHandler.java b/Essentials/src/com/earth2me/essentials/perm/PermissionsHandler.java index 847164f25..7a6d5665a 100644 --- a/Essentials/src/com/earth2me/essentials/perm/PermissionsHandler.java +++ b/Essentials/src/com/earth2me/essentials/perm/PermissionsHandler.java @@ -2,11 +2,14 @@ package com.earth2me.essentials.perm; import com.earth2me.essentials.Essentials; import com.earth2me.essentials.perm.impl.*; +import com.google.common.collect.ImmutableSet; import org.bukkit.entity.Player; import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.function.Function; +import java.util.function.Supplier; import java.util.logging.Level; public class PermissionsHandler implements IPermissionsHandler { @@ -89,6 +92,16 @@ public class PermissionsHandler implements IPermissionsHandler { return suffix; } + @Override + public void registerContext(String context, Function> calculator, Supplier> suggestions) { + handler.registerContext(context, calculator, suggestions); + } + + @Override + public void unregisterContexts() { + handler.unregisterContexts(); + } + @Override public boolean tryProvider() { return true; @@ -97,6 +110,7 @@ public class PermissionsHandler implements IPermissionsHandler { public void checkPermissions() { // load and assign a handler List> providerClazz = Arrays.asList( + LuckPermsHandler.class, ModernVaultHandler.class, GenericVaultHandler.class, SuperpermsHandler.class @@ -105,7 +119,14 @@ public class PermissionsHandler implements IPermissionsHandler { try { IPermissionsHandler provider = providerClass.newInstance(); if (provider.tryProvider()) { + if (provider.getClass().isInstance(this.handler)) { + return; + } + if (this.handler != null) { + unregisterContexts(); + } this.handler = provider; + initContexts(); break; } } catch (Throwable ignored) { @@ -160,4 +181,10 @@ public class PermissionsHandler implements IPermissionsHandler { } } + private void initContexts() { + registerContext("essentials:afk", player -> Collections.singleton(String.valueOf(ess.getUser(player).isAfk())), () -> ImmutableSet.of("true", "false")); + registerContext("essentials:muted", player -> Collections.singleton(String.valueOf(ess.getUser(player).isMuted())), () -> ImmutableSet.of("true", "false")); + registerContext("essentials:vanished", player -> Collections.singleton(String.valueOf(ess.getUser(player).isHidden())), () -> ImmutableSet.of("true", "false")); + } + } diff --git a/Essentials/src/com/earth2me/essentials/perm/impl/LuckPermsHandler.java b/Essentials/src/com/earth2me/essentials/perm/impl/LuckPermsHandler.java new file mode 100644 index 000000000..98dbe6fbd --- /dev/null +++ b/Essentials/src/com/earth2me/essentials/perm/impl/LuckPermsHandler.java @@ -0,0 +1,55 @@ +package com.earth2me.essentials.perm.impl; + +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 Set> contextCalculators; + + @Override + public void registerContext(String context, Function> calculator, Supplier> suggestions) { + ContextCalculator contextCalculator = new ContextCalculator() { + @Override + public void calculate(Player target, ContextConsumer consumer) { + calculator.apply(target).forEach(value -> consumer.accept(context, value)); + } + + @Override + public ContextSet estimatePotentialContexts() { + ImmutableContextSet.Builder builder = ImmutableContextSet.builder(); + suggestions.get().forEach(value -> builder.add(context, value)); + return builder.build(); + } + }; + luckPerms.getContextManager().registerCalculator(contextCalculator); + contextCalculators.add(contextCalculator); + } + + @Override + public void unregisterContexts() { + contextCalculators.forEach(contextCalculator -> luckPerms.getContextManager().unregisterCalculator(contextCalculator)); + contextCalculators.clear(); + } + + @Override + public boolean tryProvider() { + RegisteredServiceProvider provider = Bukkit.getServicesManager().getRegistration(LuckPerms.class); + if (provider != null) { + luckPerms = provider.getProvider(); + contextCalculators = new HashSet<>(); + } + return luckPerms != null && super.tryProvider(); + } +} diff --git a/Essentials/src/com/earth2me/essentials/perm/impl/SuperpermsHandler.java b/Essentials/src/com/earth2me/essentials/perm/impl/SuperpermsHandler.java index fa7a67e17..e8aa7da86 100644 --- a/Essentials/src/com/earth2me/essentials/perm/impl/SuperpermsHandler.java +++ b/Essentials/src/com/earth2me/essentials/perm/impl/SuperpermsHandler.java @@ -7,6 +7,8 @@ import org.bukkit.plugin.Plugin; import java.util.Arrays; import java.util.List; +import java.util.function.Function; +import java.util.function.Supplier; public class SuperpermsHandler implements IPermissionsHandler { @@ -72,6 +74,14 @@ public class SuperpermsHandler implements IPermissionsHandler { return null; } + @Override + public void registerContext(String context, Function> calculator, Supplier> suggestions) { + } + + @Override + public void unregisterContexts() { + } + @Override public boolean tryProvider() { return getEnabledPermsPlugin() != null; diff --git a/Essentials/src/plugin.yml b/Essentials/src/plugin.yml index 622f69deb..e0244a123 100644 --- a/Essentials/src/plugin.yml +++ b/Essentials/src/plugin.yml @@ -5,7 +5,7 @@ main: com.earth2me.essentials.Essentials version: ${full.version} website: http://tiny.cc/EssentialsCommands description: Provides an essential, core set of commands for Bukkit. -softdepend: [Vault] +softdepend: [Vault, LuckPerms] authors: [Zenexer, ementalo, Aelux, Brettflan, KimKandor, snowleo, ceulemans, Xeology, KHobbits, md_5, Iaccidentally, drtshock, vemacs, SupaHam, md678685] api-version: "1.13" commands: