Browse Source

支持在踢出群成员时选择是否拉黑 (#1457)

* 支持在踢出群成员时选择是否拉黑

* fix binary-compatibility for kick NormalMember

* change doc
RainChan 4 years ago
parent
commit
bd61c1e80d

+ 2 - 0
binary-compatibility-validator/android/api/binary-compatibility-validator-android.api

@@ -446,6 +446,8 @@ public abstract interface class net/mamoe/mirai/contact/NormalMember : net/mamoe
 	public fun isMuted ()Z
 	public fun isMuted ()Z
 	public fun kick (Ljava/lang/String;)V
 	public fun kick (Ljava/lang/String;)V
 	public abstract fun kick (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
 	public abstract fun kick (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+	public fun kick (Ljava/lang/String;Z)V
+	public abstract fun kick (Ljava/lang/String;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;
 	public fun modifyAdmin (Z)V
 	public fun modifyAdmin (Z)V
 	public abstract fun modifyAdmin (ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;
 	public abstract fun modifyAdmin (ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;
 	public fun nudge ()Lnet/mamoe/mirai/message/action/MemberNudge;
 	public fun nudge ()Lnet/mamoe/mirai/message/action/MemberNudge;

+ 2 - 0
binary-compatibility-validator/api/binary-compatibility-validator.api

@@ -446,6 +446,8 @@ public abstract interface class net/mamoe/mirai/contact/NormalMember : net/mamoe
 	public fun isMuted ()Z
 	public fun isMuted ()Z
 	public fun kick (Ljava/lang/String;)V
 	public fun kick (Ljava/lang/String;)V
 	public abstract fun kick (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
 	public abstract fun kick (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
+	public fun kick (Ljava/lang/String;Z)V
+	public abstract fun kick (Ljava/lang/String;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;
 	public fun modifyAdmin (Z)V
 	public fun modifyAdmin (Z)V
 	public abstract fun modifyAdmin (ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;
 	public abstract fun modifyAdmin (ZLkotlin/coroutines/Continuation;)Ljava/lang/Object;
 	public fun nudge ()Lnet/mamoe/mirai/message/action/MemberNudge;
 	public fun nudge ()Lnet/mamoe/mirai/message/action/MemberNudge;

+ 14 - 0
mirai-core-api/src/commonMain/kotlin/contact/NormalMember.kt

@@ -105,12 +105,26 @@ public interface NormalMember : Member {
      *
      *
      * 管理员可踢出成员, 群主可踢出管理员和群员.
      * 管理员可踢出成员, 群主可踢出管理员和群员.
      *
      *
+     * @param block 为 `true` 时拉黑成员
+     *
+     * @see MemberLeaveEvent.Kick 成员被踢出事件.
+     * @throws PermissionDeniedException 无权限修改时
+     *
+     */
+    public suspend fun kick(message: String, block: Boolean)
+
+    /**
+     * 踢出该成员, 默认不拉黑
+     *
+     * 管理员可踢出成员, 群主可踢出管理员和群员.
+     *
      * @see MemberLeaveEvent.Kick 成员被踢出事件.
      * @see MemberLeaveEvent.Kick 成员被踢出事件.
      * @throws PermissionDeniedException 无权限修改时
      * @throws PermissionDeniedException 无权限修改时
      *
      *
      */
      */
     public suspend fun kick(message: String)
     public suspend fun kick(message: String)
 
 
+
     /**
     /**
      * 给予或移除群成员的管理员权限。
      * 给予或移除群成员的管理员权限。
      *
      *

+ 6 - 3
mirai-core/src/commonMain/kotlin/contact/NormalMemberImpl.kt

@@ -21,8 +21,6 @@ import net.mamoe.mirai.contact.*
 import net.mamoe.mirai.data.MemberInfo
 import net.mamoe.mirai.data.MemberInfo
 import net.mamoe.mirai.event.broadcast
 import net.mamoe.mirai.event.broadcast
 import net.mamoe.mirai.event.events.*
 import net.mamoe.mirai.event.events.*
-import net.mamoe.mirai.internal.message.OnlineMessageSourceToGroupImpl
-import net.mamoe.mirai.internal.message.OnlineMessageSourceToStrangerImpl
 import net.mamoe.mirai.internal.message.OnlineMessageSourceToTempImpl
 import net.mamoe.mirai.internal.message.OnlineMessageSourceToTempImpl
 import net.mamoe.mirai.internal.message.createMessageReceipt
 import net.mamoe.mirai.internal.message.createMessageReceipt
 import net.mamoe.mirai.internal.network.protocol.packet.chat.TroopManagement
 import net.mamoe.mirai.internal.network.protocol.packet.chat.TroopManagement
@@ -171,6 +169,10 @@ internal class NormalMemberImpl constructor(
     }
     }
 
 
     override suspend fun kick(message: String) {
     override suspend fun kick(message: String) {
+        kick(message, false)
+    }
+
+    override suspend fun kick(message: String, block: Boolean) {
         checkBotPermissionHigherThanThis("kick")
         checkBotPermissionHigherThanThis("kick")
         check(group.members[this.id] != null) {
         check(group.members[this.id] != null) {
             "Member ${this.id} had already been kicked from group ${group.id}"
             "Member ${this.id} had already been kicked from group ${group.id}"
@@ -179,7 +181,8 @@ internal class NormalMemberImpl constructor(
             val response: TroopManagement.Kick.Response = TroopManagement.Kick(
             val response: TroopManagement.Kick.Response = TroopManagement.Kick(
                 client = bot.client,
                 client = bot.client,
                 member = this@NormalMemberImpl,
                 member = this@NormalMemberImpl,
-                message = message
+                message = message,
+                ban = block
             ).sendAndExpect()
             ).sendAndExpect()
 
 
             check(response.success) { "kick failed: ${response.ret}" }
             check(response.success) { "kick failed: ${response.ret}" }

+ 3 - 2
mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/TroopManagement.kt

@@ -192,7 +192,8 @@ internal class TroopManagement {
         operator fun invoke(
         operator fun invoke(
             client: QQAndroidClient,
             client: QQAndroidClient,
             member: Member,
             member: Member,
-            message: String
+            message: String,
+            ban: Boolean
         ) = buildOutgoingUniPacket(client) {
         ) = buildOutgoingUniPacket(client) {
             writeProtoBuf(
             writeProtoBuf(
                 OidbSso.OIDBSSOPkg.serializer(),
                 OidbSso.OIDBSSOPkg.serializer(),
@@ -206,7 +207,7 @@ internal class TroopManagement {
                             Oidb0x8a0.KickMemberInfo(
                             Oidb0x8a0.KickMemberInfo(
                                 optUint32Operate = 5,
                                 optUint32Operate = 5,
                                 optUint64MemberUin = member.id,
                                 optUint64MemberUin = member.id,
-                                optUint32Flag = 0
+                                optUint32Flag = if (ban) 1 else 0 //1为拉黑
                             )
                             )
                         ),
                         ),
                         kickMsg = message.toByteArray()
                         kickMsg = message.toByteArray()