Skip to content

Commit

Permalink
✨ support getPage command
Browse files Browse the repository at this point in the history
  • Loading branch information
XiYang6666 committed Jun 8, 2024
1 parent 6cce6ab commit 7a6f474
Show file tree
Hide file tree
Showing 2 changed files with 110 additions and 10 deletions.
104 changes: 97 additions & 7 deletions src/main/kotlin/xyz/xasmc/hashbook/command/HashBookCommand.kt
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package xyz.xasmc.hashbook.command

import dev.jorel.commandapi.CommandAPICommand
import dev.jorel.commandapi.arguments.IntegerArgument
import dev.jorel.commandapi.arguments.StringArgument
import dev.jorel.commandapi.executors.CommandExecutor
import net.kyori.adventure.text.Component
import org.bukkit.Bukkit
import org.bukkit.Material
import org.bukkit.command.CommandSender
Expand All @@ -14,6 +16,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.msgTitle
import xyz.xasmc.hashbook.util.MessageUtil.sendMiniMessage
import xyz.xasmc.hashbook.util.MessageUtil.shortHashMessage
Expand Down Expand Up @@ -56,22 +59,64 @@ object HashBookCommand {
player.sendMiniMessage("$msgTitle <aqua>new_hash</aqua>: <green>$newShortHashMsg")
})

val getPage = CommandAPICommand("getPage")
.withPermission("xasmc.hashbook.command.getpage")
.withArguments(StringArgument("hash"), IntegerArgument("page"))
.executes(CommandExecutor { sender, args ->
val hash = args["hash"] as String
val page = args["page"] as Int
val realPage = page - 1
val data = StorageServices.read(hash) ?: run {
val shortHashMsg = shortHashMessage(hash)
sender.sendMiniMessage("$msgTitle <dark_green>未找到成书数据")
sender.sendMiniMessage("$msgTitle <aqua>hash</aqua>: <green>$shortHashMsg")
return@CommandExecutor
}
val pageList = BookUtil.deserializePages(data)
if (pageList.isEmpty()) {
sender.sendMiniMessage("$msgTitle <dark_green>该成书没有书页")
return@CommandExecutor
}
if (pageList.size < page || page <= 0) {
sender.sendMiniMessage("$msgTitle <dark_green>错误的页码")
return@CommandExecutor
}

val shortHashMsg = shortHashMessage(hash)
val message = Component.text()
.append(MessageUtil.mm.deserialize("$msgTitle <dark_green>Book: <green>$shortHashMsg</green> Page $page</dark_green>\n"))
.append(pageList[realPage])
sender.sendMessage(message)

val pageBarMessage = createPageBarMessage(hash, realPage, pageList.size)
sender.sendMessage(pageBarMessage)
})

val searchBookCommand = CommandAPICommand("searchBook")
.withPermission("xasmc.hashbook.command.searchbook")
.withArguments(StringArgument("incompleteHash"))
.executes(CommandExecutor { sender, args ->
val incompleteHash = args["incompleteHash"] as String
sender.sendMiniMessage("$msgTitle <dark_green>搜索到以下结果")
StorageServices.search(incompleteHash).forEach {
val shortHashMsg = shortHashMessage(it.first)
sender.sendMiniMessage("<light_purple>==============================")
val searchResult = StorageServices.search(incompleteHash)
sender.sendMiniMessage(
if (searchResult.isEmpty()) "$msgTitle <dark_green>未搜索到结果"
else "$msgTitle <dark_green>搜索到 ${searchResult.size} 条结果"
)
searchResult.forEach { result ->
val pageList = BookUtil.deserializePages(result.second)
val totalPage = pageList.size
val shortHashMsg = shortHashMessage(result.first)
sender.sendMiniMessage("<light_purple>========================================")
sender.sendMiniMessage("$msgTitle <aqua>hash</aqua>: <green>$shortHashMsg")
sender.sendMiniMessage("$msgTitle <aqua>content</aqua>:")
sender.sendMiniMessage(it.second)
sender.sendMessage(
Component.text()
.append(MessageUtil.mm.deserialize("$msgTitle <aqua>content</aqua>:\n"))
.also { if (totalPage > 0) it.append(pageList.first()) }
)
sender.sendMessage(createPageBarMessage(result.first, 0, totalPage))
}
})


val storeBookCommand = CommandAPICommand("storeBook")
.withPermission("xasmc.hashbook.command.storebook")
.executes(CommandExecutor { sender, args ->
Expand Down Expand Up @@ -109,6 +154,7 @@ object HashBookCommand {
reloadCommand,
calcHashCommand,
setHashCommand,
getPage,
searchBookCommand,
storeBookCommand,
bookInfoCommand
Expand Down Expand Up @@ -144,4 +190,48 @@ object HashBookCommand {
return pair
}

private fun generatePageRange(page: Int, total: Int, side: Int = 3): Pair<Pair<Boolean, Boolean>, Pair<Int, Int>> {
var start = (page - side).coerceAtMost(total - 1 - 2 * side).coerceAtLeast(0)
var end = (page + 1 + side).coerceAtLeast(2 * side + 1).coerceAtMost(total)
val first = start > 0
val last = end < total - 1
if (first) start++
if (last) end--
return Pair(Pair(first, last), Pair(start, end))
}

private fun createPageBarMessage(hash: String, page: Int, total: Int, side: Int = 3): Component {
val prevPageStr =
"<hover:show_text:'<gray>上一页</gray>'><click:run_command:'/hashbook getPage $hash ${page + 1 - 1}'><</click></hover> "
val nextPageStr =
"<hover:show_text:'<gray>下一页</gray>'><click:run_command:'/hashbook getPage $hash ${page + 1 + 1}'>></click></hover> "
val noPrevPageStr = "<hover:show_text:'<red><i>没有上一页</i></red>'><gray><</gray></hover> "
val noNextPageStr = "<hover:show_text:'<red><i>没有下一页</i></red>'><gray>></gray></hover> "

val createPageCodeStr = { i: Int, underline: Boolean ->
val str = if (underline) "<u>${i + 1}</u>" else "${i + 1}"
"<hover:show_text:'<gray>页码${i + 1}</gray>'><click:run_command:'/hashbook getPage $hash ${i + 1}'>$str</click></hover>"
}

val pageBarSB = StringBuilder()

pageBarSB.append(if (page == 0) noPrevPageStr else prevPageStr)
pageBarSB.append("<dark_green>Page</dark_green> <gray>${page + 1}</gray><dark_gray>/</dark_gray><gray>${total}</gray> ")
pageBarSB.append(if (page == total - 1) noNextPageStr else nextPageStr)

val (firstAndLast, startAndEnd) = generatePageRange(page, total, side)
val (first, last) = firstAndLast
val (start, end) = startAndEnd
pageBarSB.append("<dark_gray>(</dark_gray>")
if (first) pageBarSB.append(createPageCodeStr(0, false)).append(" <dark_gray>...</dark_gray> ")
for (i in start until end) {
if (i != start) pageBarSB.append(" <dark_gray>|</dark_gray> ")
pageBarSB.append(createPageCodeStr(i, i == page))
}
if (last) pageBarSB.append(" <dark_gray>...</dark_gray> ").append(createPageCodeStr(total - 1, false))
pageBarSB.append("<dark_gray>)</dark_gray>")

val pageBarMessage = pageBarSB.toString()
return MessageUtil.mm.deserialize(pageBarMessage)
}
}
16 changes: 13 additions & 3 deletions src/main/resources/plugin.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,19 @@ softdepend:
- NBTAPI

permissions:
"xasmc.hashbook.command.sethash":
default: op
"xasmc.hashbook.command.hashbook":
default: not op
"xasmc.hashbook.command.reload":
default: op
"xasmc.hashbook.command.calchash":
default: not op
"xasmc.hashbook.command.sethash":
default: op
"xasmc.hashbook.command.getpage":
default: not op
"xasmc.hashbook.command.searchbook":
default: op
default: not op
"xasmc.hashbook.command.storebook":
default: not op
"xasmc.hashbook.command.bookinfo":
default: not op

0 comments on commit 7a6f474

Please sign in to comment.