summaryrefslogtreecommitdiff
path: root/platform-paper/src
diff options
context:
space:
mode:
authorSho Sakuma <me@m1sk9.dev>2026-01-26 02:47:15 +0900
committerSho Sakuma <me@m1sk9.dev>2026-01-26 02:47:15 +0900
commitf544a6ba28a81f2f8d2294aa984e74c4bcc80ba7 (patch)
tree0ded53c5f515e0ce1a1acf10df1beef39cfa1900 /platform-paper/src
parenta7cac6e6b49c017b20c9c1f63b09ae06dc5605a6 (diff)
downloadLunaticChat-f544a6ba28a81f2f8d2294aa984e74c4bcc80ba7.tar.gz
LunaticChat-f544a6ba28a81f2f8d2294aa984e74c4bcc80ba7.tar.bz2
LunaticChat-f544a6ba28a81f2f8d2294aa984e74c4bcc80ba7.zip
feat: Add ChangeChat message notification
Diffstat (limited to 'platform-paper/src')
-rw-r--r--platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/LunaticChat.kt11
-rw-r--r--platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/chat/handler/ChannelMessageHandler.kt20
-rw-r--r--platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/chat/handler/DirectMessageHandler.kt4
-rw-r--r--platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/command/setting/SettingKey.kt8
-rw-r--r--platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/command/setting/handler/ChannelMessageNoticeSettingHandler.kt53
-rw-r--r--platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/common/SoundCollector.kt17
-rw-r--r--platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/settings/PlayerSettingsManager.kt6
-rw-r--r--platform-paper/src/main/resources/languages/en.yml5
-rw-r--r--platform-paper/src/main/resources/languages/ja.yml5
9 files changed, 125 insertions, 4 deletions
diff --git a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/LunaticChat.kt b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/LunaticChat.kt
index 7e51e20..d238dd6 100644
--- a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/LunaticChat.kt
+++ b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/LunaticChat.kt
@@ -10,6 +10,7 @@ import dev.m1sk9.lunaticChat.paper.command.impl.ReplyCommand
import dev.m1sk9.lunaticChat.paper.command.impl.TellCommand
import dev.m1sk9.lunaticChat.paper.command.impl.lc.LunaticChatCommand
import dev.m1sk9.lunaticChat.paper.command.setting.SettingHandlerRegistry
+import dev.m1sk9.lunaticChat.paper.command.setting.handler.ChannelMessageNoticeSettingHandler
import dev.m1sk9.lunaticChat.paper.command.setting.handler.DirectMessageNoticeSettingHandler
import dev.m1sk9.lunaticChat.paper.command.setting.handler.JapaneseConversionSettingHandler
import dev.m1sk9.lunaticChat.paper.common.UpdateCheckResult
@@ -108,6 +109,16 @@ class LunaticChat :
),
)
+ // Always register channel message notification setting if channel is enabled
+ if (services.channelManager != null) {
+ settingHandlerRegistry.register(
+ ChannelMessageNoticeSettingHandler(
+ services.playerSettingsManager,
+ services.languageManager,
+ ),
+ )
+ }
+
// Conditionally register Japanese conversion setting
if (services.romajiConverter != null) {
settingHandlerRegistry.register(
diff --git a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/chat/handler/ChannelMessageHandler.kt b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/chat/handler/ChannelMessageHandler.kt
index 0560939..70756d9 100644
--- a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/chat/handler/ChannelMessageHandler.kt
+++ b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/chat/handler/ChannelMessageHandler.kt
@@ -2,6 +2,8 @@ package dev.m1sk9.lunaticChat.paper.chat.handler
import dev.m1sk9.lunaticChat.paper.chat.channel.ChannelManager
import dev.m1sk9.lunaticChat.paper.common.SpyPermissionManager
+import dev.m1sk9.lunaticChat.paper.common.playChannelReceiveNotification
+import dev.m1sk9.lunaticChat.paper.common.playMessageSendNotification
import dev.m1sk9.lunaticChat.paper.config.ConfigManager
import dev.m1sk9.lunaticChat.paper.settings.PlayerSettingsManager
import io.ktor.util.logging.Logger
@@ -26,6 +28,14 @@ class ChannelMessageHandler(
?: return false
val formattedMessage = formatChannelMessage(player.name, context.channel.name, message)
+ // Play notification sound to sender if enabled
+ settingsManager?.let { manager ->
+ val senderSettings = manager.getSettings(playerId)
+ if (senderSettings.channelMessageNotificationEnabled) {
+ player.playMessageSendNotification()
+ }
+ }
+
SpyPermissionManager
.getDirectMessageSpyPlayers()
.values
@@ -35,6 +45,16 @@ class ChannelMessageHandler(
Bukkit.getPlayer(member.playerId)?.let { memberPlayer ->
if (memberPlayer.isOnline) {
memberPlayer.sendMessage(formattedMessage)
+
+ // Play notification sound to receiver if enabled and not the sender
+ if (memberPlayer.uniqueId != playerId) {
+ settingsManager?.let { manager ->
+ val receiverSettings = manager.getSettings(memberPlayer.uniqueId)
+ if (receiverSettings.channelMessageNotificationEnabled) {
+ memberPlayer.playChannelReceiveNotification()
+ }
+ }
+ }
}
}
}
diff --git a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/chat/handler/DirectMessageHandler.kt b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/chat/handler/DirectMessageHandler.kt
index 7857221..6155381 100644
--- a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/chat/handler/DirectMessageHandler.kt
+++ b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/chat/handler/DirectMessageHandler.kt
@@ -2,7 +2,7 @@ package dev.m1sk9.lunaticChat.paper.chat.handler
import dev.m1sk9.lunaticChat.paper.common.SpyPermissionManager
import dev.m1sk9.lunaticChat.paper.common.playDirectMessageNotification
-import dev.m1sk9.lunaticChat.paper.common.playDirectMessageSendNotification
+import dev.m1sk9.lunaticChat.paper.common.playMessageSendNotification
import dev.m1sk9.lunaticChat.paper.config.ConfigManager
import dev.m1sk9.lunaticChat.paper.converter.RomanjiConverter
import dev.m1sk9.lunaticChat.paper.settings.PlayerSettingsManager
@@ -118,7 +118,7 @@ class DirectMessageHandler(
sender.apply {
sendMessage(userMessage)
takeIf { senderSettings?.directMessageNotificationEnabled == true }
- ?.playDirectMessageSendNotification()
+ ?.playMessageSendNotification()
}
recipient.apply {
sendMessage(userMessage)
diff --git a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/command/setting/SettingKey.kt b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/command/setting/SettingKey.kt
index 26a1f06..076a7aa 100644
--- a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/command/setting/SettingKey.kt
+++ b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/command/setting/SettingKey.kt
@@ -19,11 +19,17 @@ sealed class SettingKey(
*/
data object Notice : SettingKey("notice")
+ /**
+ * Channel message notification setting
+ * Command: /lc setting chNotice <on|off>
+ */
+ data object ChNotice : SettingKey("chNotice")
+
companion object {
/**
* Returns all available setting keys.
*/
- fun values(): List<SettingKey> = listOf(Japanese, Notice)
+ fun values(): List<SettingKey> = listOf(Japanese, Notice, ChNotice)
/**
* Finds a setting key by its string representation.
diff --git a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/command/setting/handler/ChannelMessageNoticeSettingHandler.kt b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/command/setting/handler/ChannelMessageNoticeSettingHandler.kt
new file mode 100644
index 0000000..8867e7c
--- /dev/null
+++ b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/command/setting/handler/ChannelMessageNoticeSettingHandler.kt
@@ -0,0 +1,53 @@
+package dev.m1sk9.lunaticChat.paper.command.setting.handler
+
+import dev.m1sk9.lunaticChat.engine.command.CommandResult
+import dev.m1sk9.lunaticChat.paper.command.core.CommandContext
+import dev.m1sk9.lunaticChat.paper.command.setting.SettingHandler
+import dev.m1sk9.lunaticChat.paper.command.setting.SettingKey
+import dev.m1sk9.lunaticChat.paper.i18n.LanguageManager
+import dev.m1sk9.lunaticChat.paper.i18n.MessageFormatter
+import dev.m1sk9.lunaticChat.paper.settings.PlayerSettingsManager
+
+/**
+ * Handles the channel message notification setting.
+ * Manages enabling/disabling channel message notifications for players.
+ */
+class ChannelMessageNoticeSettingHandler(
+ private val settingsManager: PlayerSettingsManager,
+ private val languageManager: LanguageManager,
+) : SettingHandler {
+ override val key: SettingKey = SettingKey.ChNotice
+
+ override fun execute(
+ ctx: CommandContext,
+ enable: Boolean,
+ ): CommandResult {
+ val player = ctx.requirePlayer()
+ val currentSettings = settingsManager.getSettings(player.uniqueId)
+ val updatedSettings = currentSettings.copy(channelMessageNotificationEnabled = enable)
+ settingsManager.updateSettings(updatedSettings)
+
+ val toggleText = languageManager.getToggleText(enable)
+ val message =
+ MessageFormatter.formatSuccess(
+ languageManager.getMessage("channelMessage.noticeToggle", mapOf("toggle" to toggleText)),
+ )
+
+ player.sendMessage(message)
+ return CommandResult.Success
+ }
+
+ override fun showStatus(ctx: CommandContext): CommandResult {
+ val player = ctx.requirePlayer()
+ val settings = settingsManager.getSettings(player.uniqueId)
+
+ val toggleText = languageManager.getToggleText(settings.channelMessageNotificationEnabled)
+ val message =
+ MessageFormatter.format(
+ languageManager.getMessage("channelMessage.noticeStatus", mapOf("toggle" to toggleText)),
+ )
+
+ player.sendMessage(message)
+ return CommandResult.Success
+ }
+}
diff --git a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/common/SoundCollector.kt b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/common/SoundCollector.kt
index b0adbf5..e56c356 100644
--- a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/common/SoundCollector.kt
+++ b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/common/SoundCollector.kt
@@ -31,6 +31,14 @@ object SoundCollector {
0.6f,
2.0f,
)
+
+ val LUNATIC_BELL_SOUND: Sound =
+ Sound.sound(
+ Key.key("block.note_block.bell"),
+ Sound.Source.PLAYER,
+ 0.7f,
+ 1.2f,
+ )
}
/**
@@ -43,7 +51,7 @@ fun Player.playDirectMessageNotification() {
/**
* Plays the message sent sound to the player.
*/
-fun Player.playDirectMessageSendNotification() {
+fun Player.playMessageSendNotification() {
playSound(SoundCollector.LUNATIC_POP_SOUND)
}
@@ -53,3 +61,10 @@ fun Player.playDirectMessageSendNotification() {
fun Player.playChannelJoinNotification() {
playSound(SoundCollector.LUNATIC_SOFT_SOUND)
}
+
+/**
+ * Plays the channel message receive notification sound to the player.
+ */
+fun Player.playChannelReceiveNotification() {
+ playSound(SoundCollector.LUNATIC_BELL_SOUND)
+}
diff --git a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/settings/PlayerSettingsManager.kt b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/settings/PlayerSettingsManager.kt
index a30618b..f0927d8 100644
--- a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/settings/PlayerSettingsManager.kt
+++ b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/settings/PlayerSettingsManager.kt
@@ -19,6 +19,7 @@ class PlayerSettingsManager(
) {
private val japaneseConversionCache = ConcurrentHashMap<UUID, Boolean>()
private val directMessageNotificationCache = ConcurrentHashMap<UUID, Boolean>()
+ private val channelMessageNotificationCache = ConcurrentHashMap<UUID, Boolean>()
private lateinit var settingsData: PlayerSettingsData
/**
@@ -29,6 +30,7 @@ class PlayerSettingsManager(
settingsData = storage.loadFromDisk()
japaneseConversionCache.putAll(settingsData.japaneseConversion)
directMessageNotificationCache.putAll(settingsData.directMessageNotification)
+ channelMessageNotificationCache.putAll(settingsData.channelMessageNotification)
logger.info("Loaded settings for ${japaneseConversionCache.size} players")
}
@@ -42,10 +44,12 @@ class PlayerSettingsManager(
fun getSettings(uuid: UUID): PlayerChatSettings {
val japaneseConversionEnabled = japaneseConversionCache.getOrDefault(uuid, true)
val directMessageNotificationEnabled = directMessageNotificationCache.getOrDefault(uuid, true)
+ val channelMessageNotificationEnabled = channelMessageNotificationCache.getOrDefault(uuid, true)
return PlayerChatSettings(
uuid = uuid,
japaneseConversionEnabled = japaneseConversionEnabled,
directMessageNotificationEnabled = directMessageNotificationEnabled,
+ channelMessageNotificationEnabled = channelMessageNotificationEnabled,
)
}
@@ -57,11 +61,13 @@ class PlayerSettingsManager(
fun updateSettings(settings: PlayerChatSettings) {
japaneseConversionCache[settings.uuid] = settings.japaneseConversionEnabled
directMessageNotificationCache[settings.uuid] = settings.directMessageNotificationEnabled
+ channelMessageNotificationCache[settings.uuid] = settings.channelMessageNotificationEnabled
settingsData =
settingsData.copy(
japaneseConversion = japaneseConversionCache.toMap(),
directMessageNotification = directMessageNotificationCache.toMap(),
+ channelMessageNotification = channelMessageNotificationCache.toMap(),
)
storage.queueAsyncSave(settingsData)
diff --git a/platform-paper/src/main/resources/languages/en.yml b/platform-paper/src/main/resources/languages/en.yml
index 39908d2..925d7e7 100644
--- a/platform-paper/src/main/resources/languages/en.yml
+++ b/platform-paper/src/main/resources/languages/en.yml
@@ -14,6 +14,7 @@
commandDescription:
jp: "Toggle romaji-to-kana conversion on/off"
notice: "Toggle direct message notifications on/off"
+ chNotice: "Toggle channel message notifications on/off"
reply: "Reply to the player who last sent/received a direct message"
tell: "Send a direct message to another player"
lc: "LunaticChat Main Command"
@@ -29,6 +30,10 @@ romajiConversion:
toggle: "Romaji-to-kana conversion has been set to {toggle}"
status: "Romaji-to-kana conversion is currently {toggle}"
+channelMessage:
+ noticeToggle: "Channel message notifications have been set to {toggle}"
+ noticeStatus: "Channel message notifications are currently {toggle}"
+
status:
hover: "LunaticChat was born as the successor to LunaChat. With respect to its original creator, uccchyocean."
runningVersion: "Running LunaticChat v{version}"
diff --git a/platform-paper/src/main/resources/languages/ja.yml b/platform-paper/src/main/resources/languages/ja.yml
index 47399b8..17b0bf6 100644
--- a/platform-paper/src/main/resources/languages/ja.yml
+++ b/platform-paper/src/main/resources/languages/ja.yml
@@ -16,6 +16,7 @@ commandDescription:
reply: "最後にダイレクトメッセージを送信/受信したプレイヤーに返信します"
jp: "かな・ローマ字変換機能のオン/オフを切り替えます"
notice: "ダイレクトメッセージ通知のオン/オフを切り替えます"
+ chNotice: "チャンネルメッセージ通知のオン/オフを切り替えます"
lc: "LunaticChat のメインコマンド"
directMessage:
@@ -29,6 +30,10 @@ romajiConversion:
toggle: "かな・ローマ字変換機能を{toggle}にしました"
status: "現在かな・ローマ字変換機能は{toggle}です"
+channelMessage:
+ noticeToggle: "チャンネルメッセージ通知を{toggle}にしました"
+ noticeStatus: "現在チャンネルメッセージ通知は{toggle}です"
+
status:
hover: "LunaticChat は LunaChatの後継として生まれました。\nオリジナルの作者であるucchyoceanに敬意を込めて。"
runningVersion: "LunaticChat v{version} が使用されています"