diff --git a/build.gradle.kts b/build.gradle.kts index eafe0c4..929c1fc 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,15 +1,16 @@ plugins { - val kotlinVersion = "1.5.10" + val kotlinVersion = "1.6.0" kotlin("jvm") version kotlinVersion kotlin("plugin.serialization") version kotlinVersion - id("net.mamoe.mirai-console") version "2.7.1" + id("net.mamoe.mirai-console") version "2.10.1" } -group = "me.jie65535" -version = "0.1.1" +group = "top.jie65535" +version = "1.0.0" repositories { + mavenLocal() maven("https://maven.aliyun.com/repository/public") mavenCentral() } diff --git a/src/main/kotlin/me/jie65535/jnr/JNRCommand.kt b/src/main/kotlin/me/jie65535/jnr/JNRCommand.kt deleted file mode 100644 index 6b2c1fc..0000000 --- a/src/main/kotlin/me/jie65535/jnr/JNRCommand.kt +++ /dev/null @@ -1,53 +0,0 @@ -package me.jie65535.jnr - -import kotlinx.coroutines.TimeoutCancellationException -import net.mamoe.mirai.console.command.CommandSender -import net.mamoe.mirai.console.command.RawCommand -import net.mamoe.mirai.console.command.isUser -import net.mamoe.mirai.event.events.MessageEvent -import net.mamoe.mirai.event.nextEventAsync -import net.mamoe.mirai.message.data.MessageChain -import net.mamoe.mirai.message.data.isContentBlank -import net.mamoe.mirai.utils.MiraiExperimentalApi - -object JNRCommand : RawCommand( - JNudgeReply, "jnr", "setPokeReply", "setNudgeReply", - usage = "/jnr|setPokeReply|setNudgeReply # 设置戳一戳回复消息", - description = "设置戳一戳回复消息" -) { - private const val WAIT_REPLY_TIMEOUT_MS = 30000L - - @OptIn(MiraiExperimentalApi::class) - override suspend fun CommandSender.onCommand(args: MessageChain) { - if (args.isContentBlank()) { - if (this.isUser()) { - try { - sendMessage("请在${WAIT_REPLY_TIMEOUT_MS / 1000}秒内发送要回复的消息内容,你可以发送空白消息来清空预设回复。") - val msg = subject.nextEventAsync( - WAIT_REPLY_TIMEOUT_MS, - coroutineContext = this.coroutineContext - ) { it.sender == user } .await() - if (msg.message.isContentBlank()) { - setReplyMessage(null) - } else { - setReplyMessage(msg.message) - } - sendMessage("OK") - } catch (e: TimeoutCancellationException) { - sendMessage("已取消") - } - } else { - setReplyMessage(null) - sendMessage("已清空预设回复") - } - } else { - setReplyMessage(args) - sendMessage("OK") - } - } - - private fun setReplyMessage(message: MessageChain?) { - JNRPluginConfig.replyMessage = message?.serializeToMiraiCode() ?: "" - JNudgeReply.logger.info("已设置戳一戳回复内容 \"${JNRPluginConfig.replyMessage}\"") - } -} \ 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 new file mode 100644 index 0000000..51f28cf --- /dev/null +++ b/src/main/kotlin/top/jie65535/jnr/JNRCommand.kt @@ -0,0 +1,110 @@ +package top.jie65535.jnr + +import kotlinx.coroutines.TimeoutCancellationException +import kotlinx.coroutines.withTimeout +import net.mamoe.mirai.console.command.CommandSender +import net.mamoe.mirai.console.command.CompositeCommand +import net.mamoe.mirai.console.command.fold +import net.mamoe.mirai.console.command.isUser +import net.mamoe.mirai.event.EventPriority +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 + +object JNRCommand : CompositeCommand( + JNudgeReply, "jnr", + description = "戳一戳自动回复" +) { + private const val WAIT_REPLY_TIMEOUT_MS = 30000L + + @SubCommand + @Description("添加简单回复消息(权重默认为1)") + suspend fun CommandSender.add(message: PlainText, weight: Int = 1) { + if (weight < 1) { + sendMessage("请设置正确的权重值") + return + } + if (message.isContentBlank()) { + sendMessage("消息内容不能为空") + return + } + JNRPluginConfig.replyMessageList.add(ReplyMessage(message.serializeToMiraiCode(), weight)) + sendMessage("已添加一条消息,权重为$weight") + } + + @SubCommand + @Description("添加回复消息(权重默认为1)") + suspend fun CommandSender.add(weight: Int = 1) { + if (weight < 1) { + sendMessage("请设置正确的权重值") + return + } + if (isUser()) { + try { + sendMessage("请在${WAIT_REPLY_TIMEOUT_MS / 1000}秒内发送要添加的消息内容,你可以发送空白消息来取消。") + val msg = withTimeout(WAIT_REPLY_TIMEOUT_MS) { + subject.globalEventChannel().nextEvent(EventPriority.MONITOR) { it.sender == user } + } + if (msg.message.isContentBlank()) { + sendMessage("已取消") + } else { + JNRPluginConfig.replyMessageList.add(ReplyMessage(msg.message.serializeToMiraiCode(), weight)) + sendMessage("已添加一条消息,权重为$weight") + } + } catch (e: TimeoutCancellationException) { + sendMessage("已取消") + } + } else { + sendMessage("必须使用聊天环境执行该命令") + } + } + + @SubCommand + @Description("删除指定索引的回复消息") + suspend fun CommandSender.remove(index: Int) { + if (index < 0 || index >= JNRPluginConfig.replyMessageList.size) { + sendMessage("目标索引超出范围") + } else { + JNRPluginConfig.replyMessageList.removeAt(index) + sendMessage("OK") + } + } + + @SubCommand + @Description("清空回复消息列表") + suspend fun CommandSender.clear() { + JNRPluginConfig.replyMessageList.clear() + sendMessage("OK") + } + + @SubCommand + @Description("列出当前回复消息列表") + suspend fun CommandSender.list() { + val list = JNRPluginConfig.replyMessageList + if (list.isEmpty()) { + sendMessage("当前列表为空") + } else { + this.fold({ + val sb = StringBuilder() + for (i in list.indices) { + sb.appendLine(" - [$i] (${list[i].weight}) \"${list[i].message}\"") + } + sendMessage(sb.toString()) + }, { + if (list.size > 1) { + sendMessage(buildForwardMessage(subject) { + for (i in list.indices) { + bot named "[$i] (${list[i].weight})" says list[i].message.deserializeMiraiCode() + } + }) + } else { + sendMessage(list[0].message.deserializeMiraiCode()) + } + }) + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/me/jie65535/jnr/JNRPluginConfig.kt b/src/main/kotlin/top/jie65535/jnr/JNRPluginConfig.kt similarity index 85% rename from src/main/kotlin/me/jie65535/jnr/JNRPluginConfig.kt rename to src/main/kotlin/top/jie65535/jnr/JNRPluginConfig.kt index f02a947..bd3495c 100644 --- a/src/main/kotlin/me/jie65535/jnr/JNRPluginConfig.kt +++ b/src/main/kotlin/top/jie65535/jnr/JNRPluginConfig.kt @@ -1,12 +1,10 @@ -package me.jie65535.jnr +package top.jie65535.jnr import net.mamoe.mirai.console.data.AutoSavePluginConfig import net.mamoe.mirai.console.data.ValueDescription import net.mamoe.mirai.console.data.value import net.mamoe.mirai.event.EventPriority import net.mamoe.mirai.message.data.Message -import net.mamoe.mirai.message.data.MessageChain -import net.mamoe.mirai.message.data.MessageChainBuilder /** * 插件配置 @@ -17,7 +15,7 @@ object JNRPluginConfig : AutoSavePluginConfig("jnr") { * @see Message */ @ValueDescription("戳一戳回复的消息") - var replyMessage: String by value() + var replyMessageList: MutableList by value() /** * 优先级 默认为高 diff --git a/src/main/kotlin/me/jie65535/jnr/JNudgeReply.kt b/src/main/kotlin/top/jie65535/jnr/JNudgeReply.kt similarity index 67% rename from src/main/kotlin/me/jie65535/jnr/JNudgeReply.kt rename to src/main/kotlin/top/jie65535/jnr/JNudgeReply.kt index 97784a4..9a49427 100644 --- a/src/main/kotlin/me/jie65535/jnr/JNudgeReply.kt +++ b/src/main/kotlin/top/jie65535/jnr/JNudgeReply.kt @@ -1,18 +1,14 @@ -package me.jie65535.jnr +package top.jie65535.jnr import net.mamoe.mirai.console.command.CommandManager.INSTANCE.register -import net.mamoe.mirai.console.command.CommandManager.INSTANCE.unregister -import net.mamoe.mirai.console.data.AutoSavePluginConfig -import net.mamoe.mirai.console.data.value import net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription import net.mamoe.mirai.console.plugin.jvm.KotlinPlugin 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.Message -import net.mamoe.mirai.message.data.isContentBlank import net.mamoe.mirai.utils.info +import kotlin.random.Random object JNudgeReply : KotlinPlugin( JvmPluginDescription( @@ -27,10 +23,19 @@ object JNudgeReply : KotlinPlugin( override fun onEnable() { JNRPluginConfig.reload() JNRCommand.register() - + Random.nextInt() globalEventChannel().subscribeAlways(priority = JNRPluginConfig.priority) { - if (target.id == bot.id && JNRPluginConfig.replyMessage.isNotBlank()) { - subject.sendMessage(JNRPluginConfig.replyMessage.deserializeMiraiCode()) + if (target.id == bot.id && JNRPluginConfig.replyMessageList.isNotEmpty()) { + val totalWeight = JNRPluginConfig.replyMessageList.sumOf { it.weight } + var w = Random.nextInt(totalWeight) + for (msg in JNRPluginConfig.replyMessageList) { + if (w < msg.weight) { + subject.sendMessage(msg.message.deserializeMiraiCode()) + break + } else { + w -= msg.weight + } + } if (JNRPluginConfig.priority != EventPriority.MONITOR && JNRPluginConfig.isIntercept) intercept() } diff --git a/src/main/kotlin/top/jie65535/jnr/ReplyMessage.kt b/src/main/kotlin/top/jie65535/jnr/ReplyMessage.kt new file mode 100644 index 0000000..b37530b --- /dev/null +++ b/src/main/kotlin/top/jie65535/jnr/ReplyMessage.kt @@ -0,0 +1,12 @@ +package top.jie65535.jnr + +/** + * 回复的消息 + * @param message 消息内容 + * @param weight 回复该消息的权重 + */ +@kotlinx.serialization.Serializable +data class ReplyMessage( + val message: String, + val weight: Int +) \ No newline at end of file diff --git a/src/main/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin b/src/main/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin index 6c567ec..ddc9789 100644 --- a/src/main/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin +++ b/src/main/resources/META-INF/services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin @@ -1 +1 @@ -me.jie65535.jnr.JNudgeReply \ No newline at end of file +top.jie65535.jnr.JNudgeReply \ No newline at end of file