Skip to content

Commit

Permalink
playerlist command & api for developers
Browse files Browse the repository at this point in the history
  • Loading branch information
MeiNanziiii committed Oct 13, 2024
1 parent 2f8669b commit feb3c7d
Show file tree
Hide file tree
Showing 7 changed files with 248 additions and 159 deletions.
2 changes: 1 addition & 1 deletion src/main/kotlin/ua/mei/minekord/Minekord.kt
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,6 @@ object Minekord : ModInitializer {

if (config[ExperimentalSpec.DiscordSpec.loginByIp]) IPCache.load()

MinekordBot.launchBot()
ServerLifecycleEvents.SERVER_STARTING.register(MinekordBot::launchBot)
}
}
25 changes: 17 additions & 8 deletions src/main/kotlin/ua/mei/minekord/bot/MinekordBot.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,18 @@ import dev.kord.core.entity.Guild
import dev.kord.core.entity.Webhook
import dev.kord.core.entity.channel.TextChannel
import dev.kordex.core.ExtensibleBot
import dev.kordex.core.utils.loadModule
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import net.minecraft.server.MinecraftServer
import ua.mei.minekord.bot.extensions.IPCheckExtension
import ua.mei.minekord.bot.extensions.MessageExtension
import ua.mei.minekord.bot.extensions.PlayerListExtension
import ua.mei.minekord.bot.extensions.SetupExtension
import ua.mei.minekord.config.config
import ua.mei.minekord.config.spec.BotSpec
import ua.mei.minekord.config.spec.CommandsSpec
import ua.mei.minekord.config.spec.ExperimentalSpec
import kotlin.coroutines.CoroutineContext

Expand All @@ -22,25 +26,30 @@ object MinekordBot : CoroutineScope {
lateinit var chat: TextChannel
lateinit var webhook: Webhook

fun launchBot() {
fun launchBot(server: MinecraftServer) {
launch {
println("не ліх")

bot = ExtensibleBot(config[BotSpec.token]) {
extensions {
add(::SetupExtension)
add(::MessageExtension)

if (config[CommandsSpec.PlayerListSpec.enabled])
add(::PlayerListExtension)

if (config[ExperimentalSpec.DiscordSpec.enabled])
add(::IPCheckExtension)
}
}

try {
bot.start()
} catch (_: Throwable) {
println("ліх чи шо?")
hooks {
afterKoinSetup {
loadModule {
single { server }
}
}
}
}

bot.start()
}
}

Expand Down
247 changes: 97 additions & 150 deletions src/main/kotlin/ua/mei/minekord/bot/extensions/MessageExtension.kt

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package ua.mei.minekord.bot.extensions

import dev.kord.common.entity.Snowflake
import dev.kord.rest.builder.message.embed
import dev.kordex.core.extensions.Extension
import dev.kordex.core.extensions.ephemeralSlashCommand
import net.minecraft.server.MinecraftServer
import org.koin.core.component.inject
import ua.mei.minekord.config.config
import ua.mei.minekord.config.spec.BotSpec
import ua.mei.minekord.config.spec.CommandsSpec
import ua.mei.minekord.utils.parse
import kotlin.getValue

class PlayerListExtension : Extension() {
override val name: String = "Player List Extension"

private val server: MinecraftServer by inject()

override suspend fun setup() {
ephemeralSlashCommand {
name = config[CommandsSpec.PlayerListSpec.name]
description = config[CommandsSpec.PlayerListSpec.description]

guild(Snowflake(config[BotSpec.guild]))

action {
respond {
embed {
title = parse(config[CommandsSpec.PlayerListSpec.title], server).string
description = server.playerManager.playerList.map {
parse(config[CommandsSpec.PlayerListSpec.format], it).string
}.joinToString("\n")
}
}
}
}
}
}
2 changes: 2 additions & 0 deletions src/main/kotlin/ua/mei/minekord/config/MinekordConfig.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import com.uchuhimo.konf.source.toml
import net.fabricmc.loader.api.FabricLoader
import ua.mei.minekord.config.spec.BotSpec
import ua.mei.minekord.config.spec.ChatSpec
import ua.mei.minekord.config.spec.CommandsSpec
import ua.mei.minekord.config.spec.ExperimentalSpec
import ua.mei.minekord.config.spec.PresenceSpec

Expand All @@ -14,6 +15,7 @@ val config: Config = Config {
addSpec(BotSpec)
addSpec(ChatSpec)
addSpec(PresenceSpec)
addSpec(CommandsSpec)
addSpec(ExperimentalSpec)
}
.from.toml.resource(CONFIG_PATH)
Expand Down
13 changes: 13 additions & 0 deletions src/main/kotlin/ua/mei/minekord/config/spec/CommandsSpec.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package ua.mei.minekord.config.spec

import com.uchuhimo.konf.ConfigSpec

object CommandsSpec : ConfigSpec() {
object PlayerListSpec : ConfigSpec() {
val enabled by required<Boolean>()
val name by required<String>()
val description by required<String>()
val title by required<String>()
val format by required<String>()
}
}
79 changes: 79 additions & 0 deletions src/main/kotlin/ua/mei/minekord/extension/MinekordExtension.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
package ua.mei.minekord.extension

import dev.kord.common.entity.AllowedMentionType
import dev.kord.core.behavior.execute
import dev.kord.core.entity.Webhook
import dev.kord.rest.builder.message.AllowedMentionsBuilder
import dev.kord.rest.builder.message.EmbedBuilder
import dev.kord.rest.builder.message.create.WebhookMessageCreateBuilder
import dev.kord.rest.builder.message.embed
import dev.kordex.core.extensions.Extension
import dev.vankka.mcdiscordreserializer.discord.DiscordSerializerOptions
import dev.vankka.mcdiscordreserializer.minecraft.MinecraftSerializerOptions
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.toList
import kotlinx.coroutines.launch
import net.kyori.adventure.text.Component
import net.minecraft.server.MinecraftServer
import org.koin.core.component.inject
import ua.mei.minekord.bot.MinekordBot
import ua.mei.minekord.config.config
import ua.mei.minekord.config.spec.ChatSpec
import ua.mei.minekord.utils.MinekordMinecraftRenderer
import ua.mei.minekord.utils.SerializerUtils
import kotlin.getValue

abstract class MinekordExtension : Extension() {
open val mentions: AllowedMentionsBuilder = AllowedMentionsBuilder().apply {
MinekordBot.launch {
add(AllowedMentionType.UserMentions)
roles.addAll(MinekordBot.guild.roles.filter { it.mentionable }.map { it.id }.toList())
}
}

open val discordOptions: DiscordSerializerOptions = DiscordSerializerOptions.defaults()
.withEmbedLinks(false)
.withEscapeMarkdown(config[ChatSpec.convertMarkdown])
.withKeybindProvider(SerializerUtils::translatableToString)
.withTranslationProvider(SerializerUtils::translatableToString)

open val minecraftOptions: MinecraftSerializerOptions<Component> = MinecraftSerializerOptions.defaults()
.addRenderer(MinekordMinecraftRenderer)

open val server: MinecraftServer by inject()

open val webhook: Webhook = MinekordBot.webhook

open suspend fun createWebhookMessageSync(builder: suspend WebhookMessageCreateBuilder.() -> Unit) {
webhook.execute(webhook.token!!, null) {
allowedMentions = mentions
builder()
}
}

open fun createWebhookMessage(builder: suspend WebhookMessageCreateBuilder.() -> Unit) {
launch {
createWebhookMessageSync(builder)
}
}

open suspend fun createWebhookEmbedSync(builder: EmbedBuilder.() -> Unit) {
createWebhookMessageSync {
embed(builder)
}
}

open fun createWebhookEmbed(builder: EmbedBuilder.() -> Unit) {
launch {
createWebhookMessageSync {
embed(builder)
}
}
}

fun launch(block: suspend CoroutineScope.() -> Unit) {
MinekordBot.launch { block() }
}
}

0 comments on commit feb3c7d

Please sign in to comment.