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