diff options
| author | Sho Sakuma <me@m1sk9.dev> | 2026-02-23 19:37:39 +0900 |
|---|---|---|
| committer | Sho Sakuma <me@m1sk9.dev> | 2026-02-23 19:37:39 +0900 |
| commit | 265b668a91e944d90d5e4654f2e9af85188c5135 (patch) | |
| tree | f7ab29e1a7a24d33ccfed8c860e7ea9f81ef4146 /platform-paper/src | |
| parent | f56d42a478c0dfefe8b2a5d73e483d0ad11e1e89 (diff) | |
| download | LunaticChat-265b668a91e944d90d5e4654f2e9af85188c5135.tar.gz LunaticChat-265b668a91e944d90d5e4654f2e9af85188c5135.tar.bz2 LunaticChat-265b668a91e944d90d5e4654f2e9af85188c5135.zip | |
feat: Add more status view to Status command
Diffstat (limited to 'platform-paper/src')
7 files changed, 171 insertions, 8 deletions
diff --git a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/BuildInfo.kt b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/BuildInfo.kt new file mode 100644 index 0000000..5609fe9 --- /dev/null +++ b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/BuildInfo.kt @@ -0,0 +1,19 @@ +package dev.m1sk9.lunaticChat.paper + +import java.util.Properties + +object BuildInfo { + val version: String + val commitHash: String + + init { + val props = Properties() + BuildInfo::class.java.getResourceAsStream("/build-info.properties")?.use { + props.load(it) + } + version = props.getProperty("version", "unknown") + commitHash = props.getProperty("commit", "unknown") + } + + fun versionWithCommit(): String = "$version ($commitHash)" +} 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 42a4c86..880db16 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 @@ -21,6 +21,7 @@ import dev.m1sk9.lunaticChat.paper.config.ConfigManager import dev.m1sk9.lunaticChat.paper.config.LunaticChatConfiguration import dev.m1sk9.lunaticChat.paper.i18n.LanguageManager import dev.m1sk9.lunaticChat.paper.listener.EventListenerRegistry +import dev.m1sk9.lunaticChat.paper.velocity.VelocityConnectionManager import io.ktor.client.HttpClient import io.ktor.client.engine.cio.CIO import kotlinx.coroutines.launch @@ -38,6 +39,7 @@ class LunaticChat : var chatModeManager: ChatModeManager? = null var channelMessageHandler: ChannelMessageHandler? = null var channelNotificationHandler: ChannelNotificationHandler? = null + var velocityConnectionManager: VelocityConnectionManager? = null private lateinit var services: ServiceContainer private lateinit var configuration: LunaticChatConfiguration @@ -80,6 +82,7 @@ class LunaticChat : chatModeManager = services.chatModeManager channelMessageHandler = services.channelMessageHandler channelNotificationHandler = services.channelNotificationHandler + velocityConnectionManager = services.velocityConnectionManager // Schedule periodic tasks serviceInitializer.schedulePeriodicTasks() @@ -140,7 +143,7 @@ class LunaticChat : // Register core commands commandRegistry.registerAll( TellCommand(this, services.directMessageHandler, services.languageManager), - LunaticChatCommand(this, settingHandlerRegistry, services.languageManager), + LunaticChatCommand(this, settingHandlerRegistry, services.languageManager, configuration), ) // Conditionally register /reply command if quick replies are enabled 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 9f608d8..d945737 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 @@ -8,6 +8,7 @@ import dev.m1sk9.lunaticChat.paper.command.annotation.Permission import dev.m1sk9.lunaticChat.paper.command.annotation.PlayerOnly import dev.m1sk9.lunaticChat.paper.command.core.LunaticCommand import dev.m1sk9.lunaticChat.paper.command.setting.SettingHandlerRegistry +import dev.m1sk9.lunaticChat.paper.config.LunaticChatConfiguration import dev.m1sk9.lunaticChat.paper.i18n.LanguageManager import io.papermc.paper.command.brigadier.CommandSourceStack import io.papermc.paper.command.brigadier.Commands @@ -27,6 +28,7 @@ class LunaticChatCommand( plugin: LunaticChat, private val settingHandlerRegistry: SettingHandlerRegistry, private val languageManager: LanguageManager, + private val configuration: LunaticChatConfiguration, ) : LunaticCommand(plugin) { override val description: String get() = languageManager.getMessage("commandDescription.lc") @@ -45,6 +47,7 @@ class LunaticChatCommand( StatusCommand( plugin, languageManager, + configuration, ).buildWithPermissionCheck(), ) diff --git a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/command/impl/lc/StatusCommand.kt b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/command/impl/lc/StatusCommand.kt index 20971ee..a3dea37 100644 --- a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/command/impl/lc/StatusCommand.kt +++ b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/command/impl/lc/StatusCommand.kt @@ -3,21 +3,26 @@ 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.BuildInfo import dev.m1sk9.lunaticChat.paper.LunaticChat import dev.m1sk9.lunaticChat.paper.command.annotation.Permission import dev.m1sk9.lunaticChat.paper.command.core.CommandContext import dev.m1sk9.lunaticChat.paper.command.core.LunaticCommand +import dev.m1sk9.lunaticChat.paper.config.LunaticChatConfiguration import dev.m1sk9.lunaticChat.paper.i18n.LanguageManager import dev.m1sk9.lunaticChat.paper.i18n.MessageFormatter +import dev.m1sk9.lunaticChat.paper.velocity.VelocityConnectionManager 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.event.ClickEvent import net.kyori.adventure.text.event.HoverEvent +import net.kyori.adventure.text.format.NamedTextColor class StatusCommand( plugin: LunaticChat, private val languageManager: LanguageManager, + private val configuration: LunaticChatConfiguration, ) : LunaticCommand(plugin) { fun buildWithPermissionCheck(): LiteralArgumentBuilder<CommandSourceStack> { val builder = build() @@ -36,7 +41,57 @@ class StatusCommand( private fun execute(ctx: CommandContext): CommandResult { val sender = ctx.requirePlayer() - val meta = plugin.pluginMeta + val features = configuration.features + + // Version line with click-to-copy + val versionText = BuildInfo.versionWithCommit() + val versionLine = + MessageFormatter + .format( + languageManager.getMessage( + "status.runningVersion", + mapOf("version" to versionText), + ), + ).hoverEvent( + HoverEvent.showText( + Component.text(languageManager.getMessage("status.clickToCopy"), NamedTextColor.GRAY), + ), + ).clickEvent(ClickEvent.copyToClipboard(versionText)) + + // Health status + val velocityManager = plugin.velocityConnectionManager + val isDegraded = + features.velocityIntegration.enabled && + velocityManager != null && + velocityManager.getState() == VelocityConnectionManager.ConnectionState.FAILED + val healthLine = + if (isDegraded) { + Component + .text(" • ", NamedTextColor.GRAY) + .append(Component.text("${languageManager.getMessage("status.label.health")}: ", NamedTextColor.GRAY)) + .append(Component.text(languageManager.getMessage("status.health.degraded"), NamedTextColor.YELLOW)) + .hoverEvent( + HoverEvent.showText( + Component.text(languageManager.getMessage("status.health.degradedHover"), NamedTextColor.YELLOW), + ), + ) + } else { + Component + .text(" • ", NamedTextColor.GRAY) + .append(Component.text("${languageManager.getMessage("status.label.health")}: ", NamedTextColor.GRAY)) + .append(Component.text(languageManager.getMessage("status.health.ok"), NamedTextColor.GREEN)) + } + + // Feature toggles + val featureEntries = + listOf( + "status.feature.quickReplies" to features.quickReplies.enabled, + "status.feature.japaneseConversion" to features.japaneseConversion.enabled, + "status.feature.channelChat" to features.channelChat.enabled, + "status.feature.velocityIntegration" to features.velocityIntegration.enabled, + ) + + // Configuration values val urls = mapOf( "GitHub" to "https://github.com/m1sk9/LunaticChat", @@ -45,21 +100,65 @@ class StatusCommand( ) sender.apply { + sendMessage(versionLine) + sendMessage(healthLine) + + // --- Features --- sendMessage( - MessageFormatter - .format( - languageManager.getMessage("status.runningVersion", mapOf("version" to meta.version)), - ).hoverEvent(HoverEvent.showText(Component.text(languageManager.getMessage("status.hover")))), + Component + .text(" ", NamedTextColor.GRAY) + .append(Component.text(languageManager.getMessage("status.label.features"), NamedTextColor.GRAY)), ) + featureEntries.forEach { (key, enabled) -> + sendMessage(getToggleLine(languageManager.getMessage(key), enabled)) + } + // --- Configuration --- + sendMessage( + Component + .text(" ", NamedTextColor.GRAY) + .append(Component.text(languageManager.getMessage("status.label.config"), NamedTextColor.GRAY)), + ) + sendMessage(getToggleLine(languageManager.getMessage("status.config.debug"), configuration.debug)) + sendMessage(getToggleLine(languageManager.getMessage("status.config.checkForUpdates"), configuration.checkForUpdates)) + sendMessage( + Component + .text(" • ", NamedTextColor.GRAY) + .append(Component.text("${languageManager.getMessage("status.config.language")}: ", NamedTextColor.GRAY)) + .append(Component.text(configuration.language.code, NamedTextColor.AQUA)), + ) + + // Links urls.forEach { (label, url) -> - sendMessage(Component.text("§b$label: §r$url").clickEvent(ClickEvent.openUrl(url))) + sendMessage( + Component + .text(" • ", NamedTextColor.GRAY) + .append(Component.text("$label: ", NamedTextColor.AQUA)) + .append(Component.text(url, NamedTextColor.WHITE)) + .hoverEvent( + HoverEvent.showText( + Component.text(languageManager.getMessage("status.clickToOpen"), NamedTextColor.GRAY), + ), + ).clickEvent(ClickEvent.openUrl(url)), + ) } } return CommandResult.Success } + private fun getToggleLine( + label: String, + enabled: Boolean, + ): Component { + val toggleText = languageManager.getMessage(if (enabled) "toggle.on" else "toggle.off") + val color = if (enabled) NamedTextColor.GREEN else NamedTextColor.GRAY + return Component + .text(" • ", NamedTextColor.GRAY) + .append(Component.text("$label: ", NamedTextColor.GRAY)) + .append(Component.text(toggleText, color)) + } + override fun buildCommand(): LiteralArgumentBuilder<CommandSourceStack> = throw UnsupportedOperationException( "Should use build() method instead of buildCommand()", diff --git a/platform-paper/src/main/resources/build-info.properties b/platform-paper/src/main/resources/build-info.properties new file mode 100644 index 0000000..f093468 --- /dev/null +++ b/platform-paper/src/main/resources/build-info.properties @@ -0,0 +1,2 @@ +version=${version} +commit=${gitCommitHash} diff --git a/platform-paper/src/main/resources/languages/en.yml b/platform-paper/src/main/resources/languages/en.yml index e3dcf91..1275ce5 100644 --- a/platform-paper/src/main/resources/languages/en.yml +++ b/platform-paper/src/main/resources/languages/en.yml @@ -36,8 +36,26 @@ channelMessage: 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}" + clickToCopy: "Click to copy version" + clickToOpen: "Click to open" + label: + health: "Health" + features: "--- Features ---" + config: "--- Configuration ---" + feature: + quickReplies: "Quick Replies" + japaneseConversion: "Japanese Conversion" + channelChat: "Channel Chat" + velocityIntegration: "Velocity Integration" + config: + debug: "Debug Mode" + checkForUpdates: "Update Check" + language: "Language" + health: + ok: "OK" + degraded: "Degraded" + degradedHover: "Velocity integration is enabled but the connection failed. Use /lcv status for details." settings: availableValues: "Available settings value: {values}" diff --git a/platform-paper/src/main/resources/languages/ja.yml b/platform-paper/src/main/resources/languages/ja.yml index 892df41..f2d4ae6 100644 --- a/platform-paper/src/main/resources/languages/ja.yml +++ b/platform-paper/src/main/resources/languages/ja.yml @@ -37,6 +37,25 @@ channelMessage: status: runningVersion: "LunaticChat v{version} が使用されています" + clickToCopy: "クリックしてバージョンをコピー" + clickToOpen: "クリックして開く" + label: + health: "ヘルス" + features: "--- 機能 ---" + config: "--- 設定 ---" + feature: + quickReplies: "クイックリプライ" + japaneseConversion: "かな・ローマ字変換" + channelChat: "チャンネルチャット" + velocityIntegration: "Velocity 連携" + config: + debug: "デバッグモード" + checkForUpdates: "アップデートチェック" + language: "言語" + health: + ok: "正常" + degraded: "問題あり" + degradedHover: "Velocity 連携が有効ですが接続に失敗しました。/lcv status を確認してください。" settings: availableValues: "使用可能な設定値: {values}" |
