Make chat events use fabric events
[no changelog]
This commit is contained in:
20
src/main/kotlin/moe/nea/firmament/events/AllowChatEvent.kt
Normal file
20
src/main/kotlin/moe/nea/firmament/events/AllowChatEvent.kt
Normal file
@@ -0,0 +1,20 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2023 Linnea Gräf <nea@nea.moe>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
package moe.nea.firmament.events
|
||||
|
||||
import moe.nea.firmament.util.unformattedString
|
||||
import net.minecraft.text.Text
|
||||
|
||||
/**
|
||||
* Filter whether the user should see a chat message altogether. May or may not be called for every chat packet sent by
|
||||
* the server. When that quality is desired, consider [ProcessChatEvent] instead.
|
||||
*/
|
||||
data class AllowChatEvent(val text: Text) : FirmamentEvent.Cancellable() {
|
||||
val unformattedString = text.unformattedString
|
||||
|
||||
companion object : FirmamentEventBus<AllowChatEvent>()
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2023 Linnea Gräf <nea@nea.moe>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
package moe.nea.firmament.events
|
||||
|
||||
import net.minecraft.text.Text
|
||||
import moe.nea.firmament.util.unformattedString
|
||||
|
||||
/**
|
||||
* Published just before a message is added to the chat gui. Cancelling only prevents rendering, not logging to the
|
||||
* console.
|
||||
*/
|
||||
data class ClientChatLineReceivedEvent(val text: Text) : FirmamentEvent.Cancellable() {
|
||||
val unformattedString = text.unformattedString
|
||||
var replaceWith: Text = text
|
||||
|
||||
companion object : FirmamentEventBus<ClientChatLineReceivedEvent>()
|
||||
}
|
||||
@@ -20,10 +20,10 @@ open class FirmamentEventBus<T : FirmamentEvent> {
|
||||
|
||||
private val toHandle: MutableList<Handler<T>> = CopyOnWriteArrayList()
|
||||
fun subscribe(handle: (T) -> Unit) {
|
||||
subscribe(handle, false)
|
||||
subscribe(false, handle)
|
||||
}
|
||||
|
||||
fun subscribe(handle: (T) -> Unit, receivesCancelled: Boolean) {
|
||||
fun subscribe(receivesCancelled: Boolean, handle: (T) -> Unit) {
|
||||
toHandle.add(Handler(handle, receivesCancelled))
|
||||
}
|
||||
|
||||
|
||||
25
src/main/kotlin/moe/nea/firmament/events/ModifyChatEvent.kt
Normal file
25
src/main/kotlin/moe/nea/firmament/events/ModifyChatEvent.kt
Normal file
@@ -0,0 +1,25 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2023 Linnea Gräf <nea@nea.moe>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
package moe.nea.firmament.events
|
||||
|
||||
import moe.nea.firmament.util.unformattedString
|
||||
import net.minecraft.text.Text
|
||||
|
||||
/**
|
||||
* Allow modification of a chat message before it is sent off to the user. Intended for display purposes.
|
||||
*/
|
||||
data class ModifyChatEvent(val originalText: Text) : FirmamentEvent() {
|
||||
var unformattedString = originalText.unformattedString
|
||||
private set
|
||||
var replaceWith: Text = originalText
|
||||
set(value) {
|
||||
field = value
|
||||
unformattedString = value.unformattedString
|
||||
}
|
||||
|
||||
companion object : FirmamentEventBus<ModifyChatEvent>()
|
||||
}
|
||||
25
src/main/kotlin/moe/nea/firmament/events/ProcessChatEvent.kt
Normal file
25
src/main/kotlin/moe/nea/firmament/events/ProcessChatEvent.kt
Normal file
@@ -0,0 +1,25 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2023 Linnea Gräf <nea@nea.moe>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
package moe.nea.firmament.events
|
||||
|
||||
import moe.nea.firmament.util.unformattedString
|
||||
import net.minecraft.text.Text
|
||||
|
||||
/**
|
||||
* Behaves like [AllowChatEvent], but is triggered even when cancelled by other mods. Intended for data collection.
|
||||
* Make sure to subscribe to cancellable events as well when using.
|
||||
*/
|
||||
data class ProcessChatEvent(val text: Text, val wasExternallyCancelled: Boolean) : FirmamentEvent.Cancellable() {
|
||||
val unformattedString = text.unformattedString
|
||||
|
||||
init {
|
||||
if (wasExternallyCancelled)
|
||||
cancelled = true
|
||||
}
|
||||
|
||||
companion object : FirmamentEventBus<ProcessChatEvent>()
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2023 Linnea Gräf <nea@nea.moe>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
package moe.nea.firmament.events
|
||||
|
||||
import net.minecraft.text.Text
|
||||
import moe.nea.firmament.util.unformattedString
|
||||
|
||||
/**
|
||||
* This event gets published whenever the client receives a chat message from the server.
|
||||
* This event is cancellable, but should not get cancelled. Use [ClientChatLineReceivedEvent] for that instead. */
|
||||
data class ServerChatLineReceivedEvent(val text: Text) : FirmamentEvent.Cancellable() {
|
||||
val unformattedString = text.unformattedString
|
||||
|
||||
companion object : FirmamentEventBus<ServerChatLineReceivedEvent>()
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2023 Linnea Gräf <nea@nea.moe>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
package moe.nea.firmament.events.registration
|
||||
|
||||
import moe.nea.firmament.events.AllowChatEvent
|
||||
import moe.nea.firmament.events.ModifyChatEvent
|
||||
import moe.nea.firmament.events.ProcessChatEvent
|
||||
import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents
|
||||
import net.minecraft.text.Text
|
||||
|
||||
private var lastReceivedMessage: Text? = null
|
||||
|
||||
fun registerFirmamentChatEvents() {
|
||||
ClientReceiveMessageEvents.ALLOW_CHAT.register(ClientReceiveMessageEvents.AllowChat { message, signedMessage, sender, params, receptionTimestamp ->
|
||||
lastReceivedMessage = message
|
||||
!ProcessChatEvent.publish(ProcessChatEvent(message, false)).cancelled
|
||||
&& !AllowChatEvent.publish(AllowChatEvent(message)).cancelled
|
||||
})
|
||||
ClientReceiveMessageEvents.ALLOW_GAME.register(ClientReceiveMessageEvents.AllowGame { message, overlay ->
|
||||
lastReceivedMessage = message
|
||||
overlay || (!ProcessChatEvent.publish(ProcessChatEvent(message, false)).cancelled &&
|
||||
!AllowChatEvent.publish(AllowChatEvent(message)).cancelled)
|
||||
})
|
||||
ClientReceiveMessageEvents.MODIFY_GAME.register(ClientReceiveMessageEvents.ModifyGame { message, overlay ->
|
||||
if (overlay) message
|
||||
else ModifyChatEvent.publish(ModifyChatEvent(message)).replaceWith
|
||||
})
|
||||
ClientReceiveMessageEvents.GAME_CANCELED.register(ClientReceiveMessageEvents.GameCanceled { message, overlay ->
|
||||
if (!overlay && lastReceivedMessage !== message) {
|
||||
ProcessChatEvent.publish(ProcessChatEvent(message, true))
|
||||
}
|
||||
})
|
||||
ClientReceiveMessageEvents.CHAT_CANCELED.register(ClientReceiveMessageEvents.ChatCanceled { message, signedMessage, sender, params, receptionTimestamp ->
|
||||
if (lastReceivedMessage !== message) {
|
||||
ProcessChatEvent.publish(ProcessChatEvent(message, true))
|
||||
}
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user