Fix image uploading; fix #944

This commit is contained in:
Karlatemp 2021-02-02 22:22:56 +08:00
parent 280e0655f1
commit 918007df9b
No known key found for this signature in database
GPG Key ID: 21FBDDF664FF06F8
3 changed files with 29 additions and 3 deletions

View File

@ -18,12 +18,14 @@ import net.mamoe.mirai.event.events.*
import net.mamoe.mirai.internal.message.OfflineFriendImage
import net.mamoe.mirai.internal.message.contextualBugReportException
import net.mamoe.mirai.internal.message.getImageType
import net.mamoe.mirai.internal.network.BdhSession
import net.mamoe.mirai.internal.network.highway.ChannelKind
import net.mamoe.mirai.internal.network.highway.Highway
import net.mamoe.mirai.internal.network.highway.ResourceKind.PRIVATE_IMAGE
import net.mamoe.mirai.internal.network.highway.postImage
import net.mamoe.mirai.internal.network.highway.tryServers
import net.mamoe.mirai.internal.network.protocol.data.proto.Cmd0x352
import net.mamoe.mirai.internal.network.protocol.packet.EMPTY_BYTE_ARRAY
import net.mamoe.mirai.internal.network.protocol.packet.chat.image.ImgStore
import net.mamoe.mirai.internal.network.protocol.packet.chat.image.LongConn
import net.mamoe.mirai.internal.network.protocol.packet.sendAndExpect
@ -133,7 +135,14 @@ internal abstract class AbstractUser(
resource = resource,
kind = PRIVATE_IMAGE,
commandId = 2,
initialTicket = response.uKey
initialTicket = response.uKey,
fallbackSession = {
BdhSession(
EMPTY_BYTE_ARRAY, EMPTY_BYTE_ARRAY,
ssoAddresses = response.uploadIpList.zip(response.uploadPortList)
.toMutableSet(),
)
}
)
}
}

View File

@ -21,11 +21,13 @@ import net.mamoe.mirai.event.broadcast
import net.mamoe.mirai.event.events.*
import net.mamoe.mirai.internal.QQAndroidBot
import net.mamoe.mirai.internal.message.*
import net.mamoe.mirai.internal.network.BdhSession
import net.mamoe.mirai.internal.network.QQAndroidBotNetworkHandler
import net.mamoe.mirai.internal.network.highway.*
import net.mamoe.mirai.internal.network.highway.ResourceKind.GROUP_IMAGE
import net.mamoe.mirai.internal.network.highway.ResourceKind.GROUP_VOICE
import net.mamoe.mirai.internal.network.protocol.data.proto.Cmd0x388
import net.mamoe.mirai.internal.network.protocol.packet.EMPTY_BYTE_ARRAY
import net.mamoe.mirai.internal.network.protocol.packet.chat.TroopEssenceMsgManager
import net.mamoe.mirai.internal.network.protocol.packet.chat.image.ImgStore
import net.mamoe.mirai.internal.network.protocol.packet.chat.voice.PttStore
@ -166,7 +168,14 @@ internal class GroupImpl(
resource = resource,
kind = GROUP_IMAGE,
commandId = 2,
initialTicket = response.uKey
initialTicket = response.uKey,
noBdhAwait = true,
fallbackSession = {
BdhSession(
EMPTY_BYTE_ARRAY, EMPTY_BYTE_ARRAY,
ssoAddresses = response.uploadIpList.zip(response.uploadPortList).toMutableSet(),
)
},
)
return OfflineGroupImage(imageId = resource.calculateResourceId())

View File

@ -21,6 +21,7 @@ import kotlinx.io.core.buildPacket
import kotlinx.io.core.discardExact
import kotlinx.io.core.writeFully
import net.mamoe.mirai.internal.QQAndroidBot
import net.mamoe.mirai.internal.network.BdhSession
import net.mamoe.mirai.internal.network.QQAndroidClient
import net.mamoe.mirai.internal.network.protocol.data.proto.CSDataHighwayHead
import net.mamoe.mirai.internal.network.protocol.packet.EMPTY_BYTE_ARRAY
@ -52,8 +53,15 @@ internal object Highway {
encrypt: Boolean = false,
initialTicket: ByteArray? = null,
tryOnce: Boolean = false,
noBdhAwait: Boolean = false,
fallbackSession: (Throwable) -> BdhSession = { throw IllegalStateException("Failed to get bdh session", it) }
): BdhUploadResponse {
val bdhSession = bot.client.bdhSession.await() // no need to care about timeout. proceed by bot init
val bdhSession = kotlin.runCatching {
val deferred = bot.client.bdhSession
// no need to care about timeout. proceed by bot init
@OptIn(ExperimentalCoroutinesApi::class)
if (noBdhAwait) deferred.getCompleted() else deferred.await()
}.getOrElse(fallbackSession)
return tryServers(
bot = bot,