Просмотр исходного кода

use working switch replace with permission switch

00ll00 5 лет назад
Родитель
Сommit
4c4f37f847
28 измененных файлов с 228 добавлено и 165 удалено
  1. 2 2
      build.gradle.kts
  2. 9 1
      src/main/kotlin/bot_luo_core/cli/Checker.kt
  3. 13 0
      src/main/kotlin/bot_luo_core/cli/checkers/GroupCmdWorkingChecker.kt
  4. 2 2
      src/main/kotlin/bot_luo_core/cli/checkers/PermissionChecker.kt
  5. 1 1
      src/main/kotlin/bot_luo_core/cli/checkers/UserCmdParallelExecutingChecker.kt
  6. 13 0
      src/main/kotlin/bot_luo_core/cli/checkers/UserCmdWorkingChecker.kt
  7. 1 1
      src/main/kotlin/bot_luo_core/cli/checkers/addon/GlobalCmdParallelExecutingChecker.kt
  8. 3 5
      src/main/kotlin/bot_luo_core/cli/checkers/addon/GroupPermissionChecker.kt
  9. 3 5
      src/main/kotlin/bot_luo_core/cli/checkers/addon/UserPermissionChecker.kt
  10. 7 7
      src/main/kotlin/bot_luo_core/cli/commands/DataCmd.kt
  11. 13 4
      src/main/kotlin/bot_luo_core/cli/commands/DebugCmd.kt
  12. 2 2
      src/main/kotlin/bot_luo_core/cli/commands/ExecuteCmd.kt
  13. 4 3
      src/main/kotlin/bot_luo_core/cli/commands/HelpCmd.kt
  14. 6 6
      src/main/kotlin/bot_luo_core/cli/commands/ListCmd.kt
  15. 20 12
      src/main/kotlin/bot_luo_core/cli/commands/PermissionCmd.kt
  16. 25 22
      src/main/kotlin/bot_luo_core/cli/commands/StatCmd.kt
  17. 12 16
      src/main/kotlin/bot_luo_core/cli/commands/SwitchCmd.kt
  18. 1 1
      src/main/kotlin/bot_luo_core/data/CmdData.kt
  19. 1 1
      src/main/kotlin/bot_luo_core/data/Data.kt
  20. 6 5
      src/main/kotlin/bot_luo_core/data/DataArray.kt
  21. 5 4
      src/main/kotlin/bot_luo_core/data/DataObject.kt
  22. 16 15
      src/main/kotlin/bot_luo_core/data/Group.kt
  23. 1 1
      src/main/kotlin/bot_luo_core/data/Groups.kt
  24. 14 13
      src/main/kotlin/bot_luo_core/data/User.kt
  25. 1 1
      src/main/kotlin/bot_luo_core/data/Users.kt
  26. 31 2
      src/main/kotlin/bot_luo_core/util/GsonHelper.kt
  27. 0 30
      src/main/kotlin/bot_luo_core/util/JsonWorker.kt
  28. 16 3
      src/main/kotlin/bot_luo_core/util/Text.kt

+ 2 - 2
build.gradle.kts

@@ -6,6 +6,6 @@ dependencies {
     api("net.mamoe:mirai-core:2.7.1-dev-1")
     api("com.github.salomonbrys.kotson:kotson:2.5.0")
     implementation("org.reflections:reflections:0.9.12")
-    implementation ("org.apache.logging.log4j:log4j-api:2.14.0")
-    implementation ("org.apache.logging.log4j:log4j-core:2.14.0")
+    api ("org.apache.logging.log4j:log4j-api:2.14.0")
+    api ("org.apache.logging.log4j:log4j-core:2.14.0")
 }

+ 9 - 1
src/main/kotlin/bot_luo_core/cli/Checker.kt

@@ -14,7 +14,13 @@ interface Checker {
     @Throws(CheckerFatal::class)
     fun check(cmd: CmdExecutable, context: CmdContext)
 
+    /**
+     * 获取一个绑定当前命令的[CheckerFatal]实例
+     */
     fun CheckerFatal(output: Message, message: String) = CheckerFatal(output, "$name 检定失败:${message}", this::class)
+    /**
+     * 获取一个绑定当前命令的[CheckerFatal]实例
+     */
     fun CheckerFatal(message: String) = CheckerFatal(message.toPlainText(), message)
 
     companion object {
@@ -30,11 +36,13 @@ interface Checker {
         val CHECKERS = arrayListOf(
             BotRunningChecker::class,
             GroupCDChecker::class,
+            GroupCmdWorkingChecker::class,
             GroupDayLimitChecker::class,
             PermissionChecker::class,
             UserCDChecker::class,
+            UserCmdWorkingChecker::class,
             UserDayLimitChecker::class,
-            UserParallelExecutingChecker::class
+            UserCmdParallelExecutingChecker::class
         )
 
         fun KClass<out Checker>.order() = CHECKERS.indexOf(this)

+ 13 - 0
src/main/kotlin/bot_luo_core/cli/checkers/GroupCmdWorkingChecker.kt

@@ -0,0 +1,13 @@
+package bot_luo_core.cli.checkers
+
+import bot_luo_core.cli.Checker
+import bot_luo_core.cli.CmdContext
+import bot_luo_core.cli.CmdExecutable
+
+class GroupCmdWorkingChecker: Checker {
+    override val name = "群组命令启用检定器"
+
+    override fun check(cmd: CmdExecutable, context: CmdContext) {
+        if (!context.group.getCmdWorking(cmd)) throw CheckerFatal("此命令未在群组${context.group.name}(${context.group.id})启用")
+    }
+}

+ 2 - 2
src/main/kotlin/bot_luo_core/cli/checkers/PermissionChecker.kt

@@ -11,8 +11,8 @@ class PermissionChecker: Checker {
     override val name = "权限检定器"
 
     override fun check(cmd: CmdExecutable, context: CmdContext) {
-        val p1 = context.userF.realPmsGroup
-        val p2 = context.groupF.realPmsGroup
+        val p1 = context.userF.pmsGroup
+        val p2 = context.groupF.pmsGroup
         val i1 = p1.readPmsOn(cmd)
         val i2 = p2.readPmsOn(cmd)
         if (i1 + i2 <= 0) throw CheckerFatal("权限不足,要求:${cmd.pmsLevel.name} 群组权限:${p2.name}($i2) 用户权限:${p1.name}($i1)")

+ 1 - 1
src/main/kotlin/bot_luo_core/cli/checkers/UserParallelExecutingChecker.kt → src/main/kotlin/bot_luo_core/cli/checkers/UserCmdParallelExecutingChecker.kt

@@ -5,7 +5,7 @@ import bot_luo_core.cli.CmdContext
 import bot_luo_core.cli.CmdExecutable
 import net.mamoe.mirai.message.data.toPlainText
 
-class UserParallelExecutingChecker: Checker {
+class UserCmdParallelExecutingChecker: Checker {
     override val name = "用户命令并发检定器"
 
     override fun check(cmd: CmdExecutable, context: CmdContext) {

+ 13 - 0
src/main/kotlin/bot_luo_core/cli/checkers/UserCmdWorkingChecker.kt

@@ -0,0 +1,13 @@
+package bot_luo_core.cli.checkers
+
+import bot_luo_core.cli.Checker
+import bot_luo_core.cli.CmdContext
+import bot_luo_core.cli.CmdExecutable
+
+class UserCmdWorkingChecker: Checker {
+    override val name = "用户命令启用检定器"
+
+    override fun check(cmd: CmdExecutable, context: CmdContext) {
+        if (!context.user.getCmdWorking(cmd)) throw CheckerFatal("此命令未对用户${context.user.name}(${context.user.id})启用")
+    }
+}

+ 1 - 1
src/main/kotlin/bot_luo_core/cli/checkers/addon/CmdParallelExecutingChecker.kt → src/main/kotlin/bot_luo_core/cli/checkers/addon/GlobalCmdParallelExecutingChecker.kt

@@ -5,7 +5,7 @@ import bot_luo_core.cli.CmdContext
 import bot_luo_core.cli.CmdExecutable
 import net.mamoe.mirai.message.data.toPlainText
 
-class CmdParallelExecutingChecker: Checker {
+class GlobalCmdParallelExecutingChecker: Checker {
     override val name = "全局命令并发检定器"
 
     override fun check(cmd: CmdExecutable, context: CmdContext) {

+ 3 - 5
src/main/kotlin/bot_luo_core/cli/checkers/addon/GroupOriginalPermissionChecker.kt → src/main/kotlin/bot_luo_core/cli/checkers/addon/GroupPermissionChecker.kt

@@ -4,16 +4,14 @@ import bot_luo_core.cli.Checker
 import bot_luo_core.cli.CmdContext
 import bot_luo_core.cli.CmdExecutable
 import bot_luo_core.data.PmsGroups.readPmsOn
-import net.mamoe.mirai.message.data.toPlainText
 
-class GroupOriginalPermissionChecker: Checker {
+class GroupPermissionChecker: Checker {
 
-    override val name = "群组原始权限检定器"
+    override val name = "群组权限检定器"
 
     override fun check(cmd: CmdExecutable, context: CmdContext) {
         val p = context.group.pmsGroup
         val i = p.readPmsOn(cmd)
-        if (i < 1) throw CheckerFatal("群组原始权限不足,要求:${cmd.pmsLevel.name} 群组原始权限:${p.name}($i)")
+        if (i <= 0) throw CheckerFatal("群组权限不足,要求:${cmd.pmsLevel.name} 群组权限:${p.name}($i)")
     }
-
 }

+ 3 - 5
src/main/kotlin/bot_luo_core/cli/checkers/addon/UserOriginalPermissionChecker.kt → src/main/kotlin/bot_luo_core/cli/checkers/addon/UserPermissionChecker.kt

@@ -4,16 +4,14 @@ import bot_luo_core.cli.Checker
 import bot_luo_core.cli.CmdContext
 import bot_luo_core.cli.CmdExecutable
 import bot_luo_core.data.PmsGroups.readPmsOn
-import net.mamoe.mirai.message.data.toPlainText
 
-class UserOriginalPermissionChecker: Checker {
+class UserPermissionChecker: Checker {
 
-    override val name = "用户原始权限检定器"
+    override val name = "群组权限检定器"
 
     override fun check(cmd: CmdExecutable, context: CmdContext) {
         val p = context.user.pmsGroup
         val i = p.readPmsOn(cmd)
-        if (i < 1) throw CheckerFatal("用户原始权限不足,要求:${cmd.pmsLevel.name} 用户原始权限:${p.name}($i)")
+        if (i <= 0) throw CheckerFatal("用户权限不足,要求:${cmd.pmsLevel.name} 用户权限:${p.name}($i)")
     }
-
 }

+ 7 - 7
src/main/kotlin/bot_luo_core/cli/commands/DataCmd.kt

@@ -4,7 +4,7 @@ import bot_luo_core.cli.*
 import bot_luo_core.cli.annotation.Argument
 import bot_luo_core.cli.annotation.Command
 import bot_luo_core.cli.annotation.Method
-import bot_luo_core.cli.checkers.addon.UserOriginalPermissionChecker
+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.JsonPathArgHandler
@@ -64,7 +64,7 @@ class DataCmd(context: CmdContext) : Cmd(context) {
         return FATAL
     }
 
-    @Method(name = "", alias = ["get-group","gg","g"], pmsLevel = CmdPermissionLevel.OP, addonCheckers = [UserOriginalPermissionChecker::class], title = "获取群组数据")
+    @Method(name = "", alias = ["get-group","gg","g"], pmsLevel = CmdPermissionLevel.OP, ignoreCheckers = [GroupCmdWorkingChecker::class], title = "获取群组数据")
     fun getGroup (
         @Argument(name = "群组", handler = GroupArgHandler::class)
         group: Group,
@@ -72,7 +72,7 @@ class DataCmd(context: CmdContext) : Cmd(context) {
         pathIn: ArrayList<String>?
     ): CmdReceipt = get(group, "群组", "${group.name}(${group.id})", pathIn?: ArrayList())
 
-    @Method(name = "get-user", alias = ["gu","u"], pmsLevel = CmdPermissionLevel.OP, addonCheckers = [UserOriginalPermissionChecker::class], title = "获取用户数据")
+    @Method(name = "get-user", alias = ["gu","u"], pmsLevel = CmdPermissionLevel.OP, ignoreCheckers = [GroupCmdWorkingChecker::class], title = "获取用户数据")
     fun getUser (
         @Argument(name = "用户", handler = UserArgHandler::class)
         user: User,
@@ -158,7 +158,7 @@ class DataCmd(context: CmdContext) : Cmd(context) {
         return FATAL
     }
 
-    @Method(name = "set-group", alias = ["sg"], pmsLevel = CmdPermissionLevel.DEBUG, addonCheckers = [UserOriginalPermissionChecker::class], order = 0, title = "修改群组数据")
+    @Method(name = "set-group", alias = ["sg"], pmsLevel = CmdPermissionLevel.DEBUG, ignoreCheckers = [GroupCmdWorkingChecker::class], order = 0, title = "修改群组数据")
     suspend fun setGroup (
         @Argument(name = "群组", handler = GroupArgHandler::class)
         group: Group,
@@ -168,7 +168,7 @@ class DataCmd(context: CmdContext) : Cmd(context) {
         value: String
     ): CmdReceipt = set(group, "群组", "${group.name}(${group.id})", path, value)
 
-    @Method(name = "set-user", alias = ["su"], pmsLevel = CmdPermissionLevel.DEBUG, addonCheckers = [UserOriginalPermissionChecker::class], order = 0, title = "修改用户数据")
+    @Method(name = "set-user", alias = ["su"], pmsLevel = CmdPermissionLevel.DEBUG, ignoreCheckers = [GroupCmdWorkingChecker::class], order = 0, title = "修改用户数据")
     suspend fun setUser (
         @Argument(name = "用户", handler = UserArgHandler::class)
         user: User,
@@ -178,7 +178,7 @@ class DataCmd(context: CmdContext) : Cmd(context) {
         value: String
     ): CmdReceipt = set(user, "用户", "${user.name}(${user.id})", path, value)
 
-    @Method(name = "set-group", alias = ["sg"], pmsLevel = CmdPermissionLevel.DEBUG, addonCheckers = [UserOriginalPermissionChecker::class], order = 1, title = "修改群组数据")
+    @Method(name = "set-group", alias = ["sg"], pmsLevel = CmdPermissionLevel.DEBUG, ignoreCheckers = [GroupCmdWorkingChecker::class], order = 1, title = "修改群组数据")
     suspend fun setGroup (
         @Argument(name = "群组", handler = GroupArgHandler::class)
         group: Group,
@@ -193,7 +193,7 @@ class DataCmd(context: CmdContext) : Cmd(context) {
         type: String
     ): CmdReceipt  = set(group, "群组", "${group.name}(${group.id})", path, value, type)
 
-    @Method(name = "set-user", alias = ["su"], pmsLevel = CmdPermissionLevel.DEBUG, addonCheckers = [UserOriginalPermissionChecker::class], order = 1, title = "修改用户数据")
+    @Method(name = "set-user", alias = ["su"], pmsLevel = CmdPermissionLevel.DEBUG, ignoreCheckers = [GroupCmdWorkingChecker::class], order = 1, title = "修改用户数据")
     suspend fun setUser (
         @Argument(name = "用户", handler = UserArgHandler::class)
         user: User,

+ 13 - 4
src/main/kotlin/bot_luo_core/cli/commands/DebugCmd.kt

@@ -8,6 +8,7 @@ import bot_luo_core.data.Data
 import bot_luo_core.data.Groups
 import bot_luo_core.data.Users
 import bot_luo_core.util.TableBuilder
+import bot_luo_core.util.Text.limitStart
 import bot_luo_core.util.Time.relativeTo
 
 @Command(
@@ -23,11 +24,19 @@ class DebugCmd(context: CmdContext) : Cmd(context) {
         val table = TableBuilder(4)
         table.th("调试信息 ——").br()
         table.tr("start_at:").td( BotLuo.startAt relativeTo context.time)
-        table.tr("active_groups:").td(Groups.activeGroupsCount)
-        table.tr("active_users:").td(Users.activeUsersCount)
-        table.tr("save_jobs:").td(Data.savingJobs.size)
+        table.th()
+        table.prettyLines("active_groups(${Groups.activeGroupsCount}):", Groups.groups.keys) { item, builder ->
+            builder.td(item)
+        }
+        table.th()
+        table.prettyLines("active_users(${Users.activeUsersCount}):", Users.users.keys) { item, builder ->
+            builder.td(item)
+        }
+        table.th()
+        table.prettyLines("saving_data(${Data.savingJobs.size}):",Data.savingJobs.keys) { item, builder ->
+            builder.td(item::class.simpleName).td(item.filePath.limitStart(20))
+        }
         context.print(table.toString())
         return SUCCESS
     }
-
 }

+ 2 - 2
src/main/kotlin/bot_luo_core/cli/commands/ExecuteCmd.kt

@@ -4,7 +4,7 @@ import bot_luo_core.cli.*
 import bot_luo_core.cli.annotation.Argument
 import bot_luo_core.cli.annotation.Command
 import bot_luo_core.cli.annotation.Method
-import bot_luo_core.cli.checkers.UserParallelExecutingChecker
+import bot_luo_core.cli.checkers.UserCmdParallelExecutingChecker
 import bot_luo_core.cli.exceptions.*
 import bot_luo_core.cli.handlers.MultiGroupArgHandler
 import bot_luo_core.cli.handlers.MultiUserArgHandler
@@ -28,7 +28,7 @@ import kotlin.reflect.KType
 )
 class ExecuteCmd(context: CmdContext) : Cmd(context) {
 
-    @Method(name = "", alias = [], pmsLevel = CmdPermissionLevel.OP, ignoreCheckers = [UserParallelExecutingChecker::class])
+    @Method(name = "", alias = [], pmsLevel = CmdPermissionLevel.OP, ignoreCheckers = [UserCmdParallelExecutingChecker::class])
     fun run (
         @Argument("子命令", handler = ExecuteArgHandler::class)
         contexts: ArrayList<CmdContext>

+ 4 - 3
src/main/kotlin/bot_luo_core/cli/commands/HelpCmd.kt

@@ -4,7 +4,8 @@ import bot_luo_core.cli.*
 import bot_luo_core.cli.annotation.Argument
 import bot_luo_core.cli.annotation.Command
 import bot_luo_core.cli.annotation.Method
-import bot_luo_core.cli.checkers.addon.GroupOriginalPermissionChecker
+import bot_luo_core.cli.checkers.PermissionChecker
+import bot_luo_core.cli.checkers.addon.GroupPermissionChecker
 import bot_luo_core.cli.exceptions.CheckerFatal
 import bot_luo_core.cli.handlers.CmdExArgHandler
 import bot_luo_core.util.TableBuilder
@@ -52,7 +53,7 @@ class HelpCmd(context: CmdContext) : Cmd(context) {
 
         val filtered = cmds.filter {
             try {
-                justCheck.forEach{checker -> if (checker in it.checkers) checker.createInstance().check(it,context)}
+                justCheck.forEach{checker -> checker.createInstance().check(it,context)}
                 true
             } catch (ignore: CheckerFatal) {
                 false
@@ -71,7 +72,7 @@ class HelpCmd(context: CmdContext) : Cmd(context) {
     companion object {
 
         val justCheck = arrayOf(
-            GroupOriginalPermissionChecker::class
+            GroupPermissionChecker::class
         )
 
         fun cmdHelpGen(cmds: List<CmdExecutable>): String? {

+ 6 - 6
src/main/kotlin/bot_luo_core/cli/commands/ListCmd.kt

@@ -3,9 +3,9 @@ package bot_luo_core.cli.commands
 import bot_luo_core.cli.*
 import bot_luo_core.cli.annotation.Command
 import bot_luo_core.cli.annotation.Method
-import bot_luo_core.cli.checkers.addon.GroupOriginalPermissionChecker
+import bot_luo_core.cli.checkers.PermissionChecker
+import bot_luo_core.cli.checkers.addon.GroupPermissionChecker
 import bot_luo_core.cli.exceptions.CheckerFatal
-import bot_luo_core.data.PmsGroups.readPmsOn
 import bot_luo_core.util.TableBuilder
 import kotlin.reflect.full.createInstance
 
@@ -27,7 +27,7 @@ class ListCmd(context: CmdContext) : Cmd(context) {
             if (map[cmd.cmdName]?.first == true) continue
             try {
                 justCheck.forEach { it.createInstance().check(cmd, context) }
-                map[cmd.cmdName] = (group.realPmsGroup.readPmsOn(cmd) >= 0) to cmd
+                map[cmd.cmdName] = group.getCmdWorking(cmd) to cmd
             } catch (ignore: CheckerFatal) {}
         }
         map.values.forEach { (working, cmd) ->
@@ -47,7 +47,7 @@ class ListCmd(context: CmdContext) : Cmd(context) {
         for (cex in CmdCatalog.COMMANDS.distinctBy { it.id }.sortedBy { it.id }) {
             try {
                 justCheck.forEach { it.createInstance().check(cex, context) }
-                table.tr(if (group.realPmsGroup.readPmsOn(cex) >= 0) "[√]" else "[×]").td(cex.idFixed).td(cex.subTitle)
+                table.tr(if (group.getCmdWorking(cex)) "[√]" else "[×]").td(cex.idFixed).td(cex.subTitle)
             } catch (ignore: CheckerFatal) {}
         }
 
@@ -62,7 +62,7 @@ class ListCmd(context: CmdContext) : Cmd(context) {
         table.th("命令列表 —— 群组 ${group.name}(${group.id})").br()
 
         for (cex in CmdCatalog.COMMANDS.distinctBy { it.id }.sortedBy { it.id }) {
-            table.tr(if (group.realPmsGroup.readPmsOn(cex) >= 0) "[√]" else "[×]").td(cex.idFixed).td(cex.subTitle)
+            table.tr(if (group.getCmdWorking(cex)) "[√]" else "[×]").td(cex.idFixed).td(cex.subTitle)
         }
 
         context.print(table.toString())
@@ -72,7 +72,7 @@ class ListCmd(context: CmdContext) : Cmd(context) {
 
     companion object{
         val justCheck = arrayOf(
-            GroupOriginalPermissionChecker::class
+            GroupPermissionChecker::class
         )
     }
 }

+ 20 - 12
src/main/kotlin/bot_luo_core/cli/commands/PermissionCmd.kt

@@ -35,11 +35,8 @@ class PermissionCmd(context: CmdContext) : Cmd(context) {
         val group = groupIn?: context.group
         val table = TableBuilder(4)
         table.th("权限 —— 群组 ${group.name}(${group.id})").br()
-        table.tr("权限组:").td(group.realPmsGroup.name)
-        table.tr("描述:").td(group.realPmsGroup.description)
-        table.prettyLines("修改项:", group.pmsModify.entries) { item, builder ->
-            builder.td("${item.key}:").td(item.value)
-        }
+        table.tr("权限组:").td(group.pmsGroup.name)
+        table.tr("描述:").td(group.pmsGroup.description)
         context.print(table.toString())
         return SUCCESS
     }
@@ -52,18 +49,15 @@ class PermissionCmd(context: CmdContext) : Cmd(context) {
         val user = userIn?: context.user
         val table = TableBuilder(4)
         table.th("权限 —— 用户 ${user.name}(${user.id})").br()
-        table.tr("权限组:").td(user.realPmsGroup.name)
-        table.tr("描述:").td(user.realPmsGroup.description)
-        table.prettyLines("修改项:", user.pmsModify.entries) { item, builder ->
-            builder.td("${item.key}:").td(item.value)
-        }
+        table.tr("权限组:").td(user.pmsGroup.name)
+        table.tr("描述:").td(user.pmsGroup.description)
         context.print(table.toString())
         return SUCCESS
     }
 
     /*  ========================  set  ========================  */
 
-    @Method(name = "set-group",alias = ["sg"],pmsLevel = CmdPermissionLevel.OP,title = "设置群组")
+    @Method(name = "set-group",alias = ["sg"],pmsLevel = CmdPermissionLevel.OP,title = "设置群组", order = 0)
     suspend fun setG(
         @Argument(name = "权限组", handler = PmsGroupArgHandler::class)
         pms: PmsGroup,
@@ -80,8 +74,15 @@ class PermissionCmd(context: CmdContext) : Cmd(context) {
         context.print(table.toString())
         return SUCCESS
     }
+    @Method(name = "set-group",alias = ["sg"],pmsLevel = CmdPermissionLevel.OP,title = "设置群组", order = 1)
+    suspend fun setG(
+        @Argument(name = "群组", required = false, multiValued = true, handler = MultiGroupArgHandler::class)
+        groupsIn: ArrayList<Group>?,
+        @Argument(name = "权限组", handler = PmsGroupArgHandler::class)
+        pms: PmsGroup
+    ): CmdReceipt = setG(pms, groupsIn)
 
-    @Method(name = "set-user",alias = ["su"],pmsLevel = CmdPermissionLevel.OP,title = "设置用户")
+    @Method(name = "set-user",alias = ["su"],pmsLevel = CmdPermissionLevel.OP,title = "设置用户",order = 0)
     suspend fun setU(
         @Argument(name = "权限组", handler = PmsGroupArgHandler::class)
         pms: PmsGroup,
@@ -98,4 +99,11 @@ class PermissionCmd(context: CmdContext) : Cmd(context) {
         context.print(table.toString())
         return SUCCESS
     }
+    @Method(name = "set-user",alias = ["su"],pmsLevel = CmdPermissionLevel.OP,title = "设置用户",order = 1)
+    suspend fun setU(
+        @Argument(name = "用户", required = false, multiValued = true, handler = MultiUserArgHandler::class)
+        usersIn: ArrayList<User>?,
+        @Argument(name = "权限组", handler = PmsGroupArgHandler::class)
+        pms: PmsGroup
+    ): CmdReceipt = setU(pms, usersIn)
 }

+ 25 - 22
src/main/kotlin/bot_luo_core/cli/commands/StatCmd.kt

@@ -5,7 +5,8 @@ import bot_luo_core.cli.CmdCatalog.COMMANDS
 import bot_luo_core.cli.annotation.Argument
 import bot_luo_core.cli.annotation.Command
 import bot_luo_core.cli.annotation.Method
-import bot_luo_core.cli.checkers.addon.GroupOriginalPermissionChecker
+import bot_luo_core.cli.checkers.PermissionChecker
+import bot_luo_core.cli.checkers.addon.GroupPermissionChecker
 import bot_luo_core.cli.exceptions.CheckerFatal
 import bot_luo_core.cli.handlers.CmdExArgHandler
 import bot_luo_core.data.CmdDataObj
@@ -22,10 +23,10 @@ import kotlin.reflect.full.createInstance
 )
 class StatCmd(context: CmdContext) : Cmd(context) {
 
-    suspend fun getDetail(carrier: CmdDataObj, name: String, id: String, cmds: List<CmdExecutable>): CmdReceipt {
+    fun getDetail(carrier: CmdDataObj, name: String, id: String, cmds: List<CmdExecutable>): CmdReceipt {
         val filtered = cmds.filter {
             try {
-                justCheck.forEach { checker -> if (checker in it.checkers) checker.createInstance().check(it, context) }
+                justCheck.forEach { checker -> checker.createInstance().check(it, context) }
                 true
             } catch (ignore: CheckerFatal) {
                 false
@@ -33,30 +34,31 @@ class StatCmd(context: CmdContext) : Cmd(context) {
         }
 
         return if (filtered.isEmpty()) {
-            context.sendMessageWithLog("${name}统计 —— 403 Forbidden")
+            context.print("${name}统计 —— 403 Forbidden")
             FATAL
         } else {
             val table = TableBuilder(4)
             filtered.groupBy { it.cmdName }.forEach { (k, v) ->
                 table.th("${name}统计 —— $id").br()
+                val map = v.associateBy { it.methName }
                 table.prettyLines(
-                    "${k}:${v.sumOf { carrier.readCmdData(it).totalCount }}次",
-                    v.groupBy { it.methName }.entries
+                    "${k}:${map.values.sumOf { carrier.readCmdData(it).totalCount }}次",
+                    map.entries
                 ) { (key, value), builder ->
                     builder.td("-$key:")
-                        .td("${value.sumOf { carrier.readCmdData(it).totalCount }}次")
-                        .td(value.maxOf { carrier.readCmdData(it).lastTime } relativeToE context.time)
+                        .td("${carrier.readCmdData(value).totalCount}次")
+                        .td(carrier.readCmdData(value).lastTime relativeToE context.time)
                 }
             }
-            context.sendMessageWithLog(table.toString())
+            context.print(table.toString())
             SUCCESS
         }
     }
 
-    suspend fun getGeneral(carrier: CmdDataObj, name: String, id: String, cmds: ArrayList<CmdExecutable>): CmdReceipt {
+    fun getGeneral(carrier: CmdDataObj, name: String, id: String, cmds: ArrayList<CmdExecutable>): CmdReceipt {
         val filtered = cmds.filter {
             try {
-                justCheck.forEach { checker -> if (checker in it.checkers) checker.createInstance().check(it, context) }
+                justCheck.forEach { checker -> checker.createInstance().check(it, context) }
                 true
             } catch (ignore: CheckerFatal) {
                 false
@@ -64,17 +66,18 @@ class StatCmd(context: CmdContext) : Cmd(context) {
         }
 
         return if (filtered.isEmpty()) {
-            context.sendMessageWithLog("${name}统计 —— 403 Forbidden")
+            context.print("${name}统计 —— 403 Forbidden")
             FATAL
         } else {
             val table = TableBuilder(4)
             table.th("${name}统计 —— $id").br()
             filtered.groupBy { it.cmdName }.forEach { (k, v) ->
+                val map = v.associateBy { it.methName }
                 table.tr("$k:")
-                    .td("${v.sumOf { carrier.readCmdData(it).totalCount }}次")
-                    .td(v.maxOf { carrier.readCmdData(it).lastTime } relativeToE context.time)
+                    .td("${map.values.sumOf { carrier.readCmdData(it).totalCount }}次")
+                    .td(map.values.maxOf { carrier.readCmdData(it).lastTime } relativeToE context.time)
             }
-            context.sendMessageWithLog(table.toString())
+            context.print(table.toString())
             SUCCESS
         }
     }
@@ -82,40 +85,40 @@ class StatCmd(context: CmdContext) : Cmd(context) {
     /*  ========================  cmd  ========================  */
 
     @Method(name = "", alias = ["cmd", "c"], pmsLevel = CmdPermissionLevel.HIGH, title = "全局统计", order = 0)
-    suspend fun cmd (
+    fun cmd (
         @Argument(name = "命令", handler = CmdExArgHandler::class)
         cmds: List<CmdExecutable>
     ): CmdReceipt = getDetail(Cmds, "全局命令", "", cmds)
 
     @Method(name = "", alias = ["cmd", "c"], pmsLevel = CmdPermissionLevel.HIGH, title = "全局统计", order = 1)
-    suspend fun cmd (): CmdReceipt = getGeneral(Cmds, "全局命令", "", COMMANDS)
+    fun cmd (): CmdReceipt = getGeneral(Cmds, "全局命令", "", COMMANDS)
 
     /*  ========================  group  ========================  */
 
     @Method(name = "group", alias = ["g"], pmsLevel = CmdPermissionLevel.HIGH, title = "群组统计", order = 0)
-    suspend fun group (
+    fun group (
         @Argument(name = "命令", handler = CmdExArgHandler::class)
         cmds: List<CmdExecutable>
     ): CmdReceipt = getDetail(context.group, "群组", "${context.group.name}(${context.group.id})", cmds)
 
     @Method(name = "group", alias = ["g"], pmsLevel = CmdPermissionLevel.HIGH, title = "群组统计", order = 1)
-    suspend fun group (): CmdReceipt = getGeneral(context.group, "群组", "${context.group.name}(${context.group.id})", COMMANDS)
+    fun group (): CmdReceipt = getGeneral(context.group, "群组", "${context.group.name}(${context.group.id})", COMMANDS)
 
     /*  ========================  user  ========================  */
 
     @Method(name = "user", alias = ["u"], pmsLevel = CmdPermissionLevel.HIGH, title = "用户统计", order = 0)
-    suspend fun user (
+    fun user (
         @Argument(name = "命令", handler = CmdExArgHandler::class)
         cmds: List<CmdExecutable>
     ): CmdReceipt = getDetail(context.user, "用户", "${context.user.name}(${context.user.id})", cmds)
 
     @Method(name = "user", alias = ["u"], pmsLevel = CmdPermissionLevel.HIGH, title = "用户统计", order = 1)
-    suspend fun user (): CmdReceipt = getGeneral(context.user, "用户", "${context.user.name}(${context.user.id})", COMMANDS)
+    fun user (): CmdReceipt = getGeneral(context.user, "用户", "${context.user.name}(${context.user.id})", COMMANDS)
 
     companion object {
 
         val justCheck = arrayOf(
-            GroupOriginalPermissionChecker::class
+            GroupPermissionChecker::class
         )
     }
 }

+ 12 - 16
src/main/kotlin/bot_luo_core/cli/commands/SwitchCmd.kt

@@ -7,8 +7,7 @@ import bot_luo_core.cli.CmdPermissionLevel
 import bot_luo_core.cli.annotation.Argument
 import bot_luo_core.cli.annotation.Command
 import bot_luo_core.cli.annotation.Method
-import bot_luo_core.cli.checkers.PermissionChecker
-import bot_luo_core.cli.checkers.addon.UserOriginalPermissionChecker
+import bot_luo_core.cli.checkers.GroupCmdWorkingChecker
 import bot_luo_core.cli.handlers.CmdIdArgHandler
 import bot_luo_core.cli.handlers.GroupArgHandler
 import bot_luo_core.data.Group
@@ -25,7 +24,7 @@ class SwitchCmd(context: CmdContext) : Cmd(context) {
 
     /*  ========================  show  ========================  */
 
-    @Method(name = "", alias = ["show"], pmsLevel = CmdPermissionLevel.OP, order = 0, ignoreCheckers = [PermissionChecker::class], addonCheckers = [UserOriginalPermissionChecker::class],
+    @Method(name = "", alias = ["show"], pmsLevel = CmdPermissionLevel.OP, order = 0, ignoreCheckers = [GroupCmdWorkingChecker::class],
     title = "查看", usage = "获取命令是否开启")
     fun show(
         @Argument(name = "命令", handler = CmdIdArgHandler::class, multiValued = true)
@@ -37,14 +36,13 @@ class SwitchCmd(context: CmdContext) : Cmd(context) {
         val table = TableBuilder(4)
         table.th("电闸 —— 群组(${group.id})").br()
         for (id in ids) {
-            val i = group.pmsModify[id]?: 0
-            table.tr(id).td(":").td(if (i >= 0) "ON" else "OFF")
+            table.tr(id).td(":").td(if (group.getCmdWorking(id)) "ON" else "OFF")
         }
         context.println(table.toString())
         return SUCCESS
     }
 
-    @Method(name = "", alias = ["show"], pmsLevel = CmdPermissionLevel.OP, order = 0, ignoreCheckers = [PermissionChecker::class], addonCheckers = [UserOriginalPermissionChecker::class])
+    @Method(name = "", alias = ["show"], pmsLevel = CmdPermissionLevel.OP, order = 0, ignoreCheckers = [GroupCmdWorkingChecker::class])
     fun show(
         @Argument(name = "群组", handler = GroupArgHandler::class)
         groupIn: Group,
@@ -54,7 +52,7 @@ class SwitchCmd(context: CmdContext) : Cmd(context) {
 
     /*  ========================  on  ========================  */
 
-    @Method(name = "on", pmsLevel = CmdPermissionLevel.OP, order = 0, ignoreCheckers = [PermissionChecker::class], addonCheckers = [UserOriginalPermissionChecker::class])
+    @Method(name = "on", pmsLevel = CmdPermissionLevel.OP, order = 0, ignoreCheckers = [GroupCmdWorkingChecker::class])
     suspend fun on(
         @Argument(name = "命令", handler = CmdIdArgHandler::class, multiValued = true)
         ids: ArrayList<String>,
@@ -66,16 +64,15 @@ class SwitchCmd(context: CmdContext) : Cmd(context) {
         table.th("电闸开启 —— 群组(${group.id})").br()
         withLockedAccessing(group) {
             for (id in ids) {
-                val i = group.pmsModify[id] ?: 0
-                table.tr(id).td(":").td(if (i >= 0) "ON" else "OFF").td("->").td("ON")
-                if (i == -1) group.pmsModify = group.pmsModify.apply { remove(id) }
+                table.tr(id).td(":").td(if (group.getCmdWorking(id)) "ON" else "OFF").td("->").td("ON")
+                group.setCmdWorking(id, true)
             }
         }
         context.println(table.toString())
         return SUCCESS
     }
 
-    @Method(name = "on", pmsLevel = CmdPermissionLevel.OP, order = 0, ignoreCheckers = [PermissionChecker::class], addonCheckers = [UserOriginalPermissionChecker::class])
+    @Method(name = "on", pmsLevel = CmdPermissionLevel.OP, order = 0, ignoreCheckers = [GroupCmdWorkingChecker::class])
     suspend fun on(
         @Argument(name = "群组", handler = GroupArgHandler::class)
         groupIn: Group,
@@ -85,7 +82,7 @@ class SwitchCmd(context: CmdContext) : Cmd(context) {
 
     /*  ========================  off  ========================  */
 
-    @Method(name = "off", pmsLevel = CmdPermissionLevel.OP, order = 0, ignoreCheckers = [PermissionChecker::class], addonCheckers = [UserOriginalPermissionChecker::class])
+    @Method(name = "off", pmsLevel = CmdPermissionLevel.OP, order = 0, ignoreCheckers = [GroupCmdWorkingChecker::class])
     suspend fun off(
         @Argument(name = "命令", handler = CmdIdArgHandler::class, multiValued = true)
         ids: ArrayList<String>,
@@ -97,16 +94,15 @@ class SwitchCmd(context: CmdContext) : Cmd(context) {
         table.th("电闸关闭 —— 群组(${group.id})").br()
         withLockedAccessing(group) {
             for (id in ids) {
-                val i = group.pmsModify[id] ?: 0
-                table.tr(id).td(":").td(if (i >= 0) "ON" else "OFF").td("->").td("OFF")
-                group.pmsModify = group.pmsModify.apply { set(id, -1) }
+                table.tr(id).td(":").td(if (group.getCmdWorking(id)) "ON" else "OFF").td("->").td("OFF")
+                group.setCmdWorking(id, false)
             }
         }
         context.println(table.toString())
         return SUCCESS
     }
 
-    @Method(name = "off", pmsLevel = CmdPermissionLevel.OP, order = 0, ignoreCheckers = [PermissionChecker::class], addonCheckers = [UserOriginalPermissionChecker::class])
+    @Method(name = "off", pmsLevel = CmdPermissionLevel.OP, order = 0, ignoreCheckers = [GroupCmdWorkingChecker::class])
     suspend fun off(
         @Argument(name = "群组", handler = GroupArgHandler::class)
         groupIn: Group,

+ 1 - 1
src/main/kotlin/bot_luo_core/data/CmdData.kt

@@ -4,5 +4,5 @@ data class CmdData(
     var lastTime: Long,
     var totalCount: Int,
     var dayCount: Int,
-    var working: Boolean
+    var working: Boolean?
 )

+ 1 - 1
src/main/kotlin/bot_luo_core/data/Data.kt

@@ -18,7 +18,7 @@ abstract class Data(
     /**
      * JSON数据文件路径
      */
-    protected val filePath: String,
+    internal val filePath: String,
     /**
      * 自动保存间隔时间(ms)
      *

+ 6 - 5
src/main/kotlin/bot_luo_core/data/DataArray.kt

@@ -1,5 +1,6 @@
 package bot_luo_core.data
 
+import bot_luo_core.util.GSON
 import com.github.salomonbrys.kotson.removeAll
 import com.google.gson.Gson
 import com.google.gson.JsonArray
@@ -61,7 +62,7 @@ abstract class DataArray(
             if (!file.parentFile.exists()) file.parentFile.mkdirs()
             file.createNewFile()
         }
-        file.writeText(Gson().toJson(element))
+        file.writeText(GSON.toJson(element))
         changed = false
     }
 
@@ -73,12 +74,12 @@ abstract class DataArray(
     inline fun <reified T> getObj(index: Int): T? {
         return if (index >= element.size()) {
             val type = object : TypeToken<T>() {}.type
-            Gson().fromJson(element[index], type)
+            GSON.fromJson(element[index], type)
         } else null
     }
     inline fun <reified T: List<*>> getArray(): T {
         val type = object : TypeToken<T>() {}.type
-        return Gson().fromJson(element, type)
+        return GSON.fromJson(element, type)
     }
 
     /**
@@ -92,12 +93,12 @@ abstract class DataArray(
      * @see withLockedAccessing
      */
     fun <T> setObj(index: Int, value: T?) {
-        element[index] = Gson().toJsonTree(value)
+        element[index] = GSON.toJsonTree(value)
         changed = true
     }
     fun <T: List<*>> setArray(value: T) {
         element.removeAll()
-        value.forEach { v -> element.add(Gson().toJsonTree(value)) }
+        value.forEach { v -> element.add(GSON.toJsonTree(v)) }
         changed = true
     }
 }

+ 5 - 4
src/main/kotlin/bot_luo_core/data/DataObject.kt

@@ -1,5 +1,6 @@
 package bot_luo_core.data
 
+import bot_luo_core.util.GSON
 import bot_luo_core.util.set
 import com.github.salomonbrys.kotson.put
 import com.github.salomonbrys.kotson.putAll
@@ -64,7 +65,7 @@ abstract class DataObject(
             if (!file.parentFile.exists()) file.parentFile.mkdirs()
             file.createNewFile()
         }
-        file.writeText(Gson().toJson(element))
+        file.writeText(GSON.toJson(element))
         changed = false
     }
 
@@ -76,12 +77,12 @@ abstract class DataObject(
     inline fun <reified T> getObj(key: String): T? {
         return if (element.has(key)) {
             val type = object : TypeToken<T>() {}.type
-            Gson().fromJson(element[key], type)
+            GSON.fromJson(element[key], type)
         } else null
     }
     inline fun <reified T: Map<*, *>> getObj(): T {
         val type = object : TypeToken<T>() {}.type
-        return Gson().fromJson(element, type)
+        return GSON.fromJson(element, type)
     }
 
     /**
@@ -100,7 +101,7 @@ abstract class DataObject(
     }
     fun <T: Map<String, *>> setObj(value: T?) {
         element.removeAll()
-        value?.forEach{ (k,v) -> element.put(k to Gson().toJsonTree(v)) }
+        value?.forEach{ (k,v) -> element.put(k to GSON.toJsonTree(v)) }
         changed = true
     }
 }

+ 16 - 15
src/main/kotlin/bot_luo_core/data/Group.kt

@@ -3,6 +3,7 @@ package bot_luo_core.data
 import bot_luo_core.bot.BotContact
 import bot_luo_core.bot.BotContactType
 import bot_luo_core.bot.BotLuo
+import bot_luo_core.cli.CmdExecutable
 import net.mamoe.mirai.Bot
 import net.mamoe.mirai.contact.Contact
 import net.mamoe.mirai.contact.Group
@@ -40,21 +41,6 @@ class Group internal constructor(
         get() = PmsGroups[(getObj("pmsGroup")?: "NONE")]
         set(value) = setObj("pmsGroup", value.name)
 
-    var pmsModify: HashMap<String, Int>
-        get() = getObj("pmsModify")?: HashMap()
-        set(value) = setObj("pmsModify", value)
-
-    val realPmsGroup: PmsGroup
-        get() {
-            return if (pmsModify.isEmpty()) pmsGroup
-            else PmsGroup(
-                name = pmsGroup.name+"*",
-                description = pmsGroup.description+"(modified)",
-                inherit = pmsGroup.name,
-                modify = pmsModify
-            )
-        }
-
     var mutedExceptions: ArrayList<String>
         get() = getObj("mutedExceptions")?: Config.MUTED_EXCEPTIONS
         set(value) = setObj("mutedExceptions", value)
@@ -63,6 +49,21 @@ class Group internal constructor(
         get() = getObj("mutedCheckers")?: Config.MUTED_CHECKERS
         set(value) = setObj("mutedCheckers", value)
 
+    fun getCmdWorking(id: String): Boolean {
+        return readCmdData(id).working ?: false //群组默认关闭
+    }
+    fun getCmdWorking(cmd: CmdExecutable): Boolean {
+        return readCmdData(cmd).working ?: false //群组默认关闭
+    }
+
+    fun setCmdWorking(id: String, value: Boolean) {
+        return writeCmdData(id, readCmdData(id).apply { working = value })
+    }
+
+    fun setCmdWorking(cmd: CmdExecutable, value: Boolean) {
+        return writeCmdData(cmd, readCmdData(cmd).apply { working = value })
+    }
+
     inline fun withServeBot(pms: MemberPermission = MemberPermission.MEMBER, action: (contact: Group)->Unit): Boolean {
         if (virtual) return false
         val contact = if (bot == null) BotLuo.getContactableBots(this).map { it.getGroup(id) }.filter { it != null && it.botPermission >= pms }.randomOrNull()

+ 1 - 1
src/main/kotlin/bot_luo_core/data/Groups.kt

@@ -2,7 +2,7 @@ package bot_luo_core.data
 
 object Groups {
 
-    private val groups = HashMap<Long, Group>()
+    internal val groups = HashMap<Long, Group>()
     val activeGroupsCount: Int get() = groups.size
     val virtualGroup: Group get() = readGroup(0)
 

+ 14 - 13
src/main/kotlin/bot_luo_core/data/User.kt

@@ -3,6 +3,7 @@ package bot_luo_core.data
 import bot_luo_core.bot.BotContact
 import bot_luo_core.bot.BotContactType
 import bot_luo_core.bot.BotLuo
+import bot_luo_core.cli.CmdExecutable
 import bot_luo_core.cli.CmdReceipt
 import net.mamoe.mirai.Bot
 import net.mamoe.mirai.contact.*
@@ -50,20 +51,20 @@ class User internal constructor (
         get() = PmsGroups[(getObj("pmsGroup")?: "NONE")]
         set(value) = setObj("pmsGroup", value.name)
 
-    var pmsModify: HashMap<String, Int>
-        get() = getObj("pmsModify")?: HashMap()
-        set(value) = setObj("pmsModify", value)
+    fun getCmdWorking(id: String): Boolean {
+        return readCmdData(id).working ?: true //用户默认开启
+    }
+    fun getCmdWorking(cmd: CmdExecutable): Boolean {
+        return readCmdData(cmd).working ?: true //用户默认开启
+    }
 
-    val realPmsGroup: PmsGroup
-        get() {
-            return if (pmsModify.isEmpty()) pmsGroup
-            else PmsGroup(
-                name = pmsGroup.name+"*",
-                description = pmsGroup.description+"(modified)",
-                inherit = pmsGroup.name,
-                modify = pmsModify
-            )
-        }
+    fun setCmdWorking(id: String, value: Boolean) {
+        return writeCmdData(id, readCmdData(id).apply { working = value })
+    }
+
+    fun setCmdWorking(cmd: CmdExecutable, value: Boolean) {
+        return writeCmdData(cmd, readCmdData(cmd).apply { working = value })
+    }
 
     inline fun withServeBot(action: (contact: User)->Unit): Boolean {
         if (virtual) return false

+ 1 - 1
src/main/kotlin/bot_luo_core/data/Users.kt

@@ -2,7 +2,7 @@ package bot_luo_core.data
 
 object Users {
 
-    private val users = HashMap<Long, User>()
+    internal val users = HashMap<Long, User>()
     val activeUsersCount: Int get() = users.size
     val virtualUser: User get() = readUser(0)
 

+ 31 - 2
src/main/kotlin/bot_luo_core/util/GsonHelper.kt

@@ -1,13 +1,42 @@
 package bot_luo_core.util
 
 import com.google.gson.Gson
+import com.google.gson.GsonBuilder
 import com.google.gson.JsonArray
 import com.google.gson.JsonObject
+import com.google.gson.reflect.TypeToken
+import java.io.File
+import java.lang.ClassCastException
+import kotlin.jvm.Throws
+
+val GSON: Gson get() = GsonBuilder().setPrettyPrinting().create()
 
 operator fun JsonObject.set(key: String, value: Any?) {
-    this.add(key, Gson().toJsonTree(value))
+    this.add(key, GSON.toJsonTree(value))
 }
 
 operator fun JsonArray.set(key: Int, value: Any?) {
-    this.set(key, Gson().toJsonTree(value))
+    this.set(key, GSON.toJsonTree(value))
+}
+
+/**
+ * # JSON数据读写工具类
+ */
+object JsonWorker {
+
+    @Throws(ClassCastException::class)
+    inline fun <reified T> readJson (filePath: String): T?{
+        val file = File(filePath)
+        if (!file.exists()) {
+            if (!file.parentFile.exists())
+                file.parentFile.mkdirs()
+            file.createNewFile()
+            return null
+        }
+        val type = object : TypeToken<T>() {}.type
+        return GSON.fromJson(file.readText(), type)
+    }
+
+    fun writeJson (filePath: String, obj: Any) = File(filePath).writeText(GSON.toJson(obj))
+
 }

+ 0 - 30
src/main/kotlin/bot_luo_core/util/JsonWorker.kt

@@ -1,30 +0,0 @@
-package bot_luo_core.util
-
-import com.google.gson.Gson
-import com.google.gson.reflect.TypeToken
-import java.io.File
-import java.lang.ClassCastException
-import kotlin.jvm.Throws
-
-
-/**
- * # JSON数据读写工具类
- */
-object JsonWorker {
-
-    @Throws(ClassCastException::class)
-    inline fun <reified T> readJson (filePath: String): T?{
-        val file = File(filePath)
-        if (!file.exists()) {
-            if (!file.parentFile.exists())
-                file.parentFile.mkdirs()
-            file.createNewFile()
-            return null
-        }
-        val type = object : TypeToken<T>() {}.type
-        return Gson().fromJson(file.readText(), type)
-    }
-
-    fun writeJson (filePath: String, obj: Any) = File(filePath).writeText(Gson().toJson(obj))
-
-}

+ 16 - 3
src/main/kotlin/bot_luo_core/util/Text.kt

@@ -1,6 +1,5 @@
 package bot_luo_core.util
 
-import com.google.gson.Gson
 import net.mamoe.mirai.message.code.MiraiCode.deserializeMiraiCode
 import net.mamoe.mirai.message.data.MessageChain
 import net.mamoe.mirai.message.data.MessageChainBuilder
@@ -21,7 +20,7 @@ object Text {
         return sb.toString()
     }
 
-    fun String.escapeJson(): String = Gson().toJson(this@escapeJson)
+    fun String.escapeJson(): String = GSON.toJson(this@escapeJson)
 
     infix operator fun String.times(n: Int): String {
         if (n<=0) return ""
@@ -55,7 +54,18 @@ object Text {
     fun String.decodeUrl(): String = URLDecoder.decode(this, "UTF-8")
 
     /**
-     * 限制总长,当
+     * 限制总长,当超出给定长度时从头部截断
+     */
+    fun String.limitStart(len: Int): String {
+        if (len <= 3) return '.'*len
+        return if (this.length > len)
+            "..." + this.substring(this.length - len + 3)
+        else
+            this
+    }
+
+    /**
+     * 限制总长,当超出给定长度时从尾部截断
      */
     fun String.limitEnd(len: Int): String {
         if (len <= 3) return '.'*len
@@ -65,6 +75,9 @@ object Text {
             this
     }
 
+    /**
+     * 限制总长,当超出给定长度时去除中间
+     */
     fun String.limitMid(len: Int): String {
         if (len <= 3) return '.'*len
         return if (this.length > len)