Skip to content

Commit 3e6c7bc

Browse files
committed
Handle StatSvc.ReqMSFOffline, fix #150
1 parent 40f1579 commit 3e6c7bc

File tree

3 files changed

+74
-10
lines changed

3 files changed

+74
-10
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package net.mamoe.mirai.qqandroid.network.protocol.data.jce
2+
3+
import kotlinx.serialization.Serializable
4+
import net.mamoe.mirai.qqandroid.io.JceStruct
5+
import net.mamoe.mirai.qqandroid.io.serialization.jce.JceId
6+
7+
@Serializable
8+
internal class RequestMSFForceOffline(
9+
@JceId(0) val uin: Long = 0L,
10+
@JceId(1) val iSeqno: Long = 0L,
11+
@JceId(2) val kickType: Byte = 0,
12+
@JceId(3) val info: String = "",
13+
@JceId(4) val title: String? = "",
14+
@JceId(5) val sigKick: Byte? = 0,
15+
@JceId(6) val vecSigKickData: ByteArray? = null,
16+
@JceId(7) val sameDevice: Byte? = 0
17+
) : JceStruct
18+
19+
20+
@Serializable
21+
internal class RspMSFForceOffline(
22+
@JceId(0) val uin: Long,
23+
@JceId(1) val seq: Long,
24+
@JceId(2) val const: Byte = 0
25+
) : JceStruct

mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/PacketFactory.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -152,8 +152,8 @@ internal object KnownPacketFactories {
152152
OnlinePush.ReqPush,
153153
OnlinePush.PbPushTransMsg,
154154
MessageSvc.PushNotify,
155-
ConfigPushSvc.PushReq
156-
155+
ConfigPushSvc.PushReq,
156+
StatSvc.ReqMSFOffline
157157
)
158158
// SvcReqMSFLoginNotify 自己的其他设备上限
159159
// MessageSvc.PushReaded 电脑阅读了别人的消息, 告知手机

mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/login/StatSvc.kt

+47-8
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,17 @@ package net.mamoe.mirai.qqandroid.network.protocol.packet.login
1111

1212
import kotlinx.io.core.ByteReadPacket
1313
import net.mamoe.mirai.data.Packet
14+
import net.mamoe.mirai.event.events.BotOfflineEvent
1415
import net.mamoe.mirai.qqandroid.QQAndroidBot
1516
import net.mamoe.mirai.qqandroid.io.serialization.*
1617
import net.mamoe.mirai.qqandroid.network.QQAndroidClient
18+
import net.mamoe.mirai.qqandroid.network.protocol.data.jce.RequestMSFForceOffline
1719
import net.mamoe.mirai.qqandroid.network.protocol.data.jce.RequestPacket
20+
import net.mamoe.mirai.qqandroid.network.protocol.data.jce.RspMSFForceOffline
1821
import net.mamoe.mirai.qqandroid.network.protocol.data.jce.SvcReqRegister
1922
import net.mamoe.mirai.qqandroid.network.protocol.data.proto.Oidb0x769
2023
import net.mamoe.mirai.qqandroid.network.protocol.data.proto.StatSvcGetOnline
21-
import net.mamoe.mirai.qqandroid.network.protocol.packet.OutgoingPacket
22-
import net.mamoe.mirai.qqandroid.network.protocol.packet.OutgoingPacketFactory
23-
import net.mamoe.mirai.qqandroid.network.protocol.packet.buildLoginOutgoingPacket
24-
import net.mamoe.mirai.qqandroid.network.protocol.packet.writeSsoPacket
24+
import net.mamoe.mirai.qqandroid.network.protocol.packet.*
2525
import net.mamoe.mirai.qqandroid.utils.NetworkType
2626
import net.mamoe.mirai.utils.MiraiInternalAPI
2727
import net.mamoe.mirai.utils.MiraiPlatformUtils
@@ -81,7 +81,6 @@ internal class StatSvc {
8181
}
8282
}
8383

84-
8584
internal object Register : OutgoingPacketFactory<Register.Response>("StatSvc.register") {
8685

8786
internal object Response : Packet {
@@ -140,9 +139,10 @@ internal class StatSvc {
140139
strOSVer = client.device.version.release.encodeToString(),
141140

142141
uOldSSOIp = 0,
143-
uNewSSOIp = MiraiPlatformUtils.localIpAddress().split(".").foldIndexed(0L) { index: Int, acc: Long, s: String ->
144-
acc or ((s.toLong() shl (index * 16)))
145-
},
142+
uNewSSOIp = MiraiPlatformUtils.localIpAddress().split(".")
143+
.foldIndexed(0L) { index: Int, acc: Long, s: String ->
144+
acc or ((s.toLong() shl (index * 16)))
145+
},
146146
strVendorName = "MIUI",
147147
strVendorOSName = "?ONEPLUS A5000_23_17",
148148
// register 时还需要
@@ -178,4 +178,43 @@ internal class StatSvc {
178178
return Response
179179
}
180180
}
181+
182+
internal object ReqMSFOffline :
183+
IncomingPacketFactory<BotOfflineEvent.Dropped>("StatSvc.ReqMSFOffline", "StatSvc.RspMSFForceOffline") {
184+
185+
internal data class MsfOfflineToken(
186+
val uin: Long,
187+
val seq: Long,
188+
val const: Byte
189+
) : Packet, RuntimeException("dropped by StatSvc.ReqMSFOffline")
190+
191+
override suspend fun ByteReadPacket.decode(bot: QQAndroidBot, sequenceId: Int): BotOfflineEvent.Dropped {
192+
val decodeUniPacket = decodeUniPacket(RequestMSFForceOffline.serializer())
193+
return BotOfflineEvent.Dropped(bot, MsfOfflineToken(decodeUniPacket.uin, decodeUniPacket.iSeqno, 0))
194+
}
195+
196+
override suspend fun QQAndroidBot.handle(packet: BotOfflineEvent.Dropped, sequenceId: Int): OutgoingPacket? {
197+
val cause = packet.cause
198+
check(cause is MsfOfflineToken) { "internal error: handling $packet in StatSvc.ReqMSFOffline" }
199+
return buildResponseUniPacket(client) {
200+
writeJceStruct(
201+
RequestPacket.serializer(),
202+
RequestPacket(
203+
sServantName = "StatSvc",
204+
sFuncName = "RspMSFForceOffline",
205+
iRequestId = 0,
206+
sBuffer = jceRequestSBuffer(
207+
"RspMSFForceOffline",
208+
RspMSFForceOffline.serializer(),
209+
RspMSFForceOffline(
210+
cause.uin,
211+
cause.seq,
212+
cause.const
213+
)
214+
)
215+
)
216+
)
217+
}
218+
}
219+
}
181220
}

0 commit comments

Comments
 (0)