mirror of
https://github.com/mamoe/mirai.git
synced 2025-02-15 04:50:11 +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.ReqPush,
|
||||||
OnlinePush.PbPushTransMsg,
|
OnlinePush.PbPushTransMsg,
|
||||||
MessageSvc.PushNotify,
|
MessageSvc.PushNotify,
|
||||||
ConfigPushSvc.PushReq
|
ConfigPushSvc.PushReq,
|
||||||
|
StatSvc.ReqMSFOffline
|
||||||
)
|
)
|
||||||
// SvcReqMSFLoginNotify 自己的其他设备上限
|
// SvcReqMSFLoginNotify 自己的其他设备上限
|
||||||
// MessageSvc.PushReaded 电脑阅读了别人的消息, 告知手机
|
// MessageSvc.PushReaded 电脑阅读了别人的消息, 告知手机
|
||||||
|
@ -11,17 +11,17 @@ package net.mamoe.mirai.qqandroid.network.protocol.packet.login
|
|||||||
|
|
||||||
import kotlinx.io.core.ByteReadPacket
|
import kotlinx.io.core.ByteReadPacket
|
||||||
import net.mamoe.mirai.data.Packet
|
import net.mamoe.mirai.data.Packet
|
||||||
|
import net.mamoe.mirai.event.events.BotOfflineEvent
|
||||||
import net.mamoe.mirai.qqandroid.QQAndroidBot
|
import net.mamoe.mirai.qqandroid.QQAndroidBot
|
||||||
import net.mamoe.mirai.qqandroid.io.serialization.*
|
import net.mamoe.mirai.qqandroid.io.serialization.*
|
||||||
import net.mamoe.mirai.qqandroid.network.QQAndroidClient
|
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.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.jce.SvcReqRegister
|
||||||
import net.mamoe.mirai.qqandroid.network.protocol.data.proto.Oidb0x769
|
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.data.proto.StatSvcGetOnline
|
||||||
import net.mamoe.mirai.qqandroid.network.protocol.packet.OutgoingPacket
|
import net.mamoe.mirai.qqandroid.network.protocol.packet.*
|
||||||
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.utils.NetworkType
|
import net.mamoe.mirai.qqandroid.utils.NetworkType
|
||||||
import net.mamoe.mirai.utils.MiraiInternalAPI
|
import net.mamoe.mirai.utils.MiraiInternalAPI
|
||||||
import net.mamoe.mirai.utils.MiraiPlatformUtils
|
import net.mamoe.mirai.utils.MiraiPlatformUtils
|
||||||
@ -81,7 +81,6 @@ internal class StatSvc {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
internal object Register : OutgoingPacketFactory<Register.Response>("StatSvc.register") {
|
internal object Register : OutgoingPacketFactory<Register.Response>("StatSvc.register") {
|
||||||
|
|
||||||
internal object Response : Packet {
|
internal object Response : Packet {
|
||||||
@ -140,9 +139,10 @@ internal class StatSvc {
|
|||||||
strOSVer = client.device.version.release.encodeToString(),
|
strOSVer = client.device.version.release.encodeToString(),
|
||||||
|
|
||||||
uOldSSOIp = 0,
|
uOldSSOIp = 0,
|
||||||
uNewSSOIp = MiraiPlatformUtils.localIpAddress().split(".").foldIndexed(0L) { index: Int, acc: Long, s: String ->
|
uNewSSOIp = MiraiPlatformUtils.localIpAddress().split(".")
|
||||||
acc or ((s.toLong() shl (index * 16)))
|
.foldIndexed(0L) { index: Int, acc: Long, s: String ->
|
||||||
},
|
acc or ((s.toLong() shl (index * 16)))
|
||||||
|
},
|
||||||
strVendorName = "MIUI",
|
strVendorName = "MIUI",
|
||||||
strVendorOSName = "?ONEPLUS A5000_23_17",
|
strVendorOSName = "?ONEPLUS A5000_23_17",
|
||||||
// register 时还需要
|
// register 时还需要
|
||||||
@ -178,4 +178,43 @@ internal class StatSvc {
|
|||||||
return Response
|
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