Skip to content

Commit

Permalink
kordex events goes brrrr....
Browse files Browse the repository at this point in the history
  • Loading branch information
MeiNanziiii committed Oct 13, 2024
1 parent 09ad025 commit 5c915ba
Show file tree
Hide file tree
Showing 12 changed files with 182 additions and 110 deletions.
167 changes: 76 additions & 91 deletions src/main/kotlin/ua/mei/minekord/bot/extensions/MessageExtension.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,28 +4,27 @@ import dev.kord.common.entity.Snowflake
import dev.kord.core.entity.Member
import dev.kord.core.entity.Message
import dev.kord.core.event.message.MessageCreateEvent
import dev.kord.rest.builder.message.EmbedBuilder
import dev.kordex.core.checks.inChannel
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 kotlinx.coroutines.runBlocking
import net.fabricmc.fabric.api.entity.event.v1.ServerLivingEntityEvents
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents
import net.fabricmc.fabric.api.message.v1.ServerMessageEvents
import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents
import net.minecraft.advancement.AdvancementDisplay
import net.minecraft.advancement.AdvancementFrame
import net.minecraft.server.network.ServerPlayerEntity
import net.minecraft.text.Text
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.event.AdvancementGrantEvent
import ua.mei.minekord.event.minekord.MinekordPlayerAdvancementGrantEvent
import ua.mei.minekord.event.minekord.MinekordPlayerDeathEvent
import ua.mei.minekord.event.minekord.MinekordPlayerJoinEvent
import ua.mei.minekord.event.minekord.MinekordPlayerLeaveEvent
import ua.mei.minekord.event.minekord.MinekordPlayerMessageEvent
import ua.mei.minekord.event.minekord.MinekordServerEndTickEvent
import ua.mei.minekord.event.minekord.MinekordServerStartEvent
import ua.mei.minekord.event.minekord.MinekordServerStoppedEvent
import ua.mei.minekord.extension.MinekordExtension
import ua.mei.minekord.utils.MinekordActivityType
import ua.mei.minekord.utils.MinekordColor
Expand Down Expand Up @@ -75,122 +74,108 @@ class MessageExtension : MinekordExtension() {
}
}

ServerMessageEvents.CHAT_MESSAGE.register { message, sender, type ->
createWebhookMessage {
username = sender.gameProfile.name

content = DiscordSerializer.INSTANCE.serialize(
message.content.toAdventure(server.registryManager), discordOptions
).let { if (config[ChatSpec.convertMentions]) SerializerUtils.convertMentions(it) else it }.takeIf { it.isNotBlank() } ?: return@createWebhookMessage
event<MinekordPlayerMessageEvent> {
action {
createWebhookMessage {
username = event.player.gameProfile.name
avatarUrl = event.playerAvatar

avatarUrl = parse(config[ChatSpec.WebhookSpec.playerAvatar], PlaceholderContext.of(sender)) {
"nickname" to sender.gameProfile.name.literal()
"texture" to (sender.gameProfile.properties?.get("textures")?.firstOrNull()?.value ?: "").literal()
}.string
content = DiscordSerializer.INSTANCE.serialize(
event.message.toAdventure(server.registryManager), discordOptions
).let { if (config[ChatSpec.convertMentions]) SerializerUtils.convertMentions(it) else it }.takeIf { it.isNotBlank() } ?: return@createWebhookMessage
}
}
}

ServerPlayConnectionEvents.JOIN.register { handler, sender, server ->
createWebhookEmbed {
author {
name = parse(config[ChatSpec.DiscordSpec.joinMessage], handler.player).string
icon = parse(config[ChatSpec.WebhookSpec.playerAvatar], PlaceholderContext.of(handler.player)) {
"nickname" to handler.player.gameProfile.name.literal()
"texture" to (handler.player.gameProfile.properties?.get("textures")?.firstOrNull()?.value ?: "").literal()
}.string
event<MinekordPlayerJoinEvent> {
action {
createWebhookEmbed {
author {
name = parse(config[ChatSpec.DiscordSpec.joinMessage], event.player).string
icon = event.playerAvatar
}
color = MinekordColor.GREEN
}
color = MinekordColor.GREEN
}
}

ServerPlayConnectionEvents.DISCONNECT.register { handler, server ->
val builder: EmbedBuilder.() -> Unit = {
author {
name = parse(config[ChatSpec.DiscordSpec.leaveMessage], handler.player).string
icon = parse(config[ChatSpec.WebhookSpec.playerAvatar], PlaceholderContext.of(handler.player)) {
"nickname" to handler.player.gameProfile.name.literal()
"texture" to (handler.player.gameProfile.properties?.get("textures")?.firstOrNull()?.value ?: "").literal()
}.string
}
color = MinekordColor.RED
}
if (server.isStopping) {
runBlocking {
createWebhookEmbedSync(builder)
event<MinekordPlayerLeaveEvent> {
action {
createWebhookEmbed {
author {
name = parse(config[ChatSpec.DiscordSpec.leaveMessage], event.player).string
icon = event.playerAvatar
}
color = MinekordColor.RED
}
} else {
createWebhookEmbed(builder)
}
}

ServerLivingEntityEvents.ALLOW_DEATH.register { entity, source, amount ->
if (entity is ServerPlayerEntity) {
event<MinekordPlayerDeathEvent> {
action {
createWebhookEmbed {
author {
name = parse(config[ChatSpec.DiscordSpec.deathMessage], PlaceholderContext.of(entity)) {
"message" to source.getDeathMessage(entity)
}.string
icon = parse(config[ChatSpec.WebhookSpec.playerAvatar], PlaceholderContext.of(entity)) {
"nickname" to entity.gameProfile.name.literal()
"texture" to (entity.gameProfile.properties?.get("textures")?.firstOrNull()?.value ?: "").literal()
icon = event.playerAvatar
name = parse(config[ChatSpec.DiscordSpec.deathMessage], PlaceholderContext.of(event.player)) {
"message" to event.source.getDeathMessage(event.player)
}.string
}
color = MinekordColor.YELLOW
}
}
true
}

AdvancementGrantEvent.EVENT.register { player, advancement ->
val display: AdvancementDisplay = advancement.comp_1913.get()

createWebhookEmbed {
author {
name = parse(
when (display.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
icon = parse(config[ChatSpec.WebhookSpec.playerAvatar], PlaceholderContext.of(player)) {
"nickname" to player.gameProfile.name.literal()
"texture" to (player.gameProfile.properties?.get("textures")?.firstOrNull()?.value ?: "").literal()
}.string
}
footer {
text = display.description.string
}
color = when (display.frame) {
AdvancementFrame.CHALLENGE -> MinekordColor.FUCHSIA
else -> MinekordColor.GREEN
event<MinekordPlayerAdvancementGrantEvent> {
action {
val display: AdvancementDisplay = event.advancement.comp_1913.get()

createWebhookEmbed {
author {
icon = event.playerAvatar
name = parse(
when (display.frame) {
AdvancementFrame.CHALLENGE -> config[ChatSpec.DiscordSpec.challengeMessage]
AdvancementFrame.GOAL -> config[ChatSpec.DiscordSpec.goalMessage]
else -> config[ChatSpec.DiscordSpec.advancementMessage]
},
PlaceholderContext.of(event.player)
) {
"advancement" to display.title
}.string
}
footer {
text = display.description.string
}
color = when (display.frame) {
AdvancementFrame.CHALLENGE -> MinekordColor.FUCHSIA
else -> MinekordColor.GREEN
}
}
}
}

ServerLifecycleEvents.SERVER_STARTED.register { server ->
createWebhookEmbed {
title = parse(config[ChatSpec.DiscordSpec.startMessage], server).string
color = MinekordColor.GREEN
event<MinekordServerStartEvent> {
action {
createWebhookEmbed {
title = parse(config[ChatSpec.DiscordSpec.startMessage], event.server).string
color = MinekordColor.GREEN
}
}
}

ServerLifecycleEvents.SERVER_STOPPED.register { server ->
runBlocking {
createWebhookEmbedSync {
event<MinekordServerStoppedEvent> {
action {
createWebhookEmbed {
title = parse(config[ChatSpec.DiscordSpec.stopMessage], server).string
color = MinekordColor.RED
}
}
}

ServerTickEvents.END_SERVER_TICK.register { server ->
if (config[PresenceSpec.activityType] != MinekordActivityType.NONE) {
if (server.ticks % config[PresenceSpec.updateTicks] == 0) {
launch {
event<MinekordServerEndTickEvent> {
action {
if (config[PresenceSpec.activityType] != MinekordActivityType.NONE) {
if (server.ticks % config[PresenceSpec.updateTicks] == 0) {
kord.editPresence {
val text: String = parse(config[PresenceSpec.activityText], server).string

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package ua.mei.minekord.event.base

import eu.pb4.placeholders.api.PlaceholderContext
import net.minecraft.server.network.ServerPlayerEntity
import ua.mei.minekord.config.config
import ua.mei.minekord.config.spec.ChatSpec
import ua.mei.minekord.utils.literal
import ua.mei.minekord.utils.parse

interface MinekordPlayerBaseEvent {
val player: ServerPlayerEntity

val playerAvatar: String
get() = parse(config[ChatSpec.WebhookSpec.playerAvatar], PlaceholderContext.of(player)) {
"nickname" to player.gameProfile.name.literal()
"texture" to (player.gameProfile.properties?.get("textures")?.firstOrNull()?.value ?: "").literal()
}.string
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package ua.mei.minekord.event.base

import net.minecraft.server.MinecraftServer

interface MinekordServerBaseEvent {
val server: MinecraftServer
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package ua.mei.minekord.event.minekord

import dev.kordex.core.events.KordExEvent
import net.minecraft.advancement.Advancement
import net.minecraft.server.network.ServerPlayerEntity
import ua.mei.minekord.event.base.MinekordPlayerBaseEvent

data class MinekordPlayerAdvancementGrantEvent(
override val player: ServerPlayerEntity,
val advancement: Advancement
) : KordExEvent, MinekordPlayerBaseEvent
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package ua.mei.minekord.event.minekord

import dev.kordex.core.events.KordExEvent
import net.minecraft.entity.damage.DamageSource
import net.minecraft.server.network.ServerPlayerEntity
import ua.mei.minekord.event.base.MinekordPlayerBaseEvent

data class MinekordPlayerDeathEvent(
override val player: ServerPlayerEntity,
val source: DamageSource
) : KordExEvent, MinekordPlayerBaseEvent
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package ua.mei.minekord.event.minekord

import dev.kordex.core.events.KordExEvent
import net.minecraft.server.network.ServerPlayerEntity
import ua.mei.minekord.event.base.MinekordPlayerBaseEvent

data class MinekordPlayerJoinEvent(
override val player: ServerPlayerEntity
) : KordExEvent, MinekordPlayerBaseEvent
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package ua.mei.minekord.event.minekord

import dev.kordex.core.events.KordExEvent
import net.minecraft.server.network.ServerPlayerEntity
import ua.mei.minekord.event.base.MinekordPlayerBaseEvent

data class MinekordPlayerLeaveEvent(
override val player: ServerPlayerEntity
) : KordExEvent, MinekordPlayerBaseEvent
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package ua.mei.minekord.event.minekord

import dev.kordex.core.events.KordExEvent
import net.minecraft.server.network.ServerPlayerEntity
import net.minecraft.text.Text
import ua.mei.minekord.event.base.MinekordPlayerBaseEvent

data class MinekordPlayerMessageEvent(
override val player: ServerPlayerEntity,
val message: Text
) : KordExEvent, MinekordPlayerBaseEvent
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package ua.mei.minekord.event.minekord

import dev.kordex.core.events.KordExEvent
import net.minecraft.server.MinecraftServer
import ua.mei.minekord.event.base.MinekordServerBaseEvent

data class MinekordServerEndTickEvent(
override val server: MinecraftServer
) : KordExEvent, MinekordServerBaseEvent
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package ua.mei.minekord.event.minekord

import dev.kordex.core.events.KordExEvent
import net.minecraft.server.MinecraftServer
import ua.mei.minekord.event.base.MinekordServerBaseEvent

data class MinekordServerStartEvent(
override val server: MinecraftServer
) : KordExEvent, MinekordServerBaseEvent
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package ua.mei.minekord.event.minekord

import dev.kordex.core.events.KordExEvent
import net.minecraft.server.MinecraftServer
import ua.mei.minekord.event.base.MinekordServerBaseEvent

data class MinekordServerStoppedEvent(
override val server: MinecraftServer
) : KordExEvent, MinekordServerBaseEvent
22 changes: 3 additions & 19 deletions src/main/kotlin/ua/mei/minekord/extension/MinekordExtension.kt
Original file line number Diff line number Diff line change
Expand Up @@ -46,31 +46,15 @@ abstract class MinekordExtension : Extension() {

open val webhook: Webhook = MinekordBot.webhook

open suspend fun createWebhookMessageSync(builder: suspend WebhookMessageCreateBuilder.() -> Unit) {
open suspend fun createWebhookMessage(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)
}
}
open suspend fun createWebhookEmbed(builder: EmbedBuilder.() -> Unit) {
createWebhookMessage { embed(builder) }
}

open fun launch(block: suspend CoroutineScope.() -> Unit) {
Expand Down

0 comments on commit 5c915ba

Please sign in to comment.