소스 검색

add NoticeCmd

00ll00 5 년 전
부모
커밋
5bf5ca6c7b

+ 2 - 0
src/main/kotlin/bot_luo_core/bot/BotContact.kt

@@ -2,6 +2,8 @@ package bot_luo_core.bot
 
 import net.mamoe.mirai.Bot
 import net.mamoe.mirai.contact.Contact
+import net.mamoe.mirai.contact.Group
+import net.mamoe.mirai.contact.MemberPermission
 import net.mamoe.mirai.message.MessageReceipt
 import net.mamoe.mirai.message.data.Message
 

+ 4 - 1
src/main/kotlin/bot_luo_core/bot/BotLuo.kt

@@ -1,7 +1,10 @@
 package bot_luo_core.bot
 
 import bot_luo_core.cli.CmdHandler
+import bot_luo_core.cli.commands.NoticeCmd
 import bot_luo_core.data.Data
+import bot_luo_core.data.Notice
+import bot_luo_core.data.Users
 import bot_luo_core.util.JsonWorker
 import bot_luo_core.util.Logger
 import bot_luo_core.util.Time
@@ -106,7 +109,7 @@ object BotLuo {
         GlobalEventChannel.subscribeAlways<MessageEvent>(priority = EventPriority.NORMAL) {
             if (this.sender is AnonymousMember) return@subscribeAlways
             if (this is MessageSyncEvent) return@subscribeAlways
-//            if (this !is GroupAwareMessageEvent || this.group.id != 565056329L) return@subscribeAlways
+            if (bots.find { it.id == this.sender.id } != null) return@subscribeAlways
             if (this is GroupAwareMessageEvent && !bot.isMainBotOf(this.group.id)) return@subscribeAlways
             CmdHandler.call(this)
             if (this.isIntercepted) Logger.log(this, Level.INFO) else Logger.log(this, Level.DEBUG)

+ 1 - 0
src/main/kotlin/bot_luo_core/cli/CmdCatalog.kt

@@ -34,6 +34,7 @@ object CmdCatalog {
             ExecuteCmd::class,
             HelpCmd::class,
             ListCmd::class,
+            NoticeCmd::class,
             PermissionCmd::class,
             PermissionGroupCmd::class,
             SayCmd::class,

+ 62 - 0
src/main/kotlin/bot_luo_core/cli/commands/NoticeCmd.kt

@@ -0,0 +1,62 @@
+package bot_luo_core.cli.commands
+
+import bot_luo_core.cli.Cmd
+import bot_luo_core.cli.CmdContext
+import bot_luo_core.cli.CmdPermissionLevel
+import bot_luo_core.cli.CmdReceipt
+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.handlers.GreedyMessageArgHandler
+import bot_luo_core.cli.handlers.MultiGroupArgHandler
+import bot_luo_core.cli.handlers.UserArgHandler
+import bot_luo_core.data.*
+import bot_luo_core.util.ResourceManager.downloadResource
+import net.mamoe.mirai.message.data.MessageChain
+
+@Command(
+    name = "notice",
+    display = "提醒",
+    alias = [],
+    usage = "对用户添加提醒,当指定用户下一次发言时发送提醒消息",
+    caption = [
+        "不设置限定群组时默认为当前群组"
+    ]
+)
+class NoticeCmd(context: CmdContext) : Cmd(context) {
+
+    @Method(name = "", alias = ["add", "a"], pmsLevel = CmdPermissionLevel.OP, order = 0)
+    suspend fun add(
+        @Argument(name = "用户", handler = UserArgHandler::class)
+        user: User,
+        @Argument(name = "限定群组", multiValued = true, handler = MultiGroupArgHandler::class)
+        groups: ArrayList<Group>,
+        @Argument(name = "消息", handler = GreedyMessageArgHandler::class)
+        msg: MessageChain
+    ): CmdReceipt {
+        withLockedAccessing(Notice) {
+            msg.downloadResource()
+            val list = Notice[user.id] ?: ArrayList()
+            list.add(
+                NoticeData(
+                    context.user.id,
+                    context.user.name,
+                    msg.serializeToMiraiCode(),
+                    context.time,
+                    groups.map { it.id }.toSet()
+                )
+            )
+            Notice[user.id] = list
+        }
+        context.sendMessageWithLog(context.atOrEmpty + "已添加")
+        return SUCCESS
+    }
+
+    @Method(name = "", alias = ["add", "a"], pmsLevel = CmdPermissionLevel.HIGH, order = 1)
+    suspend fun add(
+        @Argument(name = "用户", handler = UserArgHandler::class)
+        user: User,
+        @Argument(name = "消息", handler = GreedyMessageArgHandler::class)
+        msg: MessageChain
+    ): CmdReceipt = add(user, arrayListOf(context.group), msg)
+}

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

@@ -8,6 +8,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.UserCmdWorkingChecker
 import bot_luo_core.cli.handlers.CmdIdArgHandler
 import bot_luo_core.cli.handlers.GroupArgHandler
 import bot_luo_core.cli.handlers.UserArgHandler
@@ -26,7 +27,7 @@ class SwitchCmd(context: CmdContext) : Cmd(context) {
 
     /*  ========================  show  ========================  */
 
-    @Method(name = "", alias = ["group","g"], pmsLevel = CmdPermissionLevel.OP, order = 0, ignoreCheckers = [GroupCmdWorkingChecker::class],
+    @Method(name = "", alias = ["group","g"], pmsLevel = CmdPermissionLevel.OP, order = 0, ignoreCheckers = [GroupCmdWorkingChecker::class, UserCmdWorkingChecker::class],
         title = "查看群组", usage = "获取命令是否在群组开启")
     fun show(
         @Argument(name = "命令", handler = CmdIdArgHandler::class, multiValued = true)
@@ -44,7 +45,7 @@ class SwitchCmd(context: CmdContext) : Cmd(context) {
         return SUCCESS
     }
 
-    @Method(name = "user", alias = ["u"], pmsLevel = CmdPermissionLevel.OP, order = 0, ignoreCheckers = [GroupCmdWorkingChecker::class],
+    @Method(name = "user", alias = ["u"], pmsLevel = CmdPermissionLevel.OP, order = 0, ignoreCheckers = [GroupCmdWorkingChecker::class, UserCmdWorkingChecker::class],
         title = "查看用户", usage = "获取命令是否对用户开启")
     fun show(
         @Argument(name = "命令", handler = CmdIdArgHandler::class, multiValued = true)
@@ -62,7 +63,7 @@ class SwitchCmd(context: CmdContext) : Cmd(context) {
         return SUCCESS
     }
 
-    @Method(name = "", alias = ["group","g"], pmsLevel = CmdPermissionLevel.OP, order = 1, ignoreCheckers = [GroupCmdWorkingChecker::class],
+    @Method(name = "", alias = ["group","g"], pmsLevel = CmdPermissionLevel.OP, order = 1, ignoreCheckers = [GroupCmdWorkingChecker::class, UserCmdWorkingChecker::class],
         title = "查看群组", usage = "获取命令是否在群组开启")
     fun show(
         @Argument(name = "群组", handler = GroupArgHandler::class)
@@ -71,7 +72,7 @@ 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],
+    @Method(name = "user", alias = ["u"], pmsLevel = CmdPermissionLevel.OP, order = 1, ignoreCheckers = [GroupCmdWorkingChecker::class, UserCmdWorkingChecker::class],
         title = "查看用户", usage = "获取命令是否对用户开启")
     fun show(
         @Argument(name = "用户", handler = UserArgHandler::class)
@@ -82,7 +83,7 @@ class SwitchCmd(context: CmdContext) : Cmd(context) {
 
     /*  ========================  on  ========================  */
 
-    @Method(name = "group-on", alias = ["gon","on"], pmsLevel = CmdPermissionLevel.OP, order = 0, ignoreCheckers = [GroupCmdWorkingChecker::class],
+    @Method(name = "group-on", alias = ["gon","on"], pmsLevel = CmdPermissionLevel.OP, order = 0, ignoreCheckers = [GroupCmdWorkingChecker::class, UserCmdWorkingChecker::class],
         title = "群组开启")
     suspend fun on(
         @Argument(name = "命令", handler = CmdIdArgHandler::class, multiValued = true)
@@ -103,7 +104,7 @@ class SwitchCmd(context: CmdContext) : Cmd(context) {
         return SUCCESS
     }
 
-    @Method(name = "user-on", alias = ["uon"], pmsLevel = CmdPermissionLevel.OP, order = 0, ignoreCheckers = [GroupCmdWorkingChecker::class],
+    @Method(name = "user-on", alias = ["uon"], pmsLevel = CmdPermissionLevel.OP, order = 0, ignoreCheckers = [GroupCmdWorkingChecker::class, UserCmdWorkingChecker::class],
         title = "用户开启")
     suspend fun on(
         @Argument(name = "命令", handler = CmdIdArgHandler::class, multiValued = true)
@@ -124,7 +125,7 @@ class SwitchCmd(context: CmdContext) : Cmd(context) {
         return SUCCESS
     }
 
-    @Method(name = "group-on", alias = ["gon","on"], pmsLevel = CmdPermissionLevel.OP, order = 1, ignoreCheckers = [GroupCmdWorkingChecker::class],
+    @Method(name = "group-on", alias = ["gon","on"], pmsLevel = CmdPermissionLevel.OP, order = 1, ignoreCheckers = [GroupCmdWorkingChecker::class, UserCmdWorkingChecker::class],
         title = "群组开启")
     suspend fun on(
         @Argument(name = "群组", handler = GroupArgHandler::class)
@@ -133,7 +134,7 @@ 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],
+    @Method(name = "user-on", alias = ["uon"], pmsLevel = CmdPermissionLevel.OP, order = 1, ignoreCheckers = [GroupCmdWorkingChecker::class, UserCmdWorkingChecker::class],
         title = "用户开启")
     suspend fun on(
         @Argument(name = "用户", handler = UserArgHandler::class)
@@ -144,7 +145,7 @@ class SwitchCmd(context: CmdContext) : Cmd(context) {
 
     /*  ========================  off  ========================  */
 
-    @Method(name = "group-off", alias = ["goff","off"], pmsLevel = CmdPermissionLevel.OP, order = 0, ignoreCheckers = [GroupCmdWorkingChecker::class],
+    @Method(name = "group-off", alias = ["goff","off"], pmsLevel = CmdPermissionLevel.OP, order = 0, ignoreCheckers = [GroupCmdWorkingChecker::class, UserCmdWorkingChecker::class],
         title = "群组关闭")
     suspend fun off(
         @Argument(name = "命令", handler = CmdIdArgHandler::class, multiValued = true)
@@ -165,7 +166,7 @@ class SwitchCmd(context: CmdContext) : Cmd(context) {
         return SUCCESS
     }
 
-    @Method(name = "user-off", alias = ["uoff"], pmsLevel = CmdPermissionLevel.OP, order = 0, ignoreCheckers = [GroupCmdWorkingChecker::class],
+    @Method(name = "user-off", alias = ["uoff"], pmsLevel = CmdPermissionLevel.OP, order = 0, ignoreCheckers = [GroupCmdWorkingChecker::class, UserCmdWorkingChecker::class],
         title = "用户关闭")
     suspend fun off(
         @Argument(name = "命令", handler = CmdIdArgHandler::class, multiValued = true)
@@ -186,7 +187,7 @@ class SwitchCmd(context: CmdContext) : Cmd(context) {
         return SUCCESS
     }
 
-    @Method(name = "group-off", alias = ["goff","off"], pmsLevel = CmdPermissionLevel.OP, order = 1, ignoreCheckers = [GroupCmdWorkingChecker::class],
+    @Method(name = "group-off", alias = ["goff","off"], pmsLevel = CmdPermissionLevel.OP, order = 1, ignoreCheckers = [GroupCmdWorkingChecker::class, UserCmdWorkingChecker::class],
         title = "群组关闭")
     suspend fun off(
         @Argument(name = "群组", handler = GroupArgHandler::class)
@@ -195,7 +196,7 @@ class SwitchCmd(context: CmdContext) : Cmd(context) {
         ids: ArrayList<String>
     ) = off (ids, groupIn)
 
-    @Method(name = "user-off", alias = ["uoff"], pmsLevel = CmdPermissionLevel.OP, order = 1, ignoreCheckers = [GroupCmdWorkingChecker::class],
+    @Method(name = "user-off", alias = ["uoff"], pmsLevel = CmdPermissionLevel.OP, order = 1, ignoreCheckers = [GroupCmdWorkingChecker::class, UserCmdWorkingChecker::class],
         title = "用户关闭")
     suspend fun off(
         @Argument(name = "用户", handler = UserArgHandler::class)

+ 0 - 2
src/main/kotlin/bot_luo_core/data/Cmds.kt

@@ -5,8 +5,6 @@ import bot_luo_core.cli.CmdExecutable
 object Cmds: CmdDataObj("data/cmds.json", 10000L, false) {
     override val defaultData get() = CmdData(0, 0, 0, false)
 
-    override fun unload() {}
-
     operator fun get(id: String): CmdData = readCmdData(id)
     operator fun get(cmd: CmdExecutable) = readCmdData(cmd)
     operator fun set(id: String, value: CmdData) = writeCmdData(id, value)

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

@@ -100,7 +100,7 @@ abstract class Data(
      *
      * 需要确保卸载时数据已使用[save]存入磁盘
      */
-    abstract fun unload()
+    open fun unload() {}
 
     /**
      * 是否已有记录文件存在

+ 0 - 1
src/main/kotlin/bot_luo_core/data/GroupTags.kt

@@ -7,7 +7,6 @@ import kotlin.collections.ArrayList
 import kotlin.collections.HashMap
 
 object GroupTags: DataObject("data/group_tags.json", 10000L, false) {
-    override fun unload() {}
 
     val BUILTIN_GROUP_TAGS = listOf("#this", "#none")
 

+ 87 - 0
src/main/kotlin/bot_luo_core/data/Notice.kt

@@ -0,0 +1,87 @@
+package bot_luo_core.data
+
+import bot_luo_core.bot.BotLuo.isMainBotOf
+import bot_luo_core.bot.VirtualMessageEvent
+import bot_luo_core.util.Logger.sendMessageWithLog
+import bot_luo_core.util.ResourceManager.deleteResourceIfNeeded
+import bot_luo_core.util.ResourceManager.uploadResource
+import bot_luo_core.util.Text.limitMid
+import bot_luo_core.util.Time
+import bot_luo_core.util.Time.relativeToE
+import net.mamoe.mirai.Bot
+import net.mamoe.mirai.contact.Contact
+import net.mamoe.mirai.event.EventPriority
+import net.mamoe.mirai.event.GlobalEventChannel
+import net.mamoe.mirai.event.events.GroupAwareMessageEvent
+import net.mamoe.mirai.event.events.MessageEvent
+import net.mamoe.mirai.message.code.MiraiCode.deserializeMiraiCode
+import net.mamoe.mirai.message.data.At
+import net.mamoe.mirai.message.data.MessageChainBuilder
+
+object Notice: DataObject("data/notice.json", 10000, false)
+{
+    init {
+        GlobalEventChannel.subscribeAlways<MessageEvent>(priority = EventPriority.HIGH) {
+            if (this is GroupAwareMessageEvent && !bot.isMainBotOf(this.group.id)) return@subscribeAlways
+            check(
+                Users.readUser(this.sender.id),
+                if (this is GroupAwareMessageEvent) Groups.readGroup(this.group.id) else Groups.virtualGroup,
+                this.bot
+            )
+        }
+        GlobalEventChannel.subscribeAlways<VirtualMessageEvent>(priority = EventPriority.HIGH) {
+            check(
+                user,
+                group,
+                null
+            )
+        }
+    }
+
+    operator fun get(id: Long): ArrayList<NoticeData>? {
+        return getObj<ArrayList<NoticeData>>(id.toString())
+    }
+
+    operator fun set(id: Long, value: ArrayList<NoticeData>) {
+        setObj(id.toString(), value)
+    }
+
+    suspend fun check(user: User, group: Group, botIn: Bot?) {
+        withLockedAccessing(this) {
+            val list = get(user.id)?.filter { group.id in it.groups }?.ifEmpty { null } ?: return
+
+            suspend fun send(contact: Contact) {
+                val mcb = MessageChainBuilder()
+                for (i in list.indices) {
+                    val n = list[i]
+                    mcb.add(At(user.id))
+                    mcb.add("${n.fromName.limitMid(10)}(${n.fromId})于${n.time relativeToE Time.time()}提醒你:\n")
+                    val raw = n.message.deserializeMiraiCode()
+                    val msg = raw.uploadResource(contact)
+                    mcb.add(msg)
+                    if (i < list.lastIndex) mcb.add("\n\n")
+                    raw.deleteResourceIfNeeded()
+                }
+                contact.sendMessageWithLog(mcb.build())
+            }
+
+            if (!group.virtual)
+                group.withServeBot {
+                    send(it)
+                }
+            else
+                user.apply { bot = botIn }.withServeBot {
+                    send(it)
+                }
+            setObj(user.id.toString(), null)
+        }
+    }
+}
+
+data class NoticeData(
+    val fromId: Long,
+    val fromName: String,
+    val message: String,
+    val time: Long,
+    val groups: Set<Long>
+)

+ 0 - 1
src/main/kotlin/bot_luo_core/data/PmsGroups.kt

@@ -11,7 +11,6 @@ import org.apache.logging.log4j.Level
  * # 权限组数据
  */
 object PmsGroups: DataObject("data/pms_groups.json", 10000L, false) {
-    override fun unload() {}
 
     private const val DESC_BLOCK = "屏蔽组,所有命令均为禁止状态(-1)"
     private const val DESC_NONE = "虚空组,所有命令均为中立(0)"

+ 0 - 1
src/main/kotlin/bot_luo_core/data/UserTags.kt

@@ -7,7 +7,6 @@ import kotlin.collections.ArrayList
 import kotlin.collections.HashMap
 
 object UserTags: DataObject("data/user_tags.json", 10000L, false)  {
-    override fun unload() {}
 
     val BUILTIN_USER_TAGS = listOf("#this", "#any")