From 636d492f711e7c3d7769ef9c91d967a6b212c488 Mon Sep 17 00:00:00 2001 From: Minh Nguyen Date: Wed, 27 Aug 2025 23:11:36 +0700 Subject: [PATCH 01/14] =?UTF-8?q?Th=C3=AAm=20l=E1=BB=87nh=20xo=C3=A1=20d?= =?UTF-8?q?=E1=BB=AF=20li=E1=BB=87u=20top=20n=E1=BA=A1p=20th=E1=BA=BB/mile?= =?UTF-8?q?stone=20c=E1=BB=A7a=20ng=C6=B0=E1=BB=9Di=20ch=C6=A1i?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../net/minevn/dotman/commands/AdminCmd.kt | 45 +++++++++++++++++++ .../minevn/dotman/database/PlayerDataDAO.kt | 9 ++++ .../dotman/database/h2/PlayerDataDAOImpl.kt | 5 +++ .../database/mysql/PlayerDataDAOImpl.kt | 5 +++ 4 files changed, 64 insertions(+) diff --git a/dotman-plugin/src/main/java/net/minevn/dotman/commands/AdminCmd.kt b/dotman-plugin/src/main/java/net/minevn/dotman/commands/AdminCmd.kt index 415a8dc..e05096a 100644 --- a/dotman-plugin/src/main/java/net/minevn/dotman/commands/AdminCmd.kt +++ b/dotman-plugin/src/main/java/net/minevn/dotman/commands/AdminCmd.kt @@ -5,6 +5,7 @@ import net.minevn.dotman.DotMan.Companion.transactional import net.minevn.dotman.TopupType import net.minevn.dotman.database.ConfigDAO import net.minevn.dotman.database.LogDAO +import net.minevn.dotman.database.PlayerDataDAO import net.minevn.dotman.database.PlayerInfoDAO import net.minevn.dotman.utils.Utils.Companion.format import net.minevn.dotman.utils.Utils.Companion.makePagination @@ -28,6 +29,7 @@ class AdminCmd { addSubCommand(history(), "lichsu", "history") addSubCommand(napThuCong(), "napthucong", "manual") addSubCommand(traCuuGiaoDich(), "tracuugd", "magiaodich") + addSubCommand(clearMilestoneData(), "cleardata") action { sender.sendMessage("§b§lCác lệnh của plugin DotMan") @@ -314,6 +316,49 @@ class AdminCmd { } } + private fun clearMilestoneData() = command { + val usage = "" + description("Xoá dữ liệu top nạp thẻ/milestone của người chơi") + + tabComplete { + when(args.size) { + 0 -> emptyList() + 1 -> Bukkit.getOnlinePlayers().map { it.name } + .filter { it.lowercase().startsWith(args.last().lowercase()) } + else -> emptyList() + } + } + + action { + val infoDAO = PlayerInfoDAO.getInstance() + val dataDAO = PlayerDataDAO.getInstance() + + if (args.isEmpty()) { + sender.send("§cCách dùng: /$commandTree $usage") + return@action + } + val playerName = args.first() + + runNotSync { transactional { + try { + val uuid = infoDAO.getUUID(playerName) + ?: run { + sender.send("§cKhông tìm thấy người chơi $playerName, có thể họ chưa vào server bao giờ?") + return@transactional + } + + val donateKeyOrPattern = "DONATE_TOTAL_ALL%" + dataDAO.deleteDataByKeyLike(uuid, donateKeyOrPattern) + + sender.send("§aĐã xoá dữ liệu top nạp thẻ/milestone của người chơi §b$playerName") + } catch (e: Exception) { + sender.send("§cCó lỗi xảy ra: ${e.message} (chi tiết hãy xem Console và báo lỗi cho MineVN Studio)") + throw e + } + }} + } + } + /** * Removes and returns the first argument from the list if it exists and is not an option flag. * diff --git a/dotman-plugin/src/main/java/net/minevn/dotman/database/PlayerDataDAO.kt b/dotman-plugin/src/main/java/net/minevn/dotman/database/PlayerDataDAO.kt index 6cabfbc..37b2ac0 100644 --- a/dotman-plugin/src/main/java/net/minevn/dotman/database/PlayerDataDAO.kt +++ b/dotman-plugin/src/main/java/net/minevn/dotman/database/PlayerDataDAO.kt @@ -14,6 +14,7 @@ abstract class PlayerDataDAO : DataAccess() { abstract fun getDataScript(): String abstract fun getSumDataScript(): String abstract fun getAllDataScript(): String + abstract fun deleteDataByKeyLikeScript(): String fun insertData(uuid: String, key: String, value: Int) { insertDataScript().statement { @@ -68,4 +69,12 @@ abstract class PlayerDataDAO : DataAccess() { }.toMap() } } + + fun deleteDataByKeyLike(uuid: String, likePattern: String): Int { + return deleteDataByKeyLikeScript().statement { + setString(1, uuid) + setString(2, likePattern) + update() + } + } } diff --git a/dotman-plugin/src/main/java/net/minevn/dotman/database/h2/PlayerDataDAOImpl.kt b/dotman-plugin/src/main/java/net/minevn/dotman/database/h2/PlayerDataDAOImpl.kt index 3493b8b..b2d9d60 100644 --- a/dotman-plugin/src/main/java/net/minevn/dotman/database/h2/PlayerDataDAOImpl.kt +++ b/dotman-plugin/src/main/java/net/minevn/dotman/database/h2/PlayerDataDAOImpl.kt @@ -47,4 +47,9 @@ class PlayerDataDAOImpl : PlayerDataDAO() { FROM "dotman_player_data" WHERE "uuid" = ?; """.trimIndent() + + override fun deleteDataByKeyLikeScript() = """ + DELETE FROM "dotman_player_data" + WHERE "uuid" = ? AND "key" LIKE ?; + """.trimIndent() } diff --git a/dotman-plugin/src/main/java/net/minevn/dotman/database/mysql/PlayerDataDAOImpl.kt b/dotman-plugin/src/main/java/net/minevn/dotman/database/mysql/PlayerDataDAOImpl.kt index 8046463..92a0478 100644 --- a/dotman-plugin/src/main/java/net/minevn/dotman/database/mysql/PlayerDataDAOImpl.kt +++ b/dotman-plugin/src/main/java/net/minevn/dotman/database/mysql/PlayerDataDAOImpl.kt @@ -40,4 +40,9 @@ class PlayerDataDAOImpl : PlayerDataDAO() { FROM `dotman_player_data` WHERE `uuid` = ?; """.trimIndent() + + override fun deleteDataByKeyLikeScript() = """ + DELETE FROM `dotman_player_data` + WHERE `uuid` = ? AND `key` LIKE ?; + """.trimIndent() } From c8c47b016d64a607c09537ce0d0fc7abd9306be1 Mon Sep 17 00:00:00 2001 From: Minh Nguyen Date: Wed, 27 Aug 2025 23:32:38 +0700 Subject: [PATCH 02/14] =?UTF-8?q?=C4=90=E1=BB=95i=20l=E1=BA=A1i=20t=C3=AAn?= =?UTF-8?q?=20bi=E1=BA=BFn=20cho=20t=C6=B0=E1=BB=9Dng=20minh?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/net/minevn/dotman/commands/AdminCmd.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dotman-plugin/src/main/java/net/minevn/dotman/commands/AdminCmd.kt b/dotman-plugin/src/main/java/net/minevn/dotman/commands/AdminCmd.kt index e05096a..9300b7c 100644 --- a/dotman-plugin/src/main/java/net/minevn/dotman/commands/AdminCmd.kt +++ b/dotman-plugin/src/main/java/net/minevn/dotman/commands/AdminCmd.kt @@ -347,8 +347,8 @@ class AdminCmd { return@transactional } - val donateKeyOrPattern = "DONATE_TOTAL_ALL%" - dataDAO.deleteDataByKeyLike(uuid, donateKeyOrPattern) + val playerTotalDonateKey = "DONATE_TOTAL_ALL%" + dataDAO.deleteDataByKeyLike(uuid, playerTotalDonateKey) sender.send("§aĐã xoá dữ liệu top nạp thẻ/milestone của người chơi §b$playerName") } catch (e: Exception) { From b676e8c2225436fc713922b1b7efa15b24a7f657 Mon Sep 17 00:00:00 2001 From: Minh Nguyen Date: Tue, 30 Dec 2025 00:59:34 +0700 Subject: [PATCH 03/14] fix ?: inline at L345 --- .../src/main/java/net/minevn/dotman/commands/AdminCmd.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/dotman-plugin/src/main/java/net/minevn/dotman/commands/AdminCmd.kt b/dotman-plugin/src/main/java/net/minevn/dotman/commands/AdminCmd.kt index 9300b7c..c69be25 100644 --- a/dotman-plugin/src/main/java/net/minevn/dotman/commands/AdminCmd.kt +++ b/dotman-plugin/src/main/java/net/minevn/dotman/commands/AdminCmd.kt @@ -341,8 +341,7 @@ class AdminCmd { runNotSync { transactional { try { - val uuid = infoDAO.getUUID(playerName) - ?: run { + val uuid = infoDAO.getUUID(playerName) ?: run { sender.send("§cKhông tìm thấy người chơi $playerName, có thể họ chưa vào server bao giờ?") return@transactional } From c9a02bafed6f82a920c0f2da1eadd604794a19c0 Mon Sep 17 00:00:00 2001 From: Minh Nguyen Date: Tue, 30 Dec 2025 01:06:42 +0700 Subject: [PATCH 04/14] =?UTF-8?q?fix:=20xo=C3=A1=20all=20data=20theo=20t?= =?UTF-8?q?=C3=AAn=20player?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/net/minevn/dotman/commands/AdminCmd.kt | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/dotman-plugin/src/main/java/net/minevn/dotman/commands/AdminCmd.kt b/dotman-plugin/src/main/java/net/minevn/dotman/commands/AdminCmd.kt index c69be25..c2ef2d5 100644 --- a/dotman-plugin/src/main/java/net/minevn/dotman/commands/AdminCmd.kt +++ b/dotman-plugin/src/main/java/net/minevn/dotman/commands/AdminCmd.kt @@ -305,8 +305,8 @@ class AdminCmd { } val transactionId = args.first() - val logDao = LogDAO.getInstance() - val transactionDetails = logDao.getTransactionDetailsById(transactionId).firstOrNull() + val logDAO = LogDAO.getInstance() + val transactionDetails = logDAO.getTransactionDetailsById(transactionId).firstOrNull() if (transactionDetails == null) { sender.send("§cMã giao dịch $transactionId không tồn tại hoặc giao dịch đã thất bại.") return@runNotSync @@ -346,10 +346,8 @@ class AdminCmd { return@transactional } - val playerTotalDonateKey = "DONATE_TOTAL_ALL%" - dataDAO.deleteDataByKeyLike(uuid, playerTotalDonateKey) - - sender.send("§aĐã xoá dữ liệu top nạp thẻ/milestone của người chơi §b$playerName") + dataDAO.deleteDataByKeyLike(uuid, "%") + sender.send("§aĐã xoá toàn bộ dữ liệu của người chơi §b$playerName") } catch (e: Exception) { sender.send("§cCó lỗi xảy ra: ${e.message} (chi tiết hãy xem Console và báo lỗi cho MineVN Studio)") throw e From 1053523d33e7533c54405ecb007e7d6b72025127 Mon Sep 17 00:00:00 2001 From: Minh Nguyen Date: Sat, 10 Jan 2026 14:10:10 +0700 Subject: [PATCH 05/14] fix variable name --- .../java/net/minevn/dotman/commands/AdminCmd.kt | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/dotman-plugin/src/main/java/net/minevn/dotman/commands/AdminCmd.kt b/dotman-plugin/src/main/java/net/minevn/dotman/commands/AdminCmd.kt index c2ef2d5..b6fe849 100644 --- a/dotman-plugin/src/main/java/net/minevn/dotman/commands/AdminCmd.kt +++ b/dotman-plugin/src/main/java/net/minevn/dotman/commands/AdminCmd.kt @@ -305,8 +305,8 @@ class AdminCmd { } val transactionId = args.first() - val logDAO = LogDAO.getInstance() - val transactionDetails = logDAO.getTransactionDetailsById(transactionId).firstOrNull() + val logDao = LogDAO.getInstance() + val transactionDetails = logDao.getTransactionDetailsById(transactionId).firstOrNull() if (transactionDetails == null) { sender.send("§cMã giao dịch $transactionId không tồn tại hoặc giao dịch đã thất bại.") return@runNotSync @@ -318,10 +318,10 @@ class AdminCmd { private fun clearMilestoneData() = command { val usage = "" - description("Xoá dữ liệu top nạp thẻ/milestone của người chơi") + description("Xoá toàn bộ dữ liệu của người chơi") tabComplete { - when(args.size) { + when (args.size) { 0 -> emptyList() 1 -> Bukkit.getOnlinePlayers().map { it.name } .filter { it.lowercase().startsWith(args.last().lowercase()) } @@ -330,8 +330,8 @@ class AdminCmd { } action { - val infoDAO = PlayerInfoDAO.getInstance() - val dataDAO = PlayerDataDAO.getInstance() + val infoDao = PlayerInfoDAO.getInstance() + val dataDao = PlayerDataDAO.getInstance() if (args.isEmpty()) { sender.send("§cCách dùng: /$commandTree $usage") @@ -341,12 +341,12 @@ class AdminCmd { runNotSync { transactional { try { - val uuid = infoDAO.getUUID(playerName) ?: run { + val uuid = infoDao.getUUID(playerName) ?: run { sender.send("§cKhông tìm thấy người chơi $playerName, có thể họ chưa vào server bao giờ?") return@transactional } - dataDAO.deleteDataByKeyLike(uuid, "%") + dataDao.deleteDataByKeyLike(uuid, "%") sender.send("§aĐã xoá toàn bộ dữ liệu của người chơi §b$playerName") } catch (e: Exception) { sender.send("§cCó lỗi xảy ra: ${e.message} (chi tiết hãy xem Console và báo lỗi cho MineVN Studio)") From 80de5341c4a7e76f2300acb56053778da32f8d8b Mon Sep 17 00:00:00 2001 From: Minh Nguyen Date: Sat, 10 Jan 2026 14:20:09 +0700 Subject: [PATCH 06/14] rename command fun --- .../src/main/java/net/minevn/dotman/commands/AdminCmd.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dotman-plugin/src/main/java/net/minevn/dotman/commands/AdminCmd.kt b/dotman-plugin/src/main/java/net/minevn/dotman/commands/AdminCmd.kt index b6fe849..1a518d4 100644 --- a/dotman-plugin/src/main/java/net/minevn/dotman/commands/AdminCmd.kt +++ b/dotman-plugin/src/main/java/net/minevn/dotman/commands/AdminCmd.kt @@ -29,7 +29,7 @@ class AdminCmd { addSubCommand(history(), "lichsu", "history") addSubCommand(napThuCong(), "napthucong", "manual") addSubCommand(traCuuGiaoDich(), "tracuugd", "magiaodich") - addSubCommand(clearMilestoneData(), "cleardata") + addSubCommand(clearPlayerData(), "cleardata") action { sender.sendMessage("§b§lCác lệnh của plugin DotMan") @@ -316,7 +316,7 @@ class AdminCmd { } } - private fun clearMilestoneData() = command { + private fun clearPlayerData() = command { val usage = "" description("Xoá toàn bộ dữ liệu của người chơi") From 0c0126d6929c3fc7062a456170e6e838ca4c8453 Mon Sep 17 00:00:00 2001 From: Minh Nguyen Date: Sat, 10 Jan 2026 14:33:39 +0700 Subject: [PATCH 07/14] =?UTF-8?q?th=C3=AAm=20confirmation=20flag?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/net/minevn/dotman/commands/AdminCmd.kt | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/dotman-plugin/src/main/java/net/minevn/dotman/commands/AdminCmd.kt b/dotman-plugin/src/main/java/net/minevn/dotman/commands/AdminCmd.kt index 1a518d4..b1d5414 100644 --- a/dotman-plugin/src/main/java/net/minevn/dotman/commands/AdminCmd.kt +++ b/dotman-plugin/src/main/java/net/minevn/dotman/commands/AdminCmd.kt @@ -338,13 +338,20 @@ class AdminCmd { return@action } val playerName = args.first() + val hasConfirmFlag = args.any { it.equals("-confirm", ignoreCase = true) } + + if (!hasConfirmFlag) { + sender.send("§cBạn sắp xoá toàn bộ dữ liệu của người chơi §b$playerName§c. " + + "Nếu chắc chắn, hãy thêm §a-confirm§c vào lệnh: /$commandTree $playerName -confirm") + return@action + } runNotSync { transactional { try { val uuid = infoDao.getUUID(playerName) ?: run { - sender.send("§cKhông tìm thấy người chơi $playerName, có thể họ chưa vào server bao giờ?") - return@transactional - } + sender.send("§cNgười chơi $playerName không tồn tại. Có thể họ chưa vào server bao giờ?") + return@transactional + } dataDao.deleteDataByKeyLike(uuid, "%") sender.send("§aĐã xoá toàn bộ dữ liệu của người chơi §b$playerName") From 120a10461aede9005a19ed3bb5dfb0043321c00b Mon Sep 17 00:00:00 2001 From: Minh Nguyen Date: Sat, 10 Jan 2026 14:48:52 +0700 Subject: [PATCH 08/14] return if no data to delete --- .../main/java/net/minevn/dotman/commands/AdminCmd.kt | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/dotman-plugin/src/main/java/net/minevn/dotman/commands/AdminCmd.kt b/dotman-plugin/src/main/java/net/minevn/dotman/commands/AdminCmd.kt index b1d5414..b627f1e 100644 --- a/dotman-plugin/src/main/java/net/minevn/dotman/commands/AdminCmd.kt +++ b/dotman-plugin/src/main/java/net/minevn/dotman/commands/AdminCmd.kt @@ -318,7 +318,7 @@ class AdminCmd { private fun clearPlayerData() = command { val usage = "" - description("Xoá toàn bộ dữ liệu của người chơi") + description("Xóa toàn bộ dữ liệu của người chơi") tabComplete { when (args.size) { @@ -341,7 +341,7 @@ class AdminCmd { val hasConfirmFlag = args.any { it.equals("-confirm", ignoreCase = true) } if (!hasConfirmFlag) { - sender.send("§cBạn sắp xoá toàn bộ dữ liệu của người chơi §b$playerName§c. " + + sender.send("§cBạn sắp xóa toàn bộ dữ liệu của người chơi §b$playerName§c. " + "Nếu chắc chắn, hãy thêm §a-confirm§c vào lệnh: /$commandTree $playerName -confirm") return@action } @@ -353,8 +353,12 @@ class AdminCmd { return@transactional } - dataDao.deleteDataByKeyLike(uuid, "%") - sender.send("§aĐã xoá toàn bộ dữ liệu của người chơi §b$playerName") + val deletedCount = dataDao.deleteDataByKeyLike(uuid, "%") + if (deletedCount > 0) { + sender.send("§aĐã xóa toàn bộ dữ liệu của người chơi §b$playerName") + } else { + sender.send("§cNgười chơi §b$playerName§c hiện không có dữ liệu để xóa") + } } catch (e: Exception) { sender.send("§cCó lỗi xảy ra: ${e.message} (chi tiết hãy xem Console và báo lỗi cho MineVN Studio)") throw e From 69a92bb8805604c3cdd395b6325606e3bb5bbb6f Mon Sep 17 00:00:00 2001 From: Minh Nguyen Date: Sat, 10 Jan 2026 15:09:46 +0700 Subject: [PATCH 09/14] =?UTF-8?q?b=E1=BB=95=20sung=20usage=20v=C3=A0=20tab?= =?UTF-8?q?=20complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/net/minevn/dotman/commands/AdminCmd.kt | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/dotman-plugin/src/main/java/net/minevn/dotman/commands/AdminCmd.kt b/dotman-plugin/src/main/java/net/minevn/dotman/commands/AdminCmd.kt index b627f1e..90c1bd2 100644 --- a/dotman-plugin/src/main/java/net/minevn/dotman/commands/AdminCmd.kt +++ b/dotman-plugin/src/main/java/net/minevn/dotman/commands/AdminCmd.kt @@ -317,14 +317,16 @@ class AdminCmd { } private fun clearPlayerData() = command { - val usage = "" + val usage = " -confirm" description("Xóa toàn bộ dữ liệu của người chơi") tabComplete { - when (args.size) { - 0 -> emptyList() - 1 -> Bukkit.getOnlinePlayers().map { it.name } + when { + args.isEmpty() -> emptyList() + args.size == 1 -> Bukkit.getOnlinePlayers().map { it.name } .filter { it.lowercase().startsWith(args.last().lowercase()) } + args.size == 2 && !args.last().startsWith("-") -> + listOf("-confirm").filter { it.startsWith(args.last()) } else -> emptyList() } } From ca64f5003ab96f4cf3e143a2b8242728089fda54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=E1=BB=93ng=20=C3=82n?= Date: Sat, 10 Jan 2026 16:25:20 +0700 Subject: [PATCH 10/14] =?UTF-8?q?X=C3=A1c=20l=E1=BB=87nh=20l=E1=BB=87nh=20?= =?UTF-8?q?x=C3=B3a=20data=20qua=20chataction?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit lệnh gõ trên console thì không cần xác nhận --- .../net/minevn/dotman/commands/AdminCmd.kt | 72 ++++++++++++------- 1 file changed, 46 insertions(+), 26 deletions(-) diff --git a/dotman-plugin/src/main/java/net/minevn/dotman/commands/AdminCmd.kt b/dotman-plugin/src/main/java/net/minevn/dotman/commands/AdminCmd.kt index 90c1bd2..ce05cee 100644 --- a/dotman-plugin/src/main/java/net/minevn/dotman/commands/AdminCmd.kt +++ b/dotman-plugin/src/main/java/net/minevn/dotman/commands/AdminCmd.kt @@ -12,6 +12,7 @@ import net.minevn.dotman.utils.Utils.Companion.makePagination import net.minevn.dotman.utils.Utils.Companion.runNotSync import net.minevn.dotman.utils.Utils.Companion.send import net.minevn.libs.bukkit.asString +import net.minevn.libs.bukkit.chat.ChatListener import net.minevn.libs.bukkit.command import org.bukkit.Bukkit import org.bukkit.entity.Player @@ -317,7 +318,7 @@ class AdminCmd { } private fun clearPlayerData() = command { - val usage = " -confirm" + val usage = "" description("Xóa toàn bộ dữ liệu của người chơi") tabComplete { @@ -325,47 +326,66 @@ class AdminCmd { args.isEmpty() -> emptyList() args.size == 1 -> Bukkit.getOnlinePlayers().map { it.name } .filter { it.lowercase().startsWith(args.last().lowercase()) } - args.size == 2 && !args.last().startsWith("-") -> - listOf("-confirm").filter { it.startsWith(args.last()) } else -> emptyList() } } action { - val infoDao = PlayerInfoDAO.getInstance() - val dataDao = PlayerDataDAO.getInstance() - if (args.isEmpty()) { sender.send("§cCách dùng: /$commandTree $usage") return@action } + val playerName = args.first() - val hasConfirmFlag = args.any { it.equals("-confirm", ignoreCase = true) } - if (!hasConfirmFlag) { - sender.send("§cBạn sắp xóa toàn bộ dữ liệu của người chơi §b$playerName§c. " + - "Nếu chắc chắn, hãy thêm §a-confirm§c vào lệnh: /$commandTree $playerName -confirm") + fun removePlayerData() { + val infoDao = PlayerInfoDAO.getInstance() + val dataDao = PlayerDataDAO.getInstance() + runNotSync { + transactional { + try { + val uuid = infoDao.getUUID(playerName) ?: run { + sender.send("§cNgười chơi $playerName không tồn tại. Có thể họ chưa vào server bao giờ?") + return@transactional + } + + val deletedCount = dataDao.deleteDataByKeyLike(uuid, "%") + if (deletedCount > 0) { + sender.send("§aĐã xóa toàn bộ dữ liệu của người chơi §b$playerName") + } else { + sender.send("§cNgười chơi §b$playerName§c hiện không có dữ liệu để xóa") + } + } catch (e: Exception) { + sender.send("§cCó lỗi xảy ra: ${e.message} (chi tiết hãy xem Console và báo lỗi cho MineVN Studio)") + throw e + } + } + } + } + + val player = sender as? Player ?: run { + // Nếu lệnh chạy trên console thì bỏ qua confirm + removePlayerData() return@action } - runNotSync { transactional { - try { - val uuid = infoDao.getUUID(playerName) ?: run { - sender.send("§cNgười chơi $playerName không tồn tại. Có thể họ chưa vào server bao giờ?") - return@transactional - } + // Nếu gõ lệnh này trong server thì yêu cầu xác nhận + player.send("§cBạn sắp xóa toàn bộ dữ liệu của người chơi §b$playerName§c.") + player.send("§eNhập §a§lXACNHAN §eđể xác nhận, hoặc nhập §c§lHUY §eđể hủy bỏ") - val deletedCount = dataDao.deleteDataByKeyLike(uuid, "%") - if (deletedCount > 0) { - sender.send("§aĐã xóa toàn bộ dữ liệu của người chơi §b$playerName") - } else { - sender.send("§cNgười chơi §b$playerName§c hiện không có dữ liệu để xóa") - } - } catch (e: Exception) { - sender.send("§cCó lỗi xảy ra: ${e.message} (chi tiết hãy xem Console và báo lỗi cho MineVN Studio)") - throw e + ChatListener(player) { + if (message.equals("huy", true)) { + player.send("§aĐã hủy bỏ xóa dữ liệu") + return@ChatListener } - }} + + if (!message.equals("XACNHAN", true)) { + player.send("§cXác nhận không hợp lệ. Đã hủy bỏ xóa dữ liệu") + return@ChatListener + } + + removePlayerData() + } } } From 4f4bd27658ba64b87fb8d7d26411dc54f525d27e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=E1=BB=93ng=20=C3=82n?= Date: Sat, 10 Jan 2026 16:33:56 +0700 Subject: [PATCH 11/14] =?UTF-8?q?=C4=90i=E1=BB=81u=20ch=E1=BB=89nh=20th?= =?UTF-8?q?=C3=A0nh=20x=C3=B3a=20to=C3=A0n=20b=E1=BB=99=20key=20thay=20v?= =?UTF-8?q?=C3=AC=20x=C3=B3a=20theo=20prefix=5F%?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/net/minevn/dotman/commands/AdminCmd.kt | 2 +- .../main/java/net/minevn/dotman/database/PlayerDataDAO.kt | 7 +++---- .../net/minevn/dotman/database/h2/PlayerDataDAOImpl.kt | 4 ++-- .../net/minevn/dotman/database/mysql/PlayerDataDAOImpl.kt | 6 +++--- 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/dotman-plugin/src/main/java/net/minevn/dotman/commands/AdminCmd.kt b/dotman-plugin/src/main/java/net/minevn/dotman/commands/AdminCmd.kt index ce05cee..89f98a9 100644 --- a/dotman-plugin/src/main/java/net/minevn/dotman/commands/AdminCmd.kt +++ b/dotman-plugin/src/main/java/net/minevn/dotman/commands/AdminCmd.kt @@ -349,7 +349,7 @@ class AdminCmd { return@transactional } - val deletedCount = dataDao.deleteDataByKeyLike(uuid, "%") + val deletedCount = dataDao.deleteAllDataByUuid(uuid) if (deletedCount > 0) { sender.send("§aĐã xóa toàn bộ dữ liệu của người chơi §b$playerName") } else { diff --git a/dotman-plugin/src/main/java/net/minevn/dotman/database/PlayerDataDAO.kt b/dotman-plugin/src/main/java/net/minevn/dotman/database/PlayerDataDAO.kt index 37b2ac0..5e63a2b 100644 --- a/dotman-plugin/src/main/java/net/minevn/dotman/database/PlayerDataDAO.kt +++ b/dotman-plugin/src/main/java/net/minevn/dotman/database/PlayerDataDAO.kt @@ -14,7 +14,7 @@ abstract class PlayerDataDAO : DataAccess() { abstract fun getDataScript(): String abstract fun getSumDataScript(): String abstract fun getAllDataScript(): String - abstract fun deleteDataByKeyLikeScript(): String + abstract fun deleteAllDataByUuidScript(): String fun insertData(uuid: String, key: String, value: Int) { insertDataScript().statement { @@ -70,10 +70,9 @@ abstract class PlayerDataDAO : DataAccess() { } } - fun deleteDataByKeyLike(uuid: String, likePattern: String): Int { - return deleteDataByKeyLikeScript().statement { + fun deleteAllDataByUuid(uuid: String): Int { + return deleteAllDataByUuidScript().statement { setString(1, uuid) - setString(2, likePattern) update() } } diff --git a/dotman-plugin/src/main/java/net/minevn/dotman/database/h2/PlayerDataDAOImpl.kt b/dotman-plugin/src/main/java/net/minevn/dotman/database/h2/PlayerDataDAOImpl.kt index b2d9d60..3cb7217 100644 --- a/dotman-plugin/src/main/java/net/minevn/dotman/database/h2/PlayerDataDAOImpl.kt +++ b/dotman-plugin/src/main/java/net/minevn/dotman/database/h2/PlayerDataDAOImpl.kt @@ -48,8 +48,8 @@ class PlayerDataDAOImpl : PlayerDataDAO() { WHERE "uuid" = ?; """.trimIndent() - override fun deleteDataByKeyLikeScript() = """ + override fun deleteAllDataByUuidScript() = """ DELETE FROM "dotman_player_data" - WHERE "uuid" = ? AND "key" LIKE ?; + WHERE "uuid" = ?; """.trimIndent() } diff --git a/dotman-plugin/src/main/java/net/minevn/dotman/database/mysql/PlayerDataDAOImpl.kt b/dotman-plugin/src/main/java/net/minevn/dotman/database/mysql/PlayerDataDAOImpl.kt index 92a0478..245b2de 100644 --- a/dotman-plugin/src/main/java/net/minevn/dotman/database/mysql/PlayerDataDAOImpl.kt +++ b/dotman-plugin/src/main/java/net/minevn/dotman/database/mysql/PlayerDataDAOImpl.kt @@ -35,14 +35,14 @@ class PlayerDataDAOImpl : PlayerDataDAO() { WHERE `key` = ?; """.trimIndent() - override fun getAllDataScript() = """ + override fun getAllDataScript() = """K SELECT `key`, `value` FROM `dotman_player_data` WHERE `uuid` = ?; """.trimIndent() - override fun deleteDataByKeyLikeScript() = """ + override fun deleteAllDataByUuidScript() = """ DELETE FROM `dotman_player_data` - WHERE `uuid` = ? AND `key` LIKE ?; + WHERE `uuid` = ?; """.trimIndent() } From 50f8beb4fa312fe009fe74b58c9b9a39decd1a20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C6=B0=C6=A1ng=20H=E1=BB=93ng=20=C3=82n?= Date: Sat, 10 Jan 2026 16:39:34 +0700 Subject: [PATCH 12/14] Update dotman-plugin/src/main/java/net/minevn/dotman/database/mysql/PlayerDataDAOImpl.kt Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- .../net/minevn/dotman/database/mysql/PlayerDataDAOImpl.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/dotman-plugin/src/main/java/net/minevn/dotman/database/mysql/PlayerDataDAOImpl.kt b/dotman-plugin/src/main/java/net/minevn/dotman/database/mysql/PlayerDataDAOImpl.kt index 245b2de..3d4e610 100644 --- a/dotman-plugin/src/main/java/net/minevn/dotman/database/mysql/PlayerDataDAOImpl.kt +++ b/dotman-plugin/src/main/java/net/minevn/dotman/database/mysql/PlayerDataDAOImpl.kt @@ -35,7 +35,11 @@ class PlayerDataDAOImpl : PlayerDataDAO() { WHERE `key` = ?; """.trimIndent() - override fun getAllDataScript() = """K + override fun getAllDataScript() = """ + SELECT `key`, `value` + FROM `dotman_player_data` + WHERE `uuid` = ?; + """.trimIndent() SELECT `key`, `value` FROM `dotman_player_data` WHERE `uuid` = ?; From 29a2ac24ceeb97a7117424f77af5aa45f01582eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=E1=BB=93ng=20=C3=82n?= Date: Sat, 10 Jan 2026 16:41:19 +0700 Subject: [PATCH 13/14] Fix AI mistake --- .../net/minevn/dotman/database/mysql/PlayerDataDAOImpl.kt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/dotman-plugin/src/main/java/net/minevn/dotman/database/mysql/PlayerDataDAOImpl.kt b/dotman-plugin/src/main/java/net/minevn/dotman/database/mysql/PlayerDataDAOImpl.kt index 3d4e610..ebc9b71 100644 --- a/dotman-plugin/src/main/java/net/minevn/dotman/database/mysql/PlayerDataDAOImpl.kt +++ b/dotman-plugin/src/main/java/net/minevn/dotman/database/mysql/PlayerDataDAOImpl.kt @@ -40,10 +40,6 @@ class PlayerDataDAOImpl : PlayerDataDAO() { FROM `dotman_player_data` WHERE `uuid` = ?; """.trimIndent() - SELECT `key`, `value` - FROM `dotman_player_data` - WHERE `uuid` = ?; - """.trimIndent() override fun deleteAllDataByUuidScript() = """ DELETE FROM `dotman_player_data` From 29d91449b0d69c0c905a9d5d0df00b1db681befe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=E1=BB=93ng=20=C3=82n?= Date: Sat, 10 Jan 2026 20:04:39 +0700 Subject: [PATCH 14/14] reduce indent --- .../net/minevn/dotman/commands/AdminCmd.kt | 57 ++++++++++--------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/dotman-plugin/src/main/java/net/minevn/dotman/commands/AdminCmd.kt b/dotman-plugin/src/main/java/net/minevn/dotman/commands/AdminCmd.kt index 89f98a9..4cfcbc2 100644 --- a/dotman-plugin/src/main/java/net/minevn/dotman/commands/AdminCmd.kt +++ b/dotman-plugin/src/main/java/net/minevn/dotman/commands/AdminCmd.kt @@ -15,6 +15,7 @@ import net.minevn.libs.bukkit.asString import net.minevn.libs.bukkit.chat.ChatListener import net.minevn.libs.bukkit.command import org.bukkit.Bukkit +import org.bukkit.command.CommandSender import org.bukkit.entity.Player import java.time.LocalDate import java.time.format.DateTimeParseException @@ -321,6 +322,32 @@ class AdminCmd { val usage = "" description("Xóa toàn bộ dữ liệu của người chơi") + /** + * Chức năng chính của command + */ + fun removePlayerData(sender: CommandSender, playerName: String) { + val infoDao = PlayerInfoDAO.getInstance() + val dataDao = PlayerDataDAO.getInstance() + runNotSync { transactional { + try { + val uuid = infoDao.getUUID(playerName) ?: run { + sender.send("§cNgười chơi $playerName không tồn tại. Có thể họ chưa vào server bao giờ?") + return@transactional + } + + val deletedCount = dataDao.deleteAllDataByUuid(uuid) + if (deletedCount > 0) { + sender.send("§aĐã xóa toàn bộ dữ liệu của người chơi §b$playerName") + } else { + sender.send("§cNgười chơi §b$playerName§c hiện không có dữ liệu để xóa") + } + } catch (e: Exception) { + sender.send("§cCó lỗi xảy ra: ${e.message} (chi tiết hãy xem Console và báo lỗi cho MineVN Studio)") + throw e + } + }} + } + tabComplete { when { args.isEmpty() -> emptyList() @@ -337,35 +364,9 @@ class AdminCmd { } val playerName = args.first() - - fun removePlayerData() { - val infoDao = PlayerInfoDAO.getInstance() - val dataDao = PlayerDataDAO.getInstance() - runNotSync { - transactional { - try { - val uuid = infoDao.getUUID(playerName) ?: run { - sender.send("§cNgười chơi $playerName không tồn tại. Có thể họ chưa vào server bao giờ?") - return@transactional - } - - val deletedCount = dataDao.deleteAllDataByUuid(uuid) - if (deletedCount > 0) { - sender.send("§aĐã xóa toàn bộ dữ liệu của người chơi §b$playerName") - } else { - sender.send("§cNgười chơi §b$playerName§c hiện không có dữ liệu để xóa") - } - } catch (e: Exception) { - sender.send("§cCó lỗi xảy ra: ${e.message} (chi tiết hãy xem Console và báo lỗi cho MineVN Studio)") - throw e - } - } - } - } - val player = sender as? Player ?: run { // Nếu lệnh chạy trên console thì bỏ qua confirm - removePlayerData() + removePlayerData(sender, playerName) return@action } @@ -384,7 +385,7 @@ class AdminCmd { return@ChatListener } - removePlayerData() + removePlayerData(sender, playerName) } } }