|
|
@@ -7,9 +7,11 @@ import bot_luo_core.cli.annotation.Method
|
|
|
import bot_luo_core.cli.checkers.GroupCmdWorkingChecker
|
|
|
import bot_luo_core.cli.exceptions.SyntaxError
|
|
|
import bot_luo_core.cli.handlers.GroupArgHandler
|
|
|
+import bot_luo_core.cli.handlers.JsonArgHandler
|
|
|
import bot_luo_core.cli.handlers.JsonPathArgHandler
|
|
|
import bot_luo_core.cli.handlers.UserArgHandler
|
|
|
import bot_luo_core.data.*
|
|
|
+import bot_luo_core.util.GSON
|
|
|
import bot_luo_core.util.TableBuilder
|
|
|
import bot_luo_core.util.indices
|
|
|
import bot_luo_core.util.set
|
|
|
@@ -83,14 +85,14 @@ class DataCmd(context: CmdContext) : Cmd(context) {
|
|
|
|
|
|
/* ======================== set ======================== */
|
|
|
|
|
|
- suspend fun set(dataObject: DataObject, objName: String, objId: String = "", path: ArrayList<String>, value: String): CmdReceipt {
|
|
|
+ suspend fun set(dataObject: DataObject, objName: String, objId: String = "", path: ArrayList<String>, value: JsonElement): CmdReceipt {
|
|
|
val table = TableBuilder(4)
|
|
|
table.th("写入${objName}数据 —— $objId")
|
|
|
table.p("/"+path.joinToString("/")).br().br()
|
|
|
try { withLockedAccessing(dataObject) {
|
|
|
dataObject.markDirty()
|
|
|
- val (old, new) = writeByPathTyped(dataObject.element, path, defaultCast(value))
|
|
|
- table.tr(formatValue(old)).td("->").td(formatValue(new))
|
|
|
+ val old = writeByPathTyped(dataObject.element, path, value)
|
|
|
+ table.tr(formatValue(old)).td("->").td(formatValue(value))
|
|
|
context.print(table.toString())
|
|
|
return SUCCESS
|
|
|
} } catch (e: NullPointerException) {
|
|
|
@@ -102,14 +104,14 @@ class DataCmd(context: CmdContext) : Cmd(context) {
|
|
|
return FATAL
|
|
|
}
|
|
|
|
|
|
- suspend fun set(dataArray: DataArray, arrayName: String, arrayId: String = "", path: ArrayList<String>, value: String): CmdReceipt {
|
|
|
+ suspend fun set(dataArray: DataArray, arrayName: String, arrayId: String = "", path: ArrayList<String>, value: JsonElement): CmdReceipt {
|
|
|
val table = TableBuilder(4)
|
|
|
table.th("写入${arrayName}数据 —— $arrayId")
|
|
|
table.p("/"+path.joinToString("/")).br().br()
|
|
|
try { withLockedAccessing(dataArray) {
|
|
|
dataArray.markDirty()
|
|
|
- val (old, new) = writeByPathTyped(dataArray.element, path, defaultCast(value))
|
|
|
- table.tr(formatValue(old)).td("->").td(formatValue(new))
|
|
|
+ val old = writeByPathTyped(dataArray.element, path, value)
|
|
|
+ table.tr(formatValue(old)).td("->").td(formatValue(value))
|
|
|
context.print(table.toString())
|
|
|
return SUCCESS
|
|
|
} } catch (e: NullPointerException) {
|
|
|
@@ -127,7 +129,8 @@ class DataCmd(context: CmdContext) : Cmd(context) {
|
|
|
table.p("/"+path.joinToString("/")).br().br()
|
|
|
try { withLockedAccessing(dataObject) {
|
|
|
dataObject.markDirty()
|
|
|
- val (old, new) = writeByPathTyped(dataObject.element, path, value castTo type)
|
|
|
+ val new = value castTo type
|
|
|
+ val old = writeByPathTyped(dataObject.element, path, new)
|
|
|
table.tr(formatValue(old)).td("->").td(formatValue(new))
|
|
|
context.print(table.toString())
|
|
|
return SUCCESS
|
|
|
@@ -146,7 +149,8 @@ class DataCmd(context: CmdContext) : Cmd(context) {
|
|
|
table.p("/"+path.joinToString("/")).br().br()
|
|
|
try { withLockedAccessing(dataArray) {
|
|
|
dataArray.markDirty()
|
|
|
- val (old, new) = writeByPathTyped(dataArray.element, path, value castTo type)
|
|
|
+ val new = value castTo type
|
|
|
+ val old = writeByPathTyped(dataArray.element, path, new)
|
|
|
table.tr(formatValue(old)).td("->").td(formatValue(new))
|
|
|
context.print(table.toString())
|
|
|
return SUCCESS
|
|
|
@@ -165,8 +169,8 @@ class DataCmd(context: CmdContext) : Cmd(context) {
|
|
|
group: Group,
|
|
|
@Argument(name = "路径", handler = JsonPathArgHandler::class)
|
|
|
path: ArrayList<String>,
|
|
|
- @Argument(name = "值")
|
|
|
- value: String
|
|
|
+ @Argument(name = "值", handler = JsonArgHandler::class)
|
|
|
+ value: JsonElement
|
|
|
): CmdReceipt = set(group, "群组", "${group.name}(${group.id})", path, value)
|
|
|
|
|
|
@Method(name = "set-user", alias = ["su"], pmsLevel = CmdPermissionLevel.DEBUG, ignoreCheckers = [GroupCmdWorkingChecker::class], order = 0, title = "修改用户数据")
|
|
|
@@ -175,8 +179,8 @@ class DataCmd(context: CmdContext) : Cmd(context) {
|
|
|
user: User,
|
|
|
@Argument(name = "路径", handler = JsonPathArgHandler::class)
|
|
|
path: ArrayList<String>,
|
|
|
- @Argument(name = "值")
|
|
|
- value: String
|
|
|
+ @Argument(name = "值", handler = JsonArgHandler::class)
|
|
|
+ value: JsonElement
|
|
|
): CmdReceipt = set(user, "用户", "${user.name}(${user.id})", path, value)
|
|
|
|
|
|
@Method(name = "set-group", alias = ["sg"], pmsLevel = CmdPermissionLevel.DEBUG, ignoreCheckers = [GroupCmdWorkingChecker::class], order = 1, title = "修改群组数据")
|
|
|
@@ -212,31 +216,19 @@ class DataCmd(context: CmdContext) : Cmd(context) {
|
|
|
@Suppress("UNCHECKED_CAST")
|
|
|
companion object {
|
|
|
|
|
|
- private infix fun String.castTo(type: String): Any? {
|
|
|
+ private infix fun String.castTo(type: String): JsonElement {
|
|
|
return when (type.lowercase()) {
|
|
|
- "num","number","float","double" -> this.toBigDecimalOrNull()?: throw SyntaxError(-1, "无法将“$this”转换为浮点数")
|
|
|
- "int","integer","short","long","longlong" -> this.toBigIntegerOrNull()?: throw SyntaxError(-1, "无法将“$this”转换为整数")
|
|
|
- "str","string","charsequence" -> this
|
|
|
- "bool","boolean" -> this.toBoolean()
|
|
|
- "null" -> if (this == "null") return null else throw SyntaxError(-1, "无法将“$this”转换为Null")
|
|
|
+ "num","number","float","double" -> GSON.toJsonTree(this.toBigDecimalOrNull()?: throw SyntaxError(-1, "无法将“$this”转换为浮点数"))
|
|
|
+ "int","integer","short","long","longlong" -> GSON.toJsonTree(this.toBigIntegerOrNull()?: throw SyntaxError(-1, "无法将“$this”转换为整数"))
|
|
|
+ "str","string","charsequence" -> GSON.toJsonTree(this)
|
|
|
+ "bool","boolean" -> GSON.toJsonTree(this.toBoolean())
|
|
|
+ "null" -> if (this == "null") return JsonNull.INSTANCE else throw SyntaxError(-1, "无法将“$this”转换为Null")
|
|
|
"array","list" -> if (this == "[]") return JsonArray() else throw SyntaxError(-1, "无法将“$this”转换为Array")
|
|
|
"object","obj" -> if (this == "{}") return JsonObject() else throw SyntaxError(-1, "无法将“$this”转换为Object")
|
|
|
else -> throw SyntaxError(-1, "未知的类型“$type”")
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private fun defaultCast(input: String): Any? {
|
|
|
- return input.toBigIntegerOrNull()?:
|
|
|
- input.toBigDecimalOrNull()?:
|
|
|
- input.toBooleanStrictOrNull()?:
|
|
|
- when (input) {
|
|
|
- "{}" -> JsonObject()
|
|
|
- "[]" -> JsonArray()
|
|
|
- "null" -> null
|
|
|
- else -> input
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
private fun objectGet(obj: JsonObject, table: TableBuilder) {
|
|
|
for ((k, v) in obj.entrySet()) {
|
|
|
table.tr("$k:").td(formatValue(v))
|
|
|
@@ -265,14 +257,13 @@ class DataCmd(context: CmdContext) : Cmd(context) {
|
|
|
when (obj) {
|
|
|
is JsonObject -> objectGet(obj, table)
|
|
|
is JsonArray -> arrayGet(obj, table)
|
|
|
- is JsonNull -> throw NullPointerException()
|
|
|
else -> table.tr(formatValue(obj))
|
|
|
}
|
|
|
} else {
|
|
|
when (obj) {
|
|
|
is JsonObject -> {
|
|
|
val key = path[0]
|
|
|
- if (key !in obj.keys()) throw NullPointerException()
|
|
|
+ if (!obj.has(key)) throw NullPointerException()
|
|
|
readByPath(obj[key], path.apply { removeAt(0) }, table)
|
|
|
}
|
|
|
is JsonArray -> {
|
|
|
@@ -293,18 +284,18 @@ class DataCmd(context: CmdContext) : Cmd(context) {
|
|
|
* 返回 [Pair] (旧数据,新数据)
|
|
|
*/
|
|
|
@Throws(NullPointerException::class)
|
|
|
- private fun writeByPathTyped(obj: JsonElement, path: ArrayList<String>, value: Any?): Pair<JsonElement,JsonElement> {
|
|
|
+ private fun writeByPathTyped(obj: JsonElement, path: ArrayList<String>, value: JsonElement): JsonElement {
|
|
|
when (path.size) {
|
|
|
0 -> throw NullPointerException()
|
|
|
1 -> {
|
|
|
when (obj) {
|
|
|
is JsonObject -> {
|
|
|
- val oldValue = obj[path[0]]
|
|
|
- if (value == null)
|
|
|
+ val oldValue = obj[path[0]] ?: JsonNull.INSTANCE
|
|
|
+ if (value is JsonNull)
|
|
|
obj.remove(path[0])
|
|
|
else
|
|
|
obj[path[0]] = value
|
|
|
- return oldValue to obj[path[0]]
|
|
|
+ return oldValue
|
|
|
}
|
|
|
is JsonArray -> {
|
|
|
val index = path[0].toIntOrNull()?: throw NullPointerException()
|
|
|
@@ -312,16 +303,16 @@ class DataCmd(context: CmdContext) : Cmd(context) {
|
|
|
val oldValue: JsonElement
|
|
|
if (index == obj.size()) {
|
|
|
oldValue = JsonNull.INSTANCE
|
|
|
- if (value != null)
|
|
|
+ if (value !is JsonNull)
|
|
|
obj.add(value)
|
|
|
} else {
|
|
|
- oldValue = obj[index]
|
|
|
- if (value == null)
|
|
|
+ oldValue = obj[index] ?: JsonNull.INSTANCE
|
|
|
+ if (value is JsonNull)
|
|
|
obj.remove(index)
|
|
|
else
|
|
|
obj[index] = value
|
|
|
}
|
|
|
- return oldValue to if (value == null) JsonNull.INSTANCE else obj[index]
|
|
|
+ return oldValue
|
|
|
}
|
|
|
else -> throw NullPointerException()
|
|
|
}
|
|
|
@@ -330,7 +321,7 @@ class DataCmd(context: CmdContext) : Cmd(context) {
|
|
|
return when (obj) {
|
|
|
is JsonObject -> {
|
|
|
val key = path[0]
|
|
|
- if (key !in obj.keys()) throw NullPointerException()
|
|
|
+ if (!obj.has(key)) throw NullPointerException()
|
|
|
writeByPathTyped(obj[key], path.apply { removeAt(0) }, value)
|
|
|
}
|
|
|
is JsonArray -> {
|