mirror of
https://github.com/mamoe/mirai.git
synced 2025-02-13 11:30:13 +08:00
Handle StatSvc.ReqMSFOffline
, fix #150
This commit is contained in:
parent
40f157978f
commit
3e6c7bc691
@ -0,0 +1,25 @@
|
||||
package net.mamoe.mirai.qqandroid.network.protocol.data.jce
|
||||
|
||||
import kotlinx.serialization.Serializable
|
||||
import net.mamoe.mirai.qqandroid.io.JceStruct
|
||||
import net.mamoe.mirai.qqandroid.io.serialization.jce.JceId
|
||||
|
||||
@Serializable
|
||||
internal class RequestMSFForceOffline(
|
||||
@JceId(0) val uin: Long = 0L,
|
||||
@JceId(1) val iSeqno: Long = 0L,
|
||||
@JceId(2) val kickType: Byte = 0,
|
||||
@JceId(3) val info: String = "",
|
||||
@JceId(4) val title: String? = "",
|
||||
@JceId(5) val sigKick: Byte? = 0,
|
||||
@JceId(6) val vecSigKickData: ByteArray? = null,
|
||||
@JceId(7) val sameDevice: Byte? = 0
|
||||
) : JceStruct
|
||||
|
||||
|
||||
@Serializable
|
||||
internal class RspMSFForceOffline(
|
||||
@JceId(0) val uin: Long,
|
||||
@JceId(1) val seq: Long,
|
||||
@JceId(2) val const: Byte = 0
|
||||
) : JceStruct
|
@ -152,8 +152,8 @@ internal object KnownPacketFactories {
|
||||
OnlinePush.ReqPush,
|
||||
OnlinePush.PbPushTransMsg,
|
||||
MessageSvc.PushNotify,
|
||||
ConfigPushSvc.PushReq
|
||||
|
||||
ConfigPushSvc.PushReq,
|
||||
StatSvc.ReqMSFOffline
|
||||
)
|
||||
// SvcReqMSFLoginNotify 自己的其他设备上限
|
||||
// MessageSvc.PushReaded 电脑阅读了别人的消息, 告知手机
|
||||
|
@ -11,17 +11,17 @@ package net.mamoe.mirai.qqandroid.network.protocol.packet.login
|
||||
|
||||
import kotlinx.io.core.ByteReadPacket
|
||||
import net.mamoe.mirai.data.Packet
|
||||
import net.mamoe.mirai.event.events.BotOfflineEvent
|
||||
import net.mamoe.mirai.qqandroid.QQAndroidBot
|
||||
import net.mamoe.mirai.qqandroid.io.serialization.*
|
||||
import net.mamoe.mirai.qqandroid.network.QQAndroidClient
|
||||
import net.mamoe.mirai.qqandroid.network.protocol.data.jce.RequestMSFForceOffline
|
||||
import net.mamoe.mirai.qqandroid.network.protocol.data.jce.RequestPacket
|
||||
import net.mamoe.mirai.qqandroid.network.protocol.data.jce.RspMSFForceOffline
|
||||
import net.mamoe.mirai.qqandroid.network.protocol.data.jce.SvcReqRegister
|
||||
import net.mamoe.mirai.qqandroid.network.protocol.data.proto.Oidb0x769
|
||||
import net.mamoe.mirai.qqandroid.network.protocol.data.proto.StatSvcGetOnline
|
||||
import net.mamoe.mirai.qqandroid.network.protocol.packet.OutgoingPacket
|
||||
import net.mamoe.mirai.qqandroid.network.protocol.packet.OutgoingPacketFactory
|
||||
import net.mamoe.mirai.qqandroid.network.protocol.packet.buildLoginOutgoingPacket
|
||||
import net.mamoe.mirai.qqandroid.network.protocol.packet.writeSsoPacket
|
||||
import net.mamoe.mirai.qqandroid.network.protocol.packet.*
|
||||
import net.mamoe.mirai.qqandroid.utils.NetworkType
|
||||
import net.mamoe.mirai.utils.MiraiInternalAPI
|
||||
import net.mamoe.mirai.utils.MiraiPlatformUtils
|
||||
@ -81,7 +81,6 @@ internal class StatSvc {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
internal object Register : OutgoingPacketFactory<Register.Response>("StatSvc.register") {
|
||||
|
||||
internal object Response : Packet {
|
||||
@ -140,7 +139,8 @@ internal class StatSvc {
|
||||
strOSVer = client.device.version.release.encodeToString(),
|
||||
|
||||
uOldSSOIp = 0,
|
||||
uNewSSOIp = MiraiPlatformUtils.localIpAddress().split(".").foldIndexed(0L) { index: Int, acc: Long, s: String ->
|
||||
uNewSSOIp = MiraiPlatformUtils.localIpAddress().split(".")
|
||||
.foldIndexed(0L) { index: Int, acc: Long, s: String ->
|
||||
acc or ((s.toLong() shl (index * 16)))
|
||||
},
|
||||
strVendorName = "MIUI",
|
||||
@ -178,4 +178,43 @@ internal class StatSvc {
|
||||
return Response
|
||||
}
|
||||
}
|
||||
|
||||
internal object ReqMSFOffline :
|
||||
IncomingPacketFactory<BotOfflineEvent.Dropped>("StatSvc.ReqMSFOffline", "StatSvc.RspMSFForceOffline") {
|
||||
|
||||
internal data class MsfOfflineToken(
|
||||
val uin: Long,
|
||||
val seq: Long,
|
||||
val const: Byte
|
||||
) : Packet, RuntimeException("dropped by StatSvc.ReqMSFOffline")
|
||||
|
||||
override suspend fun ByteReadPacket.decode(bot: QQAndroidBot, sequenceId: Int): BotOfflineEvent.Dropped {
|
||||
val decodeUniPacket = decodeUniPacket(RequestMSFForceOffline.serializer())
|
||||
return BotOfflineEvent.Dropped(bot, MsfOfflineToken(decodeUniPacket.uin, decodeUniPacket.iSeqno, 0))
|
||||
}
|
||||
|
||||
override suspend fun QQAndroidBot.handle(packet: BotOfflineEvent.Dropped, sequenceId: Int): OutgoingPacket? {
|
||||
val cause = packet.cause
|
||||
check(cause is MsfOfflineToken) { "internal error: handling $packet in StatSvc.ReqMSFOffline" }
|
||||
return buildResponseUniPacket(client) {
|
||||
writeJceStruct(
|
||||
RequestPacket.serializer(),
|
||||
RequestPacket(
|
||||
sServantName = "StatSvc",
|
||||
sFuncName = "RspMSFForceOffline",
|
||||
iRequestId = 0,
|
||||
sBuffer = jceRequestSBuffer(
|
||||
"RspMSFForceOffline",
|
||||
RspMSFForceOffline.serializer(),
|
||||
RspMSFForceOffline(
|
||||
cause.uin,
|
||||
cause.seq,
|
||||
cause.const
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user