From 4f37aace859dee99d5cc45af964fd1618a621756 Mon Sep 17 00:00:00 2001 From: Grand-cocoa <1075576561@qq.com49111108+grand-cocoa@users.noreply.github.com> Date: Mon, 24 Mar 2025 17:23:13 +0800 Subject: [PATCH] =?UTF-8?q?feat(service):=20=E6=B7=BB=E5=8A=A0=20JM=20?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 DownloadUtil 工具类,用于处理 JMComic 下载任务 - 添加 JmDownloadService 服务类,实现 /JmDownload 命令的处理 - 更新 .gitea/workflows/build-test.yaml,重命名为 package.yaml 并调整工作流名称- 修改 MFAGenerateService、RandomPhotoService 和 ExampleService,优化命令前缀和参数处理 - 新增 JsonUtil 工具类,用于解析 JSON 数据 - 更新 AlistUtil 依赖版本至 1.0.1-spring --- .../{build-test.yaml => package.yaml} | 6 +- lib/AlistUtil-1.0.1-spring.jar | Bin 0 -> 17556 bytes pom.xml | 2 +- .../sakuramiki/service/ExampleService.kt | 2 +- .../service/jm/JmDownloadService.kt | 49 ++++++++++ .../service/jm/util/DownloadUtil.kt | 85 ++++++++++++++++++ .../service/mfa/MFAGenerateService.kt | 4 +- .../service/randomphoto/RandomPhotoService.kt | 2 +- .../alinadace/sakuramiki/util/JsonUtil.kt | 13 +++ 9 files changed, 155 insertions(+), 8 deletions(-) rename .gitea/workflows/{build-test.yaml => package.yaml} (77%) create mode 100644 lib/AlistUtil-1.0.1-spring.jar create mode 100644 src/main/kotlin/info/alinadace/sakuramiki/service/jm/JmDownloadService.kt create mode 100644 src/main/kotlin/info/alinadace/sakuramiki/service/jm/util/DownloadUtil.kt create mode 100644 src/main/kotlin/info/alinadace/sakuramiki/util/JsonUtil.kt diff --git a/.gitea/workflows/build-test.yaml b/.gitea/workflows/package.yaml similarity index 77% rename from .gitea/workflows/build-test.yaml rename to .gitea/workflows/package.yaml index e80886e..80dfe27 100644 --- a/.gitea/workflows/build-test.yaml +++ b/.gitea/workflows/package.yaml @@ -1,11 +1,11 @@ name: Sakura-Miki-build -run-name: ${{ gitea.actor }} is testing out Gitea Actions 🚀 +run-name: Automatic-Packaging 📦 on: [ push ] env: BARE_REPO_DIR: https://git.alina-dace.info/Dace/Sakura-Miki.git CLONED_REPO_DIR: ./ jobs: - Explore-Gitea-Actions: + Automatic-Packaging: runs-on: ubuntu-latest steps: - name: Checkout Git Repo @@ -18,7 +18,7 @@ jobs: distribution: 'temurin' cache: maven - run: chmod +x ./mvnw - - run: ./mvnw install:install-file -Dfile=./lib/AlistUtil-1.0.0-spring.jar -Dpackaging=jar -DgroupId=io.github.1530624156 -DartifactId=AlistUtil -Dversion=1.0.0-spring + - run: ./mvnw install:install-file -Dfile=./lib/AlistUtil-1.0.1-spring.jar -Dpackaging=jar -DgroupId=io.github.1530624156 -DartifactId=AlistUtil -Dversion=1.0.1-spring - name: build run: ./mvnw clean package -DskipTests=true -P prod - run: docker build -t sakura-miki:latest ./ diff --git a/lib/AlistUtil-1.0.1-spring.jar b/lib/AlistUtil-1.0.1-spring.jar new file mode 100644 index 0000000000000000000000000000000000000000..811c958bfb80e719014d00130c2842cae8683b6a GIT binary patch literal 17556 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 literal 0 HcmV?d00001 diff --git a/pom.xml b/pom.xml index 3b7b8f4..cf6a8f7 100644 --- a/pom.xml +++ b/pom.xml @@ -136,7 +136,7 @@ io.github.1530624156 AlistUtil - 1.0.0-spring + 1.0.1-spring com.squareup.okhttp3 diff --git a/src/main/kotlin/info/alinadace/sakuramiki/service/ExampleService.kt b/src/main/kotlin/info/alinadace/sakuramiki/service/ExampleService.kt index 962593d..6c77389 100644 --- a/src/main/kotlin/info/alinadace/sakuramiki/service/ExampleService.kt +++ b/src/main/kotlin/info/alinadace/sakuramiki/service/ExampleService.kt @@ -27,7 +27,7 @@ class ExampleService : Service { override fun entrance(event: MessageV2Event): Boolean { val chain = event.message if (chain.size == 1 && chain[0] is PlainText && event.sender.id == botConfig.admin) { - if (chain[0].toString() == "测试") { + if (chain[0].toString().trim() == "测试") { return true } } diff --git a/src/main/kotlin/info/alinadace/sakuramiki/service/jm/JmDownloadService.kt b/src/main/kotlin/info/alinadace/sakuramiki/service/jm/JmDownloadService.kt new file mode 100644 index 0000000..9420a07 --- /dev/null +++ b/src/main/kotlin/info/alinadace/sakuramiki/service/jm/JmDownloadService.kt @@ -0,0 +1,49 @@ +package info.alinadace.sakuramiki.service.jm + +import info.alinadace.sakuramiki.annotation.BotFunction +import info.alinadace.sakuramiki.configuration.BotConfig +import info.alinadace.sakuramiki.service.Service +import info.alinadace.sakuramiki.service.jm.util.DownloadUtil +import io.github.kloping.qqbot.api.v2.FriendMessageEvent +import io.github.kloping.qqbot.api.v2.GroupMessageEvent +import io.github.kloping.qqbot.api.v2.MessageV2Event +import io.github.kloping.qqbot.entities.ex.PlainText +import jakarta.annotation.Resource + +/** + * @author Kane + * @since 2025/3/24 15:36 + */ +@BotFunction(FriendMessageEvent::class, GroupMessageEvent::class) +class JmDownloadService: Service{ + + @Resource + lateinit var botConfig: BotConfig + + @Resource + lateinit var downloadUtil: DownloadUtil + + /** + * 服务入口 + */ + override fun entrance(event: MessageV2Event): Boolean { + val chain = event.message + if (chain.size == 1 && chain[0] is PlainText && event.sender.id == botConfig.admin) { + if (chain[0].toString().trim().startsWith("/JmDownload")) { + return true + } + } + return false + } + + /** + * 服务行为 + */ + override fun active(event: MessageV2Event) { + val chain = event.message + val code = chain[0].toString().trim().split(" ")[1] + event.send("任务已添加") + downloadUtil.start(code) + event.send("任务已完成,请前往Alist查看") + } +} diff --git a/src/main/kotlin/info/alinadace/sakuramiki/service/jm/util/DownloadUtil.kt b/src/main/kotlin/info/alinadace/sakuramiki/service/jm/util/DownloadUtil.kt new file mode 100644 index 0000000..3020de6 --- /dev/null +++ b/src/main/kotlin/info/alinadace/sakuramiki/service/jm/util/DownloadUtil.kt @@ -0,0 +1,85 @@ +package info.alinadace.sakuramiki.service.jm.util + +import cn.hutool.core.lang.UUID +import com.mavis.service.AlistService +import info.alinadace.sakuramiki.util.okHttpClient +import info.alinadace.sakuramiki.util.parse +import jakarta.annotation.Resource +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.RequestBody +import okhttp3.RequestBody.Companion.toRequestBody +import okhttp3.Response +import org.springframework.stereotype.Service + +/** + * @author Kane + * @since 2025/3/24 15:38 + */ +@Service +class DownloadUtil { + companion object { + private const val DIR = "/AliDrive/JMComic" + private const val OWNER = "Grand-cocoa" + private const val REPO = "JMComic-Crawler-Python" + private const val WORKFLOW_ID = "151600689" + private const val BASE = "https://api.github.com" + private const val CREATE = "${BASE}/repos/${OWNER}/${REPO}/actions/workflows/${WORKFLOW_ID}/dispatches" + private const val LIST = "${BASE}/repos/${OWNER}/${REPO}/actions/workflows/${WORKFLOW_ID}/runs" + private const val GET = "${BASE}/repos/${OWNER}/${REPO}/actions/runs/%d" + private const val ARTIFACTS = "${BASE}/repos/${OWNER}/${REPO}/actions/runs/%d/artifacts" + private const val DOWNLOAD = "${BASE}/repos/${OWNER}/${REPO}/actions/artifacts/%d/zip" + private const val APIKEY = "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" + + private const val CREATE_BODY = """{"inputs": {"JM_ALBUM_IDS": "%s","JM_PHOTO_IDS": ""},"ref": "master"}""" + + private fun OkHttpClient.newCall(url: String, method: String, body: RequestBody? = null): Response { + return this.newCall(Request.Builder() + .url(url) + .method(method, body) +// .addHeader("Content-Type", "application/json") + .addHeader("Authorization", "Bearer $APIKEY") + .addHeader("User-Agent", "Apifox/1.0.0 (https://apifox.com)") + .addHeader("Accept", "*/*") + .addHeader("Host", "api.github.com") + .addHeader("Connection", "keep-alive") + .build()).execute() + } + } + + @Resource + lateinit var alistService: AlistService + + fun start(id: String){ + val createBody = CREATE_BODY.format(id).toRequestBody() +// Request.Builder().post(createBody).addHeader() + val create = okHttpClient.newCall(CREATE, "POST", createBody) + if (create.code != 200) return + Thread.sleep(3000) + val list = okHttpClient.newCall(LIST, "GET") + if (list.code != 200) return + val listBody = parse(list.body?.string()!!) + val jobId = listBody.getByPath("workflow_runs[0].id") + var status = false + for (i in 0..10){ + Thread.sleep(10000) + val get = okHttpClient.newCall(GET.format(jobId), "GET") + if (get.code != 200) return + val getBody = parse(get.body?.string()!!) + if (getBody.getByPath("conclusion") == "success"){ + status = true + break + } + } + if (!status) return + val artifacts = okHttpClient.newCall(ARTIFACTS.format(jobId), "GET") + if (artifacts.code != 200) return + val artifactsBody = parse(artifacts.body?.string()!!) + val artifactId = artifactsBody.getByPath("artifacts[0].id") + val download = okHttpClient.newCall(DOWNLOAD.format(artifactId), "GET") + if (download.code != 200) return + val blob = download.body?.bytes() + val fastUUID = UUID.fastUUID().toString(true) + alistService.uploadFile(blob, DIR, fastUUID) + } +} diff --git a/src/main/kotlin/info/alinadace/sakuramiki/service/mfa/MFAGenerateService.kt b/src/main/kotlin/info/alinadace/sakuramiki/service/mfa/MFAGenerateService.kt index 65a3545..a194ebe 100644 --- a/src/main/kotlin/info/alinadace/sakuramiki/service/mfa/MFAGenerateService.kt +++ b/src/main/kotlin/info/alinadace/sakuramiki/service/mfa/MFAGenerateService.kt @@ -31,7 +31,7 @@ class MFAGenerateService : Service { if (message.size != 1 && message.size != 2) { return false } - if (message[0] is PlainText && message[0].toString().startsWith("mfa")){ + if (message[0] is PlainText && message[0].toString().startsWith("/mfa")){ if (message.size == 1){ val split = message[0].toString().split(" ") return split.size <= 2 @@ -45,7 +45,7 @@ class MFAGenerateService : Service { */ override fun active(event: FriendMessageEvent) { val message = event.message - if (message[0] is PlainText && message[0].toString().startsWith("mfa")){ + if (message[0] is PlainText && message[0].toString().startsWith("/mfa")){ val command = message[0].toString().split(" ") if (command.size == 1){ val mfa = mapper.selectOne( diff --git a/src/main/kotlin/info/alinadace/sakuramiki/service/randomphoto/RandomPhotoService.kt b/src/main/kotlin/info/alinadace/sakuramiki/service/randomphoto/RandomPhotoService.kt index b7fbc17..6112c6c 100644 --- a/src/main/kotlin/info/alinadace/sakuramiki/service/randomphoto/RandomPhotoService.kt +++ b/src/main/kotlin/info/alinadace/sakuramiki/service/randomphoto/RandomPhotoService.kt @@ -31,7 +31,7 @@ class RandomPhotoService : Service { */ override fun entrance(event: MessageV2Event): Boolean { val chain = event.message - return chain.size == 1 && chain[0] is PlainText && chain[0].toString() == "#photo" + return chain.size == 1 && chain[0] is PlainText && chain[0].toString().trim() == "/photo" } /** diff --git a/src/main/kotlin/info/alinadace/sakuramiki/util/JsonUtil.kt b/src/main/kotlin/info/alinadace/sakuramiki/util/JsonUtil.kt new file mode 100644 index 0000000..a3b3f66 --- /dev/null +++ b/src/main/kotlin/info/alinadace/sakuramiki/util/JsonUtil.kt @@ -0,0 +1,13 @@ +package info.alinadace.sakuramiki.util + +import cn.hutool.core.lang.Dict +import com.fasterxml.jackson.databind.ObjectMapper + +/** + * @author Kane + * @since 2025/3/24 16:10 + */ +private val OBJECT_MAPPER = ObjectMapper() +fun parse(json: String): Dict { + return OBJECT_MAPPER.readValue(json, OBJECT_MAPPER.typeFactory.constructType(Dict::class.java)) +}