diff --git a/core/common/build.gradle.kts b/core/common/build.gradle.kts index 1533f974..0c902c6d 100644 --- a/core/common/build.gradle.kts +++ b/core/common/build.gradle.kts @@ -43,6 +43,7 @@ dependencies { compileOnly("com.nexomc:nexo:1.17.0") { exclude(group = "*", module = "*") } + compileOnly("net.luckperms:api:5.4") compileOnly(fileTree("../../lib") { include("*.jar") diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/LibreforgeSpigotPlugin.kt b/core/common/src/main/kotlin/com/willfp/libreforge/LibreforgeSpigotPlugin.kt index 3c053bd9..5bec4b28 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/LibreforgeSpigotPlugin.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/LibreforgeSpigotPlugin.kt @@ -31,6 +31,7 @@ import com.willfp.libreforge.integrations.huskintegration.husktowns.HuskTownsInt import com.willfp.libreforge.integrations.jobs.JobsIntegration import com.willfp.libreforge.integrations.lands.LandsIntegration import com.willfp.libreforge.integrations.levelledmobs.LevelledMobsIntegration +import com.willfp.libreforge.integrations.luckperms.LuckPermsIntegration import com.willfp.libreforge.integrations.mcmmo.McMMOIntegration import com.willfp.libreforge.integrations.modelengine.ModelEngineIntegration import com.willfp.libreforge.integrations.mythicmobs.MythicMobsIntegration @@ -232,7 +233,8 @@ class LibreforgeSpigotPlugin : EcoPlugin() { IntegrationLoader("EdPrison") { EdPrisonCoreIntegration.load(this) }, IntegrationLoader("MythicMobs") { MythicMobsIntegration.load(this) }, IntegrationLoader("Nexo") { NexoIntegration.load(this) }, - IntegrationLoader("Oraxen") { OraxenIntegration.load(this)} + IntegrationLoader("Oraxen") { OraxenIntegration.load(this) }, + IntegrationLoader("LuckPerms") { LuckPermsIntegration.load(this) } ) } diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/integrations/luckperms/LuckPermsIntegration.kt b/core/common/src/main/kotlin/com/willfp/libreforge/integrations/luckperms/LuckPermsIntegration.kt new file mode 100644 index 00000000..4fc3c84d --- /dev/null +++ b/core/common/src/main/kotlin/com/willfp/libreforge/integrations/luckperms/LuckPermsIntegration.kt @@ -0,0 +1,30 @@ +package com.willfp.libreforge.integrations.luckperms + +import com.willfp.eco.core.EcoPlugin +import com.willfp.libreforge.conditions.Conditions +import com.willfp.libreforge.effects.Effects +import com.willfp.libreforge.integrations.LoadableIntegration +import com.willfp.libreforge.integrations.luckperms.impl.ConditionLuckPermHasPermission +import com.willfp.libreforge.integrations.luckperms.impl.EffectLuckPermGivePermission +import net.luckperms.api.LuckPermsProvider +import net.luckperms.api.model.user.User +import org.bukkit.entity.Player + +object LuckPermsIntegration : LoadableIntegration { + override fun load(plugin: EcoPlugin) { + Conditions.register(ConditionLuckPermHasPermission) + Effects.register(EffectLuckPermGivePermission) + } + + override fun getPluginName(): String { + return "LuckPerms" + } + + fun Player.getLuckPermsUser(): User? { + return LuckPermsProvider.get().userManager.getUser(uniqueId) + } + + fun User.saveChanges() { + LuckPermsProvider.get().userManager.saveUser(this) + } +} diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/integrations/luckperms/impl/ConditionLuckPermHasPermission.kt b/core/common/src/main/kotlin/com/willfp/libreforge/integrations/luckperms/impl/ConditionLuckPermHasPermission.kt new file mode 100644 index 00000000..4b5d13cf --- /dev/null +++ b/core/common/src/main/kotlin/com/willfp/libreforge/integrations/luckperms/impl/ConditionLuckPermHasPermission.kt @@ -0,0 +1,30 @@ +package com.willfp.libreforge.integrations.luckperms.impl + +import com.willfp.eco.core.config.interfaces.Config +import com.willfp.libreforge.Dispatcher +import com.willfp.libreforge.NoCompileData +import com.willfp.libreforge.ProvidedHolder +import com.willfp.libreforge.arguments +import com.willfp.libreforge.conditions.Condition +import com.willfp.libreforge.get +import com.willfp.libreforge.integrations.luckperms.LuckPermsIntegration.getLuckPermsUser +import org.bukkit.entity.Player + +object ConditionLuckPermHasPermission : Condition("has_permission") { + override val arguments = arguments { + require("permission", "You must specify the permission!") + } + + override fun isMet( + dispatcher: Dispatcher<*>, + config: Config, + holder: ProvidedHolder, + compileData: NoCompileData + ): Boolean { + val player = dispatcher.get() ?: return false + + val user = player.getLuckPermsUser() ?: return false + + return user.cachedData.permissionData.checkPermission(config.getString("permission")).asBoolean() + } +} \ No newline at end of file diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/integrations/luckperms/impl/EffectLuckPermGivePermission.kt b/core/common/src/main/kotlin/com/willfp/libreforge/integrations/luckperms/impl/EffectLuckPermGivePermission.kt new file mode 100644 index 00000000..2fcd32c1 --- /dev/null +++ b/core/common/src/main/kotlin/com/willfp/libreforge/integrations/luckperms/impl/EffectLuckPermGivePermission.kt @@ -0,0 +1,59 @@ +package com.willfp.libreforge.integrations.luckperms.impl + +import com.willfp.eco.core.config.interfaces.Config +import com.willfp.eco.core.map.listMap +import com.willfp.libreforge.Dispatcher +import com.willfp.libreforge.NoCompileData +import com.willfp.libreforge.ProvidedHolder +import com.willfp.libreforge.arguments +import com.willfp.libreforge.effects.Effect +import com.willfp.libreforge.effects.Identifiers +import com.willfp.libreforge.get +import com.willfp.libreforge.integrations.luckperms.LuckPermsIntegration.getLuckPermsUser +import com.willfp.libreforge.integrations.luckperms.LuckPermsIntegration.saveChanges +import net.luckperms.api.node.types.PermissionNode +import org.bukkit.entity.Player +import java.util.UUID + +object EffectLuckPermGivePermission : Effect("give_permission") { + override val arguments = arguments { + require("permission", "You must specify the permission!") + } + + private val permissions = listMap() + + override fun onEnable( + dispatcher: Dispatcher<*>, + config: Config, + identifiers: Identifiers, + holder: ProvidedHolder, + compileData: NoCompileData + ) { + val player = dispatcher.get() ?: return + val user = player.getLuckPermsUser() ?: return + val permission = config.getString("permission") + + val node = PermissionNode.builder(permission).value(true).build() + + permissions[player.uniqueId].add(GivenPermission(node, player.uniqueId)) + user.data().add(node) + user.saveChanges() + } + + override fun onDisable(dispatcher: Dispatcher<*>, identifiers: Identifiers, holder: ProvidedHolder) { + val player = dispatcher.get() ?: return + val user = player.getLuckPermsUser() ?: return + + val givenPermission = permissions[player.uniqueId] + .firstOrNull { it.uuid == identifiers.uuid } ?: return + + permissions[player.uniqueId].remove(givenPermission) + user.data().remove(givenPermission.node) + user.saveChanges() + } + + private data class GivenPermission( + val node: PermissionNode, + val uuid: UUID + ) +} \ No newline at end of file diff --git a/core/common/src/main/resources/plugin.yml b/core/common/src/main/resources/plugin.yml index e400ad98..e9301c12 100644 --- a/core/common/src/main/resources/plugin.yml +++ b/core/common/src/main/resources/plugin.yml @@ -36,6 +36,7 @@ softdepend: - CustomFishing - Lands - EdPrison + - LuckPerms commands: lrcdb: