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 06b9c143f..52e0bc192 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 @@ -95,12 +95,17 @@ internal class QQAndroidBotNetworkHandler(bot: QQAndroidBot) : BotNetworkHandler //start updating friend/group list bot.logger.info("Start updating friend/group list") + /* val data = FriendList.GetFriendGroupList( bot.client, 0, - 10, + 1, 0, - 0 + 2 + ).sendAndExpect() + */ + val data = FriendList.GetTroopList( + bot.client ).sendAndExpect() println(data.contentToString()) } diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/data/jce/TroopList.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/data/jce/TroopList.kt new file mode 100644 index 000000000..296d4c133 --- /dev/null +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/data/jce/TroopList.kt @@ -0,0 +1,26 @@ +package net.mamoe.mirai.qqandroid.network.protocol.data.jce + +import kotlinx.serialization.SerialId +import kotlinx.serialization.Serializable +import net.mamoe.mirai.qqandroid.io.JceStruct + +@Serializable +internal class GetTroopListReqV2Simplify( + @SerialId(0) val uin: Long, + @SerialId(1) val getMSFMsgFlag: Byte? = null, + @SerialId(2) val vecCookies: ByteArray? = null, + @SerialId(3) val vecGroupInfo: List? = null, + @SerialId(4) val groupFlagExt: Byte? = null, + @SerialId(5) val shVersion: Int? = null, + @SerialId(6) val dwCompanyId: Long? = null, + @SerialId(7) val versionNum: Long? = null, + @SerialId(8) val getLongGroupName: Byte? = null +) : JceStruct + +@Serializable +internal class stTroopNumSimplify( + @SerialId(0) val groupCode: Long, + @SerialId(1) val dwGroupInfoSeq: Long? = null, + @SerialId(2) val dwGroupFlagExt: Long? = null, + @SerialId(3) val dwGroupRankSeq: Long? = null +) : JceStruct diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/PacketFactory.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/PacketFactory.kt index 798a30710..2e61d2649 100644 --- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/PacketFactory.kt +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/PacketFactory.kt @@ -66,7 +66,8 @@ internal object KnownPacketFactories : List> by mutableListOf( MessageSvc.PbGetMsg, MessageSvc.PushForceOffline, MessageSvc.PbSendMsg, - FriendList.GetFriendGroupList + FriendList.GetFriendGroupList, + FriendList.GetTroopList ) { // SvcReqMSFLoginNotify 自己的其他设备上限 // MessageSvc.PushReaded 电脑阅读了别人的消息, 告知手机 diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/list/FriendListPacket.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/list/FriendListPacket.kt index 1f143331b..c62de6ef3 100644 --- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/list/FriendListPacket.kt +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/list/FriendListPacket.kt @@ -3,13 +3,11 @@ package net.mamoe.mirai.qqandroid.network.protocol.packet.list import kotlinx.io.core.ByteReadPacket import net.mamoe.mirai.data.Packet import net.mamoe.mirai.qqandroid.QQAndroidBot -import net.mamoe.mirai.qqandroid.io.serialization.decodeUniPacket -import net.mamoe.mirai.qqandroid.io.serialization.jceRequestSBuffer -import net.mamoe.mirai.qqandroid.io.serialization.toByteArray -import net.mamoe.mirai.qqandroid.io.serialization.writeJceStruct +import net.mamoe.mirai.qqandroid.io.serialization.* import net.mamoe.mirai.qqandroid.network.QQAndroidClient import net.mamoe.mirai.qqandroid.network.protocol.data.jce.GetFriendListReq import net.mamoe.mirai.qqandroid.network.protocol.data.jce.GetFriendListResp +import net.mamoe.mirai.qqandroid.network.protocol.data.jce.GetTroopListReqV2Simplify import net.mamoe.mirai.qqandroid.network.protocol.data.jce.RequestPacket import net.mamoe.mirai.qqandroid.network.protocol.data.proto.Vec0xd50 import net.mamoe.mirai.qqandroid.network.protocol.packet.EMPTY_BYTE_ARRAY @@ -19,10 +17,55 @@ import net.mamoe.mirai.qqandroid.network.protocol.packet.buildOutgoingUniPacket import net.mamoe.mirai.utils.cryptor.contentToString import net.mamoe.mirai.utils.io.debugPrint import net.mamoe.mirai.utils.io.discardExact +import net.mamoe.mirai.utils.io.readRemainingBytes +import net.mamoe.mirai.utils.io.toUHexString internal class FriendList { + internal object GetTroopList : PacketFactory("friendlist.GetTroopListReqV2") { + override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): GetTroopList.Response { + println("获取到了GetTroopList的回信") + println(this.readRemainingBytes().toUHexString()) + return Response() + } + + class Response : Packet { + override fun toString(): String = "FriendList.GetFriendGroupList.Response" + } + + operator fun invoke( + client: QQAndroidClient + ): OutgoingPacket { + return buildOutgoingUniPacket(client, bodyType = 1, key = client.wLoginSigInfo.d2Key) { + writeJceStruct( + RequestPacket.serializer(), + RequestPacket( + sFuncName = "GetTroopListReqV2Simplify", + sServantName = "mqq.IMService.FriendListServiceServantObj", + iVersion = 3, + cPacketType = 0x00, + iMessageType = 0x00000, + iRequestId = 1921334513, + sBuffer = jceRequestSBuffer( + "GetTroopListReqV2Simplify", + GetTroopListReqV2Simplify.serializer(), + GetTroopListReqV2Simplify( + uin = client.uin, + getMSFMsgFlag = 0, + groupFlagExt = 1, + shVersion = 7, + dwCompanyId = 0, + versionNum = 1, + getLongGroupName = 1 + ) + ) + ) + ) + } + } + } + internal object GetFriendGroupList : PacketFactory("friendlist.getFriendGroupList") { class Response : Packet { @@ -30,15 +73,9 @@ internal class FriendList { } override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Response { - - println(this - .apply { - this.discardExact(4) - } - .decodeUniPacket(GetFriendListResp.serializer()) - .contentToString() - ) - + this.discardExact(4) + val res = this.decodeUniPacket(GetFriendListResp.serializer()) + println(res.contentToString()) return Response() } @@ -73,7 +110,7 @@ internal class FriendList { startIndex = friendListStartIndex.toShort(), getfriendCount = friendListCount.toShort(), groupid = 0, - ifGetGroupInfo = if (friendListStartIndex <= 0) { + ifGetGroupInfo = if (groupListCount <= 0) { 0 } else { 1