@@ -11,17 +11,17 @@ package net.mamoe.mirai.qqandroid.network.protocol.packet.login
11
11
12
12
import kotlinx.io.core.ByteReadPacket
13
13
import net.mamoe.mirai.data.Packet
14
+ import net.mamoe.mirai.event.events.BotOfflineEvent
14
15
import net.mamoe.mirai.qqandroid.QQAndroidBot
15
16
import net.mamoe.mirai.qqandroid.io.serialization.*
16
17
import net.mamoe.mirai.qqandroid.network.QQAndroidClient
18
+ import net.mamoe.mirai.qqandroid.network.protocol.data.jce.RequestMSFForceOffline
17
19
import net.mamoe.mirai.qqandroid.network.protocol.data.jce.RequestPacket
20
+ import net.mamoe.mirai.qqandroid.network.protocol.data.jce.RspMSFForceOffline
18
21
import net.mamoe.mirai.qqandroid.network.protocol.data.jce.SvcReqRegister
19
22
import net.mamoe.mirai.qqandroid.network.protocol.data.proto.Oidb0x769
20
23
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.*
25
25
import net.mamoe.mirai.qqandroid.utils.NetworkType
26
26
import net.mamoe.mirai.utils.MiraiInternalAPI
27
27
import net.mamoe.mirai.utils.MiraiPlatformUtils
@@ -81,7 +81,6 @@ internal class StatSvc {
81
81
}
82
82
}
83
83
84
-
85
84
internal object Register : OutgoingPacketFactory<Register.Response>(" StatSvc.register" ) {
86
85
87
86
internal object Response : Packet {
@@ -140,9 +139,10 @@ internal class StatSvc {
140
139
strOSVer = client.device.version.release.encodeToString(),
141
140
142
141
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
+ },
146
146
strVendorName = " MIUI" ,
147
147
strVendorOSName = " ?ONEPLUS A5000_23_17" ,
148
148
// register 时还需要
@@ -178,4 +178,43 @@ internal class StatSvc {
178
178
return Response
179
179
}
180
180
}
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
+ }
181
220
}
0 commit comments