Skip to content

Commit dac546d

Browse files
feat: add LuckPerms integration for player permissions handling
1 parent 84a22af commit dac546d

5 files changed

Lines changed: 69 additions & 1 deletion

File tree

gradle/libs.versions.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ packetevents-plugin = "2.11.2"
1616
commandapi = "11.2.0"
1717

1818
# LuckPerms
19-
luckperms = "v5.5.0-bukkit"
19+
luckperms = "5.4"
2020

2121
# Scoreboard Library
2222
scoreboard-library = "2.7.3"
@@ -151,6 +151,7 @@ flogger-slf4j-backend = { module = "com.google.flogger:flogger-slf4j-backend", v
151151
aide-reflection = { module = "tech.hiddenproject:aide-reflection", version.ref = "aide-reflection" }
152152
glm = { module = "io.github.kotlin-graphics:glm", version.ref = "glm" }
153153
datafixerupper = { module = "com.mojang:datafixerupper", version.ref = "datafixerupper" }
154+
luckperms = { module = "net.luckperms:api", version.ref = "luckperms" }
154155

155156
auto-service-annotations = { module = "com.google.auto.service:auto-service-annotations", version.ref = "auto-service" }
156157
auto-service = { module = "dev.zacsweers.autoservice:auto-service-ksp", version.ref = "auto-service-ksp" }

surf-api-core/surf-api-core/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ plugins {
66
dependencies {
77
api(projects.surfApiShared.surfApiSharedPublic)
88
api(libs.adventure.nbt)
9+
compileOnlyApi(libs.luckperms)
910
compileOnlyApi(libs.packetevents.api)
1011
compileOnlyApi(libs.dazzleconf)
1112
compileOnlyApi(libs.spongepowered.math)
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package dev.slne.surf.api.core.luckperms
2+
3+
import dev.slne.surf.api.core.messages.adventure.uuidOrNull
4+
import kotlinx.coroutines.future.await
5+
import net.kyori.adventure.audience.Audience
6+
import net.luckperms.api.LuckPermsProvider
7+
import net.luckperms.api.model.user.User
8+
import net.luckperms.api.node.NodeType
9+
import java.util.*
10+
11+
object LuckPermsAccess {
12+
val luckperms by lazy {
13+
LuckPermsProvider.get()
14+
}
15+
16+
fun getUser(uuid: UUID) = luckperms.userManager.getUser(uuid)
17+
suspend fun loadUser(uuid: UUID): User = luckperms.userManager.loadUser(uuid).await()
18+
}
19+
20+
val User.prefix: String
21+
get() = this.cachedData.metaData.prefix ?: ""
22+
val User.suffix: String
23+
get() = this.cachedData.metaData.suffix ?: ""
24+
25+
val User.weight
26+
get() = LuckPermsAccess.luckperms.groupManager.getGroup(this.primaryGroup)?.weight ?: 0
27+
28+
inline fun <reified T : Any> User.getMeta(key: String): T? {
29+
val value = this.resolveInheritedNodes(NodeType.META, this.queryOptions)
30+
.find { it.metaKey == key }
31+
?.metaValue
32+
33+
return value as? T
34+
}
35+
36+
inline fun <reified T : Any> User.getMeta(key: String, default: T): T {
37+
val value = this.resolveInheritedNodes(NodeType.META, this.queryOptions)
38+
.find { it.metaKey == key }
39+
?.metaValue
40+
41+
return value as? T ?: default
42+
}
43+
44+
45+
fun Audience.getLuckPermsUser() = this.uuidOrNull()?.let { LuckPermsAccess.getUser(it) }
46+
fun Audience.getLuckPermsUserOrNull() = this.uuidOrNull()?.let { LuckPermsAccess.getUser(it) }
47+
?: error("Audience does not have a valid UUID or LuckPerms user could not be found.")

surf-api-paper/surf-api-paper/src/main/kotlin/dev/slne/surf/api/paper/util/bukkit-util.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package dev.slne.surf.api.paper.util
66
import com.github.shynixn.mccoroutine.folia.SuspendingPlugin
77
import com.github.shynixn.mccoroutine.folia.entityDispatcher
88
import com.github.shynixn.mccoroutine.folia.regionDispatcher
9+
import dev.slne.surf.api.core.luckperms.LuckPermsAccess
910
import dev.slne.surf.api.core.util.getCallerClass
1011
import dev.slne.surf.api.core.util.mutableObjectListOf
1112
import dev.slne.surf.api.paper.SurfApiPaper
@@ -263,6 +264,17 @@ suspend fun World.getBlockAtAsync(pos: BlockPosition): Block {
263264
}
264265
}
265266

267+
268+
fun Player.getLuckPermsUser() = LuckPermsAccess.getUser(this.uniqueId)
269+
?: error("LuckPerms user not found for online player ${this.name}")
270+
271+
fun Player.getLuckPermsUserOrNull() = LuckPermsAccess.getUser(this.uniqueId)
272+
273+
suspend fun OfflinePlayer.getLuckPermsUser() = withContext(Dispatchers.IO) {
274+
LuckPermsAccess.getUser(this@getLuckPermsUser.uniqueId)
275+
?: LuckPermsAccess.loadUser(this@getLuckPermsUser.uniqueId)
276+
}
277+
266278
/**
267279
* Constructs a human-readable string representing the location, including coordinates and optionally
268280
* rotation data.
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,9 @@
11
package dev.slne.surf.api.velocity.util
22

3+
import com.velocitypowered.api.proxy.Player
4+
import dev.slne.surf.api.core.luckperms.LuckPermsAccess
5+
6+
fun Player.getLuckPermsUser() = LuckPermsAccess.getUser(this.uniqueId)
7+
?: error("LuckPerms user not found for online player ${this.username}")
8+
9+
fun Player.getLuckPermsUserOrNull() = LuckPermsAccess.getUser(this.uniqueId)

0 commit comments

Comments
 (0)