From ebb714df6500108f1207cec180a3ff2cdb2d327b Mon Sep 17 00:00:00 2001 From: MeiNanziiii Date: Tue, 19 Nov 2024 14:26:29 +0200 Subject: [PATCH] luckperms role sync --- src/main/kotlin/ua/mei/minekord/Minekord.kt | 5 ++- .../bot/extension/RoleSyncExtension.kt | 43 +++++++++++++++++++ .../ua/mei/minekord/config/MinekordConfig.kt | 12 ++++++ .../mei/minekord/config/spec/LuckPermsSpec.kt | 7 +++ src/main/resources/minekord.toml | 4 ++ 5 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 src/main/kotlin/ua/mei/minekord/bot/extension/RoleSyncExtension.kt create mode 100644 src/main/kotlin/ua/mei/minekord/config/spec/LuckPermsSpec.kt diff --git a/src/main/kotlin/ua/mei/minekord/Minekord.kt b/src/main/kotlin/ua/mei/minekord/Minekord.kt index 44a02fd..856da5b 100644 --- a/src/main/kotlin/ua/mei/minekord/Minekord.kt +++ b/src/main/kotlin/ua/mei/minekord/Minekord.kt @@ -11,6 +11,7 @@ import ua.mei.minekord.bot.MinekordBot import ua.mei.minekord.bot.extension.IPCheckExtension import ua.mei.minekord.bot.extension.MessagesExtension import ua.mei.minekord.bot.extension.PlayerListExtension +import ua.mei.minekord.bot.extension.RoleSyncExtension import ua.mei.minekord.cache.IPCache import ua.mei.minekord.config.MinekordConfig import ua.mei.minekord.config.MinekordConfig.CONFIG_PATH @@ -43,8 +44,10 @@ object Minekord : ModInitializer { MinekordConfig.load() - MinekordBot.registerExtension(::MessagesExtension) MinekordBot.registerExtension(::IPCheckExtension) + MinekordBot.registerExtension(::MessagesExtension) + MinekordBot.registerExtension(::RoleSyncExtension) + if (Commands.PlayerList.enabled) { MinekordBot.registerExtension(::PlayerListExtension) } diff --git a/src/main/kotlin/ua/mei/minekord/bot/extension/RoleSyncExtension.kt b/src/main/kotlin/ua/mei/minekord/bot/extension/RoleSyncExtension.kt new file mode 100644 index 0000000..324cb98 --- /dev/null +++ b/src/main/kotlin/ua/mei/minekord/bot/extension/RoleSyncExtension.kt @@ -0,0 +1,43 @@ +package ua.mei.minekord.bot.extension + +import dev.kord.core.entity.Member +import net.fabricmc.loader.api.FabricLoader +import net.luckperms.api.LuckPerms +import net.luckperms.api.LuckPermsProvider +import net.luckperms.api.node.types.InheritanceNode +import net.minecraft.server.network.ServerPlayerEntity +import ua.mei.minekord.bot.MinekordExtension +import ua.mei.minekord.config.MinekordConfig +import ua.mei.minekord.utils.AuthUtils + +class RoleSyncExtension : MinekordExtension() { + override val name: String = "minekord.rolesync" + + override suspend fun setup() { + + } + + override suspend fun onPlayerJoin(player: ServerPlayerEntity) { + if (FabricLoader.getInstance().isModLoaded("luckperms") && !MinekordConfig.LuckPerms.roles.isEmpty()) { + val lp: LuckPerms = LuckPermsProvider.get() + + lp.userManager.loadUser(player.gameProfile.id).thenAcceptAsync { user -> + val member: Member = AuthUtils.findMember(player.gameProfile.name) ?: return@thenAcceptAsync + val roles: List = member.roleIds.map { it.value } + + user.data().toCollection() + .filterIsInstance() + .filter { groupNode -> groupNode.groupName != "default" && MinekordConfig.LuckPerms.roles[groupNode.groupName] !in roles } + .forEach { user.data().remove(it) } + + MinekordConfig.LuckPerms.roles.forEach { entry -> + if (entry.value in roles) { + user.data().add(InheritanceNode.builder(entry.key).build()) + } + } + + lp.userManager.saveUser(user) + } + } + } +} diff --git a/src/main/kotlin/ua/mei/minekord/config/MinekordConfig.kt b/src/main/kotlin/ua/mei/minekord/config/MinekordConfig.kt index c0a7f23..f2361ef 100644 --- a/src/main/kotlin/ua/mei/minekord/config/MinekordConfig.kt +++ b/src/main/kotlin/ua/mei/minekord/config/MinekordConfig.kt @@ -18,6 +18,7 @@ import ua.mei.minekord.config.spec.AuthSpec import ua.mei.minekord.config.spec.ChatSpec import ua.mei.minekord.config.spec.ColorsSpec import ua.mei.minekord.config.spec.CommandsSpec +import ua.mei.minekord.config.spec.LuckPermsSpec import ua.mei.minekord.config.spec.MainSpec import ua.mei.minekord.config.spec.MessagesSpec import ua.mei.minekord.config.spec.PresenceSpec @@ -43,6 +44,7 @@ object MinekordConfig { addSpec(CommandsSpec) addSpec(ColorsSpec) addSpec(AuthSpec) + addSpec(LuckPermsSpec) addSpec(MessagesSpec) }.from.toml.file(FabricLoader.getInstance().configDir.resolve(CONFIG_PATH).toFile()) @@ -54,6 +56,7 @@ object MinekordConfig { Commands.load() Colors.load() Auth.load() + LuckPerms.load() Messages.load() } @@ -247,6 +250,15 @@ object MinekordConfig { } } + object LuckPerms { + lateinit var roles: Map + private set + + fun load() { + roles = config[LuckPermsSpec.roles] + } + } + object Messages { lateinit var ipKickMessage: String private set diff --git a/src/main/kotlin/ua/mei/minekord/config/spec/LuckPermsSpec.kt b/src/main/kotlin/ua/mei/minekord/config/spec/LuckPermsSpec.kt new file mode 100644 index 0000000..0321c13 --- /dev/null +++ b/src/main/kotlin/ua/mei/minekord/config/spec/LuckPermsSpec.kt @@ -0,0 +1,7 @@ +package ua.mei.minekord.config.spec + +import com.uchuhimo.konf.ConfigSpec + +object LuckPermsSpec : ConfigSpec() { + val roles by required>() +} diff --git a/src/main/resources/minekord.toml b/src/main/resources/minekord.toml index 8b503c0..2973951 100644 --- a/src/main/resources/minekord.toml +++ b/src/main/resources/minekord.toml @@ -68,6 +68,10 @@ snowflakeBasedUuid = false requiredRoles = [] ipBasedLogin = false +[LuckPerms] + +roles = {} + [Messages] ipKickMessage = "Joined with new IP! Check your DM."