00ll00 5 лет назад
Родитель
Сommit
8ca1227c92
1 измененных файлов с 65 добавлено и 2 удалено
  1. 65 2
      src/main/kotlin/bot_luo_core/cli/commands/AnnounceCmd.kt

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

@@ -10,6 +10,7 @@ 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 kotlinx.coroutines.delay
 import net.mamoe.mirai.contact.MemberPermission
 import net.mamoe.mirai.contact.PermissionDeniedException
 import net.mamoe.mirai.contact.announcement.Announcement
@@ -29,6 +30,14 @@ import kotlin.reflect.KType
     display = "公告",
     alias = ["anc"],
     usage = "发送群公告",
+    caption = [
+        "可用的公告选项有:",
+        "pin         置顶. 可以有多个置顶公告",
+        "pop         使用弹窗",
+        "edit(e)     显示能够引导群成员修改昵称的窗口",
+        "confirm(c)  需要群成员确认",
+        "new(n)      发送给新成员"
+              ],
     notice = [
         "如果目标群组中无管理bot则无事发生",
         "此命令执行时间通常较长,请耐心等待"
@@ -36,7 +45,7 @@ import kotlin.reflect.KType
 )
 class AnnounceCmd(context: CmdContext) : Cmd(context) {
 
-    @Method(name = "", alias = [], pmsLevel = CmdPermissionLevel.OP)
+    @Method(name = "", alias = [], pmsLevel = CmdPermissionLevel.OP, order = 0)
     suspend fun announce (
         @Argument(display = "群组", multiValued = true, handler = MultiGroupArgHandler::class)
         groups: ArrayList<Group>,
@@ -47,6 +56,30 @@ class AnnounceCmd(context: CmdContext) : Cmd(context) {
         @Argument(display = "文本", handler = GreedyStringArgHandler::class)
         content: String
     ): CmdReceipt {
+
+        val t = TableBuilder(4)
+        t.th("公告预览 ——").br()
+
+        t.tr("置顶:").tb(builder.isPinned)
+        t.tr("弹窗:").tb(builder.showPopup)
+        t.tr("编辑名片:").tb(builder.showEditCard)
+        t.tr("需要确认:").tb(builder.requireConfirmation)
+        t.tr("仅新成员:").tb(builder.sendToNewMember)
+        t.p("头图:").sp()
+        if (image != null) t.p(image)
+        t.br()
+        t.p("文本:").sp().p(content).br()
+        t.br().p("确认发送?(y/n)")
+
+        context.sendMessageWithLog(t.toMessage())
+        if (!context.nextYorN(timeoutMillis = 30000L) {
+                context.print("操作超时,")
+                false
+        }) {
+            context.print("已取消发送")
+            return FATAL
+        }
+
         var suc = 0
         val table = TableBuilder(4)
         table.th("发送公告 —— ").br()
@@ -61,6 +94,7 @@ class AnnounceCmd(context: CmdContext) : Cmd(context) {
                 contact.publishAnnouncement(content, builder.build())
                 table.tr("[√]").tb("${group.name}(${group.id})")
                 suc ++
+                delay((3000L..6000L).random())
             } catch (e: IOException) {
                 table.tr("[×]").tb("${group.name}(${group.id})").tb("网络异常")
             } catch (e: IllegalStateException) {
@@ -71,6 +105,34 @@ class AnnounceCmd(context: CmdContext) : Cmd(context) {
         context.print(table.toString())
         return if (suc > 0) SUCCESS else FATAL
     }
+
+    @Method(name = "", alias = [], pmsLevel = CmdPermissionLevel.OP, order = 1)
+    suspend fun announce (
+        @Argument(display = "群组", multiValued = true, handler = MultiGroupArgHandler::class)
+        groups: ArrayList<Group>,
+        @Argument(display = "公告选项", handler = AnnouncementParametersArgHandler::class)
+        builder: AnnouncementParametersBuilder,
+        @Argument(display = "文本", handler = GreedyStringArgHandler::class)
+        content: String
+    ): CmdReceipt = announce(groups, builder, null, content)
+
+    @Method(name = "", alias = [], pmsLevel = CmdPermissionLevel.OP, order = 2)
+    suspend fun announce (
+        @Argument(display = "群组", multiValued = true, handler = MultiGroupArgHandler::class)
+        groups: ArrayList<Group>,
+        @Argument(display = "头图", handler = ImageArgHandler::class)
+        image: Image,
+        @Argument(display = "文本", handler = GreedyStringArgHandler::class)
+        content: String
+    ): CmdReceipt = announce(groups, AnnouncementParametersBuilder(), image, content)
+
+    @Method(name = "", alias = [], pmsLevel = CmdPermissionLevel.OP, order = 3)
+    suspend fun announce (
+        @Argument(display = "群组", multiValued = true, handler = MultiGroupArgHandler::class)
+        groups: ArrayList<Group>,
+        @Argument(display = "文本", handler = GreedyStringArgHandler::class)
+        content: String
+    ): CmdReceipt = announce(groups, AnnouncementParametersBuilder(), null, content)
 }
 
 class AnnouncementParametersArgHandler: ArgHandler<AnnouncementParametersBuilder> {
@@ -87,12 +149,13 @@ class AnnouncementParametersArgHandler: ArgHandler<AnnouncementParametersBuilder
         val input = reader.readString()
         val builder = AnnouncementParametersBuilder()
         var offset = 0
-        for (i in input.split(Regex(",,"))) {
+        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)
+                "n", "new" -> builder.sendToNewMember(true)
                 else -> throw HandlerFatal(i, argName, pos + offset, type)
             }
             offset += i.length