feat: use cloudflare r2 oss instead of github repository

This commit is contained in:
2024-10-09 20:52:24 +08:00
parent fdad0054ef
commit 829f858840
9 files changed
+85 -10

No files matched your search

@@ -8,6 +8,7 @@
package cn.rtast.fancybot.util.file
import cn.rtast.fancybot.entity.Config
import cn.rtast.fancybot.enums.ImageBedType
import cn.rtast.fancybot.util.str.JsonFileHandler
class ConfigManager : JsonFileHandler<Config>("config.json") {
@@ -39,4 +40,10 @@ class ConfigManager : JsonFileHandler<Config>("config.json") {
val tianXingApiKey = config.tianXingApiKey
val githubUser = config.githubUser
val githubImageRepo = config.githubImageRepo
val imageBedType = config.imageBedType
val cloudflareAccountId = config.cloudflareAccountId
val cloudflareR2AccessKey = config.cloudflareR2AccessKeyId
val cloudflareR2SecretKey = config.cloudflareR2SecretKey
val cloudflareR2BucketName = config.cloudflareR2BucketName
val cloudflareR2PublicUrl = config.cloudflareR2PublicUrl
}
@@ -10,10 +10,18 @@ package cn.rtast.fancybot.util.misc
import cn.rtast.fancybot.configManager
import cn.rtast.fancybot.entity.github.UploadContentPayload
import cn.rtast.fancybot.entity.github.UploadContentResponse
import cn.rtast.fancybot.enums.ImageBedType
import cn.rtast.fancybot.util.Http
import cn.rtast.fancybot.util.str.encodeToBase64
import cn.rtast.fancybot.util.str.proxy
import cn.rtast.fancybot.util.str.toJson
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider
import software.amazon.awssdk.core.sync.RequestBody
import software.amazon.awssdk.regions.Region
import software.amazon.awssdk.services.s3.S3Client
import software.amazon.awssdk.services.s3.model.PutObjectRequest
import java.net.URI
import java.util.UUID
object ImageBed {
@@ -21,12 +29,37 @@ object ImageBed {
private val imageBedUrl =
"https://api.github.com/repos/${configManager.githubUser}/${configManager.githubImageRepo}/contents".proxy
private val s3Client = this.createS3Client()
private fun createS3Client(): S3Client {
val credentials = AwsBasicCredentials.create(
configManager.cloudflareR2AccessKey,
configManager.cloudflareR2SecretKey
)
return S3Client.builder()
.region(Region.US_EAST_1)
.credentialsProvider(StaticCredentialsProvider.create(credentials))
.endpointOverride(URI.create("https://${configManager.cloudflareAccountId}.r2.cloudflarestorage.com"))
.build()
}
fun upload(file: ByteArray, fileType: String = ""): String {
val body = UploadContentPayload("uploadImage", file.encodeToBase64()).toJson()
val response = Http.put<UploadContentResponse>(
"$imageBedUrl/${UUID.randomUUID()}${if (fileType.isNotBlank()) ".$fileType" else ""}", body,
mapOf("Authorization" to "Bearer ${configManager.githubKey}")
).content.name
return "https://raw.githubusercontent.com/${configManager.githubUser}/${configManager.githubImageRepo}/refs/heads/main/$response".proxy
val randomUUID = UUID.randomUUID().toString()
if (configManager.imageBedType == ImageBedType.CloudflareR2) {
val key = "$randomUUID${if (fileType.isNotBlank()) ".$fileType" else ""}"
val putObjectRequest = PutObjectRequest.builder()
.bucket(configManager.cloudflareR2BucketName)
.key(key)
.build()
s3Client.putObject(putObjectRequest, RequestBody.fromBytes(file))
return "${configManager.cloudflareR2PublicUrl}/$key"
} else {
val body = UploadContentPayload("uploadImage", file.encodeToBase64()).toJson()
val response = Http.put<UploadContentResponse>(
"$imageBedUrl/${randomUUID}${if (fileType.isNotBlank()) ".$fileType" else ""}", body,
mapOf("Authorization" to "Bearer ${configManager.githubKey}")
).content.name
return "https://raw.githubusercontent.com/${configManager.githubUser}/${configManager.githubImageRepo}/refs/heads/main/$response".proxy
}
}
}