Fix PC OtherClientOnlineEvent sync missing clientInfo, fix #955

This commit is contained in:
Him188 2021-02-06 17:29:28 +08:00
parent 502f62167d
commit 3964d9976a
2 changed files with 30 additions and 8 deletions

View File

@ -2,10 +2,13 @@ package net.mamoe.mirai.internal.network.protocol.packet.chat.receive
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.cancel
import kotlinx.coroutines.delay
import kotlinx.coroutines.sync.withLock
import kotlinx.io.core.ByteReadPacket
import net.mamoe.mirai.Mirai
import net.mamoe.mirai.contact.ClientKind
import net.mamoe.mirai.contact.OtherClientInfo
import net.mamoe.mirai.contact.Platform
import net.mamoe.mirai.event.events.OtherClientOfflineEvent
import net.mamoe.mirai.event.events.OtherClientOnlineEvent
import net.mamoe.mirai.internal.QQAndroidBot
@ -24,16 +27,35 @@ internal object MessageSvcRequestPushStatus : IncomingPacketFactory<Packet?>(
override suspend fun ByteReadPacket.decode(bot: QQAndroidBot, sequenceId: Int): Packet? {
val packet = readUniPacket(RequestPushStatus.serializer())
bot.otherClientsLock.withLock {
val appId = packet.vecInstanceList?.firstOrNull()?.iAppId ?: 1
val instanceInfo = packet.vecInstanceList?.firstOrNull()
val appId = instanceInfo?.iAppId ?: 1
val platformId = instanceInfo?.iPlatform?.toInt()
return when (packet.status.toInt()) {
1 -> { // online
if (bot.otherClients.any { appId == it.appId }) return null
val info = Mirai.getOnlineOtherClientsList(bot).firstOrNull { appId == it.appId }
?: throw contextualBugReportException(
suspend fun tryFindInQuery(): OtherClientInfo? {
return Mirai.getOnlineOtherClientsList(bot).find { it.appId == appId }
?: kotlin.run {
delay(2000) // sometimes server sync slow
Mirai.getOnlineOtherClientsList(bot).find { it.appId == appId }
}
}
val info =
tryFindInQuery() ?: kotlin.run {
bot.network.logger.warning(
contextualBugReportException(
"SvcRequestPushStatus (OtherClient online)",
packet._miraiContentToString(),
"packet: \n" + packet._miraiContentToString() +
"\n\nquery: \n" +
Mirai.getOnlineOtherClientsList(bot)._miraiContentToString(),
additional = "Failed to find corresponding instanceInfo."
)
)
OtherClientInfo(appId, Platform.WINDOWS, "", "电脑")
}
val client = bot.createOtherClient(info)
bot.otherClients.delegate.add(client)
OtherClientOnlineEvent(

View File

@ -268,7 +268,7 @@ internal class StatSvc {
val info = Mirai.getOnlineOtherClientsList(bot).find { it.appId == appId }
?: kotlin.run {
delay(1000) // sometimes server sync slow
delay(2000) // sometimes server sync slow
Mirai.getOnlineOtherClientsList(bot).find { it.appId == appId }
} ?: throw contextualBugReportException(
"SvcReqMSFLoginNotify (OtherClient online)",