From c2ef779a721cd1120f41638abdbb6c129c474631 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=AD=B1=E5=82=91?= Date: Sat, 18 Feb 2023 19:08:21 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=9B=BE=E7=89=87=E6=9C=AC?= =?UTF-8?q?=E5=9C=B0=E7=BC=93=E5=AD=98=20=E9=81=BF=E5=85=8D=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E5=A4=B1=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle.kts | 7 +++ src/main/kotlin/top/jie65535/jnr/HttpUtil.kt | 17 +++++++ .../kotlin/top/jie65535/jnr/JNRCommand.kt | 46 ++++++++++++++++--- .../kotlin/top/jie65535/jnr/JNudgeReply.kt | 31 ++++++++++++- 4 files changed, 93 insertions(+), 8 deletions(-) create mode 100644 src/main/kotlin/top/jie65535/jnr/HttpUtil.kt diff --git a/build.gradle.kts b/build.gradle.kts index f2af2fb..77bc2ed 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -14,3 +14,10 @@ repositories { maven("https://maven.aliyun.com/repository/public") mavenCentral() } + +val ktorVersion = "2.2.3" + +dependencies { + implementation("io.ktor:ktor-client-core-jvm:$ktorVersion") + implementation("io.ktor:ktor-client-okhttp:$ktorVersion") +} \ No newline at end of file diff --git a/src/main/kotlin/top/jie65535/jnr/HttpUtil.kt b/src/main/kotlin/top/jie65535/jnr/HttpUtil.kt new file mode 100644 index 0000000..a0df62c --- /dev/null +++ b/src/main/kotlin/top/jie65535/jnr/HttpUtil.kt @@ -0,0 +1,17 @@ +package top.jie65535.jnr + +import io.ktor.client.* +import io.ktor.client.call.* +import io.ktor.client.engine.okhttp.* +import io.ktor.client.request.* +import java.io.File + +object HttpUtil { + private val httpClient = HttpClient(OkHttp) + + suspend fun download(url: String, file: File): ByteArray { + val data = httpClient.get(url).body() + file.writeBytes(data) + return data + } +} \ No newline at end of file diff --git a/src/main/kotlin/top/jie65535/jnr/JNRCommand.kt b/src/main/kotlin/top/jie65535/jnr/JNRCommand.kt index 0cf712e..383e8ba 100644 --- a/src/main/kotlin/top/jie65535/jnr/JNRCommand.kt +++ b/src/main/kotlin/top/jie65535/jnr/JNRCommand.kt @@ -11,9 +11,8 @@ import net.mamoe.mirai.event.events.MessageEvent import net.mamoe.mirai.event.globalEventChannel import net.mamoe.mirai.event.nextEvent import net.mamoe.mirai.message.code.MiraiCode.deserializeMiraiCode -import net.mamoe.mirai.message.data.PlainText -import net.mamoe.mirai.message.data.buildForwardMessage -import net.mamoe.mirai.message.data.isContentBlank +import net.mamoe.mirai.message.data.* +import net.mamoe.mirai.message.data.Image.Key.queryUrl import top.jie65535.jnr.JNudgeReply.reload import kotlin.math.min @@ -48,13 +47,19 @@ object JNRCommand : CompositeCommand( if (isUser()) { try { sendMessage("请在${WAIT_REPLY_TIMEOUT_MS / 1000}秒内发送要添加的消息内容,你可以发送空白消息来取消。") - val msg = withTimeout(WAIT_REPLY_TIMEOUT_MS) { + val nextEvent = withTimeout(WAIT_REPLY_TIMEOUT_MS) { subject.globalEventChannel().nextEvent(EventPriority.MONITOR) { it.sender == user } } - if (msg.message.isContentBlank()) { + if (nextEvent.message.isContentBlank()) { sendMessage("已取消") } else { - JNRPluginConfig.replyMessageList.add(ReplyMessage(msg.message.serializeToMiraiCode(), weight)) + if (nextEvent.message.contains(OnlineAudio.Key)) { + sendMessage("暂不支持语音消息!") + return + } + + saveResources(nextEvent.message) + JNRPluginConfig.replyMessageList.add(ReplyMessage(nextEvent.message.serializeToMiraiCode(), weight)) sendMessage("已添加一条消息,权重为$weight") } } catch (e: TimeoutCancellationException) { @@ -65,6 +70,35 @@ object JNRCommand : CompositeCommand( } } + /** + * 保存消息中的图片和音频 + */ + private suspend fun saveResources(message: MessageChain) { + for (it in message) { + if (it is Image) { + val imgDir = JNudgeReply.resolveDataFile("images") + if (!imgDir.exists()) { + imgDir.mkdir() + } + val imgFile = imgDir.resolve(it.imageId) + if (!imgFile.exists()) { + JNudgeReply.logger.info("下载图片 ${it.imageId}") + HttpUtil.download(it.queryUrl(), imgFile) + } + } else if (it is OnlineAudio) { + val audioDir = JNudgeReply.resolveDataFile("audios") + if (!audioDir.exists()) { + audioDir.mkdir() + } + val audioFile = audioDir.resolve(it.filename) + if (!audioFile.exists()) { + JNudgeReply.logger.info("下载语音 ${it.filename}") + HttpUtil.download(it.urlForDownload, audioFile) + } + } + } + } + @SubCommand @Description("删除指定索引的回复消息") suspend fun CommandSender.remove(index: Int) { diff --git a/src/main/kotlin/top/jie65535/jnr/JNudgeReply.kt b/src/main/kotlin/top/jie65535/jnr/JNudgeReply.kt index 9b439db..46ba653 100644 --- a/src/main/kotlin/top/jie65535/jnr/JNudgeReply.kt +++ b/src/main/kotlin/top/jie65535/jnr/JNudgeReply.kt @@ -3,6 +3,7 @@ package top.jie65535.jnr import net.mamoe.mirai.console.command.CommandManager.INSTANCE.register import net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription import net.mamoe.mirai.console.plugin.jvm.KotlinPlugin +import net.mamoe.mirai.contact.Contact import net.mamoe.mirai.contact.Group import net.mamoe.mirai.contact.Member import net.mamoe.mirai.contact.nameCardOrNick @@ -10,6 +11,11 @@ import net.mamoe.mirai.event.EventPriority import net.mamoe.mirai.event.events.NudgeEvent import net.mamoe.mirai.event.globalEventChannel import net.mamoe.mirai.message.code.MiraiCode.deserializeMiraiCode +import net.mamoe.mirai.message.data.Audio +import net.mamoe.mirai.message.data.Image +import net.mamoe.mirai.message.data.Image.Key.isUploaded +import net.mamoe.mirai.message.data.MessageChain +import net.mamoe.mirai.utils.ExternalResource.Companion.uploadAsImage import net.mamoe.mirai.utils.info import java.time.LocalDateTime import kotlin.random.Random @@ -122,10 +128,31 @@ object JNudgeReply : KotlinPlugin( } // 其它 - else -> event.subject.sendMessage(message.message.deserializeMiraiCode()) + else -> sendRecordMessage(event.subject, message.message.deserializeMiraiCode()) } } else { - event.subject.sendMessage(message.message.deserializeMiraiCode()) + sendRecordMessage(event.subject, message.message.deserializeMiraiCode()) } } + + private suspend fun sendRecordMessage(subject: Contact, message: MessageChain) { + for (it in message) { + if (it is Image) { + if (!it.isUploaded(subject.bot)) { + val imgFile = resolveDataFile("images/" + it.imageId) + if (imgFile.exists()) { + imgFile.uploadAsImage(subject) + } else { + logger.warning( + "图片的服务器缓存已失效,本地缓存已丢失,请重新设置该消息内的图片!" + + "消息内容:" + message.serializeToMiraiCode() + ) + } + } + } else if (it is Audio) { + // TODO + } + } + subject.sendMessage(message) + } }