diff --git a/build.gradle.kts b/build.gradle.kts index 6561f5bc..bd278cb6 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,6 +1,6 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { - id("com.android.application") version "8.2.0" apply false + id("com.android.application") version "8.2.1" apply false id("org.jetbrains.kotlin.android") version "1.9.22" apply false - id("com.android.library") version "8.2.0" apply false + id("com.android.library") version "8.2.1" apply false } diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetFile.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetFile.kt new file mode 100644 index 00000000..844d4f0c --- /dev/null +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetFile.kt @@ -0,0 +1,45 @@ +package moe.fuqiuluo.shamrock.remote.action.handlers + +import kotlinx.serialization.json.JsonElement +import moe.fuqiuluo.shamrock.remote.action.ActionSession +import moe.fuqiuluo.shamrock.remote.action.IActionHandler +import moe.fuqiuluo.shamrock.remote.service.data.OutResourceByBase64 +import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.shamrock.utils.FileUtils +import moe.fuqiuluo.symbols.OneBotHandler +import java.util.Base64 + +@OneBotHandler("get_file") +internal object GetFile : IActionHandler() { + override suspend fun internalHandle(session: ActionSession): String { + val file = session.getString("file") + .replace(regex = "[{}\\-]".toRegex(), replacement = "") + .replace(" ", "") + .split(".")[0].lowercase() + val fileType = session.getStringOrNull("file_type") ?: "base64" + return invoke(file, fileType, session.echo) + } + + operator fun invoke(file: String, fileType: String = "base64", echo: JsonElement = EmptyJsonString): String { + val targetFile = FileUtils.getFileByMd5(file) + return if (targetFile.exists()) { + when (fileType) { + "base64", "" -> ok( + OutResourceByBase64( + "/res/${targetFile.nameWithoutExtension}", + Base64.getEncoder() + .encodeToString(targetFile.readBytes()), + targetFile.nameWithoutExtension, + ), echo + ) + + else -> error("only support base64", echo) + } + + } else { + error("not found record file from md5", echo) + } + } + + override val requiredParams: Array = arrayOf("file") +} diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetRecord.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetRecord.kt index e5bb42e8..47ace91f 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetRecord.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetRecord.kt @@ -9,8 +9,7 @@ import moe.fuqiuluo.shamrock.tools.EmptyJsonString import moe.fuqiuluo.shamrock.utils.AudioUtils import moe.fuqiuluo.symbols.OneBotHandler -@OneBotHandler("get_record") -internal object GetRecord: IActionHandler() { +@OneBotHandler("get_record") internal object GetRecord : IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val file = session.getString("file") .replace(regex = "[{}\\-]".toRegex(), replacement = "") @@ -22,17 +21,17 @@ internal object GetRecord: IActionHandler() { operator fun invoke(file: String, format: String, echo: JsonElement = EmptyJsonString): String { val pttFile = LocalCacheHelper.getCachePttFile(file) - return if(pttFile.exists()) { + return if (pttFile.exists()) { val isSilk = AudioUtils.isSilk(pttFile) - val audioFile = when(format) { + val audioFile = when (format) { "amr" -> AudioUtils.audioToAmr(pttFile, isSilk) else -> AudioUtils.audioToFormat(pttFile, isSilk, format) } ok( OutResource( - audioFile.toString(), - url = "/res/${audioFile.nameWithoutExtension}" - ), echo) + audioFile.toString(), url = "/res/${audioFile.nameWithoutExtension}", md5 = audioFile.nameWithoutExtension + ), echo + ) } else { error("not found record file from cache", echo) } diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/api/ResourceAction.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/api/ResourceAction.kt index 5e6629f8..f553edb7 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/api/ResourceAction.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/api/ResourceAction.kt @@ -26,6 +26,12 @@ fun Routing.fetchRes() { call.respondText(GetRecord(file, format), ContentType.Application.Json) } + getOrPost("/get_file") { + val file = formatFileName( fetchGetOrThrow("file") ) + val fileType = fetchOrThrow("file_type") + call.respondText(GetFile(file, fileType), ContentType.Application.Json) + } + getOrPost("/get_image") { val file = formatFileName( fetchGetOrThrow("file") ) call.respondText(GetImage(file), ContentType.Application.Json) diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/data/ResourceData.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/data/ResourceData.kt index 211a1cb0..a0607128 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/data/ResourceData.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/data/ResourceData.kt @@ -1,9 +1,16 @@ package moe.fuqiuluo.shamrock.remote.service.data import kotlinx.serialization.Serializable +import java.util.Base64 -@Serializable -internal data class OutResource( +@Serializable internal data class OutResource( val file: String, - val url: String + val url: String, + val md5: String, +) + +@Serializable internal data class OutResourceByBase64( + val file: String, + val base64String: String, + val md5: String, ) \ No newline at end of file