diff options
| author | Sho Sakuma <me@m1sk9.dev> | 2026-01-26 02:47:15 +0900 |
|---|---|---|
| committer | Sho Sakuma <me@m1sk9.dev> | 2026-01-26 02:47:15 +0900 |
| commit | f544a6ba28a81f2f8d2294aa984e74c4bcc80ba7 (patch) | |
| tree | 0ded53c5f515e0ce1a1acf10df1beef39cfa1900 /platform-paper/src | |
| parent | a7cac6e6b49c017b20c9c1f63b09ae06dc5605a6 (diff) | |
| download | LunaticChat-f544a6ba28a81f2f8d2294aa984e74c4bcc80ba7.tar.gz LunaticChat-f544a6ba28a81f2f8d2294aa984e74c4bcc80ba7.tar.bz2 LunaticChat-f544a6ba28a81f2f8d2294aa984e74c4bcc80ba7.zip | |
feat: Add ChangeChat message notification
Diffstat (limited to 'platform-paper/src')
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} が使用されています" |
