diff --git a/mirai-core/src/commonMain/kotlin/network/protocol/data/jce/RequestPacket.kt b/mirai-core/src/commonMain/kotlin/network/protocol/data/jce/RequestPacket.kt index 863fc4216..78117e0c9 100644 --- a/mirai-core/src/commonMain/kotlin/network/protocol/data/jce/RequestPacket.kt +++ b/mirai-core/src/commonMain/kotlin/network/protocol/data/jce/RequestPacket.kt @@ -13,18 +13,17 @@ import kotlinx.serialization.Serializable import net.mamoe.mirai.internal.network.protocol.packet.EMPTY_BYTE_ARRAY import net.mamoe.mirai.internal.utils.io.JceStruct import net.mamoe.mirai.internal.utils.io.serialization.tars.TarsId -import kotlin.jvm.JvmField private val EMPTY_MAP = mapOf() @Serializable internal class RequestPacket( - @TarsId(1) @JvmField val iVersion: Short? = 3, + @TarsId(1) @JvmField val version: Short? = 3, @TarsId(2) @JvmField val cPacketType: Byte = 0, @TarsId(3) @JvmField val iMessageType: Int = 0, - @TarsId(4) @JvmField val iRequestId: Int = 0, - @TarsId(5) @JvmField val sServantName: String = "", - @TarsId(6) @JvmField val sFuncName: String = "", + @TarsId(4) @JvmField val requestId: Int = 0, + @TarsId(5) @JvmField val servantName: String = "", + @TarsId(6) @JvmField val funcName: String = "", @TarsId(7) @JvmField val sBuffer: ByteArray = EMPTY_BYTE_ARRAY, @TarsId(8) @JvmField val iTimeout: Int? = 0, @TarsId(9) @JvmField val context: Map? = EMPTY_MAP, diff --git a/mirai-core/src/commonMain/kotlin/network/protocol/data/jce/SvcRequestPushReadedNotify.kt b/mirai-core/src/commonMain/kotlin/network/protocol/data/jce/SvcRequestPushReadedNotify.kt index b420e7d2c..e34be31a9 100644 --- a/mirai-core/src/commonMain/kotlin/network/protocol/data/jce/SvcRequestPushReadedNotify.kt +++ b/mirai-core/src/commonMain/kotlin/network/protocol/data/jce/SvcRequestPushReadedNotify.kt @@ -9,7 +9,7 @@ @file:Suppress("SpellCheckingInspection") -package net.mamoe.mirai.internal.network.protocol.data.jce +package net.mamoe.mirai.internal.network.protocol.data.jce import kotlinx.serialization.Serializable import net.mamoe.mirai.internal.utils.io.JceStruct diff --git a/mirai-core/src/commonMain/kotlin/network/protocol/packet/PacketFactory.kt b/mirai-core/src/commonMain/kotlin/network/protocol/packet/PacketFactory.kt index 809d435f4..a8d5db02e 100644 --- a/mirai-core/src/commonMain/kotlin/network/protocol/packet/PacketFactory.kt +++ b/mirai-core/src/commonMain/kotlin/network/protocol/packet/PacketFactory.kt @@ -128,6 +128,7 @@ internal object KnownPacketFactories { WtLogin.Login, StatSvc.Register, StatSvc.GetOnlineStatus, + StatSvc.GetDevLoginInfo, MessageSvcPbGetMsg, MessageSvcPushForceOffline, MessageSvcPbSendMsg, diff --git a/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/TroopManagement.kt b/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/TroopManagement.kt index c73b4f37c..cbd92f541 100644 --- a/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/TroopManagement.kt +++ b/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/TroopManagement.kt @@ -406,11 +406,11 @@ internal class TroopManagement { writeJceStruct( RequestPacket.serializer(), RequestPacket( - sFuncName = "ModifyGroupCardReq", - sServantName = "mqq.IMService.FriendListServiceServantObj", - iVersion = 3, + funcName = "ModifyGroupCardReq", + servantName = "mqq.IMService.FriendListServiceServantObj", + version = 3, cPacketType = 0x00, - iRequestId = client.nextRequestPacketRequestId(), + requestId = client.nextRequestPacketRequestId(), sBuffer = jceRequestSBuffer( "MGCREQ", ModifyGroupCardReq.serializer(), diff --git a/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/OnlinePush.ReqPush.kt b/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/OnlinePush.ReqPush.kt index 307f7a6ee..457b8c6a8 100644 --- a/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/OnlinePush.ReqPush.kt +++ b/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/OnlinePush.ReqPush.kt @@ -135,9 +135,9 @@ internal object OnlinePushReqPush : IncomingPacketFactory ByteArray.loadWithUniPacket( deserializer: DeserializationStrategy, @@ -50,6 +48,24 @@ internal fun ByteReadPacket.readJceStruct( return Tars.UTF_8.load(serializer, this.readPacketExact(length)) } +internal fun BytePacketBuilder.writeJceRequestPacket( + version: Int = 3, + servantName: String, + funcName: String, + name: String = funcName, + serializer: SerializationStrategy, + body: T +) = writeJceStruct( + RequestPacket.serializer(), + RequestPacket( + requestId = 0, + version = version.toShort(), + servantName = servantName, + funcName = funcName, + sBuffer = jceRequestSBuffer(name, serializer, body) + ) +) + /** * 先解析为 [RequestPacket], 即 `UniRequest`, 再按版本解析 map, 再找出指定数据并反序列化 */ @@ -85,15 +101,15 @@ private fun Map.firstValue(): V = this.entries.first().value private fun ByteReadPacket.decodeUniRequestPacketAndDeserialize(name: String? = null, block: (ByteArray) -> R): R { val request = this.readJceStruct(RequestPacket.serializer()) - return block(if (name == null) when (request.iVersion?.toInt() ?: 3) { + return block(if (name == null) when (request.version?.toInt() ?: 3) { 2 -> request.sBuffer.loadAs(RequestDataVersion2.serializer()).map.firstValue().firstValue() 3 -> request.sBuffer.loadAs(RequestDataVersion3.serializer()).map.firstValue() - else -> error("unsupported version ${request.iVersion}") - } else when (request.iVersion?.toInt() ?: 3) { + else -> error("unsupported version ${request.version}") + } else when (request.version?.toInt() ?: 3) { 2 -> request.sBuffer.loadAs(RequestDataVersion2.serializer()).map.getOrElse(name) { error("cannot find $name") } .firstValue() 3 -> request.sBuffer.loadAs(RequestDataVersion3.serializer()).map.getOrElse(name) { error("cannot find $name") } - else -> error("unsupported version ${request.iVersion}") + else -> error("unsupported version ${request.version}") }) }