Browse Source

Add fallback strategy to generate OfflineFriendImage.imageId on AbstractUser.uploadImage #933

Him188 5 years ago
parent
commit
c572a7e434
1 changed files with 25 additions and 8 deletions
  1. 25 8
      mirai-core/src/commonMain/kotlin/contact/AbstractUser.kt

+ 25 - 8
mirai-core/src/commonMain/kotlin/contact/AbstractUser.kt

@@ -16,6 +16,7 @@ import net.mamoe.mirai.data.UserInfo
 import net.mamoe.mirai.event.broadcast
 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.highway.ChannelKind
 import net.mamoe.mirai.internal.network.highway.Highway
@@ -26,6 +27,7 @@ import net.mamoe.mirai.internal.network.protocol.data.proto.Cmd0x352
 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
+import net.mamoe.mirai.internal.utils._miraiContentToString
 import net.mamoe.mirai.message.MessageReceipt
 import net.mamoe.mirai.message.data.Image
 import net.mamoe.mirai.message.data.Message
@@ -70,14 +72,29 @@ internal abstract class AbstractUser(
         }
 
         return when (resp) {
-            is LongConn.OffPicUp.Response.FileExists -> OfflineFriendImage(
-                imageId = generateImageIdFromResourceId(
-                    resourceId = resp.resourceId,
-                    format = getImageType(resp.imageInfo.fileType).takeIf { it != ExternalResource.DEFAULT_FORMAT_NAME }
-                        ?: resource.formatName
-                ) ?: resp.resourceId
-            ).also {
-                ImageUploadEvent.Succeed(this, resource, it).broadcast()
+            is LongConn.OffPicUp.Response.FileExists -> {
+                val imageType = getImageType(resp.imageInfo.fileType)
+                    .takeIf { it != ExternalResource.DEFAULT_FORMAT_NAME }
+                    ?: resource.formatName
+
+                OfflineFriendImage(
+                    imageId = generateImageIdFromResourceId(
+                        resourceId = resp.resourceId,
+                        format = imageType
+                    ) ?: kotlin.run {
+                        if (resp.imageInfo.fileMd5.size == 16) {
+                            generateImageId(resp.imageInfo.fileMd5, imageType)
+                        } else {
+                            throw contextualBugReportException(
+                                "Failed to compute friend image image from resourceId: ${resp.resourceId}",
+                                resp._miraiContentToString(),
+                                additional = "并附加此时正在上传的文件"
+                            )
+                        }
+                    }
+                ).also {
+                    ImageUploadEvent.Succeed(this, resource, it).broadcast()
+                }
             }
 
             is LongConn.OffPicUp.Response.RequireUpload -> {