mirror of
https://github.com/mamoe/mirai.git
synced 2025-02-06 14:16:55 +08:00
[Mock] Support image isUploaded (#2582)
* finish image mock isUploaded * typo * move MockService register * update implement * chore: format * suppress remove redundant qualifier name * format
This commit is contained in:
parent
0f1bddcb24
commit
48db1a022f
@ -29,10 +29,7 @@ import net.mamoe.mirai.mock.MockBotFactory
|
||||
import net.mamoe.mirai.mock.contact.MockGroup
|
||||
import net.mamoe.mirai.mock.database.queryMessageInfo
|
||||
import net.mamoe.mirai.mock.database.removeMessageInfo
|
||||
import net.mamoe.mirai.mock.internal.contact.AQQ_RECALL_FAILED_MESSAGE
|
||||
import net.mamoe.mirai.mock.internal.contact.MockFriendImpl
|
||||
import net.mamoe.mirai.mock.internal.contact.MockImage
|
||||
import net.mamoe.mirai.mock.internal.contact.MockStrangerImpl
|
||||
import net.mamoe.mirai.mock.internal.contact.*
|
||||
import net.mamoe.mirai.mock.internal.msgsrc.registerMockMsgSerializers
|
||||
import net.mamoe.mirai.mock.utils.mock
|
||||
import net.mamoe.mirai.mock.utils.simpleMemberInfo
|
||||
@ -42,6 +39,7 @@ internal class MockMiraiImpl : MiraiImpl() {
|
||||
companion object {
|
||||
init {
|
||||
registerMockMsgSerializers()
|
||||
registerMockServices()
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -13,6 +13,7 @@ package net.mamoe.mirai.mock.internal.contact
|
||||
|
||||
import kotlinx.serialization.Serializable
|
||||
import net.mamoe.mirai.Bot
|
||||
import net.mamoe.mirai.contact.Contact
|
||||
import net.mamoe.mirai.contact.Group
|
||||
import net.mamoe.mirai.contact.Member
|
||||
import net.mamoe.mirai.contact.PermissionDeniedException
|
||||
@ -26,6 +27,7 @@ import net.mamoe.mirai.mock.utils.mock
|
||||
import net.mamoe.mirai.mock.utils.plusHttpSubpath
|
||||
import net.mamoe.mirai.utils.ExternalResource
|
||||
import net.mamoe.mirai.utils.ExternalResource.Companion.toExternalResource
|
||||
import net.mamoe.mirai.utils.Services
|
||||
import net.mamoe.mirai.utils.cast
|
||||
import net.mamoe.mirai.utils.toUHexString
|
||||
|
||||
@ -155,3 +157,35 @@ internal class MockImage(
|
||||
return this.imageId == other.imageId
|
||||
}
|
||||
}
|
||||
|
||||
internal object MockInternalImageProtocolImpl : InternalImageProtocol {
|
||||
|
||||
override fun createImage(
|
||||
imageId: String,
|
||||
size: Long,
|
||||
type: ImageType,
|
||||
width: Int,
|
||||
height: Int,
|
||||
isEmoji: Boolean
|
||||
): Image = MockImage(imageId, "images/" + imageId.substring(1..36), width, height, size, type)
|
||||
|
||||
override suspend fun isUploaded(
|
||||
bot: Bot,
|
||||
md5: ByteArray,
|
||||
size: Long,
|
||||
context: Contact?,
|
||||
type: ImageType,
|
||||
width: Int,
|
||||
height: Int
|
||||
): Boolean = bot.cast<MockBot>().tmpResourceServer.isImageUploaded(md5, size)
|
||||
|
||||
}
|
||||
|
||||
internal fun registerMockServices() {
|
||||
Services.registerAsOverride(
|
||||
Services.qualifiedNameOrFail(InternalImageProtocol::class),
|
||||
"net.mamoe.mirai.mock.internal.contact.MockInternalImageProtocolImpl"
|
||||
) {
|
||||
MockInternalImageProtocolImpl
|
||||
}
|
||||
}
|
||||
|
@ -21,6 +21,7 @@ import java.net.ServerSocket
|
||||
import java.net.URI
|
||||
import java.net.URLDecoder
|
||||
import java.net.URLEncoder
|
||||
import java.nio.file.Files
|
||||
import java.nio.file.Path
|
||||
import kotlin.io.path.*
|
||||
|
||||
@ -65,6 +66,15 @@ internal class TmpResourceServerImpl(
|
||||
}
|
||||
}
|
||||
|
||||
override fun isImageUploaded(md5: ByteArray, size: Long): Boolean {
|
||||
val img = images.resolve(generateUUID(md5))
|
||||
if (img.exists()) {
|
||||
return Files.size(img) == size
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
|
||||
override suspend fun uploadResourceAsImage(resource: ExternalResource): URI {
|
||||
val imgId = generateUUID(resource.md5)
|
||||
val resId = uploadResource(resource)
|
||||
|
@ -47,6 +47,11 @@ public interface TmpResourceServer : Closeable {
|
||||
* @return 图片的 http 链接
|
||||
*/
|
||||
public suspend fun uploadResourceAsImage(resource: ExternalResource): URI
|
||||
|
||||
/**
|
||||
* 通过图片 md5 和 size 判断图片是否已经上传
|
||||
*/
|
||||
public fun isImageUploaded(md5: ByteArray, size: Long): Boolean
|
||||
public suspend fun uploadResourceAndGetUrl(resource: ExternalResource): String {
|
||||
return resolveHttpUrl(uploadResource(resource)).toString()
|
||||
}
|
||||
|
@ -11,15 +11,18 @@ package net.mamoe.mirai.mock.test
|
||||
|
||||
import kotlinx.coroutines.runBlocking
|
||||
import net.mamoe.mirai.message.data.Image
|
||||
import net.mamoe.mirai.message.data.Image.Key.isUploaded
|
||||
import net.mamoe.mirai.message.data.Image.Key.queryUrl
|
||||
import net.mamoe.mirai.mock.MockBotFactory
|
||||
import net.mamoe.mirai.mock.utils.randomImageContent
|
||||
import net.mamoe.mirai.utils.ExternalResource.Companion.toExternalResource
|
||||
import net.mamoe.mirai.utils.getRandomByteArray
|
||||
import org.junit.jupiter.api.AfterEach
|
||||
import org.junit.jupiter.api.Test
|
||||
import org.junit.jupiter.api.TestInstance
|
||||
import java.net.URL
|
||||
import kotlin.test.assertEquals
|
||||
import kotlin.test.assertFalse
|
||||
import kotlin.test.assertNotEquals
|
||||
import kotlin.test.assertTrue
|
||||
|
||||
@ -56,4 +59,22 @@ internal class ImageUploadTest {
|
||||
assertEquals(img1, img2)
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testImageIsUploaded(): Unit = runBlocking {
|
||||
val img = Image.randomImageContent().toExternalResource().use { imgData ->
|
||||
bot.asFriend.uploadImage(imgData)
|
||||
}
|
||||
assertTrue { img.isUploaded(bot) }
|
||||
}
|
||||
|
||||
@Test
|
||||
@Suppress("RemoveRedundantQualifierName")
|
||||
fun testImageIsUploadedNotTrue(): Unit = runBlocking {
|
||||
assertFalse { Image.isUploaded(bot, getRandomByteArray(16), 10) }
|
||||
val img = Image.randomImageContent().toExternalResource().use { imgData ->
|
||||
bot.asFriend.uploadImage(imgData)
|
||||
}
|
||||
assertFalse { Image.isUploaded(bot, img.md5, img.size + 5) }
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user