summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSho Sakuma <me@m1sk9.dev>2026-01-07 12:57:32 +0900
committerSho Sakuma <me@m1sk9.dev>2026-01-07 12:57:38 +0900
commitf6f2ec77fa773250b2663491628f14e5baa92f5d (patch)
tree29ede64472da8c7431bc4515d9f76b610a1a43c6
parent122af44500427cf61c979896149d1f08233a63d4 (diff)
downloadLunaticChat-f6f2ec77fa773250b2663491628f14e5baa92f5d.tar.gz
LunaticChat-f6f2ec77fa773250b2663491628f14e5baa92f5d.tar.bz2
LunaticChat-f6f2ec77fa773250b2663491628f14e5baa92f5d.zip
feat: Add permission collector
-rw-r--r--engine/src/main/kotlin/dev/m1sk9/lunaticChat/engine/exception/RequirePermissionException.kt12
-rw-r--r--engine/src/main/kotlin/dev/m1sk9/lunaticChat/engine/permission/LunaticChatPermissionNode.kt9
-rw-r--r--platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/common/PermissionCollector.kt60
-rw-r--r--platform-velocity/build.gradle.kts5
4 files changed, 81 insertions, 5 deletions
diff --git a/engine/src/main/kotlin/dev/m1sk9/lunaticChat/engine/exception/RequirePermissionException.kt b/engine/src/main/kotlin/dev/m1sk9/lunaticChat/engine/exception/RequirePermissionException.kt
new file mode 100644
index 0000000..dace909
--- /dev/null
+++ b/engine/src/main/kotlin/dev/m1sk9/lunaticChat/engine/exception/RequirePermissionException.kt
@@ -0,0 +1,12 @@
+package dev.m1sk9.lunaticChat.engine.exception
+
+import dev.m1sk9.lunaticChat.engine.permission.LunaticChatPermissionNode
+
+/**
+ * Exception thrown when required permissions are missing.
+ *
+ * @param permissions The list of missing permissions.
+ */
+class RequirePermissionException(
+ permissions: List<LunaticChatPermissionNode>,
+) : Exception("Missing required permissions: ${permissions.joinToString { it.permissionNode }}")
diff --git a/engine/src/main/kotlin/dev/m1sk9/lunaticChat/engine/permission/LunaticChatPermissionNode.kt b/engine/src/main/kotlin/dev/m1sk9/lunaticChat/engine/permission/LunaticChatPermissionNode.kt
new file mode 100644
index 0000000..c7f4be6
--- /dev/null
+++ b/engine/src/main/kotlin/dev/m1sk9/lunaticChat/engine/permission/LunaticChatPermissionNode.kt
@@ -0,0 +1,9 @@
+package dev.m1sk9.lunaticChat.engine.permission
+
+sealed class LunaticChatPermissionNode(
+ val permissionNode: String,
+) {
+ object Tell : LunaticChatPermissionNode("lunaticchat.command.tell")
+
+ object Reply : LunaticChatPermissionNode("lunaticchat.command.reply")
+}
diff --git a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/common/PermissionCollector.kt b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/common/PermissionCollector.kt
new file mode 100644
index 0000000..4edfe34
--- /dev/null
+++ b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/common/PermissionCollector.kt
@@ -0,0 +1,60 @@
+package dev.m1sk9.lunaticChat.paper.common
+
+import dev.m1sk9.lunaticChat.engine.exception.RequirePermissionException
+import dev.m1sk9.lunaticChat.engine.permission.LunaticChatPermissionNode
+import org.bukkit.entity.Player
+
+@DslMarker
+annotation class PermissionDsl
+
+@PermissionDsl
+class PermissionCollector {
+ internal val permissions = mutableListOf<LunaticChatPermissionNode>()
+
+ operator fun LunaticChatPermissionNode.unaryPlus() {
+ permissions.add(this)
+ }
+}
+
+fun LunaticChatPermissionNode.has(player: Player): Boolean = player.hasPermission(this.permissionNode)
+
+/**
+ * Checks if the player has at least one of the specified permissions.
+ *
+ * @param block A lambda with receiver to collect permissions.
+ * @return `true` if the player has at least one of the specified permissions.
+ */
+fun Player.hasAnyPermission(block: PermissionCollector.() -> Unit): Boolean =
+ PermissionCollector()
+ .apply(block)
+ .permissions
+ .any { it.has(this) }
+
+/**
+ * Checks if the player has all the specified permissions.
+ *
+ * @param block A lambda with receiver to collect permissions.
+ * @return `true` if the player has all the specified permissions.
+ */
+fun Player.hasAllPermission(block: PermissionCollector.() -> Unit): Boolean =
+ PermissionCollector()
+ .apply(block)
+ .permissions
+ .all { it.has(this) }
+
+/**
+ * Requires the player to have at least one of the specified permissions.
+ *
+ * @param block A lambda with receiver to collect permissions.
+ * @return Throws [RequirePermissionException] if the player lacks all specified permissions.
+ * @throws RequirePermissionException if the player lacks all specified permissions.
+ */
+fun Player.requirePermission(block: PermissionCollector.() -> Unit) {
+ val result =
+ PermissionCollector()
+ .apply(block)
+ .permissions
+ if (!result.any { it.has(this) }) {
+ throw RequirePermissionException(result)
+ }
+}
diff --git a/platform-velocity/build.gradle.kts b/platform-velocity/build.gradle.kts
index e259a94..6fa7401 100644
--- a/platform-velocity/build.gradle.kts
+++ b/platform-velocity/build.gradle.kts
@@ -11,12 +11,7 @@ repositories {
}
dependencies {
- // engine モジュールを使用
api(project(":engine"))
-
- // Velocity API (将来追加予定)
- // compileOnly("com.velocitypowered:velocity-api:3.4.0")
- // kapt("com.velocitypowered:velocity-api:3.4.0")
}
tasks {