From 42716ab62d9861d0828cfe23c4db06be5dc6417e Mon Sep 17 00:00:00 2001
From: ryoii <ryoii@foxmail.com>
Date: Sun, 12 Jul 2020 11:43:51 +0800
Subject: [PATCH] Fix #375, broadcast `BotJoinGroupEvent` when create new group
 from other client

---
 .../chat/receive/MessageSvc.PbGetMsg.kt       | 57 +++++++++++--------
 1 file changed, 34 insertions(+), 23 deletions(-)

diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/receive/MessageSvc.PbGetMsg.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/receive/MessageSvc.PbGetMsg.kt
index 6bf941e3e..3fa76c5c6 100644
--- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/receive/MessageSvc.PbGetMsg.kt
+++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/receive/MessageSvc.PbGetMsg.kt
@@ -44,7 +44,6 @@ import net.mamoe.mirai.qqandroid.network.protocol.packet.buildOutgoingUniPacket
 import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.GroupInfoImpl
 import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.NewContact
 import net.mamoe.mirai.qqandroid.network.protocol.packet.list.FriendList
-import net.mamoe.mirai.qqandroid.utils._miraiContentToString
 import net.mamoe.mirai.qqandroid.utils.io.serialization.readProtoBuf
 import net.mamoe.mirai.qqandroid.utils.io.serialization.toByteArray
 import net.mamoe.mirai.qqandroid.utils.io.serialization.writeProtoBuf
@@ -147,21 +146,32 @@ internal object MessageSvcPbGetMsg : OutgoingPacketFactory<MessageSvcPbGetMsg.Re
             } // 删除消息
             .mapNotNull<MsgComm.Msg, Packet> { msg ->
 
-                when (msg.msgHead.msgType) {
-                    33 -> bot.groupListModifyLock.withLock { // 邀请入群
-                        val group = bot.getGroupByUinOrNull(msg.msgHead.fromUin)
-                        if (msg.msgHead.authUin == bot.id) {
-                            if (group != null) {
-                                return@mapNotNull null
-                            }
-                            // 新群
+                suspend fun createGroupForBot(groupUin: Long): Group? {
+                    val group = bot.getGroupByUinOrNull(groupUin)
+                    if (group != null) {
+                        return null
+                    }
 
-                            val newGroup = bot.getNewGroup(Group.calculateGroupCodeByGroupUin(msg.msgHead.fromUin))
-                                ?: return@mapNotNull null
-                            bot.groups.delegate.addLast(newGroup)
-                            return@mapNotNull BotJoinGroupEvent.Active(newGroup)
+                    return bot.getNewGroup(Group.calculateGroupCodeByGroupUin(groupUin))?.apply {
+                        bot.groups.delegate.addLast(this)
+                    }
+                }
+
+                when (msg.msgHead.msgType) {
+                    33 -> bot.groupListModifyLock.withLock {
+
+                        if (msg.msgHead.authUin == bot.id) {
+                            // 邀请入群
+                            return@mapNotNull createGroupForBot(msg.msgHead.fromUin)?.let {
+                                // TODO: 这里被邀请入群应该是Invite(),但是没有获取邀请人的信息,邀请人的信息在msg.msgContent里,未解包
+                                // BotJoinGroupEvent.Invite()
+                                BotJoinGroupEvent.Active(it)
+                            }
                         } else {
-                            group ?: return@mapNotNull null
+
+                            // 成员申请入群
+                            val group = bot.getGroupByUinOrNull(msg.msgHead.fromUin)
+                                ?: return@mapNotNull null
 
                             // 主动入群, 直接加入: msgContent=27 0B 60 E7 01 76 E4 B8 DD 82 3E 03 3F A2 06 B4 B4 BD A8 D5 DF 00 30 42 39 41 30 33 45 38 34 30 39 34 42 46 30 45 32 45 38 42 31 43 43 41 34 32 42 38 42 44 42 35 34 44 42 31 44 32 32 30 46 30 38 39 46 46 35 41 38
                             // 主动直接加入                  27 0B 60 E7 01 76 E4 B8 DD 82 3E 03 3F A2 06 B4 B4 BD A8 D5 DF 00 30 33 30 45 38 42 31 33 46 41 41 31 33 46 38 31 35 34 41 38 33 32 37 31 43 34 34 38 35 33 35 46 45 31 38 32 43 39 42 43 46 46 32 44 39 39 46 41 37
@@ -192,19 +202,20 @@ internal object MessageSvcPbGetMsg : OutgoingPacketFactory<MessageSvcPbGetMsg.Re
                         return@mapNotNull null
                     }
 
-                    85 -> bot.groupListModifyLock.withLock { // 其他客户端入群
-                        val group = bot.getGroupByUinOrNull(msg.msgHead.fromUin)
-                        if (msg.msgHead.toUin == bot.id && group == null) {
+                    38 -> bot.groupListModifyLock.withLock { // 建群
+                        return@mapNotNull createGroupForBot(msg.msgHead.fromUin)
+                            ?.let { BotJoinGroupEvent.Active(it) }
+                    }
 
-                            val newGroup = bot.getNewGroup(Group.calculateGroupCodeByGroupUin(msg.msgHead.fromUin))
-                                ?: return@mapNotNull null
-                            bot.groups.delegate.addLast(newGroup)
-                            return@mapNotNull BotJoinGroupEvent.Active(newGroup)
+                    85 -> bot.groupListModifyLock.withLock { // 其他客户端入群
+                        return@mapNotNull if (msg.msgHead.toUin == bot.id) {
+                            createGroupForBot(msg.msgHead.fromUin)
+                                ?.let { BotJoinGroupEvent.Active(it) }
                         } else {
-                            // unknown
-                            return@mapNotNull null
+                            null
                         }
                     }
+
                     /*
                     34 -> { // 主动入群