Skip to content

Commit

Permalink
✨ support readHash command
Browse files Browse the repository at this point in the history
  • Loading branch information
XiYang6666 committed Jun 8, 2024
1 parent c9df8bb commit afc6d2c
Show file tree
Hide file tree
Showing 7 changed files with 88 additions and 27 deletions.
60 changes: 45 additions & 15 deletions src/main/kotlin/xyz/xasmc/hashbook/command/HashBookCommand.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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 <aqua>hash</aqua>: <green>${hash}")
val copyMsg = MessageUtil.copyMsg("[点击复制]", hash, "<gold>点击复制")
player.sendMiniMessage("$msgTitle <aqua>hash</aqua>: <green>${hash}</green> <gold>$copyMsg</gold>")
})

val setHashCommand = CommandAPICommand("setHash")
Expand All @@ -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) ?: "<null>"
ItemDataServices.setItemData(
item,
"HashBook.hash",
ItemDataServices.DataType.String,
args["hash"] as String
)
player.sendMiniMessage("$msgTitle <dark_green>已修改成书哈希 <aqua>old_hash</aqua>: <green>$hash</green> <aqua>new_hash</aqua>: <green>${args["hash"]}</green>")
val newHash = args["hash"] as String
ItemDataServices.setItemData(item, "HashBook.hash", ItemDataServices.DataType.String, newHash)
val oldHashCopyMsg = MessageUtil.copyMsg("[点击复制]", oldHash, "<gold>点击复制")
val newHashCopyMsg = MessageUtil.copyMsg("[点击复制]", newHash, "<gold>点击复制")
player.sendMiniMessage("$msgTitle <dark_green>已修改成书哈希")
player.sendMiniMessage("$msgTitle <aqua>old_hash</aqua>: <green>$oldHash</green> <gold>$oldHashCopyMsg</gold>")
player.sendMiniMessage("$msgTitle <aqua>new_hash</aqua>: <green>$newHash</green> <gold>$newHashCopyMsg</gold>")
})

val hashCommand = CommandAPICommand("hash")
val searchBookCommand = CommandAPICommand("searchBook")
.withPermission("xasmc.hashbook.command.searchbook")
.withArguments(StringArgument("incompleteHash"))
.executes(CommandExecutor { sender, args ->
sender.sendMiniMessage("$msgTitle <dark_green>搜索到以下结果:")
StorageServices.search(args["incompleteHash"] as String).forEach {
val copyMsg = MessageUtil.copyMsg("[点击复制]", it.first, "<gold>点击复制")
sender.sendMiniMessage("<light_purple>==============================")
sender.sendMiniMessage("$msgTitle <aqua>hash</aqua>: <green>${it.first} <gold>${copyMsg}</gold>")
sender.sendMiniMessage("$msgTitle <aqua>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
Expand All @@ -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
Expand All @@ -74,14 +95,23 @@ object HashBookCommand {

Bukkit.getLogger().info(hash.javaClass.name)

player.sendMiniMessage("<blue>===== <dark_aqua>HashBook Book Info <blue>=====")
player.sendMiniMessage("<aqua>title</aqua>: <green>${title}")
player.sendMiniMessage("<aqua>author</aqua>: <green>${author}")
player.sendMiniMessage("<aqua>hash</aqua>: <green>${hash}")
val copyMsg = MessageUtil.copyMsg("[点击复制]", hash, "<gold>点击复制")
player.sendMiniMessage("$msgTitle <blue>HashBook Book Info")
player.sendMiniMessage("$msgTitle <aqua>title</aqua>: <green>${title}")
player.sendMiniMessage("$msgTitle <aqua>author</aqua>: <green>${author}")
player.sendMiniMessage("$msgTitle <aqua>hash</aqua>: <green>${hash}</green> <gold>$copyMsg</gold>")
})

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("<aqua>debug</aqua>: <green>${HashBook.config.debug}")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -39,11 +40,13 @@ class OpenBookListener : Listener {
}
val bookMeta = item.itemMeta as BookMeta
bookMeta.pages(BookUtil.deserializePages(StorageServices.read(hash) ?: run {
player.sendMiniMessage("$msgTitle <yellow>[warn] 无法读取成书书页, hash: $hash")
val copyMsg = MessageUtil.copyMsg("[点击复制]", hash, "<gold>点击复制")
player.sendMiniMessage("$msgTitle <yellow>[warn] 无法读取成书书页, <aqua>hash</aqua>: <green>$hash</green> <gold>$copyMsg</gold>")
return@onPlayerInteract
}))
val copyMsg = MessageUtil.copyMsg("[点击复制]", hash, "<gold>点击复制")
player.openBook(bookMeta)
player.debugMiniMessage("$msgTitle <aqua>[debug] <dark_green>成功替换数据, hash: $hash")
player.debugMiniMessage("$msgTitle <aqua>[debug] <dark_green>成功替换数据, <aqua>hash</aqua>: <green>$hash</green> <gold>$copyMsg</gold>")
event.isCancelled = true
}
}
18 changes: 14 additions & 4 deletions src/main/kotlin/xyz/xasmc/hashbook/service/FileStorageServices.kt
Original file line number Diff line number Diff line change
@@ -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<Pair<String, String>> {
val result = LinkedList<Pair<String, String>>()
HashBook.getDataFolder().resolve("pages").listFiles()?.forEach {
if (it.nameWithoutExtension.startsWith(incompleteHash)) result.add(
Pair(it.nameWithoutExtension, it.readText())
)
}
return result
}
}
5 changes: 3 additions & 2 deletions src/main/kotlin/xyz/xasmc/hashbook/service/StorageServices.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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<Pair<String, String>>

companion object {
lateinit var instance: StorageServices
Expand All @@ -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)
}
}
3 changes: 2 additions & 1 deletion src/main/kotlin/xyz/xasmc/hashbook/util/BookUtil.kt
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,8 @@ object BookUtil {
val serialized = serializePages(bookMeta.pages())
val hash = HashUtil.HashString(serialized)
StorageServices.save(hash, serialized)
player.debugMiniMessage("$msgTitle <aqua>[debug]<dark_green>已存储成书书页</dark_green> <aqua>hash</aqua>: <green>$hash</green> <aqua>meta</aqua>: <green>$bookMeta</green>")
val copyMsg = MessageUtil.copyMsg("[点击复制]", hash, "<gold>点击复制")
player.debugMiniMessage("$msgTitle <aqua>[debug]<dark_green>已存储成书书页</dark_green> <aqua>hash</aqua>: <green>$hash</green> <gold>$copyMsg</gold> <aqua>meta</aqua>: <green>$bookMeta</green>")

newItem = ItemDataServices.setItemData(
newItem, "HashBook.Hash", ItemDataServices.DataType.String, hash
Expand Down
16 changes: 15 additions & 1 deletion src/main/kotlin/xyz/xasmc/hashbook/util/MessageUtil.kt
Original file line number Diff line number Diff line change
@@ -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 = "<dark_aqua>[HashBook]</dark_aqua>"
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))
Expand Down
6 changes: 4 additions & 2 deletions src/main/resources/plugin.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit afc6d2c

Please sign in to comment.