From 75633f78c403baf9740d64ff64d6f33715091989 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E6=B1=A0?= Date: Wed, 21 Feb 2024 21:31:59 +0800 Subject: [PATCH] `Shamrock`: fix #248 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 白池 --- .../servlet/msg/msgelement/MsgElementMaker.kt | 8 ++- .../shamrock/helper/LocalCacheHelper.kt | 2 +- .../shamrock/remote/action/ActionManager.kt | 2 +- .../remote/action/handlers/FavAddImageMsg.kt | 2 +- .../action/handlers/FavGetItemContent.kt | 2 +- .../action/handlers/GetGuildMemberList.kt | 2 +- .../action/handlers/UploadFileToShamrock.kt | 59 +++++++++++++++++++ .../remote/action/handlers/UploadGroupFile.kt | 2 +- .../action/handlers/UploadPrivateFile.kt | 2 +- .../moe/fuqiuluo/shamrock/utils/FileUtils.kt | 8 ++- 10 files changed, 77 insertions(+), 12 deletions(-) create mode 100644 xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/UploadFileToShamrock.kt diff --git a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/msg/msgelement/MsgElementMaker.kt b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/msg/msgelement/MsgElementMaker.kt index 61dac15..28131b1 100644 --- a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/msg/msgelement/MsgElementMaker.kt +++ b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/msg/msgelement/MsgElementMaker.kt @@ -678,7 +678,7 @@ internal object MsgElementMaker { val file = data["file"].asString.let { val md5 = it.replace(regex = "[{}\\-]".toRegex(), replacement = "").split(".")[0].lowercase() var file = if (md5.length == 32) { - FileUtils.getFile(it) + FileUtils.getFileByMd5(it) } else { FileUtils.parseAndSave(it) } @@ -909,9 +909,11 @@ internal object MsgElementMaker { val url = data["url"].asStringOrNull var file: File? = null if (filePath != null) { - val md5 = filePath.replace(regex = "[{}\\-]".toRegex(), replacement = "").split(".")[0].lowercase() + val md5 = filePath + .replace(regex = "[{}\\-]".toRegex(), replacement = "") + .split(".")[0].lowercase() file = if (md5.length == 32) { - FileUtils.getFile(md5) + FileUtils.getFileByMd5(md5) } else { FileUtils.parseAndSave(filePath) } diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/helper/LocalCacheHelper.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/helper/LocalCacheHelper.kt index 2b0d343..9783f55 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/helper/LocalCacheHelper.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/helper/LocalCacheHelper.kt @@ -17,7 +17,7 @@ internal object LocalCacheHelper: BaseSvc() { } fun getCachePttFile(md5: String): File { - val file = FileUtils.getFile(md5) + val file = FileUtils.getFileByMd5(md5) return if (file.exists()) file else getCurrentPttPath().resolve("$md5.amr") } } \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/ActionManager.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/ActionManager.kt index 53a0a3d..5ba34c6 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/ActionManager.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/ActionManager.kt @@ -43,7 +43,7 @@ internal abstract class IActionHandler { return resultToString(true, Status.Ok, EmptyObject, msg, echo = echo) } - protected inline fun ok(data: T, echo: JsonElement = EmptyJsonString, msg: String = ""): String { + protected inline fun ok(data: T, echo: JsonElement, msg: String = ""): String { return resultToString(true, Status.Ok, data!!, msg, echo = echo) } diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/FavAddImageMsg.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/FavAddImageMsg.kt index 89e9a9c..4729ddd 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/FavAddImageMsg.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/FavAddImageMsg.kt @@ -40,7 +40,7 @@ internal object FavAddImageMsg: IActionHandler() { val image = fileText.let { val md5 = it.replace(regex = "[{}\\-]".toRegex(), replacement = "").split(".")[0].lowercase() if (md5.length == 32) { - FileUtils.getFile(it) + FileUtils.getFileByMd5(it) } else { FileUtils.parseAndSave(it) } diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/FavGetItemContent.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/FavGetItemContent.kt index ff1fbd9..6aa3caf 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/FavGetItemContent.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/FavGetItemContent.kt @@ -52,7 +52,7 @@ internal object FavGetItemContent: IActionHandler() { resp.getFavContentResp!!.content!!.joinToString("") { String(it.richMedia!!.rawData!!) } - )) + ), echo) } override val requiredParams: Array = arrayOf("id") diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGuildMemberList.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGuildMemberList.kt index cfe0940..07a2888 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGuildMemberList.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGuildMemberList.kt @@ -63,7 +63,7 @@ internal object GetGuildMemberList: IActionHandler() { members = members, finish = nextToken.finish, nextToken = ProtoBuf.encodeToByteArray(nextToken).toHexString(), - )) + ), echo) } override val requiredParams: Array = arrayOf("guild_id") diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/UploadFileToShamrock.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/UploadFileToShamrock.kt new file mode 100644 index 0000000..a89b073 --- /dev/null +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/UploadFileToShamrock.kt @@ -0,0 +1,59 @@ +package moe.fuqiuluo.shamrock.remote.action.handlers + +import android.util.Base64 +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonElement +import moe.fuqiuluo.shamrock.remote.action.ActionSession +import moe.fuqiuluo.shamrock.remote.action.IActionHandler +import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.shamrock.tools.hex2ByteArray +import moe.fuqiuluo.shamrock.tools.toHexString +import moe.fuqiuluo.shamrock.utils.FileUtils +import moe.fuqiuluo.symbols.OneBotHandler +import java.io.RandomAccessFile + +@OneBotHandler("upload_file_to_shamrock") +internal object UploadFileToShamrock: IActionHandler() { + override suspend fun internalHandle(session: ActionSession): String { + val md5 = session.getString("md5").hex2ByteArray() + val offset = session.getStringOrNull("offset")?.toULong() ?: 0uL + val chunk = Base64.decode(session.getString("chunk"), Base64.DEFAULT) + val fileSize = session.getStringOrNull("file_size")?.toULong() ?: chunk.size.toULong() + return invoke(md5, fileSize, offset, chunk, session.echo) + } + + operator fun invoke( + md5: ByteArray, + fileSize: ULong, + offset: ULong, + chunk: ByteArray, + echo: JsonElement = EmptyJsonString + ): String { + val file = FileUtils.getFileByMd5(md5.toHexString()) + runCatching { + if (!file.exists()) { + file.createNewFile() + } + val rd = RandomAccessFile(file, "rw") + rd.setLength(fileSize.toLong()) + rd.seek(offset.toLong()) + rd.write(chunk, 0, chunk.size) + rd.close() + }.onFailure { + return error(it.message ?: it.toString(), echo) + } + return ok(UploadFileResult( + fileSize = fileSize, + isFinish = fileSize <= offset + chunk.size.toULong(), + filePath = file.absolutePath + ), echo = echo) + } + + @Serializable + data class UploadFileResult( + @SerialName("file_size") val fileSize: ULong, + @SerialName("finish") val isFinish: Boolean, + @SerialName("path") val filePath: String + ) +} \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/UploadGroupFile.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/UploadGroupFile.kt index e64a633..1073fa8 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/UploadGroupFile.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/UploadGroupFile.kt @@ -81,7 +81,7 @@ internal object UploadGroupFile : IActionHandler() { fileElement.picThumbPath[750] = srcFile.absolutePath } 2 -> { - val thumbPic = FileUtils.getFile(MD5.genFileMd5Hex(srcFile.absolutePath)) + val thumbPic = FileUtils.getFileByMd5(MD5.genFileMd5Hex(srcFile.absolutePath)) withContext(Dispatchers.IO) { val fileOutputStream = FileOutputStream(thumbPic) val retriever = MediaMetadataRetriever() diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/UploadPrivateFile.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/UploadPrivateFile.kt index f0b967f..e53439d 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/UploadPrivateFile.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/UploadPrivateFile.kt @@ -82,7 +82,7 @@ internal object UploadPrivateFile : IActionHandler() { fileElement.picThumbPath[750] = srcFile.absolutePath } 2 -> { - val thumbPic = FileUtils.getFile(MD5.genFileMd5Hex(srcFile.absolutePath)) + val thumbPic = FileUtils.getFileByMd5(MD5.genFileMd5Hex(srcFile.absolutePath)) withContext(Dispatchers.IO) { val fileOutputStream = FileOutputStream(thumbPic) val retriever = MediaMetadataRetriever() diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/utils/FileUtils.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/utils/FileUtils.kt index d421fd4..5956d80 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/utils/FileUtils.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/utils/FileUtils.kt @@ -94,8 +94,7 @@ internal object FileUtils { fun getFile(name: String): File { if (name.length == 32) { // 使用md5获取值 - val dirName = name.substring(name.length - 4) - val file = CacheDir.resolve("$dirName/$name") + val file = getFileByMd5(name) if (file.exists()) { return file } @@ -103,6 +102,11 @@ internal object FileUtils { return CacheDir.resolve(name) } + fun getFileByMd5(md5: String): File { + val dirName = md5.substring(md5.length - 4) + return CacheDir.resolve("$dirName/$md5") + } + fun getFileType(file: File): String { val bytes = ByteArray(2) file.inputStream().use {