浏览代码

add AnnounceCmd

00ll00 5 年之前
父节点
当前提交
3b9352b640
共有 1 个文件被更改,包括 103 次插入 和 0 次删除
  1. 103 0
      src/main/kotlin/bot_luo_core/cli/commands/AnnounceCmd.kt

+ 103 - 0
src/main/kotlin/bot_luo_core/cli/commands/AnnounceCmd.kt

@@ -0,0 +1,103 @@
+package bot_luo_core.cli.commands
+
+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.exceptions.HandlerFatal
+import bot_luo_core.cli.handlers.GreedyStringArgHandler
+import bot_luo_core.cli.handlers.ImageArgHandler
+import bot_luo_core.cli.handlers.MultiGroupArgHandler
+import bot_luo_core.data.Group
+import bot_luo_core.util.TableBuilder
+import net.mamoe.mirai.contact.MemberPermission
+import net.mamoe.mirai.contact.PermissionDeniedException
+import net.mamoe.mirai.contact.announcement.Announcement
+import net.mamoe.mirai.contact.announcement.Announcement.Companion.publishAnnouncement
+import net.mamoe.mirai.contact.announcement.AnnouncementParametersBuilder
+import net.mamoe.mirai.message.data.Image
+import net.mamoe.mirai.message.data.Image.Key.queryUrl
+import net.mamoe.mirai.utils.ExternalResource.Companion.toExternalResource
+import java.io.IOException
+import java.lang.IllegalStateException
+import java.net.HttpURLConnection
+import java.net.URL
+import kotlin.reflect.KType
+
+@Command(
+    name = "announce",
+    display = "公告",
+    alias = ["anc"],
+    usage = "发送群公告",
+    notice = [
+        "如果目标群组中无管理bot则无事发生",
+        "此命令执行时间通常较长,请耐心等待"
+    ]
+)
+class AnnounceCmd(context: CmdContext) : Cmd(context) {
+
+    @Method(name = "", alias = [], pmsLevel = CmdPermissionLevel.OP)
+    suspend fun announce (
+        @Argument(display = "群组", multiValued = true, handler = MultiGroupArgHandler::class)
+        groups: ArrayList<Group>,
+        @Argument(display = "公告选项", handler = AnnouncementParametersArgHandler::class)
+        builder: AnnouncementParametersBuilder,
+        @Argument(display = "头图", handler = ImageArgHandler::class)
+        image: Image?,
+        @Argument(display = "文本", handler = GreedyStringArgHandler::class)
+        content: String
+    ): CmdReceipt {
+        var suc = 0
+        val table = TableBuilder(4)
+        table.th("发送公告 —— ").br()
+        groups.forEach { group -> group.withServeBot(MemberPermission.ADMINISTRATOR) { contact ->
+            try {
+                if (image != null) {
+                    val connection = URL(image.queryUrl()).openConnection() as HttpURLConnection
+                    connection.connect()
+                    connection.inputStream.use { builder.image = contact.announcements.uploadImage(it.toExternalResource()) }
+                    connection.disconnect()
+                }
+                contact.publishAnnouncement(content, builder.build())
+                table.tr("[√]").tb("${group.name}(${group.id})")
+                suc ++
+            } catch (e: IOException) {
+                table.tr("[×]").tb("${group.name}(${group.id})").tb("网络异常")
+            } catch (e: IllegalStateException) {
+                table.tr("[×]").tb("${group.name}(${group.id})").tb("协议异常")
+            }
+
+        }.let { if (!it) table.tr("[×]").tb("${group.name}(${group.id})").tb("无权限") } }
+        context.print(table.toString())
+        return if (suc > 0) SUCCESS else FATAL
+    }
+}
+
+class AnnouncementParametersArgHandler: ArgHandler<AnnouncementParametersBuilder> {
+
+    override val name = "公告选项参数解析器"
+
+    override fun handle(
+        reader: MessageReader,
+        pos: Int,
+        argName: String?,
+        type: KType?,
+        context: CmdContext?
+    ): AnnouncementParametersBuilder {
+        val input = reader.readString()
+        val builder = AnnouncementParametersBuilder()
+        var offset = 0
+        for (i in input.split(Regex(",,"))) {
+            when (i) {
+                "pin" -> builder.isPinned(true)
+                "pop" -> builder.showPopup(true)
+                "e", "edit" -> builder.showEditCard(true)
+                "c", "confirm" -> builder.requireConfirmation(true)
+                else -> throw HandlerFatal(i, argName, pos + offset, type)
+            }
+            offset += i.length
+            offset ++
+        }
+        return builder
+    }
+}