Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support more permission adapters #5

Draft
wants to merge 1 commit into
base: 1.19
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions common_server/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ dependencies {
mappings(loom.officialMojangMappings())

implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.4.0-RC")
compileOnly("net.luckperms:api:5.4")
}

tasks {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package io.github.colintimbarndt.chat_emotes.common
import io.github.colintimbarndt.chat_emotes.common.config.ChatEmotesConfig
import io.github.colintimbarndt.chat_emotes.common.data.EmoteDataLoaderBase
import io.github.colintimbarndt.chat_emotes.common.permissions.PermissionsAdapter
import io.github.colintimbarndt.chat_emotes.common.permissions.SafePermissionsAdapter
import io.github.colintimbarndt.chat_emotes.common.permissions.VanillaPermissionsAdapter
import kotlinx.serialization.SerializationException
import java.io.FileInputStream
Expand All @@ -16,7 +17,9 @@ abstract class ChatEmotesServerModBase {
abstract val emoteDataLoader: EmoteDataLoaderBase
abstract val registries: Registries
abstract val emoteDecorator: EmoteDecoratorBase
var permissionsAdapter: PermissionsAdapter = VanillaPermissionsAdapter
var permissionsAdapter: PermissionsAdapter = SafePermissionsAdapter

protected open fun findPermissionsAdapter(): PermissionsAdapter = VanillaPermissionsAdapter

fun reloadConfig(): Boolean {
val file = configPath.resolve("config.json").toFile()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package io.github.colintimbarndt.chat_emotes.common.permissions

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import net.luckperms.api.LuckPermsProvider
import net.minecraft.commands.CommandSourceStack
import net.minecraft.server.level.ServerPlayer

/**
* See [luckperms.net](https://luckperms.net/)
*/
@Serializable
@SerialName("luckperms")
object LuckpermsPermissionsAdapter : PermissionsAdapter {
private val api = LuckPermsProvider.get()

override fun CommandSourceStack.hasPermission(name: String): Boolean {
val player = player
?: return true // console / command block
return player.hasPermission(name)
}

override fun ServerPlayer.hasPermission(name: String): Boolean {
val user = api.userManager.getUser(uuid)
?: return false // User not found
val perms = user.cachedData.permissionData
return perms.checkPermission(name).asBoolean()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package io.github.colintimbarndt.chat_emotes.common.permissions

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import net.minecraft.commands.CommandSourceStack
import net.minecraft.server.level.ServerPlayer

/**
* Only emotes are permitted, every other permission is denied
*/
@Serializable
@SerialName("safe")
object SafePermissionsAdapter : PermissionsAdapter {
override fun CommandSourceStack.hasPermission(name: String) = isEmotesPermission(name)

override fun ServerPlayer.hasPermission(name: String) = isEmotesPermission(name)

private fun isEmotesPermission(name: String): Boolean =
name.startsWith(EMOTES_PERMISSION)
&& (name.length == EMOTES_PERMISSION.length || name[EMOTES_PERMISSION.length] == '.')
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,12 @@ object VanillaPermissionsAdapter : PermissionsAdapter {
override fun CommandSourceStack.hasPermission(name: String) = when (name) {
RELOAD_COMMAND_PERMISSION -> hasPermission(2)
COMMAND_PERMISSION -> hasPermission(2)
else -> name.startsWith(EMOTES_PERMISSION)
&& (name.length == EMOTES_PERMISSION.length || name[EMOTES_PERMISSION.length] == '.')
else -> SafePermissionsAdapter.run { hasPermission(name) }
}

override fun ServerPlayer.hasPermission(name: String) = when (name) {
RELOAD_COMMAND_PERMISSION -> hasPermissions(2)
COMMAND_PERMISSION -> hasPermissions(2)
else -> name.startsWith(EMOTES_PERMISSION)
&& (name.length == EMOTES_PERMISSION.length || name[EMOTES_PERMISSION.length] == '.')
else -> SafePermissionsAdapter.run { hasPermission(name) }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import io.github.colintimbarndt.chat_emotes.common.LOGGER
import io.github.colintimbarndt.chat_emotes.common.MOD_ID
import io.github.colintimbarndt.chat_emotes.common.Registries
import io.github.colintimbarndt.chat_emotes.common.config.ChatEmotesConfig
import io.github.colintimbarndt.chat_emotes.common.permissions.LuckpermsPermissionsAdapter
import io.github.colintimbarndt.chat_emotes.common.permissions.PermissionsAdapter
import io.github.colintimbarndt.chat_emotes.data.EmoteDataLoader
import net.fabricmc.api.DedicatedServerModInitializer
import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback
Expand All @@ -29,6 +31,7 @@ object ChatEmotesServerMod : ChatEmotesServerModBase(), DedicatedServerModInitia
lateinit var modMetadata: ModMetadata private set

override fun onInitializeServer() {
permissionsAdapter = findPermissionsAdapter()
registries = Registries()

val loader = FabricLoader.getInstance()
Expand Down Expand Up @@ -56,4 +59,17 @@ object ChatEmotesServerMod : ChatEmotesServerModBase(), DedicatedServerModInitia
ChatEmotesCommand.register(dispatcher)
}
}

override fun findPermissionsAdapter(): PermissionsAdapter {
val loader = FabricLoader.getInstance()
if (loader.isModLoaded("luckperms")) {
LOGGER.info("Connecting to LuckPerms")
runCatching {
return LuckpermsPermissionsAdapter
}.onFailure {
LOGGER.error("Unable to connect to LuckPerms", it)
}
}
return super.findPermissionsAdapter()
}
}
4 changes: 3 additions & 1 deletion fabric_mod_server/src/main/resources/fabric.mod.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,5 +37,7 @@
"java": ">=17",
"fabric-language-kotlin": ">=1.8.2+kotlin.1.7.10"
},
"suggests": {}
"suggests": {
"luckperms": ">=5.4"
}
}