summaryrefslogtreecommitdiff
path: root/platform-paper/src
diff options
context:
space:
mode:
authorSho Sakuma <me@m1sk9.dev>2026-02-23 19:37:39 +0900
committerSho Sakuma <me@m1sk9.dev>2026-02-23 19:37:39 +0900
commit265b668a91e944d90d5e4654f2e9af85188c5135 (patch)
treef7ab29e1a7a24d33ccfed8c860e7ea9f81ef4146 /platform-paper/src
parentf56d42a478c0dfefe8b2a5d73e483d0ad11e1e89 (diff)
downloadLunaticChat-265b668a91e944d90d5e4654f2e9af85188c5135.tar.gz
LunaticChat-265b668a91e944d90d5e4654f2e9af85188c5135.tar.bz2
LunaticChat-265b668a91e944d90d5e4654f2e9af85188c5135.zip
feat: Add more status view to Status command
Diffstat (limited to 'platform-paper/src')
-rw-r--r--platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/BuildInfo.kt19
-rw-r--r--platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/LunaticChat.kt5
-rw-r--r--platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/command/impl/lc/LunaticChatCommand.kt3
-rw-r--r--platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/command/impl/lc/StatusCommand.kt111
-rw-r--r--platform-paper/src/main/resources/build-info.properties2
-rw-r--r--platform-paper/src/main/resources/languages/en.yml20
-rw-r--r--platform-paper/src/main/resources/languages/ja.yml19
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}"