From afc6d2c3fa3ffa0b9562b2fcc031f2b57fffc241 Mon Sep 17 00:00:00 2001 From: XiYang6666 <1782356858@qq.com> Date: Sat, 8 Jun 2024 15:25:40 +0800 Subject: [PATCH] :sparkles: support readHash command --- .../xasmc/hashbook/command/HashBookCommand.kt | 60 ++++++++++++++----- .../hashbook/listener/OpenBookListener.kt | 7 ++- .../hashbook/service/FileStorageServices.kt | 18 ++++-- .../xasmc/hashbook/service/StorageServices.kt | 5 +- .../xyz/xasmc/hashbook/util/BookUtil.kt | 3 +- .../xyz/xasmc/hashbook/util/MessageUtil.kt | 16 ++++- src/main/resources/plugin.yml | 6 +- 7 files changed, 88 insertions(+), 27 deletions(-) diff --git a/src/main/kotlin/xyz/xasmc/hashbook/command/HashBookCommand.kt b/src/main/kotlin/xyz/xasmc/hashbook/command/HashBookCommand.kt index b89570b..f00270a 100644 --- a/src/main/kotlin/xyz/xasmc/hashbook/command/HashBookCommand.kt +++ b/src/main/kotlin/xyz/xasmc/hashbook/command/HashBookCommand.kt @@ -12,7 +12,9 @@ import org.bukkit.inventory.ItemStack import org.bukkit.inventory.meta.BookMeta import xyz.xasmc.hashbook.HashBook import xyz.xasmc.hashbook.service.ItemDataServices +import xyz.xasmc.hashbook.service.StorageServices import xyz.xasmc.hashbook.util.BookUtil +import xyz.xasmc.hashbook.util.MessageUtil import xyz.xasmc.hashbook.util.MessageUtil.msgTitle import xyz.xasmc.hashbook.util.MessageUtil.sendMiniMessage @@ -27,12 +29,14 @@ object HashBookCommand { }) val calcHashCommand = CommandAPICommand("calcHash") + .withPermission("xasmc.hashbook.command.calchash") .executes(CommandExecutor { sender, args -> val player = checkPlayer(sender) ?: return@CommandExecutor val (item) = checkWrittenBook(player) ?: return@CommandExecutor val bookMeta = item.itemMeta as BookMeta val hash = BookUtil.generateHash(bookMeta) - player.sendMiniMessage("$msgTitle hash: ${hash}") + val copyMsg = MessageUtil.copyMsg("[点击复制]", hash, "点击复制") + player.sendMiniMessage("$msgTitle hash: ${hash} $copyMsg") }) val setHashCommand = CommandAPICommand("setHash") @@ -41,18 +45,34 @@ object HashBookCommand { .executes(CommandExecutor { sender, args -> val player = checkPlayer(sender) ?: return@CommandExecutor val (item) = checkWrittenBook(player) ?: return@CommandExecutor - val hash = + val oldHash = ItemDataServices.getItemData(item, "HashBook.hash", ItemDataServices.DataType.String) ?: "" - ItemDataServices.setItemData( - item, - "HashBook.hash", - ItemDataServices.DataType.String, - args["hash"] as String - ) - player.sendMiniMessage("$msgTitle 已修改成书哈希 old_hash: $hash new_hash: ${args["hash"]}") + val newHash = args["hash"] as String + ItemDataServices.setItemData(item, "HashBook.hash", ItemDataServices.DataType.String, newHash) + val oldHashCopyMsg = MessageUtil.copyMsg("[点击复制]", oldHash, "点击复制") + val newHashCopyMsg = MessageUtil.copyMsg("[点击复制]", newHash, "点击复制") + player.sendMiniMessage("$msgTitle 已修改成书哈希") + player.sendMiniMessage("$msgTitle old_hash: $oldHash $oldHashCopyMsg") + player.sendMiniMessage("$msgTitle new_hash: $newHash $newHashCopyMsg") }) - val hashCommand = CommandAPICommand("hash") + val searchBookCommand = CommandAPICommand("searchBook") + .withPermission("xasmc.hashbook.command.searchbook") + .withArguments(StringArgument("incompleteHash")) + .executes(CommandExecutor { sender, args -> + sender.sendMiniMessage("$msgTitle 搜索到以下结果:") + StorageServices.search(args["incompleteHash"] as String).forEach { + val copyMsg = MessageUtil.copyMsg("[点击复制]", it.first, "点击复制") + sender.sendMiniMessage("==============================") + sender.sendMiniMessage("$msgTitle hash: ${it.first} ${copyMsg}") + sender.sendMiniMessage("$msgTitle content:") + sender.sendMiniMessage(it.second) + } + }) + + + val storeBookCommand = CommandAPICommand("storeBook") + .withPermission("xasmc.hashbook.command.storebook") .executes(CommandExecutor { sender, args -> val player = checkPlayer(sender) ?: return@CommandExecutor val (item, hand) = checkWrittenBook(player) ?: return@CommandExecutor @@ -61,6 +81,7 @@ object HashBookCommand { }) val bookInfoCommand = CommandAPICommand("bookInfo") + .withPermission("xasmc.hashbook.command.bookinfo") .executes(CommandExecutor { sender, _ -> val player = checkPlayer(sender) ?: return@CommandExecutor val (item) = checkWrittenBook(player) ?: return@CommandExecutor @@ -74,14 +95,23 @@ object HashBookCommand { Bukkit.getLogger().info(hash.javaClass.name) - player.sendMiniMessage("===== HashBook Book Info =====") - player.sendMiniMessage("title: ${title}") - player.sendMiniMessage("author: ${author}") - player.sendMiniMessage("hash: ${hash}") + val copyMsg = MessageUtil.copyMsg("[点击复制]", hash, "点击复制") + player.sendMiniMessage("$msgTitle HashBook Book Info") + player.sendMiniMessage("$msgTitle title: ${title}") + player.sendMiniMessage("$msgTitle author: ${author}") + player.sendMiniMessage("$msgTitle hash: ${hash} $copyMsg") }) val command = CommandAPICommand("hashbook") - .withSubcommands(reloadCommand, calcHashCommand, setHashCommand, hashCommand, bookInfoCommand) + .withPermission("xasmc.hashbook.command.hashbook") + .withSubcommands( + reloadCommand, + calcHashCommand, + setHashCommand, + searchBookCommand, + storeBookCommand, + bookInfoCommand + ) .executes(CommandExecutor { sender, _ -> sender.sendMiniMessage("$msgTitle HashBook is Running!") sender.sendMiniMessage("debug: ${HashBook.config.debug}") diff --git a/src/main/kotlin/xyz/xasmc/hashbook/listener/OpenBookListener.kt b/src/main/kotlin/xyz/xasmc/hashbook/listener/OpenBookListener.kt index bb631df..22bdab8 100644 --- a/src/main/kotlin/xyz/xasmc/hashbook/listener/OpenBookListener.kt +++ b/src/main/kotlin/xyz/xasmc/hashbook/listener/OpenBookListener.kt @@ -10,6 +10,7 @@ import xyz.xasmc.hashbook.HashBook import xyz.xasmc.hashbook.service.ItemDataServices import xyz.xasmc.hashbook.service.StorageServices import xyz.xasmc.hashbook.util.BookUtil +import xyz.xasmc.hashbook.util.MessageUtil import xyz.xasmc.hashbook.util.MessageUtil.debugMiniMessage import xyz.xasmc.hashbook.util.MessageUtil.sendMiniMessage @@ -39,11 +40,13 @@ class OpenBookListener : Listener { } val bookMeta = item.itemMeta as BookMeta bookMeta.pages(BookUtil.deserializePages(StorageServices.read(hash) ?: run { - player.sendMiniMessage("$msgTitle [warn] 无法读取成书书页, hash: $hash") + val copyMsg = MessageUtil.copyMsg("[点击复制]", hash, "点击复制") + player.sendMiniMessage("$msgTitle [warn] 无法读取成书书页, hash: $hash $copyMsg") return@onPlayerInteract })) + val copyMsg = MessageUtil.copyMsg("[点击复制]", hash, "点击复制") player.openBook(bookMeta) - player.debugMiniMessage("$msgTitle [debug] 成功替换数据, hash: $hash") + player.debugMiniMessage("$msgTitle [debug] 成功替换数据, hash: $hash $copyMsg") event.isCancelled = true } } diff --git a/src/main/kotlin/xyz/xasmc/hashbook/service/FileStorageServices.kt b/src/main/kotlin/xyz/xasmc/hashbook/service/FileStorageServices.kt index 2f897b1..bbda328 100644 --- a/src/main/kotlin/xyz/xasmc/hashbook/service/FileStorageServices.kt +++ b/src/main/kotlin/xyz/xasmc/hashbook/service/FileStorageServices.kt @@ -1,26 +1,36 @@ package xyz.xasmc.hashbook.service import xyz.xasmc.hashbook.HashBook -import java.io.File import java.io.FileNotFoundException +import java.util.* class FileStorageServices : StorageServices { init { - File(HashBook.getDataFolder(), "pages").mkdirs() + HashBook.getDataFolder().resolve("pages").mkdirs() } override fun save(hash: String, content: String) { - val file = File(HashBook.getDataFolder(), "pages/$hash.json") + val file = HashBook.getDataFolder().resolve("pages/$hash.json") file.createNewFile() file.writeText(content) } override fun read(hash: String): String? { - val file = File(HashBook.getDataFolder(), "pages/$hash.json") + val file = HashBook.getDataFolder().resolve("pages/$hash.json") return try { file.readText() } catch (e: FileNotFoundException) { return null } } + + override fun search(incompleteHash: String): List> { + val result = LinkedList>() + HashBook.getDataFolder().resolve("pages").listFiles()?.forEach { + if (it.nameWithoutExtension.startsWith(incompleteHash)) result.add( + Pair(it.nameWithoutExtension, it.readText()) + ) + } + return result + } } \ No newline at end of file diff --git a/src/main/kotlin/xyz/xasmc/hashbook/service/StorageServices.kt b/src/main/kotlin/xyz/xasmc/hashbook/service/StorageServices.kt index 10866ef..3093447 100644 --- a/src/main/kotlin/xyz/xasmc/hashbook/service/StorageServices.kt +++ b/src/main/kotlin/xyz/xasmc/hashbook/service/StorageServices.kt @@ -5,8 +5,8 @@ import xyz.xasmc.hashbook.config.StorageMode.* interface StorageServices { fun save(hash: String, content: String) - fun read(hash: String): String? + fun search(incompleteHash: String): List> companion object { lateinit var instance: StorageServices @@ -20,6 +20,7 @@ interface StorageServices { } fun save(hash: String, content: String) = instance.save(hash, content) - fun read(hash: String): String? = instance.read(hash) + fun read(hash: String) = instance.read(hash) + fun search(incompleteHash: String) = instance.search(incompleteHash) } } \ No newline at end of file diff --git a/src/main/kotlin/xyz/xasmc/hashbook/util/BookUtil.kt b/src/main/kotlin/xyz/xasmc/hashbook/util/BookUtil.kt index 92d84ef..e0444ab 100644 --- a/src/main/kotlin/xyz/xasmc/hashbook/util/BookUtil.kt +++ b/src/main/kotlin/xyz/xasmc/hashbook/util/BookUtil.kt @@ -69,7 +69,8 @@ object BookUtil { val serialized = serializePages(bookMeta.pages()) val hash = HashUtil.HashString(serialized) StorageServices.save(hash, serialized) - player.debugMiniMessage("$msgTitle [debug]已存储成书书页 hash: $hash meta: $bookMeta") + val copyMsg = MessageUtil.copyMsg("[点击复制]", hash, "点击复制") + player.debugMiniMessage("$msgTitle [debug]已存储成书书页 hash: $hash $copyMsg meta: $bookMeta") newItem = ItemDataServices.setItemData( newItem, "HashBook.Hash", ItemDataServices.DataType.String, hash diff --git a/src/main/kotlin/xyz/xasmc/hashbook/util/MessageUtil.kt b/src/main/kotlin/xyz/xasmc/hashbook/util/MessageUtil.kt index 65e7cd4..a1ff7bc 100644 --- a/src/main/kotlin/xyz/xasmc/hashbook/util/MessageUtil.kt +++ b/src/main/kotlin/xyz/xasmc/hashbook/util/MessageUtil.kt @@ -1,13 +1,27 @@ package xyz.xasmc.hashbook.util +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.event.ClickEvent import net.kyori.adventure.text.minimessage.MiniMessage import org.bukkit.command.CommandSender import org.bukkit.entity.Player import xyz.xasmc.hashbook.HashBook object MessageUtil { - val mm = MiniMessage.miniMessage() val msgTitle = "[HashBook]" + val mm = MiniMessage.miniMessage() + + fun copyMsg(message: String, copy: String, hover: String? = null): String { + val messageComponent = mm.deserialize(message) + val hoverComponent = hover?.let { mm.deserialize(it) } + return mm.serialize( + Component.text() + .append(messageComponent) + .clickEvent(ClickEvent.copyToClipboard(copy)) + .hoverEvent(hoverComponent) + .build() + ) + } infix fun Player.sendMiniMessage(message: String) = this.sendMessage(mm.deserialize(message)) diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index d3a8d33..392320f 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -9,7 +9,9 @@ softdepend: - NBTAPI permissions: - xasmc.hashbook.command.sethash: + "xasmc.hashbook.command.sethash": default: op - xasmc.hashbook.command.reload: + "xasmc.hashbook.command.reload": + default: op + "xasmc.hashbook.command.searchbook": default: op \ No newline at end of file