Skip to content

Commit

Permalink
improved config with reloading
Browse files Browse the repository at this point in the history
  • Loading branch information
MeiNanziiii committed Nov 16, 2024
1 parent 2d61bf5 commit 11441f7
Show file tree
Hide file tree
Showing 10 changed files with 257 additions and 137 deletions.
11 changes: 5 additions & 6 deletions src/main/kotlin/ua/mei/minekord/Minekord.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,7 @@ import org.apache.logging.log4j.LogManager
import org.apache.logging.log4j.Logger
import ua.mei.minekord.bot.MinekordBot
import ua.mei.minekord.bot.extension.MessagesExtension
import ua.mei.minekord.config.CONFIG_PATH
import ua.mei.minekord.config.config
import ua.mei.minekord.config.MinekordConfig
import java.nio.file.Files

object Minekord : ModInitializer {
Expand All @@ -22,14 +21,14 @@ object Minekord : ModInitializer {

val loader: FabricLoader = FabricLoader.getInstance()

if (!Files.exists(loader.configDir.resolve(CONFIG_PATH))) {
if (!Files.exists(loader.configDir.resolve(MinekordConfig.CONFIG_PATH))) {
Files.copy(
loader.getModContainer(MOD_ID).get().findPath(CONFIG_PATH).get(),
loader.configDir.resolve(CONFIG_PATH)
loader.getModContainer(MOD_ID).get().findPath(MinekordConfig.CONFIG_PATH).get(),
loader.configDir.resolve(MinekordConfig.CONFIG_PATH)
)
}

config.validateRequired()
MinekordConfig.load()

MinekordBot.registerExtension(::MessagesExtension)

Expand Down
4 changes: 2 additions & 2 deletions src/main/kotlin/ua/mei/minekord/MinekordCommands.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import net.minecraft.command.CommandRegistryAccess
import net.minecraft.server.command.CommandManager
import net.minecraft.server.command.ServerCommandSource
import net.minecraft.text.Text
import ua.mei.minekord.config.reloadConfig
import ua.mei.minekord.config.MinekordConfig

object MinekordCommands : CommandRegistrationCallback {
override fun register(dispatcher: CommandDispatcher<ServerCommandSource>, access: CommandRegistryAccess, environment: CommandManager.RegistrationEnvironment) {
Expand All @@ -18,7 +18,7 @@ object MinekordCommands : CommandRegistrationCallback {
literal<ServerCommandSource>("reload")
.requires { source -> source.hasPermissionLevel(4) }
.executes { context ->
reloadConfig()
MinekordConfig.load()

context.source.sendFeedback({ Text.literal("Config reloaded!") }, false)

Expand Down
35 changes: 21 additions & 14 deletions src/main/kotlin/ua/mei/minekord/bot/MinekordBot.kt
Original file line number Diff line number Diff line change
@@ -1,17 +1,22 @@
package ua.mei.minekord.bot

import dev.kord.common.entity.AllowedMentionType
import dev.kord.common.entity.Snowflake
import dev.kord.core.entity.Guild
import dev.kord.core.entity.Webhook
import dev.kord.core.entity.channel.TopGuildMessageChannel
import dev.kord.gateway.Intent
import dev.kord.gateway.PrivilegedIntent
import dev.kord.rest.builder.message.AllowedMentionsBuilder
import dev.kordex.core.ExtensibleBot
import dev.kordex.core.extensions.Extension
import dev.kordex.core.utils.ensureWebhook
import dev.kordex.core.utils.loadModule
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.toList
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import net.fabricmc.fabric.api.entity.event.v1.ServerLivingEntityEvents
Expand All @@ -22,13 +27,10 @@ import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents
import net.minecraft.server.MinecraftServer
import net.minecraft.server.network.ServerPlayerEntity
import ua.mei.minekord.Minekord
import ua.mei.minekord.config.config
import ua.mei.minekord.config.spec.BotSpec
import ua.mei.minekord.config.spec.ChatSpec
import ua.mei.minekord.config.spec.PresenceSpec
import ua.mei.minekord.config.MinekordConfig
import ua.mei.minekord.config.spec.PresenceSpec.MinekordActivityType
import ua.mei.minekord.event.AdvancementGrantEvent
import ua.mei.minekord.utils.parseText
import ua.mei.minekord.utils.toText
import kotlin.coroutines.CoroutineContext
import kotlin.reflect.KCallable

Expand All @@ -46,17 +48,19 @@ object MinekordBot : CoroutineScope, ServerLifecycleEvents.ServerStarting {
lateinit var webhook: Webhook
private set

val mentions: AllowedMentionsBuilder = AllowedMentionsBuilder()

override fun onServerStarting(server: MinecraftServer) {
runBlocking {
bot = ExtensibleBot(config[BotSpec.token]) {
bot = ExtensibleBot(MinekordConfig.token) {
applicationCommands {
enabled = true
}
intents {
+Intent.GuildMembers
}
members {
fill(config[BotSpec.guild])
fill(MinekordConfig.guild)
}
hooks {
afterKoinSetup {
Expand All @@ -66,9 +70,9 @@ object MinekordBot : CoroutineScope, ServerLifecycleEvents.ServerStarting {
}
}
}
guild = bot.kordRef.getGuild(Snowflake(config[BotSpec.guild]))
channel = guild.getChannel(Snowflake(config[BotSpec.channel])) as TopGuildMessageChannel
webhook = ensureWebhook(channel, config[ChatSpec.WebhookSpec.webhookName])
guild = bot.kordRef.getGuild(Snowflake(MinekordConfig.guild))
channel = guild.getChannel(Snowflake(MinekordConfig.channel)) as TopGuildMessageChannel
webhook = ensureWebhook(channel, MinekordConfig.webhookName)

extensions.forEach { bot.addExtension(it) }

Expand All @@ -90,7 +94,10 @@ object MinekordBot : CoroutineScope, ServerLifecycleEvents.ServerStarting {
Minekord.logger.info("Registered extension: ${(extension as KCallable<*>).returnType}")
}

fun setup() {
suspend fun setup() {
mentions.add(AllowedMentionType.UserMentions)
mentions.roles.addAll(guild.roles.filter { it.mentionable }.map { it.id }.toList())

val minekordExtensions: List<MinekordExtension> = bot.findExtensions()

AdvancementGrantEvent.EVENT.register { player, advancement ->
Expand Down Expand Up @@ -153,12 +160,12 @@ object MinekordBot : CoroutineScope, ServerLifecycleEvents.ServerStarting {
}

ServerTickEvents.END_SERVER_TICK.register { server ->
if (server.ticks % config[PresenceSpec.updateTicks] == 0 && config[PresenceSpec.activityType] != MinekordActivityType.NONE) {
if (server.ticks % MinekordConfig.updateTicks == 0 && MinekordConfig.activityType != MinekordActivityType.NONE) {
launch {
bot.kordRef.editPresence {
val text: String = parseText(config[PresenceSpec.activityText], server).string
val text: String = MinekordConfig.activityText.toText(server).string

when (config[PresenceSpec.activityType]) {
when (MinekordConfig.activityType) {
MinekordActivityType.NONE -> Unit
MinekordActivityType.PLAYING -> playing(text)
MinekordActivityType.LISTENING -> listening(text)
Expand Down
8 changes: 3 additions & 5 deletions src/main/kotlin/ua/mei/minekord/bot/MinekordExtension.kt
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,7 @@ import net.minecraft.server.MinecraftServer
import net.minecraft.server.network.ServerPlayerEntity
import net.minecraft.text.Text
import org.koin.core.component.inject
import ua.mei.minekord.config.config
import ua.mei.minekord.config.spec.ChatSpec
import ua.mei.minekord.utils.mentions
import ua.mei.minekord.config.MinekordConfig

abstract class MinekordExtension : Extension() {
abstract override val name: String
Expand All @@ -22,8 +20,8 @@ abstract class MinekordExtension : Extension() {

suspend fun webhookMessage(builder: suspend WebhookMessageCreateBuilder.() -> Unit) {
MinekordBot.webhook.execute(MinekordBot.webhook.token!!) {
allowedMentions = mentions
avatarUrl = config[ChatSpec.WebhookSpec.webhookAvatar]
allowedMentions = MinekordBot.mentions
avatarUrl = MinekordConfig.webhookAvatar
builder()
}
}
Expand Down
57 changes: 23 additions & 34 deletions src/main/kotlin/ua/mei/minekord/bot/extension/MessagesExtension.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,42 +10,37 @@ 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
import net.minecraft.entity.damage.DamageSource
import net.minecraft.server.network.ServerPlayerEntity
import net.minecraft.text.Text
import ua.mei.minekord.bot.MinekordExtension
import ua.mei.minekord.config.config
import ua.mei.minekord.config.spec.BotSpec
import ua.mei.minekord.config.spec.ChatSpec
import ua.mei.minekord.config.spec.ColorsSpec
import ua.mei.minekord.config.MinekordConfig
import ua.mei.minekord.utils.SerializerUtils
import ua.mei.minekord.utils.avatar
import ua.mei.minekord.utils.discordOptions
import ua.mei.minekord.utils.literal
import ua.mei.minekord.utils.minecraftOptions
import ua.mei.minekord.utils.parseText
import ua.mei.minekord.utils.summary
import ua.mei.minekord.utils.toAdventure
import ua.mei.minekord.utils.toColor
import ua.mei.minekord.utils.toNative
import ua.mei.minekord.utils.toText

class MessagesExtension : MinekordExtension() {
override val name: String = "minekord.messages"

override suspend fun setup() {
event<MessageCreateEvent> {
check { isNotBot() }
check { inChannel(Snowflake(config[BotSpec.channel])) }
check { inChannel(Snowflake(MinekordConfig.channel)) }

action {
val message: Message = event.message
val sender: Member = event.member ?: return@action

var content: Text = if (config[ChatSpec.convertMarkdown]) {
var content: Text = if (MinekordConfig.convertMarkdown) {
MinecraftSerializer.INSTANCE.serialize(message.content, minecraftOptions).toNative()
} else {
message.content.literal()
Expand All @@ -54,7 +49,7 @@ class MessagesExtension : MinekordExtension() {
if (message.referencedMessage != null) {
val replyContent: Text = MinecraftSerializer.INSTANCE.serialize(message.referencedMessage!!.content, minecraftOptions).toNative()

val reply: Text = parseText(config[ChatSpec.MinecraftSpec.replyFormat], PlaceholderContext.of(server)) {
val reply: Text = MinekordConfig.replyFormat.toText(server) {
"sender" to (message.referencedMessage!!.author?.effectiveName ?: message.referencedMessage!!.data.author.username).literal()
"message" to replyContent
"summary" to replyContent.string.summary().literal()
Expand All @@ -63,7 +58,7 @@ class MessagesExtension : MinekordExtension() {
content = Text.empty().append(reply).append("\n").append(content)
}

content = parseText(config[ChatSpec.MinecraftSpec.messageFormat], PlaceholderContext.of(server)) {
content = MinekordConfig.messageFormat.toText(server) {
"sender" to sender.effectiveName.literal()
"message" to content
}
Expand All @@ -81,7 +76,7 @@ class MessagesExtension : MinekordExtension() {
content = DiscordSerializer.INSTANCE.serialize(
message.toAdventure(), discordOptions
).let {
if (config[ChatSpec.convertMentions]) {
if (MinekordConfig.convertMentions) {
SerializerUtils.convertMentions(it)
} else {
it
Expand All @@ -94,17 +89,11 @@ class MessagesExtension : MinekordExtension() {
val display: AdvancementDisplay = advancement.display ?: return
val frame: AdvancementFrame = display.frame

val message: String = parseText(
when (frame) {
AdvancementFrame.CHALLENGE -> config[ChatSpec.DiscordSpec.challengeMessage]
AdvancementFrame.GOAL -> config[ChatSpec.DiscordSpec.goalMessage]

else -> config[ChatSpec.DiscordSpec.advancementMessage]
},
PlaceholderContext.of(player)
) {
"advancement" to display.title
}.string
val message = when (frame) {
AdvancementFrame.CHALLENGE -> MinekordConfig.challengeMessage
AdvancementFrame.GOAL -> MinekordConfig.goalMessage
AdvancementFrame.TASK -> MinekordConfig.advancementMessage
}.toText(player) { "advancement" to display.title }.string

webhookEmbed {
author {
Expand All @@ -114,53 +103,53 @@ class MessagesExtension : MinekordExtension() {
footer {
text = display.description.string
}
color = config[if (frame == AdvancementFrame.CHALLENGE) ColorsSpec.purple else ColorsSpec.blue].toColor()
color = if (frame == AdvancementFrame.CHALLENGE) MinekordConfig.purple else MinekordConfig.blue
}
}

override suspend fun onPlayerJoin(player: ServerPlayerEntity) {
webhookEmbed {
author {
name = parseText(config[ChatSpec.DiscordSpec.joinMessage], player).string
name = MinekordConfig.joinMessage.toText(player).string
icon = player.avatar
}
color = config[ColorsSpec.green].toColor()
color = MinekordConfig.green
}
}

override suspend fun onPlayerLeave(player: ServerPlayerEntity) {
webhookEmbed {
author {
name = parseText(config[ChatSpec.DiscordSpec.leaveMessage], player).string
name = MinekordConfig.leaveMessage.toText(player).string
icon = player.avatar
}
color = config[ColorsSpec.red].toColor()
color = MinekordConfig.red
}
}

override suspend fun onPlayerDeath(player: ServerPlayerEntity, source: DamageSource) {
webhookEmbed {
author {
icon = player.avatar
name = parseText(config[ChatSpec.DiscordSpec.deathMessage], PlaceholderContext.of(player)) {
name = MinekordConfig.deathMessage.toText(player) {
"message" to source.getDeathMessage(player)
}.string
}
color = config[ColorsSpec.orange].toColor()
color = MinekordConfig.orange
}
}

override suspend fun onServerStart() {
webhookEmbed {
title = parseText(config[ChatSpec.DiscordSpec.startMessage], server).string
color = config[ColorsSpec.green].toColor()
title = MinekordConfig.startMessage.toText(server).string
color = MinekordConfig.green
}
}

override suspend fun onServerStop() {
webhookEmbed {
title = parseText(config[ChatSpec.DiscordSpec.stopMessage], server).string
color = config[ColorsSpec.red].toColor()
title = MinekordConfig.stopMessage.toText(server).string
color = MinekordConfig.red
}
}
}
Loading

0 comments on commit 11441f7

Please sign in to comment.