diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/ContactImpl.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/ContactImpl.kt index e986e74a1..b136af038 100644 --- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/ContactImpl.kt +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/ContactImpl.kt @@ -325,7 +325,7 @@ internal class GroupImpl( @UseExperimental(MiraiExperimentalAPI::class) override lateinit var botPermission: MemberPermission - override val members: ContactList = ContactList(members.asSequence().mapNotNull { + override val members: ContactList = ContactList(members.mapNotNull { if (it.uin == bot.uin) { botPermission = it.permission null diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/QQAndroidBot.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/QQAndroidBot.kt index c96aad7df..c4c7067da 100644 --- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/QQAndroidBot.kt +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/QQAndroidBot.kt @@ -24,7 +24,7 @@ import net.mamoe.mirai.event.events.BotEvent import net.mamoe.mirai.message.data.Image import net.mamoe.mirai.qqandroid.network.QQAndroidBotNetworkHandler import net.mamoe.mirai.qqandroid.network.QQAndroidClient -import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.QQAndroidGroupInfo +import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.GroupInfoImpl import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.TroopManagement import net.mamoe.mirai.qqandroid.network.protocol.packet.list.FriendList import net.mamoe.mirai.utils.* @@ -92,11 +92,7 @@ internal abstract class QQAndroidBotBase constructor( TroopManagement.GetGroupInfo( client = bot.client, groupCode = id - ).sendAndExpect().apply { - if (this.delegate.groupUin == null) { - this.delegate.groupUin = Group.calculateGroupUinByGroupCode(id) - } - } + ).sendAndExpect() } override suspend fun queryGroupMemberList(groupUin: Long, groupCode: Long, ownerId: Long): Sequence = network.run { @@ -110,8 +106,7 @@ internal abstract class QQAndroidBotBase constructor( nextUin = nextUin ).sendAndExpect(timeoutMillis = 3000) sequence += data.members.asSequence().map { troopMemberInfo -> - MemberInfoImpl(troopMemberInfo.apply { - }, ownerId) + MemberInfoImpl(troopMemberInfo, ownerId) } nextUin = data.nextUin if (nextUin == 0L) { diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidBotNetworkHandler.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidBotNetworkHandler.kt index d753ad8ab..78b54628b 100644 --- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidBotNetworkHandler.kt +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidBotNetworkHandler.kt @@ -30,6 +30,7 @@ import net.mamoe.mirai.qqandroid.QQImpl import net.mamoe.mirai.qqandroid.event.PacketReceivedEvent import net.mamoe.mirai.qqandroid.network.protocol.data.proto.MsgSvc import net.mamoe.mirai.qqandroid.network.protocol.packet.* +import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.GroupInfoImpl import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.receive.MessageSvc import net.mamoe.mirai.qqandroid.network.protocol.packet.list.FriendList import net.mamoe.mirai.qqandroid.network.protocol.packet.login.Heartbeat @@ -174,7 +175,23 @@ internal class QQAndroidBotNetworkHandler(bot: QQAndroidBot) : BotNetworkHandler bot = bot, coroutineContext = bot.coroutineContext, id = troopNum.groupCode, - groupInfo = bot.queryGroupInfo(troopNum.groupCode), + groupInfo = bot.queryGroupInfo(troopNum.groupCode).apply { + this as GroupInfoImpl + + if (this.delegate.groupName == null) { + this.delegate.groupName = troopNum.groupName + } + + if (this.delegate.groupMemo == null) { + this.delegate.groupMemo = troopNum.groupMemo + } + + if (this.delegate.groupUin == null) { + this.delegate.groupUin = troopNum.groupUin + } + + this.delegate.groupCode = troopNum.groupCode + }, members = bot.queryGroupMemberList(troopNum.groupUin, troopNum.groupCode, troopNum.dwGroupOwnerUin) ) ) diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/data/proto/OIDB.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/data/proto/OIDB.kt index c46c0c3c3..e12633005 100644 --- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/data/proto/OIDB.kt +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/data/proto/OIDB.kt @@ -180,8 +180,8 @@ class Oidb0x88d : ProtoBuf { @SerialId(12) val groupDefaultPage: Int? = null, @SerialId(13) val groupInfoSeq: Int? = null, @SerialId(14) val groupRoamingTime: Int? = null, - @SerialId(15) val groupName: String? = null, - @SerialId(16) val groupMemo: String? = null, + @SerialId(15) var groupName: String? = null, + @SerialId(16) var groupMemo: String? = null, @SerialId(17) val ingGroupFingerMemo: String? = null, @SerialId(18) val ingGroupClassText: String? = null, @SerialId(19) val groupAllianceCode: List? = null, @@ -254,7 +254,7 @@ class Oidb0x88d : ProtoBuf { @SerialId(86) val isAllowConfGroupMemberNick: Int? = null, @SerialId(87) val isAllowConfGroupMemberAtAll: Int? = null, @SerialId(88) val isAllowConfGroupMemberModifyGroupName: Int? = null, - @SerialId(89) val ingLongGroupName: ByteArray? = null, + @SerialId(89) val longGroupName: String? = null, @SerialId(90) val cmduinJoinRealMsgSeq: Int? = null, @SerialId(91) val isGroupFreeze: Int? = null, @SerialId(92) val msgLimitFrequency: Int? = null, @@ -265,7 +265,8 @@ class Oidb0x88d : ProtoBuf { @SerialId(97) val isAllowHlGuildBinary: Int? = null, @SerialId(98) val cmduinRingtoneId: Int? = null, @SerialId(99) val groupFlagext4: Int? = null, - @SerialId(100) val groupFreezeReason: Int? = null + @SerialId(100) val groupFreezeReason: Int? = null, + @SerialId(101) var groupCode: Long? = null // mirai 添加 ) : ProtoBuf @Serializable diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/TroopManagement.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/TroopManagement.kt index ef4d68963..e073d068d 100644 --- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/TroopManagement.kt +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/TroopManagement.kt @@ -31,14 +31,14 @@ import net.mamoe.mirai.utils.daysToSeconds import net.mamoe.mirai.utils.io.encodeToString import net.mamoe.mirai.data.GroupInfo as MiraiGroupInfo -internal inline class QQAndroidGroupInfo( +internal inline class GroupInfoImpl( internal val delegate: Oidb0x88d.GroupInfo ) : MiraiGroupInfo, Packet { override val uin: Long get() = delegate.groupUin ?: error("cannot find groupUin") override val owner: Long get() = delegate.groupOwner ?: error("cannot find groupOwner") override val groupCode: Long get() = Group.calculateGroupCodeByGroupUin(uin) override val memo: String get() = delegate.groupMemo ?: error("cannot find groupMemo") - override val name: String get() = delegate.groupName ?: error("cannot find groupName") + override val name: String get() = delegate.groupName ?: delegate.longGroupName ?: error("cannot find groupName") override val allowMemberInvite get() = delegate.groupFlagExt?.and(0x000000c0) != 0 override val allowAnonymousChat get() = delegate.groupFlagExt?.and(0x40000000) == 0 override val autoApprove get() = delegate.groupFlagext3?.and(0x00100000) == 0 @@ -86,7 +86,7 @@ internal class TroopManagement { } - internal object GetGroupInfo : OutgoingPacketFactory("OidbSvc.0x88d_7") { + internal object GetGroupInfo : OutgoingPacketFactory("OidbSvc.0x88d_7") { operator fun invoke( client: QQAndroidClient, groupCode: Long @@ -117,7 +117,12 @@ internal class TroopManagement { createSourceFlag = 0, noCodeFingerOpenFlag = 0, ingGroupQuestion = "", - ingGroupAnswer = "" + ingGroupAnswer = "", + groupName = "", + longGroupName = "", + groupMemo = "", + groupUin = 0, + groupOwner = 0 ), groupCode = groupCode ) @@ -128,9 +133,9 @@ internal class TroopManagement { } } - override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): QQAndroidGroupInfo { + override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): GroupInfoImpl { with(this.readBytes().loadAs(OidbSso.OIDBSSOPkg.serializer()).bodybuffer.loadAs(Oidb0x88d.RspBody.serializer()).stzrspgroupinfo!![0].stgroupinfo!!) { - return QQAndroidGroupInfo(this) + return GroupInfoImpl(this) } } } diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/receive/MessageSvc.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/receive/MessageSvc.kt index 82fe43680..90bc21f74 100644 --- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/receive/MessageSvc.kt +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/receive/MessageSvc.kt @@ -133,6 +133,15 @@ internal class MessageSvc { val messages = resp.uinPairMsgs.asSequence().filterNot { it.msg == null }.flatMap { it.msg!!.asSequence() }.mapNotNull { when (it.msgHead.msgType) { 33 -> { + if (it.msgHead.authUin == bot.uin) { + val group = bot.getGroupByUinOrNull(it.msgHead.fromUin) + if (group == null) { + TODO("查询群信息, 添加群") + } + } + + TODO("为 group 添加一个 fun Member() 来构造 member") + // bot.getGroupByUin(it.msgHead.fromUin).members.delegate.addLast() println("GroupUin" + it.msgHead.fromUin + "新群员" + it.msgHead.authUin + " 出现了[" + it.msgHead.authNick + "] 添加刷新") null } diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/data/GroupInfo.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/data/GroupInfo.kt index 20a1e3db5..98b722d6d 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/data/GroupInfo.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/data/GroupInfo.kt @@ -21,17 +21,17 @@ interface GroupInfo { /** * 名称 */ - val name: String + val name: String // 不一定能获取到 /** * 群主 */ - val owner: Long + val owner: Long // 不一定能获取到 /** * 入群公告 */ - val memo: String + val memo: String // 不一定能获取到 /** * 允许群员邀请其他人加入群