Skip to content

Commit

Permalink
feat: implement #41 & #43
Browse files Browse the repository at this point in the history
  • Loading branch information
27rogi committed Feb 8, 2024
1 parent 6b5b574 commit 1b195d3
Show file tree
Hide file tree
Showing 9 changed files with 57 additions and 34 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import su.rogi.fabric2discord.utils.MessageUtils.format
@ConfigSerializable
open class MessageBase {
open var enabled: Boolean = true
open var silent: Boolean = false
open var timestamp: Boolean = false
open var fields: Array<MessageField> = arrayOf()

Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
package su.rogi.fabric2discord.config.groups

import org.spongepowered.configurate.objectmapping.ConfigSerializable
import org.spongepowered.configurate.objectmapping.meta.Comment
import su.rogi.fabric2discord.config.components.ImageStructure
import su.rogi.fabric2discord.config.components.MessageBase
import su.rogi.fabric2discord.config.components.MessageStructure

@ConfigSerializable
class ChatMessagesGroup {
var format = "[<color:4ae485>F2D</color>] %discord_user%: "
@Comment("Supported placeholders: %discord_nickname% (fallback to username if not present), %discord_username%")
var format = "[<color:4ae485>F2D</color>] %discord_nickname%: "
var formattedAttachment = "<blue><url:'%attachment_url%'>[%attachment_name%]</url></blue>"

var message = MessageBase().apply {
Expand Down
5 changes: 3 additions & 2 deletions src/main/kotlin/su/rogi/fabric2discord/kord/KordClient.kt
Original file line number Diff line number Diff line change
Expand Up @@ -55,13 +55,14 @@ object KordClient {
}
if (Configs.SETTINGS.entries.ids.getByCategory(ChannelCategory.SERVER_CHAT)?.contains(message.channelId) != true) return@on
if ((message.author == null || message.author!!.isBot) || message.webhookId != null) return@on
if (this.guildId == null) return@on Fabric2Discord.logger.error("Unable to get guildId for incoming message!")
if (message.content.isNotEmpty()) {
MessageUtils.sendMinecraftMessage(Fabric2Discord.minecraftServer!!.playerManager, message.author!!) {
MessageUtils.sendMinecraftMessage(Fabric2Discord.minecraftServer!!.playerManager, message.author!!.asMember(this.guildId!!)) {
TextParserUtils.formatTextSafe(MessageUtils.convertDiscordTags(message.content))
}
}
if (message.attachments.isNotEmpty()) {
MessageUtils.sendMinecraftMessage(Fabric2Discord.minecraftServer!!.playerManager, message.author!!) {
MessageUtils.sendMinecraftMessage(Fabric2Discord.minecraftServer!!.playerManager, message.author!!.asMember(this.guildId!!)) {
TextParserUtils.formatText(message.attachments.joinToString { attachment ->
Configs.MESSAGES.entries.chat.formattedAttachment.replace("%attachment_url%", attachment.url).replace(
"%attachment_name%",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,11 @@ object MinecraftServerMixinKotlin {
Fabric2Discord.minecraftServer = playerManager.server

if (Configs.MESSAGES.entries.server.started.enabled) {
MessageUtils.sendEmbedMessage(Configs.SETTINGS.entries.ids.getByCategory(ChannelCategory.SERVER_STATUS)) {
Configs.MESSAGES.entries.server.started.getEmbed(null, server = Fabric2Discord.minecraftServer)
MessageUtils.sendDiscordMessage(Configs.SETTINGS.entries.ids.getByCategory(ChannelCategory.SERVER_STATUS)) {
Configs.MESSAGES.entries.server.started.let {
suppressNotifications = it.silent
embeds = mutableListOf(it.getEmbed(null, server = Fabric2Discord.minecraftServer))
}
}
}

Expand Down Expand Up @@ -50,9 +53,10 @@ object MinecraftServerMixinKotlin {
}

fun afterShutdownServer(timer: Timer) {
if (Configs.MESSAGES.entries.server.stopped.enabled) {
MessageUtils.sendEmbedMessage(Configs.SETTINGS.entries.ids.getByCategory(ChannelCategory.SERVER_STATUS)) {
Configs.MESSAGES.entries.server.stopped.getEmbed(null, server = Fabric2Discord.minecraftServer)
MessageUtils.sendDiscordMessage(Configs.SETTINGS.entries.ids.getByCategory(ChannelCategory.SERVER_STATUS)) {
Configs.MESSAGES.entries.server.stopped.let {
suppressNotifications = it.silent
embeds = mutableListOf(it.getEmbed(null, server = Fabric2Discord.minecraftServer))
}
}
if (Configs.SETTINGS.entries.status.enabled) timer.cancel()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,11 @@ object PlayerAdvancementTrackerMixinKotlin {
replacements["advancement_id"] = advancement.parent.get().path
}

MessageUtils.sendEmbedMessage(Configs.SETTINGS.entries.ids.getByCategory(ChannelCategory.ADVANCEMENTS)) {
Configs.MESSAGES.entries.player.gotAdvancement.getEmbed(replacements, owner)
MessageUtils.sendDiscordMessage(Configs.SETTINGS.entries.ids.getByCategory(ChannelCategory.ADVANCEMENTS)) {
Configs.MESSAGES.entries.player.gotAdvancement.let {
suppressNotifications = it.silent
embeds = mutableListOf(it.getEmbed(replacements, owner))
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,11 @@ import su.rogi.fabric2discord.utils.MessageUtils
object PlayerManagerMixinKotlin {
fun onPlayerConnect(player: ServerPlayerEntity) {
if (!Configs.MESSAGES.entries.player.joined.enabled) return
MessageUtils.sendEmbedMessage(Configs.SETTINGS.entries.ids.getByCategory(ChannelCategory.CONNECTIONS)) {
Configs.MESSAGES.entries.player.joined.getEmbed(player = player)
MessageUtils.sendDiscordMessage(Configs.SETTINGS.entries.ids.getByCategory(ChannelCategory.CONNECTIONS)) {
Configs.MESSAGES.entries.player.joined.let {
suppressNotifications = it.silent
embeds = mutableListOf(it.getEmbed(player = player))
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,7 @@ object ServerPlayNetworkHandlerMixinKotlin {
fun onPlayerMessageEvent(player: ServerPlayerEntity, signedMessage: SignedMessage) {
if (!Configs.MESSAGES.entries.chat.message.enabled) return

val replacements = hashMapOf<String, String>()
replacements["message"] = signedMessage.content.string

val embed = Configs.MESSAGES.entries.chat.message.getEmbed(replacements, player)
val embed = Configs.MESSAGES.entries.chat.message.getEmbed(hashMapOf(Pair("message", signedMessage.content.string)), player)
if (Configs.SETTINGS.entries.ids.getWebhooks() != null) {
if (embed.author == null) {
Fabric2Discord.logger.warn("Unable to send message via webhook because field [text.header/images.header] of embed (messages.chat.message) is missing!")
Expand All @@ -30,19 +27,19 @@ object ServerPlayNetworkHandlerMixinKotlin {
return
}

MessageUtils.sendEmbedMessage(Configs.SETTINGS.entries.ids.getByCategory(ChannelCategory.GAME_CHAT)) {
embed
MessageUtils.sendDiscordMessage(Configs.SETTINGS.entries.ids.getByCategory(ChannelCategory.GAME_CHAT)) {
embeds = mutableListOf(embed)
}
}

fun remove(player: ServerPlayerEntity, reason: Text) {
if (!Configs.MESSAGES.entries.player.left.enabled) return

val replacements = hashMapOf<String, String>()
replacements["leave_reason"] = reason.string

MessageUtils.sendEmbedMessage(Configs.SETTINGS.entries.ids.getByCategory(ChannelCategory.CONNECTIONS)) {
Configs.MESSAGES.entries.player.left.getEmbed(replacements, player)
MessageUtils.sendDiscordMessage(Configs.SETTINGS.entries.ids.getByCategory(ChannelCategory.CONNECTIONS)) {
Configs.MESSAGES.entries.player.left.let {
suppressNotifications = it.silent
embeds = mutableListOf(it.getEmbed(hashMapOf(Pair("leave_reason", reason.string)), player))
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,11 @@ object ServerPlayerEntityMixinKotlin {
replacements["death_message"] = tracker.deathMessage.string
replacements["death_by"] = source.name

MessageUtils.sendEmbedMessage(Configs.SETTINGS.entries.ids.getByCategory(ChannelCategory.DEATHS)) {
Configs.MESSAGES.entries.player.died.getEmbed(replacements, player)
MessageUtils.sendDiscordMessage(Configs.SETTINGS.entries.ids.getByCategory(ChannelCategory.DEATHS)) {
Configs.MESSAGES.entries.player.died.let {
suppressNotifications = it.silent
embeds = mutableListOf(it.getEmbed(replacements, player))
}
}
}

Expand All @@ -28,8 +31,11 @@ object ServerPlayerEntityMixinKotlin {
replacements["world_origin"] = origin.registryKey.value.toString()
replacements["world_origin_id"] = origin.registryKey.value.path

MessageUtils.sendEmbedMessage(Configs.SETTINGS.entries.ids.getByCategory(ChannelCategory.TELEPORTS)) {
Configs.MESSAGES.entries.player.teleported.getEmbed(replacements, player)
MessageUtils.sendDiscordMessage(Configs.SETTINGS.entries.ids.getByCategory(ChannelCategory.TELEPORTS)) {
Configs.MESSAGES.entries.player.teleported.let {
suppressNotifications = it.silent
embeds = mutableListOf(it.getEmbed(replacements, player))
}
}
}
}
20 changes: 13 additions & 7 deletions src/main/kotlin/su/rogi/fabric2discord/utils/MessageUtils.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ import com.vdurmont.emoji.EmojiParser
import dev.kord.common.Color
import dev.kord.common.entity.Snowflake
import dev.kord.core.behavior.channel.createMessage
import dev.kord.core.entity.User
import dev.kord.core.entity.Member
import dev.kord.core.entity.channel.TextChannel
import dev.kord.rest.builder.message.EmbedBuilder
import dev.kord.rest.builder.message.create.UserMessageCreateBuilder
import dev.kord.rest.builder.message.create.WebhookMessageCreateBuilder
import eu.pb4.placeholders.api.PlaceholderContext
import eu.pb4.placeholders.api.Placeholders.parseText
Expand All @@ -21,21 +21,27 @@ import su.rogi.fabric2discord.config.Configs
import su.rogi.fabric2discord.kord.KordClient

object MessageUtils {
fun sendEmbedMessage(channels: List<Snowflake>?, embed: () -> EmbedBuilder) {
fun sendDiscordMessage(channels: List<Snowflake>?, builder: UserMessageCreateBuilder.() -> Unit) {
if (channels.isNullOrEmpty()) return
Fabric2Discord.scope.launch {
for (channel in channels) {
KordClient.kord.getChannelOf<TextChannel>(channel)!!.createMessage {
embeds = mutableListOf(embed())
builder()
}
}
}
}

fun sendMinecraftMessage(playerManager: PlayerManager, user: User, message: () -> Text) {
fun sendMinecraftMessage(playerManager: PlayerManager, member: Member, message: () -> Text) {
val replacements = hashMapOf(
Pair("discord_username", member.username),
Pair("discord_nickname", member.effectiveName),
// TODO: implement colorful names for chat depending on role or profile customization
// Pair("discord_color", member.accentColor)
)
val formattedMessage = checkNotNull(format(
Configs.MESSAGES.entries.chat.format
.replace("%discord_user%", user.username),
Configs.MESSAGES.entries.chat.format,
tags = replacements,
server = playerManager.server
)).copy().append(message.invoke())

Expand Down

0 comments on commit 1b195d3

Please sign in to comment.