Fix imageType sent from macOS client, fix #1111

This commit is contained in:
Him188 2022-05-16 20:38:04 +01:00
parent 05aa3c8026
commit 90deacb692
6 changed files with 33 additions and 17 deletions

View File

@ -19,8 +19,8 @@ import kotlin.contracts.contract
@JvmOverloads @JvmOverloads
public fun generateImageId(md5: ByteArray, format: String = "mirai"): String { public fun generateImageId(md5: ByteArray, format: String? = null): String {
return """{${generateUUID(md5)}}.$format""" return """{${generateUUID(md5)}}.${format ?: "mirai"}"""
} }
@JvmOverloads @JvmOverloads

View File

@ -120,7 +120,7 @@ internal sealed class AbstractUser(
}, },
width = fileWidth, width = fileWidth,
height = fileHeight, height = fileHeight,
imageType = getImageTypeById(fileType), imageType = getImageTypeById(fileType) ?: ImageType.UNKNOWN,
size = resource.size size = resource.size
) )
}.also { }.also {

View File

@ -241,7 +241,7 @@ internal class GroupImpl constructor(
imageId = resourceId, imageId = resourceId,
height = fileHeight, height = fileHeight,
width = fileWidth, width = fileWidth,
imageType = getImageTypeById(fileType), imageType = getImageTypeById(fileType) ?: ImageType.UNKNOWN,
size = resource.size size = resource.size
) )
} }

View File

@ -26,8 +26,6 @@ internal sealed class AbstractImage : Image {
get() = 0 get() = 0
override val height: Int override val height: Int
get() = 0 get() = 0
override val imageType: ImageType
get() = ImageType.UNKNOWN
final override fun toString(): String = _stringValue!! final override fun toString(): String = _stringValue!!
final override fun contentToString(): String = if (isEmoji) { final override fun contentToString(): String = if (isEmoji) {

View File

@ -31,11 +31,11 @@ internal data class ImageInfo(val width: Int = 0, val height: Int = 0, val image
internal val UNKNOWN_IMAGE_TYPE_PROMPT_ENABLED = systemProp("mirai.unknown.image.type.logging", false) internal val UNKNOWN_IMAGE_TYPE_PROMPT_ENABLED = systemProp("mirai.unknown.image.type.logging", false)
internal fun getImageTypeById(id: Int): ImageType { internal fun getImageTypeById(id: Int): ImageType? {
return if (id == 2001) { return if (id == 2001) {
ImageType.APNG ImageType.APNG
} else { } else {
ImageType.match(getImageType(id)) ImageType.matchOrNull(getImageType(id))
} }
} }

View File

@ -47,9 +47,9 @@ OnlineFriendImage() {
override val height: Int override val height: Int
get() = delegate.picHeight get() = delegate.picHeight
override val imageType: ImageType override val imageType: ImageType
get() = getImageTypeById(delegate.imgType) get() = OnlineImageIds.speculateImageType(delegate.filePath, delegate.imgType)
override val imageId: String = kotlin.run { override val imageId: String = kotlin.run {
val imageType = getImageType(delegate.imgType) val imageType = imageType.formatName
generateImageIdFromResourceId(delegate.resId, imageType) generateImageIdFromResourceId(delegate.resId, imageType)
?: kotlin.run { ?: kotlin.run {
if (delegate.picMd5.size == 16) generateImageId(delegate.picMd5, imageType) if (delegate.picMd5.size == 16) generateImageId(delegate.picMd5, imageType)
@ -118,16 +118,11 @@ internal class OnlineGroupImageImpl(
override val height: Int override val height: Int
get() = delegate.height get() = delegate.height
override val imageType: ImageType override val imageType: ImageType
get() = getImageTypeById(delegate.imageType) get() = OnlineImageIds.speculateImageType(delegate.filePath, delegate.imageType)
override val imageId: String = generateImageId( override val imageId: String = generateImageId(
delegate.picMd5, delegate.picMd5,
delegate.filePath.substringAfterLast('.').lowercase().let { ext -> OnlineImageIds.speculateImageTypeNameFromFilePath(delegate.filePath)
if (ext == "null") {
// official clients might send `null`
getImageType(delegate.imageType)
} else ext
}
).takeIf { ).takeIf {
Image.IMAGE_ID_REGEX.matches(it) Image.IMAGE_ID_REGEX.matches(it)
} ?: generateImageId(delegate.picMd5) } ?: generateImageId(delegate.picMd5)
@ -141,3 +136,26 @@ internal class OnlineGroupImageImpl(
delegate.pbReserve.pbImageResv_checkIsEmoji(CustomFaceExtPb.ResvAttr.serializer()) delegate.pbReserve.pbImageResv_checkIsEmoji(CustomFaceExtPb.ResvAttr.serializer())
} }
} }
private object OnlineImageIds {
fun speculateImageType(filePath: String, imageTypeInt: Int): ImageType {
return getImageTypeById(imageTypeInt) ?: speculateImageTypeFromImageId(filePath) ?: ImageType.UNKNOWN
}
fun speculateImageTypeFromImageId(filePathOrImageId: String): ImageType? {
return speculateImageTypeNameFromFilePath(filePathOrImageId)?.let { ImageType.matchOrNull(it) }
}
/**
* @param filePath should ends with `.type`
*/
fun speculateImageTypeNameFromFilePath(filePath: String): String? {
return filePath.substringAfterLast('.').lowercase().let { ext ->
if (ext == "null") {
// official clients might send `null`
null
} else ext
}
}
}