package net.hareworks.simplymcdb.command import java.util.UUID import net.hareworks.kommand_lib.KommandLib import net.hareworks.kommand_lib.kommand import net.hareworks.simplymcdb.App import net.hareworks.simplymcdb.Config import net.hareworks.simplymcdb.State import net.hareworks.simplymcdb.database.Database import net.hareworks.simplymcdb.fetch import net.hareworks.simplymcdb.findPlayersNeedingMigration import net.hareworks.simplymcdb.isRegistered import net.hareworks.simplymcdb.overwritePlayerData import net.hareworks.simplymcdb.register import net.hareworks.simplymcdb.update import net.hareworks.simplymcdb.PlayerSerializer import net.kyori.adventure.audience.Audience import net.kyori.adventure.text.minimessage.MiniMessage import org.bukkit.entity.Player import org.bukkit.plugin.java.JavaPlugin private val miniMessage = MiniMessage.miniMessage() private val commandBuffer = mutableMapOf() public fun Audience.sendMM(message: String) { this.sendMessage(miniMessage.deserialize(message)) } private fun Audience.sendConfigHelp() { sendMM( "simplymcdb config helpreload: reload the config from config.ymlfetch: fetch the config from the databaseupload: upload the current config to the database") } public fun registerCommands(plugin: JavaPlugin): KommandLib = kommand(plugin) { command("smcdb") { description = "Control Simply-Minecraft-DB" permission = "simplydb.command" executes { sender.sendMessage("simplymcdb command") } literal("config") { requires("simplydb.command.config") executes { sender.sendConfigHelp() } literal("reload") { requires("simplydb.command.config.reload") executes { sender.sendMessage("reloading config...") Config.reload() sender.sendMessage("reloaded.") } } literal("fetch") { requires("simplydb.command.config.fetch") executes { sender.sendMessage("fetching config...") } } literal("upload") { requires("simplydb.command.config.upload") executes { sender.sendMessage("uploading config...") } } literal("help") { executes { sender.sendConfigHelp() } } } literal("help") { executes { sender.sendMM( "simplymcdb helpconfig: configre the pluginactivate: when the plugin is disabled, activate itdeactivate: when the plugin is enabled, deactivate it") } } literal("activate") { requires("simplydb.command.on") executes { if (App.instance.enabled == State.ACTIVE) { sender.sendMessage("simplymcdb is already enabled.") return@executes } App.instance.enable() sender.sendMessage("simplymcdb enabled.") } } literal("deactivate") { requires("simplydb.command.off") executes { if (App.instance.enabled == State.DISABLED) { sender.sendMessage("simplymcdb is already disabled.") return@executes } App.instance.disable() sender.sendMessage("simplymcdb disabled.") } } literal("database") { literal("init") { executes { Database.initialize() sender.sendMessage("database initialized.") } } literal("reset") { executes { Database.reset() sender.sendMessage("database reset.") } } } literal("migrate") { executes { val player = sender as? Player if (player == null) { sender.sendMM("[SMCDB] This command can only be run by players.") return@executes } when (App.instance.enabled) { State.DISABLED -> { sender.sendMM("[SMCDB] simplymcdb is disabled.") return@executes } State.DISCONNECTED -> { sender.sendMM("[SMCDB] Database disconnected. Try again later.") return@executes } else -> {} } if (!isRegistered(player.uniqueId)) { sender.sendMM("[SMCDB] You are not registered in the database.") return@executes } try { sender.sendMM("[SMCDB] Applying legacy data...") fetch(player) update(player) sender.sendMM("[SMCDB] Migration complete. Data updated to the latest format.") } catch (e: Exception) { App.instance.logger.warning("Failed to migrate data for ${player.uniqueId}: ${e.message}") sender.sendMM("[SMCDB] Migration failed. Check server logs.") } } literal("all") { executes { val executor = sender as? Player if (executor == null) { sender.sendMM("[SMCDB] This command can only be run by players.") return@executes } when (App.instance.enabled) { State.DISABLED -> { sender.sendMM("[SMCDB] simplymcdb is disabled.") return@executes } State.DISCONNECTED -> { sender.sendMM("[SMCDB] Database disconnected. Try again later.") return@executes } else -> {} } val targets = findPlayersNeedingMigration() if (targets.isEmpty()) { sender.sendMM("[SMCDB] No legacy data found.") return@executes } sender.sendMM("[SMCDB] Migrating ${targets.size} legacy profiles... Please wait.") val backup = PlayerSerializer.serialize(executor) var migrated = 0 try { targets.forEach { entry -> try { PlayerSerializer.deserialize(executor, entry.serialized) val updatedSnapshot = PlayerSerializer.serialize(executor) overwritePlayerData(entry.uuid, updatedSnapshot) migrated++ } catch (ex: Exception) { App.instance.logger.warning("Failed to migrate data for ${entry.uuid}: ${ex.message}") } } } finally { try { PlayerSerializer.deserialize(executor, backup) } catch (restoreEx: Exception) { App.instance.logger.warning("Failed to restore migration executor state: ${restoreEx.message}") } } sender.sendMM("[SMCDB] Migration finished ($migrated/${targets.size}). Check logs for failures.") } } } literal("check") { executes { sender.sendMM( "${when (App.instance.enabled) { State.ACTIVE -> "●" State.DISCONNECTED -> "■" State.DISABLED -> "○" }} simply-minecraft-database") sender.sendMM( "status: ${when (App.instance.enabled) { State.ACTIVE -> "active" State.DISCONNECTED -> "disconnected" State.DISABLED -> "disabled" }}") sender.sendMM( "- database test: ${if (Database.ping()) "success" else "failed"}") sender.sendMM( "- config test: ${if (Config.config.getBoolean("enabled")) "enabled" else "disabled"}") } } literal("register") { executes { val player = sender as? Player if (player == null) { sender.sendMM("This command is only available for players.") return@executes } when (App.instance.enabled) { State.DISABLED -> { sender.sendMM("[SMCDB] simplymcdb is disabled.
Run /smcdb check to check the status.") return@executes } State.DISCONNECTED -> { sender.sendMM("[SMCDB] simplymcdb is enabled but disconnected.
Run /smcdb check to check the status.") return@executes } else -> {} } if (!isRegistered(player.uniqueId)) { sender.sendMM( "[SMCDB] The inventory of the other servers will be overwritten." + "Are you sure you want to register?" + "/smcdb confirm to confirm.") commandBuffer[player.uniqueId] = "register" } else { sender.sendMM("[SMCDB] You are already registered.") } } } literal("confirm") { executes { val player = sender as? Player ?: return@executes when (commandBuffer[player.uniqueId]) { "register" -> { if (App.instance.enabled == State.ACTIVE) { register(player) sender.sendMM("[SMCDB] Successfully registered.") } else { sender.sendMM("[SMCDB] simplymcdb is disabled.") } } else -> sender.sendMM("[SMCDB] Invalid command.") } commandBuffer.remove(player.uniqueId) } } } }