diff options
| author | Sho Sakuma <me@m1sk9.dev> | 2026-01-26 01:29:07 +0900 |
|---|---|---|
| committer | Sho Sakuma <me@m1sk9.dev> | 2026-01-26 01:29:07 +0900 |
| commit | 15b5bb3ebe0b4beb09b70878767db1c13445392b (patch) | |
| tree | f7b9ebc41ce116a9ea0eb0f9fea8ed8ec85fbe28 /platform-paper/src/main/kotlin | |
| parent | c5e355b851ad4d71d32d3c10f89aa4ed1f6dc41c (diff) | |
| download | LunaticChat-15b5bb3ebe0b4beb09b70878767db1c13445392b.tar.gz LunaticChat-15b5bb3ebe0b4beb09b70878767db1c13445392b.tar.bz2 LunaticChat-15b5bb3ebe0b4beb09b70878767db1c13445392b.zip | |
feat: Add channel-chat handle
Diffstat (limited to 'platform-paper/src/main/kotlin')
12 files changed, 178 insertions, 19 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 2473f49..7e51e20 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 @@ -3,8 +3,9 @@ package dev.m1sk9.lunaticChat.paper import dev.m1sk9.lunaticChat.paper.chat.ChatModeManager import dev.m1sk9.lunaticChat.paper.chat.channel.ChannelManager import dev.m1sk9.lunaticChat.paper.chat.channel.ChannelMembershipManager +import dev.m1sk9.lunaticChat.paper.chat.handler.ChannelMessageHandler +import dev.m1sk9.lunaticChat.paper.chat.handler.DirectMessageHandler import dev.m1sk9.lunaticChat.paper.command.core.CommandRegistry -import dev.m1sk9.lunaticChat.paper.command.handler.DirectMessageHandler 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 @@ -33,6 +34,7 @@ class LunaticChat : var channelManager: ChannelManager? = null var channelMembershipManager: ChannelMembershipManager? = null var chatModeManager: ChatModeManager? = null + var channelMessageHandler: ChannelMessageHandler? = null // Private services private lateinit var services: ServiceContainer @@ -69,6 +71,7 @@ class LunaticChat : channelManager = services.channelManager channelMembershipManager = services.channelMembershipManager chatModeManager = services.chatModeManager + channelMessageHandler = services.channelMessageHandler // Schedule periodic tasks serviceInitializer.schedulePeriodicTasks() diff --git a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/ServiceContainer.kt b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/ServiceContainer.kt index c4e56cd..3cd9e73 100644 --- a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/ServiceContainer.kt +++ b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/ServiceContainer.kt @@ -3,7 +3,8 @@ package dev.m1sk9.lunaticChat.paper import dev.m1sk9.lunaticChat.paper.chat.ChatModeManager import dev.m1sk9.lunaticChat.paper.chat.channel.ChannelManager import dev.m1sk9.lunaticChat.paper.chat.channel.ChannelMembershipManager -import dev.m1sk9.lunaticChat.paper.command.handler.DirectMessageHandler +import dev.m1sk9.lunaticChat.paper.chat.handler.ChannelMessageHandler +import dev.m1sk9.lunaticChat.paper.chat.handler.DirectMessageHandler import dev.m1sk9.lunaticChat.paper.converter.RomanjiConverter import dev.m1sk9.lunaticChat.paper.i18n.LanguageManager import dev.m1sk9.lunaticChat.paper.settings.PlayerSettingsManager @@ -21,6 +22,7 @@ import dev.m1sk9.lunaticChat.paper.settings.PlayerSettingsManager * @property channelManager Optional (only when channel chat feature is enabled) * @property channelMembershipManager Optional (only when channel chat feature is enabled) * @property chatModeManager Optional (only when channel chat feature is enabled) + * @property channelMessageHandler Optional (only when channel chat feature is enabled) */ data class ServiceContainer( val languageManager: LanguageManager, @@ -30,4 +32,5 @@ data class ServiceContainer( val channelManager: ChannelManager? = null, val channelMembershipManager: ChannelMembershipManager? = null, val chatModeManager: ChatModeManager? = null, + val channelMessageHandler: ChannelMessageHandler? = null, ) diff --git a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/ServiceInitializer.kt b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/ServiceInitializer.kt index 7865c9c..39afbc1 100644 --- a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/ServiceInitializer.kt +++ b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/ServiceInitializer.kt @@ -6,7 +6,8 @@ import dev.m1sk9.lunaticChat.paper.chat.ChatModeStorage import dev.m1sk9.lunaticChat.paper.chat.channel.ChannelManager import dev.m1sk9.lunaticChat.paper.chat.channel.ChannelMembershipManager import dev.m1sk9.lunaticChat.paper.chat.channel.ChannelStorage -import dev.m1sk9.lunaticChat.paper.command.handler.DirectMessageHandler +import dev.m1sk9.lunaticChat.paper.chat.handler.ChannelMessageHandler +import dev.m1sk9.lunaticChat.paper.chat.handler.DirectMessageHandler import dev.m1sk9.lunaticChat.paper.config.LunaticChatConfiguration import dev.m1sk9.lunaticChat.paper.converter.ConversionCache import dev.m1sk9.lunaticChat.paper.converter.RomanjiConverter @@ -19,6 +20,16 @@ import java.util.logging.Logger import kotlin.time.Duration.Companion.milliseconds /** + * Container for channel-related components. + */ +private data class ChannelComponents( + val channelManager: ChannelManager, + val channelMembershipManager: ChannelMembershipManager, + val chatModeManager: ChatModeManager, + val channelMessageHandler: ChannelMessageHandler, +) + +/** * Handles initialization and shutdown of all plugin services. * * This class centralizes service initialization logic, ensuring proper @@ -34,6 +45,7 @@ class ServiceInitializer( private var channelManager: ChannelManager? = null private var channelMembershipManager: ChannelMembershipManager? = null private var chatModeManager: ChatModeManager? = null + private var channelMessageHandler: ChannelMessageHandler? = null /** * Initializes all services in dependency order. @@ -69,13 +81,17 @@ class ServiceInitializer( null } - // 4. Initialize channel manager, membership manager, and chat mode manager - val (channelManager, channelMembershipManager, chatModeManager) = + // 4. Initialize channel manager, membership manager, chat mode manager, and channel message handler + val channelComponents = if (configuration.features.channelChat.enabled) { - initializeChannelManager() + initializeChannelManager(playerSettingsManager) } else { - Triple(null, null, null) + null } + val channelManager = channelComponents?.channelManager + val channelMembershipManager = channelComponents?.channelMembershipManager + val chatModeManager = channelComponents?.chatModeManager + val channelMessageHandler = channelComponents?.channelMessageHandler // 5. Initialize handlers val directMessageHandler = @@ -92,6 +108,7 @@ class ServiceInitializer( channelManager = channelManager, channelMembershipManager = channelMembershipManager, chatModeManager = chatModeManager, + channelMessageHandler = channelMessageHandler, ) } @@ -156,9 +173,9 @@ class ServiceInitializer( } /** - * Initializes channel manager, membership manager, and chat mode manager with storage. + * Initializes channel manager, membership manager, chat mode manager, and channel message handler with storage. */ - private fun initializeChannelManager(): Triple<ChannelManager, ChannelMembershipManager, ChatModeManager> { + private fun initializeChannelManager(settingsManager: PlayerSettingsManager): ChannelComponents { val channelsFile = plugin.dataFolder.resolve("channels.json").toPath() val storage = ChannelStorage( @@ -197,8 +214,23 @@ class ServiceInitializer( chatMode.initialize() chatModeManager = chatMode - logger.info("Channel manager, membership manager, and chat mode manager initialized successfully.") - return Triple(manager, membershipManager, chatMode) + val messageHandler = + ChannelMessageHandler( + settingsManager = settingsManager, + channelManager = manager, + logger = + io.ktor.util.logging + .KtorSimpleLogger("ChannelMessageHandler"), + ) + channelMessageHandler = messageHandler + + logger.info("Channel manager, membership manager, chat mode manager, and channel message handler initialized successfully.") + return ChannelComponents( + channelManager = manager, + channelMembershipManager = membershipManager, + chatModeManager = chatMode, + channelMessageHandler = messageHandler, + ) } /** diff --git a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/chat/channel/ChannelManager.kt b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/chat/channel/ChannelManager.kt index ff3b5d8..f7d0812 100644 --- a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/chat/channel/ChannelManager.kt +++ b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/chat/channel/ChannelManager.kt @@ -1,6 +1,7 @@ package dev.m1sk9.lunaticChat.paper.chat.channel import dev.m1sk9.lunaticChat.engine.chat.channel.Channel +import dev.m1sk9.lunaticChat.engine.chat.channel.ChannelContext import dev.m1sk9.lunaticChat.engine.chat.channel.ChannelData import dev.m1sk9.lunaticChat.engine.chat.channel.ChannelMember import dev.m1sk9.lunaticChat.engine.chat.channel.ChannelRole @@ -249,6 +250,24 @@ class ChannelManager( fun getPlayerChannel(playerId: UUID): String? = activeChannels[playerId] /** + * Gets the full channel context (channel and members) of a player's active channel. + * + * @param playerId The UUID of the player. + * @return The ChannelContext of the active channel or null if none is set. + */ + fun getPlayerChannelContext(playerId: UUID): ChannelContext? { + val channelId = activeChannels[playerId] ?: return null + val channel = channelsCache[channelId] ?: return null + val members = membersCache[channelId]?.toList() ?: return null + + return ChannelContext( + channelId = channelId, + channel = channel, + members = members, + ) + } + + /** * Sets the active channel of a player. * * @param playerId The UUID of the player. 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 new file mode 100644 index 0000000..cf57991 --- /dev/null +++ b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/chat/handler/ChannelMessageHandler.kt @@ -0,0 +1,60 @@ +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.config.ConfigManager +import dev.m1sk9.lunaticChat.paper.settings.PlayerSettingsManager +import io.ktor.util.logging.Logger +import net.kyori.adventure.text.Component +import org.bukkit.Bukkit +import org.bukkit.entity.Player + +class ChannelMessageHandler( + private val settingsManager: PlayerSettingsManager?, + private val channelManager: ChannelManager, + private val logger: Logger, +) { + private var lunaticChatConfiguration = ConfigManager.getConfiguration() + + suspend fun sendChannelMessage( + player: Player, + message: String, + ): Boolean { + val playerId = player.uniqueId + val context = + channelManager.getPlayerChannelContext(playerId) + ?: return false + val formattedMessage = formatChannelMessage(player.name, context.channel.name, message) + + SpyPermissionManager + .getDirectMessageSpyPlayers() + .values + .filter { it.isOnline && it.uniqueId != playerId } + .forEach { it.sendMessage(formattedMessage) } + context.members.forEach { member -> + Bukkit.getPlayer(member.playerId)?.let { memberPlayer -> + if (memberPlayer.isOnline && member.playerId != playerId) { + memberPlayer.sendMessage(formattedMessage) + } + } + } + + logger.info("Channel Message from ${player.name} in ${context.channel.name}: $message") + return true + } + + private fun formatChannelMessage( + senderName: String, + channelName: String, + message: String, + ): Component { + val format = lunaticChatConfiguration.messageFormat.channelMessageFormat + val text = + format + .replace("{sender}", senderName) + .replace("{channel}", channelName) + .replace("{message}", message) + + return Component.text(text) + } +} diff --git a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/command/handler/DirectMessageHandler.kt b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/chat/handler/DirectMessageHandler.kt index 4683c08..7d06ffd 100644 --- a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/command/handler/DirectMessageHandler.kt +++ b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/chat/handler/DirectMessageHandler.kt @@ -1,4 +1,4 @@ -package dev.m1sk9.lunaticChat.paper.command.handler +package dev.m1sk9.lunaticChat.paper.chat.handler import dev.m1sk9.lunaticChat.paper.common.SpyPermissionManager import dev.m1sk9.lunaticChat.paper.common.playDirectMessageNotification diff --git a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/command/impl/ReplyCommand.kt b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/command/impl/ReplyCommand.kt index 185581a..acf8fcf 100644 --- a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/command/impl/ReplyCommand.kt +++ b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/command/impl/ReplyCommand.kt @@ -5,12 +5,12 @@ import com.mojang.brigadier.builder.LiteralArgumentBuilder import dev.m1sk9.lunaticChat.engine.command.CommandResult import dev.m1sk9.lunaticChat.engine.permission.LunaticChatPermissionNode import dev.m1sk9.lunaticChat.paper.LunaticChat +import dev.m1sk9.lunaticChat.paper.chat.handler.DirectMessageHandler import dev.m1sk9.lunaticChat.paper.command.annotation.Command import dev.m1sk9.lunaticChat.paper.command.annotation.Permission import dev.m1sk9.lunaticChat.paper.command.annotation.PlayerOnly import dev.m1sk9.lunaticChat.paper.command.core.CommandContext import dev.m1sk9.lunaticChat.paper.command.core.LunaticCommand -import dev.m1sk9.lunaticChat.paper.command.handler.DirectMessageHandler import dev.m1sk9.lunaticChat.paper.i18n.LanguageManager import dev.m1sk9.lunaticChat.paper.i18n.MessageFormatter import io.papermc.paper.command.brigadier.CommandSourceStack diff --git a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/command/impl/TellCommand.kt b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/command/impl/TellCommand.kt index c84de33..16311cf 100644 --- a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/command/impl/TellCommand.kt +++ b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/command/impl/TellCommand.kt @@ -7,12 +7,12 @@ import com.mojang.brigadier.suggestion.SuggestionsBuilder import dev.m1sk9.lunaticChat.engine.command.CommandResult import dev.m1sk9.lunaticChat.engine.permission.LunaticChatPermissionNode import dev.m1sk9.lunaticChat.paper.LunaticChat +import dev.m1sk9.lunaticChat.paper.chat.handler.DirectMessageHandler import dev.m1sk9.lunaticChat.paper.command.annotation.Command import dev.m1sk9.lunaticChat.paper.command.annotation.Permission import dev.m1sk9.lunaticChat.paper.command.annotation.PlayerOnly import dev.m1sk9.lunaticChat.paper.command.core.CommandContext import dev.m1sk9.lunaticChat.paper.command.core.LunaticCommand -import dev.m1sk9.lunaticChat.paper.command.handler.DirectMessageHandler import dev.m1sk9.lunaticChat.paper.i18n.LanguageManager import dev.m1sk9.lunaticChat.paper.i18n.MessageFormatter import io.papermc.paper.command.brigadier.CommandSourceStack diff --git a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/config/ConfigManager.kt b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/config/ConfigManager.kt index f8c95b6..3617df1 100644 --- a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/config/ConfigManager.kt +++ b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/config/ConfigManager.kt @@ -57,6 +57,11 @@ object ConfigManager { "messageFormat.directMessageFormat", "§7[§e{sender} §7>> §e{recipient}§7] §f{message}", )!!, + channelMessageFormat = + configFile.getString( + "messageFormat.channelMessageFormat", + "§7[§b#{channel}§7] §e{sender}: §f{message}", + )!!, ), debug = configFile.getBoolean("debug", false), checkForUpdates = configFile.getBoolean("checkForUpdates", false), diff --git a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/config/key/MessageFormatConfig.kt b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/config/key/MessageFormatConfig.kt index 53d4399..2e623fa 100644 --- a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/config/key/MessageFormatConfig.kt +++ b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/config/key/MessageFormatConfig.kt @@ -2,4 +2,5 @@ package dev.m1sk9.lunaticChat.paper.config.key data class MessageFormatConfig( val directMessageFormat: String = "§7[§e{sender} §7>> §e{recipient}§7] §f{message}", + val channelMessageFormat: String = "§7[§b#{channel}§7] §e{sender}: §f{message}", ) diff --git a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/listener/EventListenerRegistry.kt b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/listener/EventListenerRegistry.kt index 8d4070d..2c22be1 100644 --- a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/listener/EventListenerRegistry.kt +++ b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/listener/EventListenerRegistry.kt @@ -33,10 +33,18 @@ object EventListenerRegistry { plugin, ) - // Conditionally register Japanese conversion listener - if (services.romajiConverter != null) { + // Conditionally register chat listener when all required components are available + if (services.chatModeManager != null && + services.channelMessageHandler != null && + services.romajiConverter != null + ) { pluginManager.registerEvents( - PlayerChatListener(services.romajiConverter, services.playerSettingsManager), + PlayerChatListener( + chatModeManager = services.chatModeManager, + channelMessageHandler = services.channelMessageHandler, + romajiConverter = services.romajiConverter, + settingsManager = services.playerSettingsManager, + ), plugin, ) } diff --git a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/listener/PlayerChatListener.kt b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/listener/PlayerChatListener.kt index 17df427..258b0b1 100644 --- a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/listener/PlayerChatListener.kt +++ b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/listener/PlayerChatListener.kt @@ -1,5 +1,8 @@ package dev.m1sk9.lunaticChat.paper.listener +import dev.m1sk9.lunaticChat.engine.chat.ChatMode +import dev.m1sk9.lunaticChat.paper.chat.ChatModeManager +import dev.m1sk9.lunaticChat.paper.chat.handler.ChannelMessageHandler import dev.m1sk9.lunaticChat.paper.converter.RomanjiConverter import dev.m1sk9.lunaticChat.paper.settings.PlayerSettingsManager import io.papermc.paper.event.player.AsyncChatEvent @@ -10,6 +13,8 @@ import org.bukkit.event.EventHandler import org.bukkit.event.Listener class PlayerChatListener( + private val chatModeManager: ChatModeManager, + private val channelMessageHandler: ChannelMessageHandler, private val romajiConverter: RomanjiConverter, private val settingsManager: PlayerSettingsManager, ) : Listener { @@ -20,9 +25,8 @@ class PlayerChatListener( runBlocking { val player = event.player val settings = settingsManager.getSettings(player.uniqueId) - val message = event.message() - val originalMessage = plainTextSerializer.serialize(message) + val originalMessage = plainTextSerializer.serialize(event.message()) val displayMessage = settings .takeIf { @@ -34,6 +38,30 @@ class PlayerChatListener( ?: originalMessage }?.getOrNull() ?: originalMessage + val (_, effectiveMode) = + if (originalMessage.startsWith('!')) { + val withoutPrefix = originalMessage.removePrefix("!").trim() + if (withoutPrefix.isEmpty()) { + event.isCancelled = true + return@runBlocking + } + val currentMode = chatModeManager.getChatMode(player.uniqueId) + withoutPrefix to currentMode.toggle() + } else { + originalMessage to chatModeManager.getChatMode(player.uniqueId) + } + + when (effectiveMode) { + ChatMode.GLOBAL -> { + event.message(Component.text(displayMessage)) + } + ChatMode.CHANNEL -> { + event.isCancelled = true + channelMessageHandler + .sendChannelMessage(player, originalMessage) + } + } + event.message(Component.text(displayMessage)) } } |
