Skip to content

Commit

Permalink
luckperms prefix + better role sync
Browse files Browse the repository at this point in the history
  • Loading branch information
MeiNanziiii committed Jan 10, 2025
1 parent cf3bc62 commit 8a65dfd
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 40 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import dev.kordex.core.checks.isNotBot
import dev.kordex.core.extensions.event
import dev.vankka.mcdiscordreserializer.discord.DiscordSerializer
import dev.vankka.mcdiscordreserializer.minecraft.MinecraftSerializer
import eu.pb4.placeholders.api.PlaceholderContext
import net.minecraft.advancement.Advancement
import net.minecraft.advancement.AdvancementDisplay
import net.minecraft.advancement.AdvancementFrame
Expand All @@ -17,6 +18,7 @@ import net.minecraft.server.network.ServerPlayerEntity
import net.minecraft.text.Text
import ua.mei.minekord.bot.MinekordBot
import ua.mei.minekord.bot.MinekordExtension
import ua.mei.minekord.config.MinekordConfig
import ua.mei.minekord.config.MinekordConfig.Chat
import ua.mei.minekord.config.MinekordConfig.Colors
import ua.mei.minekord.config.MinekordConfig.Main
Expand Down Expand Up @@ -54,6 +56,7 @@ class MessagesExtension : MinekordExtension() {
}

content = Chat.Minecraft.messageFormat.toText(server) {
"prefix" to MinekordConfig.parser.parseText(LuckPermsUtils.prefixByNickname(sender.effectiveName, server), PlaceholderContext.of(server).asParserContext())
"sender" to sender.effectiveName.literal()
"message" to content
}
Expand Down
43 changes: 3 additions & 40 deletions src/main/kotlin/ua/mei/minekord/bot/extension/RoleSyncExtension.kt
Original file line number Diff line number Diff line change
@@ -1,60 +1,23 @@
package ua.mei.minekord.bot.extension

import com.mojang.authlib.GameProfile
import dev.kord.core.entity.Member
import dev.kord.core.event.guild.MemberUpdateEvent
import dev.kordex.core.extensions.event
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.toList
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.Minekord
import ua.mei.minekord.bot.MinekordBot
import ua.mei.minekord.bot.MinekordExtension
import ua.mei.minekord.config.MinekordConfig
import ua.mei.minekord.utils.AuthUtils
import kotlin.jvm.optionals.getOrNull
import ua.mei.minekord.utils.LuckPermsUtils

class RoleSyncExtension : MinekordExtension() {
override val name: String = "minekord.rolesync"

override suspend fun setup() {
event<MemberUpdateEvent> {
action {
syncPlayer(event.member.effectiveName)
LuckPermsUtils.syncPlayer(event.member.effectiveName)
}
}
}

override suspend fun onPlayerJoin(player: ServerPlayerEntity) {
syncPlayer(player.gameProfile.name)
}

fun syncPlayer(nickname: String) {
if (!MinekordConfig.LuckPerms.roles.isEmpty() && FabricLoader.getInstance().isModLoaded("luckperms")) {
val lp: LuckPerms = LuckPermsProvider.get()
val member: Member = AuthUtils.findMember(nickname) ?: return
val profile: GameProfile = server.userCache?.findByName(nickname)?.getOrNull() ?: return

lp.userManager.loadUser(profile.id).thenAcceptAsync { user ->
val roles: List<ULong> = member.roleIds.map { it.value }

user.data().toCollection()
.filterIsInstance<InheritanceNode>()
.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)
}
}
LuckPermsUtils.syncPlayer(player.gameProfile.name)
}
}
52 changes: 52 additions & 0 deletions src/main/kotlin/ua/mei/minekord/utils/LuckPermsUtils.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package ua.mei.minekord.utils

import com.mojang.authlib.GameProfile
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.model.user.User
import net.luckperms.api.node.types.InheritanceNode
import net.luckperms.api.query.QueryOptions
import net.minecraft.server.MinecraftServer
import ua.mei.minekord.config.MinekordConfig
import kotlin.jvm.optionals.getOrNull

object LuckPermsUtils {
fun prefixByNickname(nickname: String, server: MinecraftServer): String {
if (!FabricLoader.getInstance().isModLoaded("luckperms")) {
return ""
}

val lp: LuckPerms = LuckPermsProvider.get()
val profile: GameProfile = server.userCache?.findByName(nickname)?.getOrNull() ?: return ""

val user: User = lp.userManager.loadUser(profile.id).get()

return user.cachedData.getMetaData(QueryOptions.defaultContextualOptions()).prefix ?: ""
}

fun syncPlayer(nickname: String) {
if (!MinekordConfig.LuckPerms.roles.isEmpty() && FabricLoader.getInstance().isModLoaded("luckperms")) {
val member: Member = AuthUtils.findMember(nickname) ?: return

val lp: LuckPerms = LuckPermsProvider.get()
val user: User = lp.userManager.getUser(nickname) ?: return

val roles: List<ULong> = member.roleIds.map { it.value }

user.data().toCollection()
.filterIsInstance<InheritanceNode>()
.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)
}
}
}

0 comments on commit 8a65dfd

Please sign in to comment.