00ll00 пре 5 година
родитељ
комит
dce13daf73

+ 1 - 1
build.gradle.kts

@@ -3,7 +3,7 @@ version = "1.4.0"
 
 dependencies {
     implementation(kotlin("stdlib"))
-    api("net.mamoe:mirai-core:2.7.1-dev-1")
+    api("net.mamoe:mirai-core:2.7.1")
     api("com.github.salomonbrys.kotson:kotson:2.5.0")
     implementation("org.reflections:reflections:0.9.12")
     api ("org.apache.logging.log4j:log4j-api:2.14.0")

+ 5 - 0
src/main/kotlin/bot_luo_core/bot/BotLuo.kt

@@ -153,6 +153,11 @@ object BotLuo {
      */
     fun Bot.isMainBotOf(groupId: Long) = this == groupMap[groupId]?.get(0)
 
+    /**
+     * ## 获取群组主Bot
+     */
+    fun getMainBot(id: Long): Bot? = groupMap[id]?.get(0)
+
     /**
      * ## 通过群号获取[mirai群组][Group]
      *

+ 1 - 1
src/main/kotlin/bot_luo_core/cli/CmdHandler.kt

@@ -38,7 +38,7 @@ object CmdHandler {
             MessageReader(event.message),
             Users.readUser(event.sender.id).apply { contact = event.sender } ,
             if (event is GroupAwareMessageEvent)
-                Groups.readGroup(event.group.id).apply { contact = event.group }
+                Groups.readGroup(event.group.id)
             else
                 Groups.virtualGroup
         )

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

@@ -1,11 +1,17 @@
 package bot_luo_core.cli.commands
 
+import bot_luo_core.bot.BotLuo
 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.BOT_RUNNING
+import bot_luo_core.cli.checkers.BotRunningChecker
+import bot_luo_core.cli.handlers.MultiGroupArgHandler
+import bot_luo_core.data.Group
 import bot_luo_core.data.Groups
 import bot_luo_core.data.Users
+import bot_luo_core.util.TableBuilder
 
 @Command(
     name = "control",
@@ -23,13 +29,28 @@ class ControlCmd(context: CmdContext) : Cmd(context) {
         return SUCCESS
     }
 
-    @Method(name = "p", alias = [], pmsLevel = CmdPermissionLevel.OP, title = "暂停")
+    @Method(name = "p", alias = [], pmsLevel = CmdPermissionLevel.OP, ignoreCheckers = [BotRunningChecker::class], title = "暂停")
     fun pause (): CmdReceipt {
         BOT_RUNNING = !BOT_RUNNING
         context.print("运行中:$BOT_RUNNING")
         return SUCCESS
     }
 
+    @Method(name = "m", alias = [], pmsLevel = CmdPermissionLevel.OP, title = "查看映射")
+    fun map (
+        @Argument(name = "群组", required = false, multiValued = true, handler = MultiGroupArgHandler::class)
+        groupsIn: Collection<Group>?
+    ): CmdReceipt {
+        val groups = groupsIn ?: listOf(context.group)
+        val table = TableBuilder(4)
+        table.prettyLines("伯特映射 ——", groups) { group, builder ->
+            val bot = BotLuo.getMainBot(group.id)
+            builder.td("${group.name}(${group.id})").td("${bot?.nick}(${bot?.id})")
+        }
+        context.print(table.toString())
+        return SUCCESS
+    }
+
 //    @Method(name = "z", alias = [], pmsLevel = CmdPermissionLevel.HIGH, title = "撤消")
 //    fun undo (): CmdReceipt {
 //

+ 8 - 8
src/main/kotlin/bot_luo_core/cli/commands/PermissionGroupCmd.kt

@@ -36,7 +36,7 @@ class PermissionGroupCmd(context: CmdContext) : Cmd(context) {
         val table = TableBuilder(4)
         table.th("权限组 —— ${pmsGroup.name}")
         table.tr("继承于:").td(pmsGroup.inherit)
-        table.prettyLines("修改项:", pmsGroup.modify?.entries?: ArrayList()) { item, builder ->
+        table.prettyLines("权限值:", pmsGroup.modify?.entries?: ArrayList()) { item, builder ->
             builder.td("${item.key}:").td(item.value)
         }
         table.tr("描述:").sp().p(pmsGroup.description)
@@ -104,9 +104,9 @@ class PermissionGroupCmd(context: CmdContext) : Cmd(context) {
         description: String,
     ): CmdReceipt  = add(name, null, description)
 
-    /*  ========================  modify  ========================  */
+    /*  ========================  setValue  ========================  */
 
-    @Method(name = "modify", alias = ["m"], pmsLevel = CmdPermissionLevel.OP, title = "设置修改")
+    @Method(name = "set-value", alias = ["sv"], pmsLevel = CmdPermissionLevel.OP, title = "设置值")
     suspend fun modify (
         @Argument(name = "权限组", handler = PmsGroupArgHandler::class)
         pmsGroup: PmsGroup,
@@ -120,7 +120,7 @@ class PermissionGroupCmd(context: CmdContext) : Cmd(context) {
             return FATAL
         }
         val table = TableBuilder(4)
-        table.th("权限组设置修改 —— ${pmsGroup.name}").br()
+        table.th("权限组设置值 —— ${pmsGroup.name}").br()
         if (pmsGroup.modify == null) pmsGroup.modify = HashMap()
         for (cmd in cmds) {
             table.tr(cmd.id).td(pmsGroup.modify!![cmd.id]).td("->").td(value)
@@ -133,9 +133,9 @@ class PermissionGroupCmd(context: CmdContext) : Cmd(context) {
         return SUCCESS
     }
 
-    /*  ========================  removeModify  ========================  */
+    /*  ========================  removeValue  ========================  */
 
-    @Method(name = "remove-modify", alias = ["rm"], pmsLevel = CmdPermissionLevel.OP, title = "移除修改")
+    @Method(name = "remove-value", alias = ["rv"], pmsLevel = CmdPermissionLevel.OP, title = "移除值")
     suspend fun removeModify (
         @Argument(name = "权限组", handler = PmsGroupArgHandler::class)
         pmsGroup: PmsGroup,
@@ -147,9 +147,9 @@ class PermissionGroupCmd(context: CmdContext) : Cmd(context) {
             return FATAL
         }
         val table = TableBuilder(4)
-        table.th("权限组移除修改 —— ${pmsGroup.name}").br()
+        table.th("权限组移除值 —— ${pmsGroup.name}").br()
         if (pmsGroup.modify == null) {
-            context.print("权限组“${pmsGroup.name}”未设置任何修改")
+            context.print("权限组“${pmsGroup.name}”未设置任何值")
             return FATAL
         }
         for (cmd in cmds) {

+ 103 - 10
src/main/kotlin/bot_luo_core/cli/commands/SwitchCmd.kt

@@ -11,6 +11,7 @@ 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
+import bot_luo_core.data.User
 import bot_luo_core.data.withLockedAccessing
 import bot_luo_core.util.TableBuilder
 
@@ -24,8 +25,8 @@ class SwitchCmd(context: CmdContext) : Cmd(context) {
 
     /*  ========================  show  ========================  */
 
-    @Method(name = "", alias = ["show"], pmsLevel = CmdPermissionLevel.OP, order = 0, ignoreCheckers = [GroupCmdWorkingChecker::class],
-    title = "查看", usage = "获取命令是否开启")
+    @Method(name = "", alias = ["group","g"], pmsLevel = CmdPermissionLevel.OP, order = 0, ignoreCheckers = [GroupCmdWorkingChecker::class],
+        title = "查看群组", usage = "获取命令是否在群组开启")
     fun show(
         @Argument(name = "命令", handler = CmdIdArgHandler::class, multiValued = true)
         ids: ArrayList<String>,
@@ -34,7 +35,7 @@ class SwitchCmd(context: CmdContext) : Cmd(context) {
     ): CmdReceipt {
         val group = groupIn?: context.group
         val table = TableBuilder(4)
-        table.th("电闸 —— 群组(${group.id})").br()
+        table.th("群组电闸 —— ${group.name}(${group.id})").br()
         for (id in ids) {
             table.tr(id).td(":").td(if (group.getCmdWorking(id)) "ON" else "OFF")
         }
@@ -42,7 +43,26 @@ class SwitchCmd(context: CmdContext) : Cmd(context) {
         return SUCCESS
     }
 
-    @Method(name = "", alias = ["show"], pmsLevel = CmdPermissionLevel.OP, order = 0, ignoreCheckers = [GroupCmdWorkingChecker::class])
+    @Method(name = "user", alias = ["u"], pmsLevel = CmdPermissionLevel.OP, order = 0, ignoreCheckers = [GroupCmdWorkingChecker::class],
+        title = "查看用户", usage = "获取命令是否对用户开启")
+    fun show(
+        @Argument(name = "命令", handler = CmdIdArgHandler::class, multiValued = true)
+        ids: ArrayList<String>,
+        @Argument(name = "用户", handler = GroupArgHandler::class, required = false)
+        userIn: User?
+    ): CmdReceipt {
+        val user = userIn?: context.user
+        val table = TableBuilder(4)
+        table.th("用户电闸 —— ${user.name}(${user.id})").br()
+        for (id in ids) {
+            table.tr(id).td(":").td(if (user.getCmdWorking(id)) "ON" else "OFF")
+        }
+        context.println(table.toString())
+        return SUCCESS
+    }
+
+    @Method(name = "", alias = ["group","g"], pmsLevel = CmdPermissionLevel.OP, order = 1, ignoreCheckers = [GroupCmdWorkingChecker::class],
+        title = "查看群组", usage = "获取命令是否在群组开启")
     fun show(
         @Argument(name = "群组", handler = GroupArgHandler::class)
         groupIn: Group,
@@ -50,9 +70,19 @@ class SwitchCmd(context: CmdContext) : Cmd(context) {
         ids: ArrayList<String>
     ) = show(ids, groupIn)
 
+    @Method(name = "user", alias = ["u"], pmsLevel = CmdPermissionLevel.OP, order = 1, ignoreCheckers = [GroupCmdWorkingChecker::class],
+        title = "查看用户", usage = "获取命令是否对用户开启")
+    fun show(
+        @Argument(name = "用户", handler = GroupArgHandler::class)
+        userIn: User,
+        @Argument(name = "命令", handler = CmdIdArgHandler::class, multiValued = true)
+        ids: ArrayList<String>
+    ) = show(ids, userIn)
+
     /*  ========================  on  ========================  */
 
-    @Method(name = "on", pmsLevel = CmdPermissionLevel.OP, order = 0, ignoreCheckers = [GroupCmdWorkingChecker::class])
+    @Method(name = "group-on", alias = ["gon","on"], pmsLevel = CmdPermissionLevel.OP, order = 0, ignoreCheckers = [GroupCmdWorkingChecker::class],
+        title = "群组开启")
     suspend fun on(
         @Argument(name = "命令", handler = CmdIdArgHandler::class, multiValued = true)
         ids: ArrayList<String>,
@@ -61,7 +91,7 @@ class SwitchCmd(context: CmdContext) : Cmd(context) {
     ): CmdReceipt {
         val group = groupIn?: context.group
         val table = TableBuilder(4)
-        table.th("电闸开启 —— 群组(${group.id})").br()
+        table.th("群组电闸开启 —— ${group.name}(${group.id})").br()
         withLockedAccessing(group) {
             for (id in ids) {
                 table.tr(id).td(":").td(if (group.getCmdWorking(id)) "ON" else "OFF").td("->").td("ON")
@@ -72,7 +102,29 @@ class SwitchCmd(context: CmdContext) : Cmd(context) {
         return SUCCESS
     }
 
-    @Method(name = "on", pmsLevel = CmdPermissionLevel.OP, order = 0, ignoreCheckers = [GroupCmdWorkingChecker::class])
+    @Method(name = "user-on", alias = ["uon"], pmsLevel = CmdPermissionLevel.OP, order = 0, ignoreCheckers = [GroupCmdWorkingChecker::class],
+        title = "用户开启")
+    suspend fun on(
+        @Argument(name = "命令", handler = CmdIdArgHandler::class, multiValued = true)
+        ids: ArrayList<String>,
+        @Argument(name = "用户", handler = GroupArgHandler::class, required = false)
+        userIn: User?
+    ): CmdReceipt {
+        val user = userIn?: context.user
+        val table = TableBuilder(4)
+        table.th("用户电闸开启 —— ${user.name}(${user.id})").br()
+        withLockedAccessing(user) {
+            for (id in ids) {
+                table.tr(id).td(":").td(if (user.getCmdWorking(id)) "ON" else "OFF").td("->").td("ON")
+                user.setCmdWorking(id, true)
+            }
+        }
+        context.println(table.toString())
+        return SUCCESS
+    }
+
+    @Method(name = "group-on", alias = ["gon","on"], pmsLevel = CmdPermissionLevel.OP, order = 1, ignoreCheckers = [GroupCmdWorkingChecker::class],
+        title = "群组开启")
     suspend fun on(
         @Argument(name = "群组", handler = GroupArgHandler::class)
         groupIn: Group,
@@ -80,9 +132,19 @@ class SwitchCmd(context: CmdContext) : Cmd(context) {
         ids: ArrayList<String>
     ) = on (ids, groupIn)
 
+    @Method(name = "user-on", alias = ["uon"], pmsLevel = CmdPermissionLevel.OP, order = 1, ignoreCheckers = [GroupCmdWorkingChecker::class],
+        title = "用户开启")
+    suspend fun on(
+        @Argument(name = "用户", handler = GroupArgHandler::class)
+        userIn: User,
+        @Argument(name = "命令", handler = CmdIdArgHandler::class, multiValued = true)
+        ids: ArrayList<String>
+    ) = on (ids, userIn)
+
     /*  ========================  off  ========================  */
 
-    @Method(name = "off", pmsLevel = CmdPermissionLevel.OP, order = 0, ignoreCheckers = [GroupCmdWorkingChecker::class])
+    @Method(name = "group-off", alias = ["goff","off"], pmsLevel = CmdPermissionLevel.OP, order = 0, ignoreCheckers = [GroupCmdWorkingChecker::class],
+        title = "群组关闭")
     suspend fun off(
         @Argument(name = "命令", handler = CmdIdArgHandler::class, multiValued = true)
         ids: ArrayList<String>,
@@ -91,7 +153,7 @@ class SwitchCmd(context: CmdContext) : Cmd(context) {
     ): CmdReceipt {
         val group = groupIn?: context.group
         val table = TableBuilder(4)
-        table.th("电闸关闭 —— 群组(${group.id})").br()
+        table.th("群组电闸关闭 —— ${group.name}(${group.id})").br()
         withLockedAccessing(group) {
             for (id in ids) {
                 table.tr(id).td(":").td(if (group.getCmdWorking(id)) "ON" else "OFF").td("->").td("OFF")
@@ -102,11 +164,42 @@ class SwitchCmd(context: CmdContext) : Cmd(context) {
         return SUCCESS
     }
 
-    @Method(name = "off", pmsLevel = CmdPermissionLevel.OP, order = 0, ignoreCheckers = [GroupCmdWorkingChecker::class])
+    @Method(name = "user-off", alias = ["uoff"], pmsLevel = CmdPermissionLevel.OP, order = 0, ignoreCheckers = [GroupCmdWorkingChecker::class],
+        title = "用户关闭")
+    suspend fun off(
+        @Argument(name = "命令", handler = CmdIdArgHandler::class, multiValued = true)
+        ids: ArrayList<String>,
+        @Argument(name = "用户", handler = GroupArgHandler::class, required = false)
+        userIn: User?
+    ): CmdReceipt {
+        val user = userIn?: context.user
+        val table = TableBuilder(4)
+        table.th("用户电闸关闭 —— ${user.name}(${user.id})").br()
+        withLockedAccessing(user) {
+            for (id in ids) {
+                table.tr(id).td(":").td(if (user.getCmdWorking(id)) "ON" else "OFF").td("->").td("OFF")
+                user.setCmdWorking(id, false)
+            }
+        }
+        context.println(table.toString())
+        return SUCCESS
+    }
+
+    @Method(name = "group-off", alias = ["goff","off"], pmsLevel = CmdPermissionLevel.OP, order = 1, ignoreCheckers = [GroupCmdWorkingChecker::class],
+        title = "群组关闭")
     suspend fun off(
         @Argument(name = "群组", handler = GroupArgHandler::class)
         groupIn: Group,
         @Argument(name = "命令", handler = CmdIdArgHandler::class, multiValued = true)
         ids: ArrayList<String>
     ) = off (ids, groupIn)
+
+    @Method(name = "user-off", alias = ["uoff"], pmsLevel = CmdPermissionLevel.OP, order = 1, ignoreCheckers = [GroupCmdWorkingChecker::class],
+        title = "用户关闭")
+    suspend fun off(
+        @Argument(name = "用户", handler = GroupArgHandler::class)
+        userIn: User,
+        @Argument(name = "命令", handler = CmdIdArgHandler::class, multiValued = true)
+        ids: ArrayList<String>
+    ) = off (ids, userIn)
 }

+ 7 - 7
src/main/kotlin/bot_luo_core/data/PmsGroups.kt

@@ -13,14 +13,14 @@ import org.apache.logging.log4j.Level
 object PmsGroups: DataObject("data/pms_groups.json", 10000L, false) {
     override fun unload() {}
 
-    private const val DESC_BLOCK = "屏蔽组,所有命令均为关闭状态"
-    private const val DESC_NONE = "虚空组,所有命令均为叠加态(0)"
-    private const val DESC_NORMAL = "普通组,低级命令对此组开启"
-    private const val DESC_HIGH = "高级组,高级及以下的命令均开启"
-    private const val DESC_OP = "管理组,管理级及以下的命令均开启"
-    private const val DESC_DEBUG = "调试组,所有命令均为开启状态"
+    private const val DESC_BLOCK = "屏蔽组,所有命令均为禁止状态(-1)"
+    private const val DESC_NONE = "虚空组,所有命令均为中立(0)"
+    private const val DESC_NORMAL = "普通组,低级命令对此组开启(1),其余为中立(0)"
+    private const val DESC_HIGH = "高级组,高级及以下的命令均开启(1),其余为中立(0)"
+    private const val DESC_OP = "管理组,管理级及以下的命令均开启(1),其余为中立(0)"
+    private const val DESC_DEBUG = "调试组,所有命令均为开启状态(1)"
 
-    val BUILTIN_PMS_GROUPS = arrayOf("BLOCKED","NONE","NORMAL","HIGH","OP","DEBUG")
+    val BUILTIN_PMS_GROUPS = arrayOf("BLOCK","NONE","NORMAL","HIGH","OP","DEBUG")
 
     init {
         Logger.sysLog(Level.DEBUG, "开始构建内建权限组……")

+ 6 - 0
src/main/resources/log4j2.xml

@@ -21,6 +21,12 @@
         </RollingRandomAccessFile>
     </Appenders>
     <Loggers>
+        <Logger name="net.mamoe.mirai.Bot" additivity="false">
+            <Level value="DEBUG"/>
+            <AppenderRef ref="SysOut"/>
+            <AppenderRef ref="LogFile"/>
+            <AppenderRef ref="DebugFile"/>
+        </Logger>
         <Root level="all">
             <AppenderRef ref="SysOut"/>
             <AppenderRef ref="LogFile"/>