Skip to content

Commit 5085d44

Browse files
Added /chatexchange send.
1 parent cd06b0d commit 5085d44

File tree

4 files changed

+56
-9
lines changed

4 files changed

+56
-9
lines changed

src/main/kotlin/NoMathExpectation/chatExchange/neoForged/ChatExchangeConfig.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,10 @@ object ChatExchangeConfig {
6464
.translation("modid.config.advancement")
6565
.define("advancement", true)
6666

67+
val commandBroadcastFormat = builder.comment("The message format when player broadcast message using the command.")
68+
.translation("modid.config.commandBroadcastFormat")
69+
.define("commandBroadcastFormat", "\"<%s> %s\"")
70+
6771
val spec = builder.build()
6872

6973
private var registered = false

src/main/kotlin/NoMathExpectation/chatExchange/neoForged/NeoForgeEvents.kt

Lines changed: 48 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
package NoMathExpectation.chatExchange.neoForged
22

3+
import com.mojang.brigadier.StringReader
34
import com.mojang.brigadier.arguments.BoolArgumentType
5+
import com.mojang.brigadier.arguments.StringArgumentType
46
import net.minecraft.commands.Commands
7+
import net.minecraft.commands.ParserUtils
58
import net.minecraft.network.chat.Component
9+
import net.minecraft.network.chat.ComponentSerialization
610
import net.minecraft.network.chat.contents.PlainTextContents
711
import net.minecraft.world.entity.player.Player
812
import net.neoforged.bus.api.EventPriority
@@ -16,10 +20,13 @@ import net.neoforged.neoforge.event.entity.player.PlayerEvent.PlayerLoggedInEven
1620
import net.neoforged.neoforge.event.entity.player.PlayerEvent.PlayerLoggedOutEvent
1721
import net.neoforged.neoforge.event.server.ServerStartedEvent
1822
import net.neoforged.neoforge.event.server.ServerStoppingEvent
23+
import org.apache.logging.log4j.LogManager
1924
import kotlin.jvm.optionals.getOrNull
2025

2126
@EventBusSubscriber(modid = ChatExchange.ID)
2227
object NeoForgeEvents {
28+
private val logger = LogManager.getLogger(ChatExchange.ID)
29+
2330
@SubscribeEvent
2431
fun onServerStarted(event: ServerStartedEvent) {
2532
ExchangeServer.startNewInstance(event.server)
@@ -57,7 +64,7 @@ object NeoForgeEvents {
5764

5865
ExchangeServer.sendEvent(
5966
MessageEvent(
60-
event.username,
67+
ExchangeServer.componentToString(event.player.name),
6168
ExchangeServer.componentToString(message)
6269
)
6370
)
@@ -69,7 +76,7 @@ object NeoForgeEvents {
6976
return
7077
}
7178

72-
val name = event.entity.name.string
79+
val name = ExchangeServer.componentToString(event.entity.name)
7380
if (ChatExchangeConfig.checkIgnoreBot(name)) {
7481
return
7582
}
@@ -85,7 +92,7 @@ object NeoForgeEvents {
8592
return
8693
}
8794

88-
val name = event.entity.name.string
95+
val name = ExchangeServer.componentToString(event.entity.name)
8996
if (ChatExchangeConfig.checkIgnoreBot(name)) {
9097
return
9198
}
@@ -102,16 +109,15 @@ object NeoForgeEvents {
102109
}
103110

104111
val player = event.entity as? Player ?: return
105-
val name = player.name.string
112+
val name = ExchangeServer.componentToString(player.name)
106113
if (ChatExchangeConfig.checkIgnoreBot(name)) {
107114
return
108115
}
109116

110117
val cause = event.source
111-
val playerName = ExchangeServer.componentToString(player.name)
112118
val text = ExchangeServer.componentToString(cause.getLocalizedDeathMessage(player))
113119
ExchangeServer.sendEvent(
114-
PlayerDieEvent(playerName, text)
120+
PlayerDieEvent(name, text)
115121
)
116122
}
117123

@@ -122,7 +128,7 @@ object NeoForgeEvents {
122128
}
123129

124130
val player = event.entity
125-
val name = player.name.string
131+
val name = ExchangeServer.componentToString(player.name)
126132
if (ChatExchangeConfig.checkIgnoreBot(name)) {
127133
return
128134
}
@@ -134,9 +140,8 @@ object NeoForgeEvents {
134140

135141
val advancementName =
136142
advancement.display.getOrNull()?.title?.let { ExchangeServer.componentToString(it) } ?: return
137-
val playerName = ExchangeServer.componentToString(player.name)
138143
ExchangeServer.sendEvent(
139-
PlayerAdvancementEvent(playerName, advancementName)
144+
PlayerAdvancementEvent(name, advancementName)
140145
)
141146
}
142147

@@ -147,9 +152,43 @@ object NeoForgeEvents {
147152
}
148153

149154
val dispatcher = event.dispatcher
155+
val buildContext = event.buildContext
150156

151157
val command = Commands.literal("chatexchange")
152158
.then(
159+
Commands.literal("send").then(
160+
Commands.argument("message", StringArgumentType.greedyString()).executes { context ->
161+
val player = context.source.player ?: return@executes 0
162+
val message = StringArgumentType.getString(context, "message")
163+
164+
val name = ExchangeServer.componentToString(player.name)
165+
166+
val component = kotlin.runCatching {
167+
val formatted = ChatExchangeConfig.commandBroadcastFormat
168+
.get()
169+
.format(
170+
name,
171+
message,
172+
)
173+
ParserUtils.parseJson(buildContext, StringReader(formatted), ComponentSerialization.CODEC)
174+
}.getOrElse {
175+
logger.error("Unable to resolve component from command broadcast format.", it)
176+
player.sendSystemMessage("chatexchange.const.exception".toExchangeServerTranslatedLiteral())
177+
return@executes 0
178+
}
179+
180+
logger.info(component.getStringWithLanguage(ExchangeServer.language))
181+
ExchangeServer.sendEvent(
182+
MessageEvent(name, message)
183+
)
184+
player.server.playerList.players.forEach {
185+
it.sendSystemMessage(component)
186+
}
187+
188+
1
189+
}
190+
)
191+
).then(
153192
Commands.literal("status").executes { context ->
154193
val player = context.source.player ?: return@executes 0
155194

src/main/resources/assets/chatexchange/lang/en_us.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
"itemGroup.chatexchange": "Chat Exchange",
33
"chatexchange.const.enabled": "§2Enabled§r",
44
"chatexchange.const.disabled": "§cDisabled§r",
5+
"chatexchange.const.exception": "§4Internal exception occurred.§r",
56
"modid.config.host": "Host",
67
"modid.config.port": "Port",
78
"modid.config.token": "Token",
@@ -12,6 +13,7 @@
1213
"modid.config.joinLeave": "Enable Join/Leave",
1314
"modid.config.death": "Enable Death",
1415
"modid.config.advancement": "Enable Advancement",
16+
"modid.config.commandBroadcastFormat": "Command Broadcast Format",
1517
"chatexchange.command.chatexchange.description": "§3§lChatExchange Help§r\nIf the server has enabled broadcasting chat messages, your chat messages will be broadcast to an external port by default.\nYou can use /chatexchange broadcastme to control whether your chat messages will be broadcast.\nAlso, you can broadcast your messages by prefixing @broadcast/@bc.",
1618
"chatexchange.command.chatexchange.status": "Chat: %s\nJoin/Leave: %s\nDeath: %s\nAdvancement: %s",
1719
"chatexchange.command.chatexchange.broadcastme.on": "Your chat messages will now be broadcast.",

src/main/resources/assets/chatexchange/lang/zh_cn.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
"itemGroup.chatexchange": "Chat Exchange",
33
"chatexchange.const.enabled": "§2已启用§r",
44
"chatexchange.const.disabled": "§c已禁用§r",
5+
"chatexchange.const.exception": "§4发生了内部错误。§r",
56
"modid.config.host": "主机",
67
"modid.config.port": "端口",
78
"modid.config.token": "令牌",
@@ -12,6 +13,7 @@
1213
"modid.config.joinLeave": "启用加入/离开消息",
1314
"modid.config.death": "启用死亡消息",
1415
"modid.config.advancement": "启用进度消息",
16+
"modid.config.commandBroadcastFormat": "命令广播格式",
1517
"chatexchange.command.chatexchange.description": "§3§lChatExchange 帮助§r\n若服务器开启了广播聊天消息,你的聊天消息默认会被自动广播到外部端口。\n你可以使用 /chatexchange broadcastme 来控制你的消息是否被广播。\n同时,在发送消息前加上@广播/@broadcast/@bc前缀也可以广播你的消息。",
1618
"chatexchange.command.chatexchange.status": "聊天消息: %s\n加入/离开消息: %s\n死亡消息: %s\n进度消息: %s",
1719
"chatexchange.command.chatexchange.broadcastme.on": "你的聊天消息现在会被广播了。",

0 commit comments

Comments
 (0)