mirror of
https://github.com/whitechi73/OpenShamrock.git
synced 2024-08-14 13:12:17 +08:00
parent
c940aea153
commit
75633f78c4
@ -678,7 +678,7 @@ internal object MsgElementMaker {
|
|||||||
val file = data["file"].asString.let {
|
val file = data["file"].asString.let {
|
||||||
val md5 = it.replace(regex = "[{}\\-]".toRegex(), replacement = "").split(".")[0].lowercase()
|
val md5 = it.replace(regex = "[{}\\-]".toRegex(), replacement = "").split(".")[0].lowercase()
|
||||||
var file = if (md5.length == 32) {
|
var file = if (md5.length == 32) {
|
||||||
FileUtils.getFile(it)
|
FileUtils.getFileByMd5(it)
|
||||||
} else {
|
} else {
|
||||||
FileUtils.parseAndSave(it)
|
FileUtils.parseAndSave(it)
|
||||||
}
|
}
|
||||||
@ -909,9 +909,11 @@ internal object MsgElementMaker {
|
|||||||
val url = data["url"].asStringOrNull
|
val url = data["url"].asStringOrNull
|
||||||
var file: File? = null
|
var file: File? = null
|
||||||
if (filePath != 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) {
|
file = if (md5.length == 32) {
|
||||||
FileUtils.getFile(md5)
|
FileUtils.getFileByMd5(md5)
|
||||||
} else {
|
} else {
|
||||||
FileUtils.parseAndSave(filePath)
|
FileUtils.parseAndSave(filePath)
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,7 @@ internal object LocalCacheHelper: BaseSvc() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun getCachePttFile(md5: String): File {
|
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")
|
return if (file.exists()) file else getCurrentPttPath().resolve("$md5.amr")
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -43,7 +43,7 @@ internal abstract class IActionHandler {
|
|||||||
return resultToString(true, Status.Ok, EmptyObject, msg, echo = echo)
|
return resultToString(true, Status.Ok, EmptyObject, msg, echo = echo)
|
||||||
}
|
}
|
||||||
|
|
||||||
protected inline fun <reified T> ok(data: T, echo: JsonElement = EmptyJsonString, msg: String = ""): String {
|
protected inline fun <reified T> ok(data: T, echo: JsonElement, msg: String = ""): String {
|
||||||
return resultToString(true, Status.Ok, data!!, msg, echo = echo)
|
return resultToString(true, Status.Ok, data!!, msg, echo = echo)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -40,7 +40,7 @@ internal object FavAddImageMsg: IActionHandler() {
|
|||||||
val image = fileText.let {
|
val image = fileText.let {
|
||||||
val md5 = it.replace(regex = "[{}\\-]".toRegex(), replacement = "").split(".")[0].lowercase()
|
val md5 = it.replace(regex = "[{}\\-]".toRegex(), replacement = "").split(".")[0].lowercase()
|
||||||
if (md5.length == 32) {
|
if (md5.length == 32) {
|
||||||
FileUtils.getFile(it)
|
FileUtils.getFileByMd5(it)
|
||||||
} else {
|
} else {
|
||||||
FileUtils.parseAndSave(it)
|
FileUtils.parseAndSave(it)
|
||||||
}
|
}
|
||||||
|
@ -52,7 +52,7 @@ internal object FavGetItemContent: IActionHandler() {
|
|||||||
resp.getFavContentResp!!.content!!.joinToString("") {
|
resp.getFavContentResp!!.content!!.joinToString("") {
|
||||||
String(it.richMedia!!.rawData!!)
|
String(it.richMedia!!.rawData!!)
|
||||||
}
|
}
|
||||||
))
|
), echo)
|
||||||
}
|
}
|
||||||
|
|
||||||
override val requiredParams: Array<String> = arrayOf("id")
|
override val requiredParams: Array<String> = arrayOf("id")
|
||||||
|
@ -63,7 +63,7 @@ internal object GetGuildMemberList: IActionHandler() {
|
|||||||
members = members,
|
members = members,
|
||||||
finish = nextToken.finish,
|
finish = nextToken.finish,
|
||||||
nextToken = ProtoBuf.encodeToByteArray(nextToken).toHexString(),
|
nextToken = ProtoBuf.encodeToByteArray(nextToken).toHexString(),
|
||||||
))
|
), echo)
|
||||||
}
|
}
|
||||||
|
|
||||||
override val requiredParams: Array<String> = arrayOf("guild_id")
|
override val requiredParams: Array<String> = arrayOf("guild_id")
|
||||||
|
@ -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
|
||||||
|
)
|
||||||
|
}
|
@ -81,7 +81,7 @@ internal object UploadGroupFile : IActionHandler() {
|
|||||||
fileElement.picThumbPath[750] = srcFile.absolutePath
|
fileElement.picThumbPath[750] = srcFile.absolutePath
|
||||||
}
|
}
|
||||||
2 -> {
|
2 -> {
|
||||||
val thumbPic = FileUtils.getFile(MD5.genFileMd5Hex(srcFile.absolutePath))
|
val thumbPic = FileUtils.getFileByMd5(MD5.genFileMd5Hex(srcFile.absolutePath))
|
||||||
withContext(Dispatchers.IO) {
|
withContext(Dispatchers.IO) {
|
||||||
val fileOutputStream = FileOutputStream(thumbPic)
|
val fileOutputStream = FileOutputStream(thumbPic)
|
||||||
val retriever = MediaMetadataRetriever()
|
val retriever = MediaMetadataRetriever()
|
||||||
|
@ -82,7 +82,7 @@ internal object UploadPrivateFile : IActionHandler() {
|
|||||||
fileElement.picThumbPath[750] = srcFile.absolutePath
|
fileElement.picThumbPath[750] = srcFile.absolutePath
|
||||||
}
|
}
|
||||||
2 -> {
|
2 -> {
|
||||||
val thumbPic = FileUtils.getFile(MD5.genFileMd5Hex(srcFile.absolutePath))
|
val thumbPic = FileUtils.getFileByMd5(MD5.genFileMd5Hex(srcFile.absolutePath))
|
||||||
withContext(Dispatchers.IO) {
|
withContext(Dispatchers.IO) {
|
||||||
val fileOutputStream = FileOutputStream(thumbPic)
|
val fileOutputStream = FileOutputStream(thumbPic)
|
||||||
val retriever = MediaMetadataRetriever()
|
val retriever = MediaMetadataRetriever()
|
||||||
|
@ -94,8 +94,7 @@ internal object FileUtils {
|
|||||||
fun getFile(name: String): File {
|
fun getFile(name: String): File {
|
||||||
if (name.length == 32) {
|
if (name.length == 32) {
|
||||||
// 使用md5获取值
|
// 使用md5获取值
|
||||||
val dirName = name.substring(name.length - 4)
|
val file = getFileByMd5(name)
|
||||||
val file = CacheDir.resolve("$dirName/$name")
|
|
||||||
if (file.exists()) {
|
if (file.exists()) {
|
||||||
return file
|
return file
|
||||||
}
|
}
|
||||||
@ -103,6 +102,11 @@ internal object FileUtils {
|
|||||||
return CacheDir.resolve(name)
|
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 {
|
fun getFileType(file: File): String {
|
||||||
val bytes = ByteArray(2)
|
val bytes = ByteArray(2)
|
||||||
file.inputStream().use {
|
file.inputStream().use {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user