Browse Source

more Checkers

00ll00 5 years ago
parent
commit
364a9f7b5d

+ 6 - 6
src/main/kotlin/bot_luo_core/cli/Checker.kt

@@ -15,10 +15,8 @@ interface Checker {
     @Throws(CheckerFatal::class)
     fun check(cmd: CmdExecutable, context: CmdContext)
 
-    @Throws(CheckerFatal::class)
-    fun fatal(msg: Message) {
-        throw CheckerFatal(msg, "$name 检定失败:${msg.content}", this::class)
-    }
+    fun CheckerFatal(output: Message, message: String) = CheckerFatal(output, "$name 检定失败:${message}", this::class)
+    fun CheckerFatal(message: String) = CheckerFatal(message.toPlainText(), "$name 检定失败:${message}")
 
     companion object {
 
@@ -33,9 +31,11 @@ interface Checker {
         val CHECKERS = arrayListOf(
             BotRunningChecker::class,
             GroupCmdWorkingChecker::class,
+            PermissionChecker::class,
+            UserCDChecker::class,
             UserCmdWorkingChecker::class,
-            UserParallelExecutingChecker::class,
-            PermissionChecker::class
+            UserDayLimitChecker::class,
+            UserParallelExecutingChecker::class
         )
 
         fun KClass<out Checker>.order() = CHECKERS.indexOf(this)

+ 4 - 0
src/main/kotlin/bot_luo_core/cli/CmdHandler.kt

@@ -11,6 +11,8 @@ import bot_luo_core.data.withAccessing
 import bot_luo_core.data.withLockedAccessing
 import bot_luo_core.util.Logger
 import bot_luo_core.util.Text.firstNotWhitespace
+import bot_luo_core.util.Time.isSameDayTo
+import bot_luo_core.util.Time.notSameDayTo
 import kotlinx.coroutines.TimeoutCancellationException
 import kotlinx.coroutines.runBlocking
 import net.mamoe.mirai.event.events.GroupAwareMessageEvent
@@ -140,10 +142,12 @@ object CmdHandler {
                         if (res.addCount) {
                             val ud = context.user.readCmdData(cmd)
                             ud.totalCount++
+                            if (time notSameDayTo ud.lastTime) ud.dayCount = 0
                             ud.dayCount++
                             context.user.writeCmdData(cmd, ud)
                             val gd = context.group.readCmdData(cmd)
                             gd.totalCount++
+                            if (time notSameDayTo gd.lastTime) gd.dayCount = 0
                             gd.dayCount++
                             context.group.writeCmdData(cmd, gd)
                         }

+ 1 - 1
src/main/kotlin/bot_luo_core/cli/checkers/BotRunningChecker.kt

@@ -10,7 +10,7 @@ class BotRunningChecker: Checker {
     override val name = "机器人运行检定器"
 
     override fun check(cmd: CmdExecutable, context: CmdContext) {
-        if (!BOT_RUNNING) fatal("机器人已关闭".toPlainText())
+        if (!BOT_RUNNING) throw CheckerFatal("机器人已关闭")
     }
 
 }

+ 21 - 0
src/main/kotlin/bot_luo_core/cli/checkers/GroupCDChecker.kt

@@ -0,0 +1,21 @@
+package bot_luo_core.cli.checkers
+
+import bot_luo_core.cli.Checker
+import bot_luo_core.cli.CmdContext
+import bot_luo_core.cli.CmdExecutable
+import bot_luo_core.util.Time
+import net.mamoe.mirai.message.data.toPlainText
+
+class GroupCDChecker: Checker {
+
+    override val name = "群组冷却检定器"
+
+    override fun check(cmd: CmdExecutable, context: CmdContext) { with(context) {
+        val cd = group.getObj<Long>("${cmd.id}_groupCD")?: 0
+        val wait = cd + group.readCmdData(cmd).lastTime - time
+        if (cd > 0 && wait > 0) throw CheckerFatal(
+            "等${Time.formatSpanE(wait)}吧,群聊冷却中".toPlainText(),
+            "群组冷却中"
+        )
+    } }
+}

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

@@ -11,6 +11,6 @@ class GroupCmdWorkingChecker: Checker {
 
     override fun check(cmd: CmdExecutable, context: CmdContext) {
         val data = context.group.readCmdData(cmd)
-        if (!data.working) fatal("此命令未在群组 ${context.group.name}(${context.group.id}) 启用".toPlainText())
+        if (!data.working) throw CheckerFatal("此命令未在群组 ${context.group.name}(${context.group.id}) 启用")
     }
 }

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

@@ -15,7 +15,7 @@ class PermissionChecker: Checker {
         val p2 = context.groupF.pmsGroup.readPmsOn(cmd)
         val b1 = p1 >= cmd.pmsLevel
         val b2 = p2 >= cmd.pmsLevel
-        if (!b1 && !b2) fatal("权限不足,要求:${cmd.pmsLevel.name} 群组权限:${p2.name} 用户权限:${p1.name}".toPlainText())
+        if (!b1 && !b2) throw CheckerFatal("权限不足,要求:${cmd.pmsLevel.name} 群组权限:${p2.name} 用户权限:${p1.name}")
     }
 
 }

+ 21 - 0
src/main/kotlin/bot_luo_core/cli/checkers/UserCDChecker.kt

@@ -0,0 +1,21 @@
+package bot_luo_core.cli.checkers
+
+import bot_luo_core.cli.Checker
+import bot_luo_core.cli.CmdContext
+import bot_luo_core.cli.CmdExecutable
+import bot_luo_core.util.Time
+import net.mamoe.mirai.message.data.toPlainText
+
+class UserCDChecker: Checker {
+
+    override val name = "用户冷却检定器"
+
+    override fun check(cmd: CmdExecutable, context: CmdContext) { with(context) {
+        val cd = group.getObj<Long>("${cmd.id}_userCD")?: 0
+        val wait = cd + user.readCmdData(cmd).lastTime - time
+        if (cd > 0 && wait > 0) throw CheckerFatal(
+            "恁缓${Time.formatSpanE(wait)}吧".toPlainText(),
+            "用户冷却中"
+        )
+    } }
+}

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

@@ -11,6 +11,6 @@ class UserCmdWorkingChecker: Checker {
 
     override fun check(cmd: CmdExecutable, context: CmdContext) {
         val data = context.user.readCmdData(cmd)
-        if (!data.working) fatal("此命令已对用户 ${context.user.name}(${context.user.id}) 关闭".toPlainText())
+        if (!data.working) throw CheckerFatal("此命令已对用户 ${context.user.name}(${context.user.id}) 关闭")
     }
 }

+ 25 - 0
src/main/kotlin/bot_luo_core/cli/checkers/UserDayLimitChecker.kt

@@ -0,0 +1,25 @@
+package bot_luo_core.cli.checkers
+
+import bot_luo_core.cli.Checker
+import bot_luo_core.cli.CmdContext
+import bot_luo_core.cli.CmdExecutable
+import bot_luo_core.util.Time.isSameDayTo
+import net.mamoe.mirai.message.data.toPlainText
+
+class UserDayLimitChecker: Checker {
+
+    override val name = "用户当日次数检定器"
+
+    override fun check(cmd: CmdExecutable, context: CmdContext) { with(context) {
+        val limit = group.getObj<Long>("${cmd.id}_userDayLimit")?: 0
+        val data = user.readCmdData(cmd)
+        if (limit > 0) {
+            if (time isSameDayTo data.lastTime) {
+                if (data.dayCount >= limit) throw CheckerFatal(
+                    "恁改天吧".toPlainText(),
+                    "达到当日次数限制 $limit"
+                )
+            }
+        }
+    } }
+}

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

@@ -9,7 +9,10 @@ class UserParallelExecutingChecker: Checker {
     override val name = "用户命令并发检定器"
 
     override fun check(cmd: CmdExecutable, context: CmdContext) {
-        if (!context.user.isCmdFree(cmd)) fatal("请等待命令执行完毕".toPlainText())
+        if (!context.user.isCmdFree(cmd)) throw CheckerFatal(
+            "请等待命令执行完成".toPlainText(),
+            "用户有相同命令正在执行"
+        )
     }
 
 }

+ 2 - 2
src/main/kotlin/bot_luo_core/cli/checkers/GroupPermissionChecker.kt → src/main/kotlin/bot_luo_core/cli/checkers/addon/GroupPermissionChecker.kt

@@ -1,4 +1,4 @@
-package bot_luo_core.cli.checkers
+package bot_luo_core.cli.checkers.addon
 
 import bot_luo_core.cli.Checker
 import bot_luo_core.cli.CmdContext
@@ -12,7 +12,7 @@ class GroupPermissionChecker: Checker {
 
     override fun check(cmd: CmdExecutable, context: CmdContext) {
         val p = context.group.pmsGroup.readPmsOn(cmd)
-        if (p < cmd.pmsLevel) fatal("群组权限不足,要求:${cmd.pmsLevel.name} 群组权限:${p.name}".toPlainText())
+        if (p < cmd.pmsLevel) throw CheckerFatal("群组权限不足,要求:${cmd.pmsLevel.name} 群组权限:${p.name}")
     }
 
 }

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

@@ -5,7 +5,7 @@ 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.GroupCmdWorkingChecker
-import bot_luo_core.cli.checkers.GroupPermissionChecker
+import bot_luo_core.cli.checkers.addon.GroupPermissionChecker
 import bot_luo_core.cli.checkers.UserCmdWorkingChecker
 import bot_luo_core.cli.exceptions.CheckerFatal
 import bot_luo_core.cli.handlers.CmdExArgHandler

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

@@ -3,10 +3,7 @@ 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.GroupCmdWorkingChecker
-import bot_luo_core.cli.checkers.GroupPermissionChecker
-import bot_luo_core.cli.checkers.PermissionChecker
-import bot_luo_core.cli.checkers.UserCmdWorkingChecker
+import bot_luo_core.cli.checkers.addon.GroupPermissionChecker
 import bot_luo_core.cli.exceptions.CheckerFatal
 import bot_luo_core.util.TableBuilder
 import kotlin.reflect.full.createInstance

+ 5 - 2
src/main/kotlin/bot_luo_core/util/Time.kt

@@ -28,9 +28,9 @@ object Time {
      */
     fun hour(time: Long) = calendar.let { it.timeInMillis= time; it.get(Calendar.HOUR_OF_DAY) }
     fun hour() = hour(time())
-    fun minute(time: Long) = calendar.let { it.timeInMillis= time(); it.get(Calendar.MINUTE) }
+    fun minute(time: Long) = calendar.let { it.timeInMillis= time; it.get(Calendar.MINUTE) }
     fun minute() = minute(time())
-    fun second(time: Long) = calendar.let { it.timeInMillis= time(); it.get(Calendar.SECOND) }
+    fun second(time: Long) = calendar.let { it.timeInMillis= time; it.get(Calendar.SECOND) }
     fun second() = second(time())
 
     /**
@@ -46,6 +46,9 @@ object Time {
         return (c.get(Calendar.YEAR) == cRef.get(Calendar.YEAR) && c.get(Calendar.MONTH) == cRef.get(Calendar.MONTH) && c.get(Calendar.DAY_OF_MONTH) == cRef.get(Calendar.DAY_OF_MONTH))
     }
 
+    infix fun Long.isSameDayTo(that: Long): Boolean = isSameDay(this, that)
+    infix fun Long.notSameDayTo(that: Long): Boolean = !isSameDay(this, that)
+
     /**
      * 时间戳(毫秒)转换为可读时间格式
      * @return [String] 时间码字符串