From 8ae4ce7870ad77756296c9a94b854a14f16530bd Mon Sep 17 00:00:00 2001 From: RTAkland Date: Tue, 8 Oct 2024 20:45:56 +0800 Subject: [PATCH] feat: add image bed api --- src/main/kotlin/cn/rtast/fancybot/Const.kt | 5 +- .../commands/misc/ShortLinkCommand.kt | 23 +++++++--- .../commands/parse/AsciiArtCommand.kt | 22 ++++++--- .../kotlin/cn/rtast/fancybot/entity/Config.kt | 2 + .../cn/rtast/fancybot/entity/ShortLink.kt | 12 ----- .../cn/rtast/fancybot/items/SetuItem.kt | 3 +- .../cn/rtast/fancybot/items/TenSetuItem.kt | 3 +- .../kotlin/cn/rtast/fancybot/util/Http.kt | 46 ++++++++++++++++++- .../rtast/fancybot/util/file/ConfigManager.kt | 2 + src/main/resources/config.json | 4 +- 10 files changed, 91 insertions(+), 31 deletions(-) delete mode 100644 src/main/kotlin/cn/rtast/fancybot/entity/ShortLink.kt diff --git a/src/main/kotlin/cn/rtast/fancybot/Const.kt b/src/main/kotlin/cn/rtast/fancybot/Const.kt index a138f34..4de5803 100644 --- a/src/main/kotlin/cn/rtast/fancybot/Const.kt +++ b/src/main/kotlin/cn/rtast/fancybot/Const.kt @@ -41,6 +41,7 @@ val gson: Gson = GsonBuilder() const val ROOT_PATH = "./data" const val ASSETS_BASE_URL = "https://static.rtast.cn" +const val API_RTAST_URL = "https://api.rtast.cn" val DEFAULT_CONFIG = Config( ncmAPI = "https://ncm.rtast.cn", @@ -67,7 +68,9 @@ val DEFAULT_CONFIG = Config( qqMusicApiUrl = "http://127.0.0.1:3200", startUpNoticeUser = 114514L, selfId = 114514L, - tianXingApiKey = "1145141919810" + tianXingApiKey = "1145141919810", + githubUser = "RTAkland", + githubImageRepo = "Static-Images" ) val configManager = ConfigManager() diff --git a/src/main/kotlin/cn/rtast/fancybot/commands/misc/ShortLinkCommand.kt b/src/main/kotlin/cn/rtast/fancybot/commands/misc/ShortLinkCommand.kt index 2635066..27b53f8 100644 --- a/src/main/kotlin/cn/rtast/fancybot/commands/misc/ShortLinkCommand.kt +++ b/src/main/kotlin/cn/rtast/fancybot/commands/misc/ShortLinkCommand.kt @@ -7,10 +7,13 @@ package cn.rtast.fancybot.commands.misc +import cn.rtast.fancybot.API_RTAST_URL import cn.rtast.fancybot.annotations.CommandDescription -import cn.rtast.fancybot.entity.ShortLink +import cn.rtast.fancybot.entity.shortlink.ShortLinkPayload +import cn.rtast.fancybot.entity.shortlink.ShortLinkResponse import cn.rtast.fancybot.util.Http import cn.rtast.fancybot.util.str.encodeToBase64 +import cn.rtast.fancybot.util.str.toJson import cn.rtast.rob.entity.GroupMessage import cn.rtast.rob.util.BaseCommand import cn.rtast.rob.util.ob.OneBotListener @@ -19,7 +22,16 @@ import cn.rtast.rob.util.ob.OneBotListener class ShortLinkCommand : BaseCommand() { override val commandNames = listOf("/s") - private val shortLinkApi = "https://api.rtast.cn" + + companion object { + fun String.makeShortLink(): String { + val shortLink = Http.post( + "$API_RTAST_URL/short_link", + ShortLinkPayload(this).toJson() + ) + return "$API_RTAST_URL/s?rnd_id=${shortLink.id}" + } + } override suspend fun executeGroup(listener: OneBotListener, message: GroupMessage, args: List) { if (args.isEmpty()) { @@ -27,10 +39,7 @@ class ShortLinkCommand : BaseCommand() { return } val target = args.first().encodeToBase64() - val shortLink = Http.post( - "$shortLinkApi/short_link", - params = mapOf("target" to target) - ) - message.reply("$shortLinkApi/s?rnd_id=${shortLink.id}") + val shortLink = target.makeShortLink() + message.reply(shortLink) } } \ No newline at end of file diff --git a/src/main/kotlin/cn/rtast/fancybot/commands/parse/AsciiArtCommand.kt b/src/main/kotlin/cn/rtast/fancybot/commands/parse/AsciiArtCommand.kt index d27be27..5d7a4db 100644 --- a/src/main/kotlin/cn/rtast/fancybot/commands/parse/AsciiArtCommand.kt +++ b/src/main/kotlin/cn/rtast/fancybot/commands/parse/AsciiArtCommand.kt @@ -113,15 +113,25 @@ class AsciiArtCommand : BaseCommand() { val asciiFrames = mutableListOf() val width = frames.first().width val height = frames.first().height - frames.forEach { asciiFrames.add(it.convertToAscii().saveAsciiArtToImage(width, height)) } + frames.forEachIndexed { index, item -> + asciiFrames.add(item.convertToAscii().saveAsciiArtToImage(width, height)) + logger.info("帧:${index}处理完成") + } + logger.info("合成GIF中...") val gifBytes = decoder.makeGif(asciiFrames) + logger.info("合并完成") val gifBase64 = gifBytes.encodeToBase64() - logger.info("处理后的图片大小: ${gifBytes.size}字节, base64大小: ${gifBase64.length * 2}字节") - message.reply(MessageChain.Builder().addImage(gifBase64, true).build()) + logger.info("处理后的图片大小: ${gifBytes.size}字节") + val msg = MessageChain.Builder() + .addImage(gifBase64, true) + message.reply(msg.build()) } - } catch (_: Exception) { - message.reply("处理GIF失败") - logger.info("gif处理失败") + } catch (_: OutOfMemoryError) { + message.reply("GIF处理失败: 内存溢出") + logger.info("GIF处理失败: 内存溢出") + } catch (e: Exception) { + message.reply("处理GIF失败: ${e.message}") + logger.info("gif处理失败: ${e.message}") } } else { message.reply("回复错误已取消本次操作") diff --git a/src/main/kotlin/cn/rtast/fancybot/entity/Config.kt b/src/main/kotlin/cn/rtast/fancybot/entity/Config.kt index 3a0d8d3..513128a 100644 --- a/src/main/kotlin/cn/rtast/fancybot/entity/Config.kt +++ b/src/main/kotlin/cn/rtast/fancybot/entity/Config.kt @@ -36,4 +36,6 @@ data class Config( val startUpNoticeUser: Long, val selfId: Long, val tianXingApiKey: String, + val githubUser: String, + val githubImageRepo: String, ) \ No newline at end of file diff --git a/src/main/kotlin/cn/rtast/fancybot/entity/ShortLink.kt b/src/main/kotlin/cn/rtast/fancybot/entity/ShortLink.kt deleted file mode 100644 index 36f3e64..0000000 --- a/src/main/kotlin/cn/rtast/fancybot/entity/ShortLink.kt +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Copyright © 2024 RTAkland - * Author: RTAkland - * Date: 2024/9/22 - */ - - -package cn.rtast.fancybot.entity - -data class ShortLink( - val id: String -) \ No newline at end of file diff --git a/src/main/kotlin/cn/rtast/fancybot/items/SetuItem.kt b/src/main/kotlin/cn/rtast/fancybot/items/SetuItem.kt index 54018ba..ca825be 100644 --- a/src/main/kotlin/cn/rtast/fancybot/items/SetuItem.kt +++ b/src/main/kotlin/cn/rtast/fancybot/items/SetuItem.kt @@ -7,6 +7,7 @@ package cn.rtast.fancybot.items +import cn.rtast.fancybot.API_RTAST_URL import cn.rtast.fancybot.entity.setu.Setu import cn.rtast.fancybot.niuziManager import cn.rtast.fancybot.util.Http @@ -27,7 +28,7 @@ class SetuItem : Item() { message: GroupMessage, after: Double ): MessageChain.Builder { - val response = Http.get("https://api.rtast.cn/api/setu") + val response = Http.get("$API_RTAST_URL/api/setu") .fromArrayJson>().first() if (response.r18) { niuziManager.updateLength(message.sender.userId, itemPrice) diff --git a/src/main/kotlin/cn/rtast/fancybot/items/TenSetuItem.kt b/src/main/kotlin/cn/rtast/fancybot/items/TenSetuItem.kt index 595c7a3..44f9d40 100644 --- a/src/main/kotlin/cn/rtast/fancybot/items/TenSetuItem.kt +++ b/src/main/kotlin/cn/rtast/fancybot/items/TenSetuItem.kt @@ -7,6 +7,7 @@ package cn.rtast.fancybot.items +import cn.rtast.fancybot.API_RTAST_URL import cn.rtast.fancybot.ROOT_PATH import cn.rtast.fancybot.configManager import cn.rtast.fancybot.entity.setu.Setu @@ -48,7 +49,7 @@ private fun getImages(r18: Boolean): NodeMessageChain { } } } else { - val response = Http.get("https://api.rtast.cn/api/setu?size=10").fromArrayJson>() + val response = Http.get("$API_RTAST_URL/api/setu?size=10").fromArrayJson>() response.filter { !it.r18 }.map { it.urls.large }.forEach { try { val imageBase64 = URI(it).toURL().readBytes().encodeToBase64() diff --git a/src/main/kotlin/cn/rtast/fancybot/util/Http.kt b/src/main/kotlin/cn/rtast/fancybot/util/Http.kt index cd5a959..284d2fd 100644 --- a/src/main/kotlin/cn/rtast/fancybot/util/Http.kt +++ b/src/main/kotlin/cn/rtast/fancybot/util/Http.kt @@ -10,14 +10,15 @@ package cn.rtast.fancybot.util import cn.rtast.fancybot.util.str.fromJson import okhttp3.FormBody import okhttp3.MediaType.Companion.toMediaType +import okhttp3.MultipartBody import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.RequestBody.Companion.toRequestBody object Http { - private val jsonMediaType = "application/json; charset=utf-8".toMediaType() - private val jsonHeader = mapOf( + val jsonMediaType = "application/json; charset=utf-8".toMediaType() + val jsonHeader = mapOf( "Content-Type" to "application/json; charset=utf-8", "Accept" to "application/json" ) @@ -136,4 +137,45 @@ object Http { val headerRequest = addHeaders(request, headers) return this.executeRequest(headerRequest.build()).fromJson() } + + @JvmOverloads + inline fun post( + url: String, + form: MultipartBody, + headers: Map? = null + ): T { + val request = Request.Builder() + .post(form) + .url(buildParams(url, headers)) + val headerRequest = addHeaders(request, headers) + return this.executeRequest(headerRequest.build()).fromJson() + } + + inline fun put( + url: String, + jsonBody: String, + headers: Map? = null, + params: Map? = null + ): T { + val paramsUrl = buildParams(url, params) + val request = Request.Builder() + .url(paramsUrl) + .put(jsonBody.toRequestBody(jsonMediaType)) + val headerRequest = addHeaders(request, headers) + return this.executeRequest(headerRequest.build()).fromJson() + } + + fun put( + url: String, + jsonBody: String, + headers: Map? = null, + params: Map? = null + ): String { + val paramsUrl = buildParams(url, params) + val request = Request.Builder() + .url(paramsUrl) + .put(jsonBody.toRequestBody(jsonMediaType)) + val headerRequest = addHeaders(request, headers) + return this.executeRequest(headerRequest.build()) + } } diff --git a/src/main/kotlin/cn/rtast/fancybot/util/file/ConfigManager.kt b/src/main/kotlin/cn/rtast/fancybot/util/file/ConfigManager.kt index 3f1ac2a..fd4b466 100644 --- a/src/main/kotlin/cn/rtast/fancybot/util/file/ConfigManager.kt +++ b/src/main/kotlin/cn/rtast/fancybot/util/file/ConfigManager.kt @@ -37,4 +37,6 @@ class ConfigManager : JsonFileHandler("config.json") { val startUpNoticeUser = config.startUpNoticeUser val selfId = config.selfId val tianXingApiKey = config.tianXingApiKey + val githubUser = config.githubUser + val githubImageRepo = config.githubImageRepo } \ No newline at end of file diff --git a/src/main/resources/config.json b/src/main/resources/config.json index 304ea1b..b821c00 100644 --- a/src/main/resources/config.json +++ b/src/main/resources/config.json @@ -28,5 +28,7 @@ "qqMusicApiUrl": "http://127.0.0.1:3200", "startUpNoticeUser": 114514, "selfId": 114514, - "tianXingApiKey": "1145141919810" + "tianXingApiKey": "1145141919810", + "githubUser": "RTAkland", + "githubImageRepo": "Static-Images" } \ No newline at end of file