Skip to content

Commit

Permalink
discord roles-based prefix + better rolesync
Browse files Browse the repository at this point in the history
  • Loading branch information
MeiNanziiii committed Jan 19, 2025
1 parent d468b83 commit 7e7d540
Show file tree
Hide file tree
Showing 6 changed files with 48 additions and 20 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -60,13 +60,13 @@ class MessagesExtension : MinekordExtension() {
content = Text.empty().append(reply).append("\n").append(content)
}

val prefix: Text = MinekordConfig.parser.parseText(
LuckPermsUtils.prefixByNickname(sender.effectiveName),
PlaceholderContext.of(server).asParserContext()
)

content = Chat.Minecraft.messageFormat.toText(server) {
"prefix" to MinekordConfig.parser.parseText(
LuckPermsUtils.prefixByNickname(
sender.effectiveName,
server
), PlaceholderContext.of(server).asParserContext()
)
"prefix" to prefix
"sender" to sender.effectiveName.literal()
"message" to content
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,14 @@ class RoleSyncExtension : MinekordExtension() {
override suspend fun setup() {
event<MemberUpdateEvent> {
action {
LuckPermsUtils.syncPlayer(event.member.effectiveName)
val player: ServerPlayerEntity = server.playerManager.getPlayer(event.member.effectiveName) ?: return@action

LuckPermsUtils.syncPlayer(player)
}
}
}

override suspend fun onPlayerJoin(player: ServerPlayerEntity) {
LuckPermsUtils.syncPlayer(player.gameProfile.name)
LuckPermsUtils.syncPlayer(player)
}
}
11 changes: 11 additions & 0 deletions src/main/kotlin/ua/mei/minekord/config/MinekordConfig.kt
Original file line number Diff line number Diff line change
Expand Up @@ -276,8 +276,19 @@ object MinekordConfig {
lateinit var roles: Map<String, ULong>
private set

lateinit var startSpacer: String
private set
lateinit var middleSpacer: String
private set
lateinit var endSpacer: String
private set

fun load() {
roles = config[LuckPermsSpec.roles]

startSpacer = config[LuckPermsSpec.startSpacer]
middleSpacer = config[LuckPermsSpec.middleSpacer]
endSpacer = config[LuckPermsSpec.endSpacer]
}
}

Expand Down
4 changes: 4 additions & 0 deletions src/main/kotlin/ua/mei/minekord/config/spec/LuckPermsSpec.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,8 @@ import com.uchuhimo.konf.ConfigSpec

object LuckPermsSpec : ConfigSpec() {
val roles by required<Map<String, ULong>>()

val startSpacer by required<String>()
val middleSpacer by required<String>()
val endSpacer by required<String>()
}
31 changes: 19 additions & 12 deletions src/main/kotlin/ua/mei/minekord/util/LuckPermsUtils.kt
Original file line number Diff line number Diff line change
@@ -1,39 +1,46 @@
package ua.mei.minekord.util

import com.mojang.authlib.GameProfile
import dev.kord.core.entity.Member
import kotlinx.coroutines.flow.firstOrNull
import net.fabricmc.loader.api.FabricLoader
import net.luckperms.api.LuckPerms
import net.luckperms.api.LuckPermsProvider
import net.luckperms.api.model.group.Group
import net.luckperms.api.model.user.User
import net.luckperms.api.node.NodeType
import net.luckperms.api.node.types.InheritanceNode
import net.luckperms.api.query.QueryOptions
import net.minecraft.server.MinecraftServer
import net.minecraft.server.network.ServerPlayerEntity
import ua.mei.minekord.bot.MinekordBot
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")) {
suspend fun prefixByNickname(nickname: String): String {
if (!FabricLoader.getInstance().isModLoaded("luckperms") || MinekordConfig.LuckPerms.roles.isEmpty()) {
return ""
}

val member: Member = MinekordBot.guild.members.firstOrNull { it.effectiveName == nickname && it.roleIds.map { it.value }.containsAll(MinekordConfig.Auth.requiredRoles) } ?: return ""
val roles: List<ULong> = member.roleIds.map { it.value }

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

val user: User = lp.userManager.loadUser(profile.id).get()
return MinekordConfig.LuckPerms.roles.filter { it.value in roles }.map {
val group: Group = lp.groupManager.getGroup(it.key) ?: return@map ""

return user.cachedData.getMetaData(QueryOptions.defaultContextualOptions()).prefix ?: ""
group.getNodes(NodeType.PREFIX).firstOrNull()?.metaValue ?: ""
}.joinToString(
separator = MinekordConfig.LuckPerms.middleSpacer,
prefix = MinekordConfig.LuckPerms.startSpacer,
postfix = MinekordConfig.LuckPerms.endSpacer
)
}

suspend fun syncPlayer(nickname: String) {
suspend fun syncPlayer(player: ServerPlayerEntity) {
if (!MinekordConfig.LuckPerms.roles.isEmpty() && FabricLoader.getInstance().isModLoaded("luckperms")) {
val member: Member = MinekordBot.guild.members.firstOrNull { it.effectiveName == nickname && it.roleIds.map { it.value }.containsAll(MinekordConfig.Auth.requiredRoles) } ?: return
val member: Member = MinekordBot.guild.members.firstOrNull { it.effectiveName == player.gameProfile.name && it.roleIds.map { it.value }.containsAll(MinekordConfig.Auth.requiredRoles) } ?: return

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

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

Expand Down
4 changes: 4 additions & 0 deletions src/main/resources/minekord.toml
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,10 @@ ipBasedLogin = false

roles = {}

startSpacer = ""
middleSpacer = ""
endSpacer = ""

[Messages]

ipKickMessage = "Joined with new IP! Check your DM."
Expand Down

0 comments on commit 7e7d540

Please sign in to comment.