mirror of
https://github.com/mamoe/mirai.git
synced 2025-03-25 06:50:09 +08:00
Avoid using UShort for sequenceId
This commit is contained in:
parent
c3ccb0b4a4
commit
a63c925cbc
mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet
@ -22,7 +22,7 @@ import net.mamoe.mirai.utils.io.*
|
||||
internal class OutgoingPacket constructor(
|
||||
name: String?,
|
||||
val packetId: PacketId,
|
||||
val sequenceId: UShort,
|
||||
val sequenceId: Short,
|
||||
val delegate: ByteReadPacket
|
||||
) : Packet {
|
||||
val name: String by lazy {
|
||||
@ -48,13 +48,12 @@ private val EMPTY_BYTE_ARRAY = ByteArray(0)
|
||||
*
|
||||
* byte[] body encrypted by 16 zero
|
||||
*/
|
||||
@UseExperimental(ExperimentalUnsignedTypes::class)
|
||||
internal inline fun PacketFactory<*, *>.buildLoginOutgoingPacket(
|
||||
uinAccount: String,
|
||||
extraData: ByteArray = EMPTY_BYTE_ARRAY,
|
||||
name: String? = null,
|
||||
id: PacketId = this.id,
|
||||
sequenceId: UShort = PacketFactory.atomicNextSequenceId(),
|
||||
sequenceId: Short = PacketFactory.atomicNextSequenceId(),
|
||||
body: BytePacketBuilder.() -> Unit
|
||||
): OutgoingPacket = OutgoingPacket(name, id, sequenceId, buildPacket {
|
||||
writeIntLVPacket(lengthOffset = { it + 4 }) {
|
||||
@ -259,7 +258,7 @@ internal inline fun BytePacketBuilder.writeRequestPacket(
|
||||
client: QQAndroidClient,
|
||||
encryptMethod: EncryptMethod,
|
||||
commandId: CommandId,
|
||||
sequenceId: UShort = PacketFactory.atomicNextSequenceId(),
|
||||
sequenceId: Short = PacketFactory.atomicNextSequenceId(),
|
||||
bodyBlock: BytePacketBuilder.() -> Unit
|
||||
) {
|
||||
val body = encryptMethod.run {
|
||||
@ -270,7 +269,7 @@ internal inline fun BytePacketBuilder.writeRequestPacket(
|
||||
writeByte(0x02) // head
|
||||
writeShort((27 + 2 + body.remaining).toShort()) // orthodox algorithm
|
||||
writeShort(client.protocolVersion)
|
||||
writeShort(sequenceId.toShort())
|
||||
writeShort(sequenceId)
|
||||
writeShort(commandId.id.toShort())
|
||||
writeQQ(client.account.id)
|
||||
writeByte(3) // originally const
|
||||
|
@ -7,6 +7,7 @@ import net.mamoe.mirai.data.Packet
|
||||
import net.mamoe.mirai.network.BotNetworkHandler
|
||||
import net.mamoe.mirai.qqandroid.network.protocol.packet.login.NullPacketId
|
||||
import net.mamoe.mirai.qqandroid.network.protocol.packet.login.PacketId
|
||||
import net.mamoe.mirai.utils.LockFreeLinkedList
|
||||
import net.mamoe.mirai.utils.cryptor.Decrypter
|
||||
import net.mamoe.mirai.utils.cryptor.DecrypterType
|
||||
|
||||
@ -31,18 +32,21 @@ internal abstract class PacketFactory<out TPacket : Packet, TDecrypter : Decrypt
|
||||
/**
|
||||
* **解码**服务器的回复数据包
|
||||
*/
|
||||
abstract suspend fun ByteReadPacket.decode(id: PacketId, sequenceId: UShort, handler: BotNetworkHandler): TPacket
|
||||
abstract suspend fun ByteReadPacket.decode(id: PacketId, sequenceId: Short, handler: BotNetworkHandler): TPacket
|
||||
|
||||
companion object {
|
||||
private val sequenceId: AtomicInt = atomic(1)
|
||||
|
||||
fun atomicNextSequenceId(): UShort {
|
||||
fun atomicNextSequenceId(): Short {
|
||||
val id = sequenceId.getAndAdd(1)
|
||||
if (id > Short.MAX_VALUE.toInt() * 2) {
|
||||
sequenceId.value = 0
|
||||
return atomicNextSequenceId()
|
||||
}
|
||||
return id.toUShort()
|
||||
return id.toShort()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal class KnownPacketFactories : LockFreeLinkedList<PacketFactory<*, *>>() {
|
||||
}
|
@ -19,7 +19,6 @@ class LoginPacketDecrypter(override val value: ByteArray) : DecrypterByteArray {
|
||||
companion object : DecrypterType<LoginPacketDecrypter>
|
||||
}
|
||||
|
||||
@UseExperimental(ExperimentalUnsignedTypes::class)
|
||||
internal object LoginPacket : PacketFactory<LoginPacket.LoginPacketResponse, LoginPacketDecrypter>(LoginPacketDecrypter) {
|
||||
init {
|
||||
this._id = PacketId(CommandId("wtlogin.login", 0x0810), 9)
|
||||
@ -164,7 +163,8 @@ internal object LoginPacket : PacketFactory<LoginPacket.LoginPacketResponse, Log
|
||||
|
||||
class LoginPacketResponse : Packet
|
||||
|
||||
override suspend fun ByteReadPacket.decode(id: PacketId, sequenceId: UShort, handler: BotNetworkHandler): LoginPacketResponse {
|
||||
@ExperimentalUnsignedTypes
|
||||
override suspend fun ByteReadPacket.decode(id: PacketId, sequenceId: Short, handler: BotNetworkHandler): LoginPacketResponse {
|
||||
|
||||
TODO()
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user