From 634dd975038bb5b845c28ca6c96aa285ef94e965 Mon Sep 17 00:00:00 2001 From: Sho Sakuma Date: Tue, 17 Mar 2026 20:34:18 +0900 Subject: feat!: Remove ChatMode feature, followback channel chat mode --- .../dev/m1sk9/lunaticChat/engine/chat/ChatMode.kt | 43 ---- .../m1sk9/lunaticChat/engine/chat/ChatModeData.kt | 14 -- .../engine/exception/ChatModeStorageException.kt | 6 - .../engine/permission/LunaticChatPermissionNode.kt | 4 - .../m1sk9/lunaticChat/engine/chat/ChatModeTest.kt | 33 --- .../engine/exception/ChannelExceptionTest.kt | 18 -- .../permission/LunaticChatPermissionNodeTest.kt | 7 +- .../engine/settings/SettingsDataClassesTest.kt | 36 ---- .../dev/m1sk9/lunaticChat/paper/LunaticChat.kt | 3 - .../m1sk9/lunaticChat/paper/ServiceContainer.kt | 3 - .../m1sk9/lunaticChat/paper/ServiceInitializer.kt | 29 +-- .../lunaticChat/paper/chat/ChatModeManager.kt | 103 ---------- .../lunaticChat/paper/chat/ChatModeStorage.kt | 98 --------- .../paper/command/impl/lc/ChatModeCommand.kt | 86 -------- .../paper/command/impl/lc/LunaticChatCommand.kt | 11 - .../impl/lc/chatmode/ChatModeToggleCommand.kt | 71 ------- .../paper/listener/EventListenerRegistry.kt | 7 +- .../paper/listener/PlayerChatListener.kt | 55 ++--- .../paper/listener/PlayerPresenceListener.kt | 25 +-- platform-paper/src/main/resources/languages/en.yml | 10 - platform-paper/src/main/resources/languages/ja.yml | 10 - .../lunaticChat/paper/chat/ChatModeManagerTest.kt | 223 --------------------- .../impl/lc/chatmode/ChatModeToggleCommandTest.kt | 88 -------- 23 files changed, 22 insertions(+), 961 deletions(-) delete mode 100644 engine/src/main/kotlin/dev/m1sk9/lunaticChat/engine/chat/ChatMode.kt delete mode 100644 engine/src/main/kotlin/dev/m1sk9/lunaticChat/engine/chat/ChatModeData.kt delete mode 100644 engine/src/main/kotlin/dev/m1sk9/lunaticChat/engine/exception/ChatModeStorageException.kt delete mode 100644 engine/src/test/kotlin/dev/m1sk9/lunaticChat/engine/chat/ChatModeTest.kt delete mode 100644 platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/chat/ChatModeManager.kt delete mode 100644 platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/chat/ChatModeStorage.kt delete mode 100644 platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/command/impl/lc/ChatModeCommand.kt delete mode 100644 platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/command/impl/lc/chatmode/ChatModeToggleCommand.kt delete mode 100644 platform-paper/src/test/kotlin/dev/m1sk9/lunaticChat/paper/chat/ChatModeManagerTest.kt delete mode 100644 platform-paper/src/test/kotlin/dev/m1sk9/lunaticChat/paper/command/impl/lc/chatmode/ChatModeToggleCommandTest.kt diff --git a/engine/src/main/kotlin/dev/m1sk9/lunaticChat/engine/chat/ChatMode.kt b/engine/src/main/kotlin/dev/m1sk9/lunaticChat/engine/chat/ChatMode.kt deleted file mode 100644 index 98bb79d..0000000 --- a/engine/src/main/kotlin/dev/m1sk9/lunaticChat/engine/chat/ChatMode.kt +++ /dev/null @@ -1,43 +0,0 @@ -package dev.m1sk9.lunaticChat.engine.chat - -/** - * Represents the chat mode for a player. - * - * Chat mode determines where messages are sent by default: - * - GLOBAL: All messages go to global chat (visible to everyone) - * - CHANNEL: All messages go to the active channel (visible to channel members only) - * - * Players can temporarily override their mode by prefixing messages with '!'. - * Chat mode is persisted and maintains its state across server restarts. - * Default mode is GLOBAL. - */ -enum class ChatMode { - /** - * Global chat mode - messages visible to all players. - */ - GLOBAL, - - /** - * Channel chat mode - messages visible only to channel members. - * Requires player to be in an active channel. - */ - CHANNEL, - ; - - /** - * Returns the opposite chat mode. - * Used when player prefixes message with '!'. - */ - fun toggle(): ChatMode = - when (this) { - GLOBAL -> CHANNEL - CHANNEL -> GLOBAL - } - - companion object { - /** - * Default chat mode for all players. - */ - val DEFAULT = GLOBAL - } -} diff --git a/engine/src/main/kotlin/dev/m1sk9/lunaticChat/engine/chat/ChatModeData.kt b/engine/src/main/kotlin/dev/m1sk9/lunaticChat/engine/chat/ChatModeData.kt deleted file mode 100644 index b462ede..0000000 --- a/engine/src/main/kotlin/dev/m1sk9/lunaticChat/engine/chat/ChatModeData.kt +++ /dev/null @@ -1,14 +0,0 @@ -package dev.m1sk9.lunaticChat.engine.chat - -import dev.m1sk9.lunaticChat.engine.settings.UUIDSerializer -import kotlinx.serialization.Serializable -import java.util.UUID - -@Serializable -data class ChatModeData( - val modes: Map< - @Serializable(with = UUIDSerializer::class) - UUID, - ChatMode, - > = emptyMap(), -) diff --git a/engine/src/main/kotlin/dev/m1sk9/lunaticChat/engine/exception/ChatModeStorageException.kt b/engine/src/main/kotlin/dev/m1sk9/lunaticChat/engine/exception/ChatModeStorageException.kt deleted file mode 100644 index 85c1e69..0000000 --- a/engine/src/main/kotlin/dev/m1sk9/lunaticChat/engine/exception/ChatModeStorageException.kt +++ /dev/null @@ -1,6 +0,0 @@ -package dev.m1sk9.lunaticChat.engine.exception - -class ChatModeStorageException( - message: String, - cause: Throwable? = null, -) : Exception(message, cause) diff --git a/engine/src/main/kotlin/dev/m1sk9/lunaticChat/engine/permission/LunaticChatPermissionNode.kt b/engine/src/main/kotlin/dev/m1sk9/lunaticChat/engine/permission/LunaticChatPermissionNode.kt index 72b7246..6291553 100644 --- a/engine/src/main/kotlin/dev/m1sk9/lunaticChat/engine/permission/LunaticChatPermissionNode.kt +++ b/engine/src/main/kotlin/dev/m1sk9/lunaticChat/engine/permission/LunaticChatPermissionNode.kt @@ -43,10 +43,6 @@ sealed class LunaticChatPermissionNode( object ChannelOwnership : LunaticChatPermissionNode("lunaticchat.command.lc.channel.ownership") - object ChatMode : LunaticChatPermissionNode("lunaticchat.command.lc.chatmode") - - object ChatModeToggle : LunaticChatPermissionNode("lunaticchat.command.lc.chatmode.toggle") - object VelocityStatus : LunaticChatPermissionNode("lunaticchat.command.lcv.status") object Spy : LunaticChatPermissionNode("lunaticchat.spy") diff --git a/engine/src/test/kotlin/dev/m1sk9/lunaticChat/engine/chat/ChatModeTest.kt b/engine/src/test/kotlin/dev/m1sk9/lunaticChat/engine/chat/ChatModeTest.kt deleted file mode 100644 index 5656a14..0000000 --- a/engine/src/test/kotlin/dev/m1sk9/lunaticChat/engine/chat/ChatModeTest.kt +++ /dev/null @@ -1,33 +0,0 @@ -package dev.m1sk9.lunaticChat.engine.chat - -import kotlin.test.Test -import kotlin.test.assertEquals - -class ChatModeTest { - @Test - fun `toggle should switch GLOBAL to CHANNEL`() { - assertEquals(ChatMode.CHANNEL, ChatMode.GLOBAL.toggle()) - } - - @Test - fun `toggle should switch CHANNEL to GLOBAL`() { - assertEquals(ChatMode.GLOBAL, ChatMode.CHANNEL.toggle()) - } - - @Test - fun `DEFAULT should be GLOBAL`() { - assertEquals(ChatMode.GLOBAL, ChatMode.DEFAULT) - } - - @Test - fun `double toggle should return original mode`() { - assertEquals(ChatMode.GLOBAL, ChatMode.GLOBAL.toggle().toggle()) - assertEquals(ChatMode.CHANNEL, ChatMode.CHANNEL.toggle().toggle()) - } - - @Test - fun `enum should have exactly two values`() { - assertEquals(2, ChatMode.entries.size) - assertEquals(setOf(ChatMode.GLOBAL, ChatMode.CHANNEL), ChatMode.entries.toSet()) - } -} diff --git a/engine/src/test/kotlin/dev/m1sk9/lunaticChat/engine/exception/ChannelExceptionTest.kt b/engine/src/test/kotlin/dev/m1sk9/lunaticChat/engine/exception/ChannelExceptionTest.kt index 955c96b..21cd5d1 100644 --- a/engine/src/test/kotlin/dev/m1sk9/lunaticChat/engine/exception/ChannelExceptionTest.kt +++ b/engine/src/test/kotlin/dev/m1sk9/lunaticChat/engine/exception/ChannelExceptionTest.kt @@ -216,23 +216,6 @@ class ChannelExceptionTest { assertEquals(cause, ex.cause) } - // --- ChatModeStorageException --- - - @Test - fun `ChatModeStorageException should preserve message`() { - val ex = ChatModeStorageException("chatmode error") - assertEquals("chatmode error", ex.message) - assertNull(ex.cause) - } - - @Test - fun `ChatModeStorageException should preserve cause`() { - val cause = RuntimeException("io error") - val ex = ChatModeStorageException("chatmode error", cause) - assertEquals("chatmode error", ex.message) - assertEquals(cause, ex.cause) - } - // --- RequirePermissionException --- @Test @@ -273,7 +256,6 @@ class ChannelExceptionTest { assertIs(ChannelRuntimeException("test")) assertIs(ChannelStorageLoadException("test")) assertIs(ChannelStorageSaveException("test")) - assertIs(ChatModeStorageException("test")) assertIs(RequirePermissionException(listOf(LunaticChatPermissionNode.Lc))) } } diff --git a/engine/src/test/kotlin/dev/m1sk9/lunaticChat/engine/permission/LunaticChatPermissionNodeTest.kt b/engine/src/test/kotlin/dev/m1sk9/lunaticChat/engine/permission/LunaticChatPermissionNodeTest.kt index c9838f2..d6d74f7 100644 --- a/engine/src/test/kotlin/dev/m1sk9/lunaticChat/engine/permission/LunaticChatPermissionNodeTest.kt +++ b/engine/src/test/kotlin/dev/m1sk9/lunaticChat/engine/permission/LunaticChatPermissionNodeTest.kt @@ -27,8 +27,6 @@ class LunaticChatPermissionNodeTest { LunaticChatPermissionNode.ChannelUnban, LunaticChatPermissionNode.ChannelMod, LunaticChatPermissionNode.ChannelOwnership, - LunaticChatPermissionNode.ChatMode, - LunaticChatPermissionNode.ChatModeToggle, LunaticChatPermissionNode.VelocityStatus, LunaticChatPermissionNode.Spy, LunaticChatPermissionNode.NoticeUpdate, @@ -46,8 +44,8 @@ class LunaticChatPermissionNodeTest { } @Test - fun `should have 26 permission nodes`() { - assertEquals(26, allNodes.size) + fun `should have 24 permission nodes`() { + assertEquals(24, allNodes.size) } @Test @@ -57,7 +55,6 @@ class LunaticChatPermissionNodeTest { assertEquals("lunaticchat.command.reply", LunaticChatPermissionNode.Reply.permissionNode) assertEquals("lunaticchat.command.lc.settings", LunaticChatPermissionNode.Settings.permissionNode) assertEquals("lunaticchat.command.lc.channel.create", LunaticChatPermissionNode.ChannelCreate.permissionNode) - assertEquals("lunaticchat.command.lc.chatmode.toggle", LunaticChatPermissionNode.ChatModeToggle.permissionNode) assertEquals("lunaticchat.command.lcv.status", LunaticChatPermissionNode.VelocityStatus.permissionNode) assertEquals("lunaticchat.spy", LunaticChatPermissionNode.Spy.permissionNode) assertEquals("lunaticchat.noticeupdate", LunaticChatPermissionNode.NoticeUpdate.permissionNode) diff --git a/engine/src/test/kotlin/dev/m1sk9/lunaticChat/engine/settings/SettingsDataClassesTest.kt b/engine/src/test/kotlin/dev/m1sk9/lunaticChat/engine/settings/SettingsDataClassesTest.kt index 8743af9..a7cc2ee 100644 --- a/engine/src/test/kotlin/dev/m1sk9/lunaticChat/engine/settings/SettingsDataClassesTest.kt +++ b/engine/src/test/kotlin/dev/m1sk9/lunaticChat/engine/settings/SettingsDataClassesTest.kt @@ -1,7 +1,5 @@ package dev.m1sk9.lunaticChat.engine.settings -import dev.m1sk9.lunaticChat.engine.chat.ChatMode -import dev.m1sk9.lunaticChat.engine.chat.ChatModeData import dev.m1sk9.lunaticChat.engine.converter.CacheData import kotlinx.serialization.json.Json import java.util.UUID @@ -130,38 +128,4 @@ class SettingsDataClassesTest { assertEquals(original.version, deserialized.version) assertEquals(original.entries, deserialized.entries) } - - // --- ChatModeData --- - - @Test - fun `ChatModeData default should have empty modes map`() { - val data = ChatModeData() - assertTrue(data.modes.isEmpty()) - } - - @Test - fun `ChatModeData serialization round-trip should preserve UUID-keyed map`() { - val original = - ChatModeData( - modes = - mapOf( - testUUID to ChatMode.CHANNEL, - testUUID2 to ChatMode.GLOBAL, - ), - ) - - val serialized = json.encodeToString(ChatModeData.serializer(), original) - val deserialized = json.decodeFromString(ChatModeData.serializer(), serialized) - - assertEquals(original.modes.size, deserialized.modes.size) - assertEquals(ChatMode.CHANNEL, deserialized.modes[testUUID]) - assertEquals(ChatMode.GLOBAL, deserialized.modes[testUUID2]) - } - - @Test - fun `ChatModeData serialized should contain UUID strings`() { - val data = ChatModeData(modes = mapOf(testUUID to ChatMode.GLOBAL)) - val serialized = json.encodeToString(ChatModeData.serializer(), data) - assertTrue(serialized.contains(testUUID.toString())) - } } 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 880db16..addc3a3 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 @@ -1,6 +1,5 @@ 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 @@ -36,7 +35,6 @@ class LunaticChat : lateinit var languageManager: LanguageManager var channelManager: ChannelManager? = null var channelMembershipManager: ChannelMembershipManager? = null - var chatModeManager: ChatModeManager? = null var channelMessageHandler: ChannelMessageHandler? = null var channelNotificationHandler: ChannelNotificationHandler? = null var velocityConnectionManager: VelocityConnectionManager? = null @@ -79,7 +77,6 @@ class LunaticChat : languageManager = services.languageManager channelManager = services.channelManager channelMembershipManager = services.channelMembershipManager - chatModeManager = services.chatModeManager channelMessageHandler = services.channelMessageHandler channelNotificationHandler = services.channelNotificationHandler velocityConnectionManager = services.velocityConnectionManager 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 5ca5e52..0607d82 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 @@ -1,6 +1,5 @@ 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 @@ -24,7 +23,6 @@ import dev.m1sk9.lunaticChat.paper.velocity.VelocityConnectionManager * @property romajiConverter Optional (only when Japanese conversion feature is enabled) * @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) * @property channelNotificationHandler Optional (only when channel chat feature is enabled) * @property velocityConnectionManager Optional (only when Velocity integration is enabled) @@ -37,7 +35,6 @@ data class ServiceContainer( val romajiConverter: RomanjiConverter? = null, val channelManager: ChannelManager? = null, val channelMembershipManager: ChannelMembershipManager? = null, - val chatModeManager: ChatModeManager? = null, val channelMessageHandler: ChannelMessageHandler? = null, val channelNotificationHandler: ChannelNotificationHandler? = null, val velocityConnectionManager: VelocityConnectionManager? = 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 b732a9e..606273b 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 @@ -1,8 +1,6 @@ package dev.m1sk9.lunaticChat.paper import dev.m1sk9.lunaticChat.engine.converter.GoogleIMEClient -import dev.m1sk9.lunaticChat.paper.chat.ChatModeManager -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.ChannelMessageLogger @@ -34,7 +32,6 @@ import kotlin.time.Duration.Companion.milliseconds private data class ChannelComponents( val channelManager: ChannelManager, val channelMembershipManager: ChannelMembershipManager, - val chatModeManager: ChatModeManager, val channelMessageHandler: ChannelMessageHandler, val channelNotificationHandler: ChannelNotificationHandler, ) @@ -54,7 +51,6 @@ class ServiceInitializer( private var conversionCache: ConversionCache? = null private var channelManager: ChannelManager? = null private var channelMembershipManager: ChannelMembershipManager? = null - private var chatModeManager: ChatModeManager? = null private var channelMessageHandler: ChannelMessageHandler? = null private var channelNotificationHandler: ChannelNotificationHandler? = null private var channelMessageLogger: ChannelMessageLogger? = null @@ -96,7 +92,7 @@ class ServiceInitializer( null } - // 4. Initialize channel manager, membership manager, chat mode manager, channel message handler, and notification handler + // 4. Initialize channel manager, membership manager, channel message handler, and notification handler val channelComponents = if (configuration.features.channelChat.enabled) { initializeChannelManager(playerSettingsManager, languageManager) @@ -105,7 +101,6 @@ class ServiceInitializer( } val channelManager = channelComponents?.channelManager val channelMembershipManager = channelComponents?.channelMembershipManager - val chatModeManager = channelComponents?.chatModeManager val channelMessageHandler = channelComponents?.channelMessageHandler val channelNotificationHandler = channelComponents?.channelNotificationHandler @@ -144,7 +139,6 @@ class ServiceInitializer( romajiConverter = romajiConverter, channelManager = channelManager, channelMembershipManager = channelMembershipManager, - chatModeManager = chatModeManager, channelMessageHandler = channelMessageHandler, channelNotificationHandler = channelNotificationHandler, velocityConnectionManager = velocityManager, @@ -213,7 +207,7 @@ class ServiceInitializer( } /** - * Initializes channel manager, membership manager, chat mode manager, channel message handler, and notification handler with storage. + * Initializes channel manager, membership manager, channel message handler, and notification handler with storage. */ private fun initializeChannelManager( settingsManager: PlayerSettingsManager, @@ -244,21 +238,6 @@ class ServiceInitializer( ) channelMembershipManager = membershipManager - val chatModeFile = plugin.dataFolder.resolve("chatmodes.json").toPath() - val chatModeStorage = - ChatModeStorage( - dataFile = chatModeFile, - logger = logger, - ) - - val chatMode = - ChatModeManager( - storage = chatModeStorage, - logger = logger, - ) - chatMode.initialize() - chatModeManager = chatMode - // Initialize channel message logger if enabled val messageLogger = if (configuration.features.channelChat.messageLogging.enabled) { @@ -302,13 +281,12 @@ class ServiceInitializer( channelNotificationHandler = notificationHandler logger.info( - "Channel manager, membership manager, chat mode manager, " + + "Channel manager, membership manager, " + "channel message handler, and notification handler initialized successfully.", ) return ChannelComponents( channelManager = manager, channelMembershipManager = membershipManager, - chatModeManager = chatMode, channelMessageHandler = messageHandler, channelNotificationHandler = notificationHandler, ) @@ -433,7 +411,6 @@ class ServiceInitializer( services.playerSettingsManager.saveToDisk() conversionCache?.saveToDisk() services.channelManager?.saveToDisk() - services.chatModeManager?.shutdown() channelMessageLogger?.shutdown() services.velocityConnectionManager?.shutdown() } diff --git a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/chat/ChatModeManager.kt b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/chat/ChatModeManager.kt deleted file mode 100644 index 93a7f04..0000000 --- a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/chat/ChatModeManager.kt +++ /dev/null @@ -1,103 +0,0 @@ -package dev.m1sk9.lunaticChat.paper.chat - -import dev.m1sk9.lunaticChat.engine.chat.ChatMode -import dev.m1sk9.lunaticChat.engine.chat.ChatModeData -import java.util.UUID -import java.util.concurrent.ConcurrentHashMap -import java.util.logging.Logger - -/** - * Manages player chat modes with persistence. - * - * Chat modes determine where player messages are sent by default. - * Modes are persisted across server restarts. - * - * @property storage Chat mode storage layer - * @property logger Logger for operations - */ -class ChatModeManager( - private val storage: ChatModeStorage, - private val logger: Logger, -) { - private val chatModes = ConcurrentHashMap() - - /** - * Initializes the manager by loading data from storage. - */ - fun initialize() { - val data = storage.loadFromDisk() - chatModes.putAll(data.modes) - logger.info("ChatModeManager initialized with ${chatModes.size} saved modes") - } - - /** - * Gets a player's current chat mode. - * - * @param playerId The player's UUID - * @return The player's chat mode, or DEFAULT if not set - */ - fun getChatMode(playerId: UUID): ChatMode = chatModes.getOrDefault(playerId, ChatMode.Companion.DEFAULT) - - /** - * Sets a player's chat mode. - * - * @param playerId The player's UUID - * @param mode The chat mode to set - */ - fun setChatMode( - playerId: UUID, - mode: ChatMode, - ) { - chatModes[playerId] = mode - saveToStorage() - } - - /** - * Toggles a player's chat mode between GLOBAL and CHANNEL. - * - * @param playerId The player's UUID - * @return The new chat mode after toggling - */ - fun toggleChatMode(playerId: UUID): ChatMode { - val currentMode = getChatMode(playerId) - val newMode = currentMode.toggle() - setChatMode(playerId, newMode) - return newMode - } - - /** - * Removes a player's chat mode setting (reverts to default). - * - * @param playerId The player's UUID - */ - fun removeChatMode(playerId: UUID) { - chatModes.remove(playerId) - saveToStorage() - } - - /** - * Saves current state to storage asynchronously. - */ - private fun saveToStorage() { - val data = ChatModeData(modes = chatModes.toMap()) - storage.queueAsyncSave(data) - } - - /** - * Forces a synchronous save to storage. - * Should only be called during plugin shutdown. - */ - fun saveToDisk() { - val data = ChatModeData(modes = chatModes.toMap()) - storage.saveToDisk(data) - } - - /** - * Shuts down the chat mode manager and its storage executor. - * Should be called during plugin disable to prevent thread leaks. - */ - fun shutdown() { - saveToDisk() - storage.shutdown() - } -} diff --git a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/chat/ChatModeStorage.kt b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/chat/ChatModeStorage.kt deleted file mode 100644 index 77fcdb3..0000000 --- a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/chat/ChatModeStorage.kt +++ /dev/null @@ -1,98 +0,0 @@ -package dev.m1sk9.lunaticChat.paper.chat - -import dev.m1sk9.lunaticChat.engine.chat.ChatModeData -import dev.m1sk9.lunaticChat.engine.exception.ChatModeStorageException -import kotlinx.serialization.json.Json -import java.nio.file.Path -import java.util.concurrent.Executors -import java.util.concurrent.TimeUnit -import java.util.logging.Logger -import kotlin.io.path.exists -import kotlin.io.path.readText -import kotlin.io.path.writeText - -/** - * Handles JSON storage for chat mode data. - * Provides async save queue and synchronous save for shutdown. - * - * @property dataFile Path to chatmodes.json - * @property logger Logger for operations - */ -class ChatModeStorage( - private val dataFile: Path, - private val logger: Logger, -) { - private val json = - Json { - prettyPrint = true - ignoreUnknownKeys = true - } - - private val saveExecutor = Executors.newSingleThreadExecutor() - - /** - * Loads chat mode data from disk. - * - * @return ChatModeData loaded from file, or empty data if file doesn't exist - * @throws ChatModeStorageException if loading fails - */ - fun loadFromDisk(): ChatModeData { - if (!dataFile.exists()) { - logger.info("Chat mode data file not found, starting with empty data") - return ChatModeData() - } - - return try { - val jsonContent = dataFile.readText() - json.decodeFromString(jsonContent) - } catch (e: Exception) { - throw ChatModeStorageException("Failed to load chat mode data from ${dataFile.fileName}", e) - } - } - - /** - * Queues an asynchronous save operation. - * - * @param data ChatModeData to save - */ - fun queueAsyncSave(data: ChatModeData) { - saveExecutor.submit { - try { - saveToDisk(data) - } catch (e: Exception) { - logger.severe("Failed to save chat mode data: ${e.message}") - } - } - } - - /** - * Saves chat mode data to disk synchronously. - * - * @param data ChatModeData to save - * @throws ChatModeStorageException if saving fails - */ - fun saveToDisk(data: ChatModeData) { - try { - val jsonContent = json.encodeToString(data) - dataFile.writeText(jsonContent) - } catch (e: Exception) { - throw ChatModeStorageException("Failed to save chat mode data to ${dataFile.fileName}", e) - } - } - - /** - * Shuts down the async save executor. - * Should be called during plugin disable. - */ - fun shutdown() { - saveExecutor.shutdown() - try { - if (!saveExecutor.awaitTermination(5, TimeUnit.SECONDS)) { - saveExecutor.shutdownNow() - } - } catch (e: InterruptedException) { - saveExecutor.shutdownNow() - Thread.currentThread().interrupt() - } - } -} diff --git a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/command/impl/lc/ChatModeCommand.kt b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/command/impl/lc/ChatModeCommand.kt deleted file mode 100644 index d0357f6..0000000 --- a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/command/impl/lc/ChatModeCommand.kt +++ /dev/null @@ -1,86 +0,0 @@ -package dev.m1sk9.lunaticChat.paper.command.impl.lc - -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.ChatModeManager -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.impl.lc.chatmode.ChatModeToggleCommand -import dev.m1sk9.lunaticChat.paper.i18n.LanguageManager -import dev.m1sk9.lunaticChat.paper.i18n.MessageFormatter -import io.papermc.paper.command.brigadier.CommandSourceStack -import io.papermc.paper.command.brigadier.Commands -import net.kyori.adventure.text.Component -import net.kyori.adventure.text.format.NamedTextColor - -@PlayerOnly -class ChatModeCommand( - plugin: LunaticChat, - private val chatModeManager: ChatModeManager, - private val languageManager: LanguageManager, -) : LunaticCommand(plugin) { - fun buildWithPermissionCheck(): LiteralArgumentBuilder { - val builder = build() - return applyMethodPermission("build", builder) - } - - @Permission(LunaticChatPermissionNode.ChatMode::class) - fun build(): LiteralArgumentBuilder { - val chatModeCommand = Commands.literal("chatmode") - - // Add toggle subcommand - chatModeCommand.then( - ChatModeToggleCommand( - plugin, - chatModeManager, - languageManager, - ).buildWithPermissionCheck(), - ) - - // Default behavior: show current chat mode - chatModeCommand.executes { ctx -> - val context = wrapContext(ctx) - checkPlayerOnly(context)?.let { return@executes handleResult(context, it) } - - val result = showCurrentMode(context) - handleResult(context, result) - } - - return chatModeCommand - } - - private fun showCurrentMode(ctx: CommandContext): CommandResult { - val sender = ctx.requirePlayer() - val currentMode = chatModeManager.getChatMode(sender.uniqueId) - - val modeKey = - when (currentMode) { - dev.m1sk9.lunaticChat.engine.chat.ChatMode.GLOBAL -> "chatmode.mode.global" - dev.m1sk9.lunaticChat.engine.chat.ChatMode.CHANNEL -> "chatmode.mode.channel" - } - - val modeColor = - when (currentMode) { - dev.m1sk9.lunaticChat.engine.chat.ChatMode.GLOBAL -> NamedTextColor.GREEN - dev.m1sk9.lunaticChat.engine.chat.ChatMode.CHANNEL -> NamedTextColor.AQUA - } - - sender.sendMessage( - MessageFormatter - .format( - languageManager.getMessage("chatmode.current") + ": ", - ).append(Component.text(languageManager.getMessage(modeKey), modeColor)), - ) - - return CommandResult.Success - } - - override fun buildCommand(): LiteralArgumentBuilder = - throw UnsupportedOperationException( - "Should use build() method instead of buildCommand()", - ) -} diff --git a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/command/impl/lc/LunaticChatCommand.kt b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/command/impl/lc/LunaticChatCommand.kt index d945737..cd3b33d 100644 --- a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/command/impl/lc/LunaticChatCommand.kt +++ b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/command/impl/lc/LunaticChatCommand.kt @@ -68,17 +68,6 @@ class LunaticChatCommand( } } - // Add chatmode command if chat mode manager is available - plugin.chatModeManager?.let { chatModeManager -> - command.then( - ChatModeCommand( - plugin, - chatModeManager, - languageManager, - ).buildWithPermissionCheck(), - ) - } - return command } } diff --git a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/command/impl/lc/chatmode/ChatModeToggleCommand.kt b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/command/impl/lc/chatmode/ChatModeToggleCommand.kt deleted file mode 100644 index e447639..0000000 --- a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/command/impl/lc/chatmode/ChatModeToggleCommand.kt +++ /dev/null @@ -1,71 +0,0 @@ -package dev.m1sk9.lunaticChat.paper.command.impl.lc.chatmode - -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.ChatModeManager -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.i18n.LanguageManager -import dev.m1sk9.lunaticChat.paper.i18n.MessageFormatter -import io.papermc.paper.command.brigadier.CommandSourceStack -import io.papermc.paper.command.brigadier.Commands -import net.kyori.adventure.text.Component -import net.kyori.adventure.text.format.NamedTextColor - -@PlayerOnly -class ChatModeToggleCommand( - plugin: LunaticChat, - private val chatModeManager: ChatModeManager, - private val languageManager: LanguageManager, -) : LunaticCommand(plugin) { - fun buildWithPermissionCheck(): LiteralArgumentBuilder { - val builder = build() - return applyMethodPermission("build", builder) - } - - @Permission(LunaticChatPermissionNode.ChatModeToggle::class) - fun build(): LiteralArgumentBuilder = - Commands.literal("toggle").executes { ctx -> - val context = wrapContext(ctx) - checkPlayerOnly(context)?.let { return@executes handleResult(context, it) } - - val result = execute(context) - handleResult(context, result) - } - - internal fun execute(ctx: CommandContext): CommandResult { - val sender = ctx.requirePlayer() - val newMode = chatModeManager.toggleChatMode(sender.uniqueId) - - val modeKey = - when (newMode) { - dev.m1sk9.lunaticChat.engine.chat.ChatMode.GLOBAL -> "chatmode.mode.global" - dev.m1sk9.lunaticChat.engine.chat.ChatMode.CHANNEL -> "chatmode.mode.channel" - } - - val modeColor = - when (newMode) { - dev.m1sk9.lunaticChat.engine.chat.ChatMode.GLOBAL -> NamedTextColor.GREEN - dev.m1sk9.lunaticChat.engine.chat.ChatMode.CHANNEL -> NamedTextColor.AQUA - } - - sender.sendMessage( - Component - .text() - .append(MessageFormatter.formatSuccess(languageManager.getMessage("chatmode.toggle.success") + ": ")) - .append(Component.text(languageManager.getMessage(modeKey), modeColor)) - .build(), - ) - - return CommandResult.Success - } - - override fun buildCommand(): LiteralArgumentBuilder = - throw UnsupportedOperationException( - "ChatModeToggleCommand should use build() method instead of buildCommand()", - ) -} 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 2bdca37..84040b6 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 @@ -37,19 +37,15 @@ object EventListenerRegistry { languageManager = services.languageManager, updateCheckerFlag = updateAvailable, playerSettingsManager = services.playerSettingsManager, - chatModeManager = services.chatModeManager, channelManager = services.channelManager, ), plugin, ) // Register chat listener when channel chat is enabled OR velocity cross-server chat is enabled - // Channel-related services (chatModeManager, channelManager, channelMessageHandler) can be null - // when channel chat is disabled, but cross-server chat can still work val shouldRegisterChatListener = ( - services.chatModeManager != null && - services.channelManager != null && + services.channelManager != null && services.channelMessageHandler != null ) || ( @@ -60,7 +56,6 @@ object EventListenerRegistry { if (shouldRegisterChatListener) { pluginManager.registerEvents( PlayerChatListener( - chatModeManager = services.chatModeManager, channelManager = services.channelManager, channelMessageHandler = services.channelMessageHandler, romajiConverter = services.romajiConverter, 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 8a07336..19b284b 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,7 +1,5 @@ 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.channel.ChannelManager import dev.m1sk9.lunaticChat.paper.chat.handler.ChannelMessageHandler import dev.m1sk9.lunaticChat.paper.config.LunaticChatConfiguration @@ -17,7 +15,6 @@ import org.bukkit.event.EventPriority import org.bukkit.event.Listener class PlayerChatListener( - private val chatModeManager: ChatModeManager?, private val channelManager: ChannelManager?, private val channelMessageHandler: ChannelMessageHandler?, private val romajiConverter: RomanjiConverter?, @@ -61,7 +58,7 @@ class PlayerChatListener( val originalMessage = plainTextSerializer.serialize(event.message()) - // Handle chat mode switching with '!' prefix + // Handle '!' prefix for global chat override val hasPrefix = originalMessage.startsWith('!') val messageWithoutPrefix = if (hasPrefix) { @@ -75,19 +72,6 @@ class PlayerChatListener( return } - val effectiveMode = - if (chatModeManager != null) { - if (hasPrefix) { - val currentMode = chatModeManager.getChatMode(player.uniqueId) - currentMode.toggle() - } else { - chatModeManager.getChatMode(player.uniqueId) - } - } else { - // Default to GLOBAL when chatModeManager is not available - ChatMode.GLOBAL - } - val displayMessage = if (settings.japaneseConversionEnabled && romajiConverter != null) { convertWithRomaji(messageWithoutPrefix, romajiConverter) @@ -95,34 +79,25 @@ class PlayerChatListener( messageWithoutPrefix } - // Route message based on chat mode - when (effectiveMode) { - ChatMode.GLOBAL -> { - handleGlobalChat(event, displayMessage) - } - ChatMode.CHANNEL -> { - // Channel chat requires channelManager and channelMessageHandler - if (channelManager != null && channelMessageHandler != null) { - val hasActiveChannel = channelManager.getPlayerChannel(player.uniqueId) != null + // Determine if the player has an active channel + val hasActiveChannel = channelManager?.getPlayerChannel(player.uniqueId) != null - if (hasActiveChannel) { - // Cancel event and clear all data to prevent other plugins from capturing it - // Even MONITOR priority listeners with ignoreCancelled=false won't get useful data - // Message will be delivered by ChannelMessageHandler instead - // Logging is handled by our own ChannelMessageLogger - event.isCancelled = true - event.viewers().clear() - event.message(Component.empty()) - channelMessageHandler.sendChannelMessage(player, displayMessage) - } else { - // Auto-fallback to global chat (with Velocity support if enabled) - handleGlobalChat(event, displayMessage) - } + when { + hasActiveChannel && !hasPrefix -> { + // Channel chat: player is in a channel and no '!' prefix + if (channelManager != null && channelMessageHandler != null) { + event.isCancelled = true + event.viewers().clear() + event.message(Component.empty()) + channelMessageHandler.sendChannelMessage(player, displayMessage) } else { - // Channel chat not available, fallback to global chat (with Velocity support if enabled) handleGlobalChat(event, displayMessage) } } + else -> { + // Global chat: player has no active channel, or used '!' prefix to override + handleGlobalChat(event, displayMessage) + } } } } diff --git a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/listener/PlayerPresenceListener.kt b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/listener/PlayerPresenceListener.kt index f4343b6..3979246 100644 --- a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/listener/PlayerPresenceListener.kt +++ b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/listener/PlayerPresenceListener.kt @@ -1,9 +1,7 @@ package dev.m1sk9.lunaticChat.paper.listener -import dev.m1sk9.lunaticChat.engine.chat.ChatMode import dev.m1sk9.lunaticChat.engine.permission.LunaticChatPermissionNode import dev.m1sk9.lunaticChat.paper.LunaticChat -import dev.m1sk9.lunaticChat.paper.chat.ChatModeManager import dev.m1sk9.lunaticChat.paper.chat.channel.ChannelManager import dev.m1sk9.lunaticChat.paper.common.hasAnyPermission import dev.m1sk9.lunaticChat.paper.i18n.LanguageManager @@ -21,7 +19,6 @@ class PlayerPresenceListener( private val languageManager: LanguageManager, private val updateCheckerFlag: AtomicBoolean, private val playerSettingsManager: PlayerSettingsManager, - private val chatModeManager: ChatModeManager? = null, private val channelManager: ChannelManager? = null, ) : Listener { @EventHandler(ignoreCancelled = true) @@ -37,23 +34,6 @@ class PlayerPresenceListener( ) } - // Send chat mode notification - chatModeManager?.let { manager -> - val chatMode = manager.getChatMode(player.uniqueId) - val modeKey = - when (chatMode) { - ChatMode.GLOBAL -> "chatmode.mode.global" - ChatMode.CHANNEL -> "chatmode.mode.channel" - } - val modeText = languageManager.getMessage(modeKey) - val notification = - languageManager.getMessage( - "chatmode.notification.login", - mapOf("mode" to modeText), - ) - player.sendMessage(MessageFormatter.format(notification)) - } - // Send channel notification if in a channel channelManager?.let { manager -> val context = manager.getPlayerChannelContext(player.uniqueId) @@ -81,10 +61,7 @@ class PlayerPresenceListener( // 2. Clear active channel for this player channelManager?.setPlayerChannel(playerId, null) - // 3. Trigger async save of chat mode data - chatModeManager?.saveToDisk() - - // 4. Trigger async save of player settings + // 3. Trigger async save of player settings playerSettingsManager.saveToDisk() } } diff --git a/platform-paper/src/main/resources/languages/en.yml b/platform-paper/src/main/resources/languages/en.yml index 1275ce5..d932105 100644 --- a/platform-paper/src/main/resources/languages/en.yml +++ b/platform-paper/src/main/resources/languages/en.yml @@ -195,16 +195,6 @@ channel: receivedOwnership: "You are now the owner of {channel} (previously owned by {previousOwner})" error: "Failed to transfer ownership" -chatmode: - current: "Current chat mode" - mode: - global: "GLOBAL" - channel: "CHANNEL" - toggle: - success: "Chat mode switched to" - notification: - login: "Current chat mode: {mode}" - general: playerOnlyCommand: "This command can only be executed by players." newUpdateAvailable: "The new version of LunaticChat is now available! You can download it from GitHub or Modrinth." diff --git a/platform-paper/src/main/resources/languages/ja.yml b/platform-paper/src/main/resources/languages/ja.yml index f2d4ae6..fbf09f9 100644 --- a/platform-paper/src/main/resources/languages/ja.yml +++ b/platform-paper/src/main/resources/languages/ja.yml @@ -195,16 +195,6 @@ channel: receivedOwnership: "チャンネル {channel} のオーナーになりました (前のオーナー: {previousOwner})" error: "オーナー権限の譲渡に失敗しました" -chatmode: - current: "現在のチャットモード" - mode: - global: "グローバル" - channel: "チャンネル" - toggle: - success: "チャットモードを切り替えました" - notification: - login: "現在のチャットモード: {mode}" - general: playerOnlyCommand: "このコマンドはプレイヤーのみが実行できます" newUpdateAvailable: "LunaticChat の新しいバージョンが利用可能です。GitHubまたはModrinthからダウンロードできます" diff --git a/platform-paper/src/test/kotlin/dev/m1sk9/lunaticChat/paper/chat/ChatModeManagerTest.kt b/platform-paper/src/test/kotlin/dev/m1sk9/lunaticChat/paper/chat/ChatModeManagerTest.kt deleted file mode 100644 index d548f60..0000000 --- a/platform-paper/src/test/kotlin/dev/m1sk9/lunaticChat/paper/chat/ChatModeManagerTest.kt +++ /dev/null @@ -1,223 +0,0 @@ -package dev.m1sk9.lunaticChat.paper.chat - -import dev.m1sk9.lunaticChat.engine.chat.ChatMode -import dev.m1sk9.lunaticChat.engine.chat.ChatModeData -import dev.m1sk9.lunaticChat.paper.TestUtils -import io.mockk.every -import io.mockk.mockk -import io.mockk.verify -import java.util.UUID -import kotlin.test.Test -import kotlin.test.assertEquals - -/** - * Tests for ChatModeManager. - * Verifies chat mode management, toggling, and persistence. - */ -class ChatModeManagerTest { - private fun createChatModeManager( - initialData: ChatModeData = ChatModeData(), - ): Triple { - val logger = TestUtils.TestLogger() - val storage = mockk(relaxed = true) - - every { storage.loadFromDisk() } returns initialData - - val manager = ChatModeManager(storage, logger) - return Triple(manager, storage, logger) - } - - @Test - fun `initialize should load data from storage`() { - val playerId = UUID.randomUUID() - val initialData = ChatModeData(modes = mapOf(playerId to ChatMode.CHANNEL)) - val (manager, _, logger) = createChatModeManager(initialData) - - manager.initialize() - - assertEquals(ChatMode.CHANNEL, manager.getChatMode(playerId)) - assert(logger.infoMessages.any { it.contains("ChatModeManager initialized with 1 saved modes") }) - } - - @Test - fun `getChatMode should return DEFAULT for unknown player`() { - val (manager, _, _) = createChatModeManager() - manager.initialize() - - val playerId = UUID.randomUUID() - val mode = manager.getChatMode(playerId) - - assertEquals(ChatMode.DEFAULT, mode) - assertEquals(ChatMode.GLOBAL, mode) // DEFAULT is GLOBAL - } - - @Test - fun `getChatMode should return set mode`() { - val (manager, _, _) = createChatModeManager() - manager.initialize() - - val playerId = UUID.randomUUID() - manager.setChatMode(playerId, ChatMode.CHANNEL) - - assertEquals(ChatMode.CHANNEL, manager.getChatMode(playerId)) - } - - @Test - fun `setChatMode should save to storage`() { - val (manager, storage, _) = createChatModeManager() - manager.initialize() - - val playerId = UUID.randomUUID() - manager.setChatMode(playerId, ChatMode.CHANNEL) - - verify(exactly = 1) { storage.queueAsyncSave(any()) } - } - - @Test - fun `toggleChatMode should switch from GLOBAL to CHANNEL`() { - val (manager, _, _) = createChatModeManager() - manager.initialize() - - val playerId = UUID.randomUUID() - // Initial mode is GLOBAL (default) - assertEquals(ChatMode.GLOBAL, manager.getChatMode(playerId)) - - val newMode = manager.toggleChatMode(playerId) - - assertEquals(ChatMode.CHANNEL, newMode) - assertEquals(ChatMode.CHANNEL, manager.getChatMode(playerId)) - } - - @Test - fun `toggleChatMode should switch from CHANNEL to GLOBAL`() { - val (manager, _, _) = createChatModeManager() - manager.initialize() - - val playerId = UUID.randomUUID() - manager.setChatMode(playerId, ChatMode.CHANNEL) - - val newMode = manager.toggleChatMode(playerId) - - assertEquals(ChatMode.GLOBAL, newMode) - assertEquals(ChatMode.GLOBAL, manager.getChatMode(playerId)) - } - - @Test - fun `toggleChatMode should persist changes`() { - val (manager, storage, _) = createChatModeManager() - manager.initialize() - - val playerId = UUID.randomUUID() - manager.toggleChatMode(playerId) - - verify(atLeast = 1) { storage.queueAsyncSave(any()) } - } - - @Test - fun `removeChatMode should revert to default`() { - val (manager, _, _) = createChatModeManager() - manager.initialize() - - val playerId = UUID.randomUUID() - manager.setChatMode(playerId, ChatMode.CHANNEL) - assertEquals(ChatMode.CHANNEL, manager.getChatMode(playerId)) - - manager.removeChatMode(playerId) - - assertEquals(ChatMode.GLOBAL, manager.getChatMode(playerId)) - } - - @Test - fun `removeChatMode should save to storage`() { - val (manager, storage, _) = createChatModeManager() - manager.initialize() - - val playerId = UUID.randomUUID() - manager.setChatMode(playerId, ChatMode.CHANNEL) - manager.removeChatMode(playerId) - - verify(atLeast = 2) { storage.queueAsyncSave(any()) } // Once for set, once for remove - } - - @Test - fun `saveToDisk should synchronously save`() { - val (manager, storage, _) = createChatModeManager() - manager.initialize() - - val playerId = UUID.randomUUID() - manager.setChatMode(playerId, ChatMode.CHANNEL) - manager.saveToDisk() - - verify { storage.saveToDisk(any()) } - } - - @Test - fun `shutdown should save and shutdown storage`() { - val (manager, storage, _) = createChatModeManager() - manager.initialize() - - manager.shutdown() - - verify { storage.saveToDisk(any()) } - verify { storage.shutdown() } - } - - @Test - fun `manager should handle multiple players independently`() { - val (manager, _, _) = createChatModeManager() - manager.initialize() - - val player1 = UUID.randomUUID() - val player2 = UUID.randomUUID() - - manager.setChatMode(player1, ChatMode.CHANNEL) - manager.setChatMode(player2, ChatMode.GLOBAL) - - assertEquals(ChatMode.CHANNEL, manager.getChatMode(player1)) - assertEquals(ChatMode.GLOBAL, manager.getChatMode(player2)) - } - - @Test - fun `manager should support rapid mode changes`() { - val (manager, storage, _) = createChatModeManager() - manager.initialize() - - val playerId = UUID.randomUUID() - - // Toggle multiple times - manager.toggleChatMode(playerId) // GLOBAL -> CHANNEL - manager.toggleChatMode(playerId) // CHANNEL -> GLOBAL - manager.toggleChatMode(playerId) // GLOBAL -> CHANNEL - - assertEquals(ChatMode.CHANNEL, manager.getChatMode(playerId)) - verify(atLeast = 3) { storage.queueAsyncSave(any()) } - } - - @Test - fun `manager should handle empty initial data`() { - val (manager, _, logger) = createChatModeManager(ChatModeData()) - manager.initialize() - - assert(logger.infoMessages.any { it.contains("ChatModeManager initialized with 0 saved modes") }) - } - - @Test - fun `manager should restore modes after initialization`() { - val player1 = TestUtils.createTestUUID(1) - val player2 = TestUtils.createTestUUID(2) - val initialData = - ChatModeData( - modes = - mapOf( - player1 to ChatMode.CHANNEL, - player2 to ChatMode.GLOBAL, - ), - ) - - val (manager, _, _) = createChatModeManager(initialData) - manager.initialize() - - assertEquals(ChatMode.CHANNEL, manager.getChatMode(player1)) - assertEquals(ChatMode.GLOBAL, manager.getChatMode(player2)) - } -} diff --git a/platform-paper/src/test/kotlin/dev/m1sk9/lunaticChat/paper/command/impl/lc/chatmode/ChatModeToggleCommandTest.kt b/platform-paper/src/test/kotlin/dev/m1sk9/lunaticChat/paper/command/impl/lc/chatmode/ChatModeToggleCommandTest.kt deleted file mode 100644 index d43c867..0000000 --- a/platform-paper/src/test/kotlin/dev/m1sk9/lunaticChat/paper/command/impl/lc/chatmode/ChatModeToggleCommandTest.kt +++ /dev/null @@ -1,88 +0,0 @@ -package dev.m1sk9.lunaticChat.paper.command.impl.lc.chatmode - -import dev.m1sk9.lunaticChat.engine.chat.ChatMode -import dev.m1sk9.lunaticChat.engine.command.CommandResult -import dev.m1sk9.lunaticChat.paper.LunaticChat -import dev.m1sk9.lunaticChat.paper.TestUtils -import dev.m1sk9.lunaticChat.paper.chat.ChatModeManager -import dev.m1sk9.lunaticChat.paper.command.core.CommandContext -import dev.m1sk9.lunaticChat.paper.i18n.LanguageManager -import io.mockk.every -import io.mockk.mockk -import io.mockk.verify -import net.kyori.adventure.text.Component -import java.util.UUID -import kotlin.test.Test -import kotlin.test.assertIs - -class ChatModeToggleCommandTest { - private val testUUID = UUID.fromString("00000001-0000-0000-0000-000000000000") - - private fun createDependencies(): TestDeps { - val plugin = mockk(relaxed = true) - val chatModeManager = mockk(relaxed = true) - val languageManager = mockk(relaxed = true) - every { languageManager.getMessage(any(), any()) } returns "test message" - - val mockPlayer = TestUtils.createMockPlayer(uuid = testUUID, name = "Player1") - val ctx = mockk(relaxed = true) - every { ctx.requirePlayer() } returns mockPlayer - - val command = ChatModeToggleCommand(plugin, chatModeManager, languageManager) - return TestDeps(command, ctx, chatModeManager, languageManager, mockPlayer) - } - - private data class TestDeps( - val command: ChatModeToggleCommand, - val ctx: CommandContext, - val chatModeManager: ChatModeManager, - val languageManager: LanguageManager, - val mockPlayer: org.bukkit.entity.Player, - ) - - @Test - fun `execute should toggle to CHANNEL mode`() { - val deps = createDependencies() - - every { deps.chatModeManager.toggleChatMode(testUUID) } returns ChatMode.CHANNEL - - val result = deps.command.execute(deps.ctx) - - assertIs(result) - verify { deps.chatModeManager.toggleChatMode(testUUID) } - } - - @Test - fun `execute should toggle to GLOBAL mode`() { - val deps = createDependencies() - - every { deps.chatModeManager.toggleChatMode(testUUID) } returns ChatMode.GLOBAL - - val result = deps.command.execute(deps.ctx) - - assertIs(result) - verify { deps.chatModeManager.toggleChatMode(testUUID) } - } - - @Test - fun `execute should send message to player`() { - val deps = createDependencies() - - every { deps.chatModeManager.toggleChatMode(testUUID) } returns ChatMode.CHANNEL - - deps.command.execute(deps.ctx) - - verify { deps.mockPlayer.sendMessage(any()) } - } - - @Test - fun `execute should return Success`() { - val deps = createDependencies() - - every { deps.chatModeManager.toggleChatMode(testUUID) } returns ChatMode.GLOBAL - - val result = deps.command.execute(deps.ctx) - - assertIs(result) - } -} -- cgit v1.2.1 From 36f25c7878ac71444d712af7cca8e785ee07a719 Mon Sep 17 00:00:00 2001 From: Sho Sakuma Date: Tue, 17 Mar 2026 20:35:18 +0900 Subject: docs: remove chatmode documentation and update channel chat pages --- docs/.vitepress/config/en.ts | 8 ------ docs/.vitepress/config/ja.ts | 8 ------ docs/src/admin-guide/permissions.md | 12 --------- docs/src/en/admin-guide/permissions.md | 12 --------- docs/src/en/player-guide/channel-chat/about.md | 15 ++++++------ docs/src/en/player-guide/channel-chat/chatmode.md | 30 ----------------------- docs/src/en/player-guide/commands/lc/chatmode.md | 17 ------------- docs/src/player-guide/channel-chat/about.md | 15 ++++++------ docs/src/player-guide/channel-chat/chatmode.md | 30 ----------------------- docs/src/player-guide/commands/lc/chatmode.md | 17 ------------- 10 files changed, 14 insertions(+), 150 deletions(-) delete mode 100644 docs/src/en/player-guide/channel-chat/chatmode.md delete mode 100644 docs/src/en/player-guide/commands/lc/chatmode.md delete mode 100644 docs/src/player-guide/channel-chat/chatmode.md delete mode 100644 docs/src/player-guide/commands/lc/chatmode.md diff --git a/docs/.vitepress/config/en.ts b/docs/.vitepress/config/en.ts index 6b1a18c..e528413 100644 --- a/docs/.vitepress/config/en.ts +++ b/docs/.vitepress/config/en.ts @@ -64,10 +64,6 @@ export const en: DefaultTheme.Config = { }, { items: [ - { - link: '/en/player-guide/channel-chat/chatmode', - text: 'Chat Mode', - }, { link: '/en/player-guide/channel-chat/private-channel', text: 'Private Channel', @@ -120,10 +116,6 @@ export const en: DefaultTheme.Config = { link: '/en/player-guide/commands/lc/channel', text: '/lc channel', }, - { - link: '/en/player-guide/commands/lc/chatmode', - text: '/lc chatmode', - }, ], text: '/lc', }, diff --git a/docs/.vitepress/config/ja.ts b/docs/.vitepress/config/ja.ts index 857c951..9b17835 100644 --- a/docs/.vitepress/config/ja.ts +++ b/docs/.vitepress/config/ja.ts @@ -64,10 +64,6 @@ export const ja: DefaultTheme.Config = { }, { items: [ - { - link: '/player-guide/channel-chat/chatmode', - text: 'チャットモード', - }, { link: '/player-guide/channel-chat/private-channel', text: 'プライベートチャンネル', @@ -112,10 +108,6 @@ export const ja: DefaultTheme.Config = { link: '/player-guide/commands/lc/channel', text: '/lc channel', }, - { - link: '/player-guide/commands/lc/chatmode', - text: '/lc chatmode', - }, ], text: '/lc', }, diff --git a/docs/src/admin-guide/permissions.md b/docs/src/admin-guide/permissions.md index a50d218..09d12d7 100644 --- a/docs/src/admin-guide/permissions.md +++ b/docs/src/admin-guide/permissions.md @@ -148,18 +148,6 @@ LunaticChat のアップデート通知を受け取ります. [`/lc channel ownership`](../player-guide/commands/lc/channel.md) コマンドの使用を切り替えます. -### `lunaticchat.command.lc.chatmode` - -- Default: `non OP` - -[`/lc chatmode`](../player-guide/commands/lc/chatmode.md) コマンドの使用を切り替えます. - -### `lunaticchat.command.lc.chatmode.toggle` - -- Default: `non OP` - -[`/lc chatmode toggle`](../player-guide/commands/lc/chatmode.md) コマンドの使用を切り替えます. - ### `lunaticchat.command.lcv.status` - Default: `OP` diff --git a/docs/src/en/admin-guide/permissions.md b/docs/src/en/admin-guide/permissions.md index 6bb8172..dd70b0e 100644 --- a/docs/src/en/admin-guide/permissions.md +++ b/docs/src/en/admin-guide/permissions.md @@ -148,18 +148,6 @@ Toggles the use of the [`/lc channel mod`](../player-guide/commands/lc/channel.m Toggles the use of the [`/lc channel ownership`](../player-guide/commands/lc/channel.md) command. -### `lunaticchat.command.lc.chatmode` - -- Default: `non OP` - -Toggles the use of the [`/lc chatmode`](../player-guide/commands/lc/chatmode.md) command. - -### `lunaticchat.command.lc.chatmode.toggle` - -- Default: `non OP` - -Toggles the use of the [`/lc chatmode toggle`](../player-guide/commands/lc/chatmode.md) command. - ### `lunaticchat.command.lcv.status` - Default: `OP` diff --git a/docs/src/en/player-guide/channel-chat/about.md b/docs/src/en/player-guide/channel-chat/about.md index 2e7ab58..404075d 100644 --- a/docs/src/en/player-guide/channel-chat/about.md +++ b/docs/src/en/player-guide/channel-chat/about.md @@ -69,7 +69,7 @@ To join a created channel, use the [`/lc channel join`](../commands/lc/channel.m /lc channel join ``` -When you join a channel, your chat mode will switch from global chat to channel chat. +When you join a channel, all your chat messages will be visible only to players in that channel. ## Viewing the Channel List @@ -81,16 +81,15 @@ To view the list of channels you can join, use the [`/lc channel list`](../comma A list of available channels will be displayed in the chat. You can click on them or use the [`/lc channel join`](#joining-a-channel) command to join a channel. -## Chat Modes +## Sending to Global Chat -In LunaticChat, there are two types of chat modes for players when sending chat messages: +While in a channel, all your chat messages are visible only to players in that channel. -1. Global chat mode: Share chat with all players. -2. Channel chat mode: Share chat with players in a specific channel you have joined. +To temporarily send a message to global chat, prefix your message with `!`. -Channel chat primarily uses chat mode `2`. - -For more details, see [here](./chatmode.md). +``` +!Hello everyone, how are you? +``` ## Difference Between Active Channel and Membership Status diff --git a/docs/src/en/player-guide/channel-chat/chatmode.md b/docs/src/en/player-guide/channel-chat/chatmode.md deleted file mode 100644 index 02d6a18..0000000 --- a/docs/src/en/player-guide/channel-chat/chatmode.md +++ /dev/null @@ -1,30 +0,0 @@ -# Chat Mode - -Chat mode refers to the mode in which players send chat messages in LunaticChat. LunaticChat has the following two types of chat modes: - -1. Global chat mode: Share chat with all players. -2. Channel chat mode: Share chat with players in a specific channel you have joined. - -## Channel Chat Mode - -While in channel chat mode, all chat messages are displayed only to players in the channel you have joined and will not be displayed in global chat. - -::: tip Temporarily Send to Global Chat - -If you want to temporarily send a message to global chat while in channel chat mode, prefix your message with `!`. - -``` -!Hello everyone, how are you? -``` - -::: - -## Global Chat Mode - -While in global chat mode, you share chat with all players on the server. It functions the same as normal Minecraft chat. - -## Temporarily Switching Chat Modes - -To temporarily switch chat modes, use the `/chatmode toggle` command. - -When you switch using this command, you can change chat modes without joining or leaving channels. diff --git a/docs/src/en/player-guide/commands/lc/chatmode.md b/docs/src/en/player-guide/commands/lc/chatmode.md deleted file mode 100644 index 97472be..0000000 --- a/docs/src/en/player-guide/commands/lc/chatmode.md +++ /dev/null @@ -1,17 +0,0 @@ -# /lc chatmode - -### `/lc chatmode` - -| Permission | -| --------------------------------- | -| `lunaticchat.command.lc.chatmode` | - -Displays the current chat mode. - -### `/lc chatmode toggle` - -| Permission | -| ---------------------------------------- | -| `lunaticchat.command.lc.chatmode.toggle` | - -Toggles the chat mode. diff --git a/docs/src/player-guide/channel-chat/about.md b/docs/src/player-guide/channel-chat/about.md index 5c5f73a..dfbee07 100644 --- a/docs/src/player-guide/channel-chat/about.md +++ b/docs/src/player-guide/channel-chat/about.md @@ -61,7 +61,7 @@ 作成されたチャンネルに参加するには,[`/lc channel join`](../commands/lc/channel.md#lc-channel-join-チャンネルid) コマンドを使用します. -チャンネルに参加すると,チャットモードが全体チャットからチャンネルチャットに切り替わります. +チャンネルに参加すると,チャットがチャンネル内のプレイヤーのみに表示されるようになります. ``` /lc channel join <チャンネルID> @@ -77,16 +77,15 @@ /lc channel list ``` -## チャットモード +## 全体チャットへの送信 -LunaticChat では,プレイヤーがチャットを送信する際のモードとして,以下の2種類のチャットモードが存在します: +チャンネルに参加中は,すべてのチャットがチャンネル内のプレイヤーのみに表示されます. -1. 全体チャットモード: すべてのプレイヤーとチャットを共有します. -2. チャンネルチャットモード: 参加している特定のチャンネル内のプレイヤーとチャットを共有します. +一時的に全体チャットへ送信したい場合は,メッセージの先頭に `!` を付けて送信します. -チャンネルチャットでは主に `2` のチャットモードが使用されます. - -詳しくは [こちら](./chatmode.md) をご覧ください. +``` +!こんにちは、みんな元気? +``` ## アクティブチャンネルとメンバーシップ状態の違い diff --git a/docs/src/player-guide/channel-chat/chatmode.md b/docs/src/player-guide/channel-chat/chatmode.md deleted file mode 100644 index 9e2712d..0000000 --- a/docs/src/player-guide/channel-chat/chatmode.md +++ /dev/null @@ -1,30 +0,0 @@ -# チャットモード - -チャットモードは LunaticChat におけるプレイヤーがチャットを送信する際のモードを指します.LunaticChat では以下の2種類のチャットモードが存在します. - -1. 全体チャットモード: すべてのプレイヤーとチャットを共有します. -2. チャンネルチャットモード: 参加している特定のチャンネル内のプレイヤーとチャットを共有します. - -## チャットチャットモード - -チャンネルチャットモード中は,全てのチャットが参加しているチャンネルのプレイヤーのみに表示され,全体チャットには表示されません. - -::: tip 一時的に全体チャットを送信する - -チャンネルチャットモード中に,一時的に全体チャットを送信したい場合は,メッセージの先頭に `!` を付けて送信します. - -``` -!こんにちは、みんな元気? -``` - -::: - -## 全体チャットモード - -全体チャットモード中は,サーバー内のすべてのプレイヤーとチャットを共有します.通常の Minecraft チャットと同様の動作をします. - -## 一時的にチャットモードを切り替える - -チャットモードを一時的に切り替えるには,`/chatmode toggle` コマンドを使用します. - -このコマンドで切り替えた場合はチャンネルの入退出なしで,チャットモードを切り替えることができます. diff --git a/docs/src/player-guide/commands/lc/chatmode.md b/docs/src/player-guide/commands/lc/chatmode.md deleted file mode 100644 index 2b38be8..0000000 --- a/docs/src/player-guide/commands/lc/chatmode.md +++ /dev/null @@ -1,17 +0,0 @@ -# /lc chatmode - -### `/lc chatmode` - -| パーミッション | -| --------------------------------- | -| `lunaticchat.command.lc.chatmode` | - -現在のチャットモードを表示します. - -### `/lc chatmode toggle` - -| パーミッション | -| ---------------------------------------- | -| `lunaticchat.command.lc.chatmode.toggle` | - -チャットモードを切り替えます. -- cgit v1.2.1 From 1812e3558db357ddd21d3d2fd40df63b2a7f000a Mon Sep 17 00:00:00 2001 From: Sho Sakuma Date: Tue, 17 Mar 2026 21:54:05 +0900 Subject: feat: Remove permission --- docs/src/admin-guide/management-data.md | 18 +----------------- docs/src/en/admin-guide/management-data.md | 18 +----------------- platform-paper/src/main/resources/paper-plugin.yml | 4 ---- 3 files changed, 2 insertions(+), 38 deletions(-) diff --git a/docs/src/admin-guide/management-data.md b/docs/src/admin-guide/management-data.md index e557894..9255721 100644 --- a/docs/src/admin-guide/management-data.md +++ b/docs/src/admin-guide/management-data.md @@ -11,7 +11,6 @@ LunaticChat は、チャンネルデータや設定情報をローカルディスクに保存します. - `channels.json`: チャンネル情報を保存するファイルです. -- `chatmodes.json`: プレイヤーのチャットモード設定を保存するファイルです. - `conversion_cache.json`: チャンネル変換のキャッシュを保存するファイルです. - `player-settings.yaml`: プレイヤーごとの設定情報を保存するファイルです. @@ -23,7 +22,7 @@ LunaticChat のデータの安全性を確保するために,定期的にバ ### `channels.json` -`channels.json` ファイルは、LunaticChat が管理するチャンネルの情報を保存します.このファイルには,チャンネル名、参加者リスト、チャットモードなどの情報が含まれます. +`channels.json` ファイルは、LunaticChat が管理するチャンネルの情報を保存します.このファイルには,チャンネル名、参加者リストなどの情報が含まれます. ```json { @@ -52,21 +51,6 @@ LunaticChat のデータの安全性を確保するために,定期的にバ } ``` -### `chatmodes.json` - -`chatmodes.json` ファイルは、プレイヤーのチャットモード設定を保存します.このファイルには,プレイヤーごとのチャットモード情報が含まれます. - -```json -{ - "modes": { - "aed5efd4-551b-3965-bc28-ae21aa072a66": "CHANNEL", - "ceaea267-39dd-3bac-931c-761ada671ebe": "CHANNEL", - "a01e3843-e521-3998-958a-f459800e4d11": "CHANNEL", - "681f539b-8bb8-3f85-85e5-a2945f6c6539": "GLOBAL" - } -} -``` - ### `conversion_cache.json` `conversion_cache.json` ファイルは、チャンネル変換のキャッシュを保存します.このファイルには,プレイヤーごとのチャンネル変換情報が含まれます. diff --git a/docs/src/en/admin-guide/management-data.md b/docs/src/en/admin-guide/management-data.md index 3f09506..0255bf0 100644 --- a/docs/src/en/admin-guide/management-data.md +++ b/docs/src/en/admin-guide/management-data.md @@ -11,7 +11,6 @@ These data files are essential to the operation of LunaticChat. Direct editing m LunaticChat saves channel data and configuration information to local disk. - `channels.json`: Stores channel information. -- `chatmodes.json`: Stores player chat mode settings. - `conversion_cache.json`: Stores cache for channel conversion. - `player-settings.yaml`: Stores player-specific settings. @@ -23,7 +22,7 @@ To ensure the safety of your LunaticChat data, we recommend creating regular bac ### `channels.json` -The `channels.json` file stores information about channels managed by LunaticChat. This file contains information such as channel names, participant lists, and chat modes. +The `channels.json` file stores information about channels managed by LunaticChat. This file contains information such as channel names and participant lists. ```json { @@ -52,21 +51,6 @@ The `channels.json` file stores information about channels managed by LunaticCha } ``` -### `chatmodes.json` - -The `chatmodes.json` file stores player chat mode settings. This file contains chat mode information for each player. - -```json -{ - "modes": { - "aed5efd4-551b-3965-bc28-ae21aa072a66": "CHANNEL", - "ceaea267-39dd-3bac-931c-761ada671ebe": "CHANNEL", - "a01e3843-e521-3998-958a-f459800e4d11": "CHANNEL", - "681f539b-8bb8-3f85-85e5-a2945f6c6539": "GLOBAL" - } -} -``` - ### `conversion_cache.json` The `conversion_cache.json` file stores cache for channel conversion. This file contains channel conversion information for each player. diff --git a/platform-paper/src/main/resources/paper-plugin.yml b/platform-paper/src/main/resources/paper-plugin.yml index cd37c13..3300917 100644 --- a/platform-paper/src/main/resources/paper-plugin.yml +++ b/platform-paper/src/main/resources/paper-plugin.yml @@ -50,10 +50,6 @@ permissions: default: true lunaticchat.command.lc.channel.ownership: default: true - lunaticchat.command.lc.chatmode: - default: true - lunaticchat.command.lc.chatmode.toggle: - default: true lunaticchat.spy: default: op -- cgit v1.2.1 From 0686211f8c2f5cb7df782f16498826dc9a23612a Mon Sep 17 00:00:00 2001 From: Sho Sakuma Date: Tue, 17 Mar 2026 21:57:36 +0900 Subject: chore: Bump version --- CHANGELOG.md | 15 +++++++++++++-- build.gradle.kts | 2 +- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 30a5707..fff3c3b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,12 +9,23 @@ - Paper 26.1 (Minecraft 26.1) is now supported. - Support for Paper 1.21.X, Folia 1.21.X (and later) has been dropped. +## v0 + +### v0.11.0 + +#### Breaking Changes + +- We have removed the chat mode implementation. + - All chat messages sent after joining a channel will now appear in the channel chat. + +#### Features + +- We have added a notification that appears when you log in to the server while already in a channel. + #### Feature Improvements - Optimization of internal logic. -## v0 - ### v0.10.1 - Codecov was introduced to expand test coverage. diff --git a/build.gradle.kts b/build.gradle.kts index 3c993e0..9bda715 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -14,7 +14,7 @@ plugins { allprojects { group = "dev.m1sk9" - version = "0.10.2" + version = "0.11.0" repositories { mavenCentral() -- cgit v1.2.1