From 8838330f0bc788b080005c9e06b27474337735f8 Mon Sep 17 00:00:00 2001 From: jie65535 Date: Tue, 14 Jun 2022 11:46:35 +0800 Subject: [PATCH] Implement v0.1.0 --- README.md | 6 +- build.gradle.kts | 6 +- settings.gradle.kts | 2 +- .../example/mirai/plugin/JavaPluginMain.java | 51 --------- src/main/kotlin/PluginMain.kt | 100 +++++------------- src/main/kotlin/Point24.kt | 55 ++++++++++ ...t.mamoe.mirai.console.plugin.jvm.JvmPlugin | 2 +- src/test/kotlin/RunMirai.kt | 18 ++-- 8 files changed, 103 insertions(+), 137 deletions(-) delete mode 100644 src/main/java/org/example/mirai/plugin/JavaPluginMain.java create mode 100644 src/main/kotlin/Point24.kt diff --git a/README.md b/README.md index c0285b4..45bbfe4 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,3 @@ -# mirai-console-plugin-template +# mirai-console-j24-plugin -[Mirai Console](https://github.com/mamoe/mirai-console) 插件模板, 使用 Kotlin + Gradle. - -[如何使用](https://github.com/project-mirai/how-to-use-plugin-template) +24点计算器 \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index 88902cb..d91f6eb 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -6,10 +6,14 @@ plugins { id("net.mamoe.mirai-console") version "2.11.1" } -group = "org.example" +group = "top.jie65535" version = "0.1.0" repositories { maven("https://maven.aliyun.com/repository/public") // 阿里云国内代理仓库 mavenCentral() } + +dependencies { + implementation("net.objecthunter:exp4j:0.4.8") +} \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index e47c53b..388c3dc 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1 +1 @@ -rootProject.name = "mirai-console-plugin-template" \ No newline at end of file +rootProject.name = "mirai-console-j24-plugin" \ No newline at end of file diff --git a/src/main/java/org/example/mirai/plugin/JavaPluginMain.java b/src/main/java/org/example/mirai/plugin/JavaPluginMain.java deleted file mode 100644 index 6bba1d2..0000000 --- a/src/main/java/org/example/mirai/plugin/JavaPluginMain.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.example.mirai.plugin; - -import net.mamoe.mirai.console.plugin.jvm.JavaPlugin; -import net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription; -import net.mamoe.mirai.console.plugin.jvm.JvmPluginDescriptionBuilder; -import net.mamoe.mirai.event.Event; -import net.mamoe.mirai.event.EventChannel; -import net.mamoe.mirai.event.GlobalEventChannel; -import net.mamoe.mirai.event.events.FriendMessageEvent; -import net.mamoe.mirai.event.events.GroupMessageEvent; - - -/** - * 使用 Java 请把 - * {@code /src/main/resources/META-INF.services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin} - * 文件内容改成 {@code org.example.mirai.plugin.JavaPluginMain}
- * 也就是当前主类全类名 - * - * 使用 Java 可以把 kotlin 源集删除且不会对项目有影响 - * - * 在 {@code settings.gradle.kts} 里改构建的插件名称、依赖库和插件版本 - * - * 在该示例下的 {@link JvmPluginDescription} 修改插件名称,id 和版本等 - * - * 可以使用 {@code src/test/kotlin/RunMirai.kt} 在 IDE 里直接调试, - * 不用复制到 mirai-console-loader 或其他启动器中调试 - */ - -public final class JavaPluginMain extends JavaPlugin { - public static final JavaPluginMain INSTANCE = new JavaPluginMain(); - private JavaPluginMain() { - super(new JvmPluginDescriptionBuilder("org.example.mirai-example", "0.1.0") - .info("EG") - .build()); - } - - @Override - public void onEnable() { - getLogger().info("日志"); - EventChannel eventChannel = GlobalEventChannel.INSTANCE.parentScope(this); - eventChannel.subscribeAlways(GroupMessageEvent.class, g -> { - //监听群消息 - getLogger().info(g.getMessage().contentToString()); - - }); - eventChannel.subscribeAlways(FriendMessageEvent.class, f -> { - //监听好友消息 - getLogger().info(f.getMessage().contentToString()); - }); - } -} diff --git a/src/main/kotlin/PluginMain.kt b/src/main/kotlin/PluginMain.kt index f7d51b4..986e51f 100644 --- a/src/main/kotlin/PluginMain.kt +++ b/src/main/kotlin/PluginMain.kt @@ -1,93 +1,51 @@ -package org.example.mirai.plugin +package top.jie65535.j24 import net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription import net.mamoe.mirai.console.plugin.jvm.KotlinPlugin -import net.mamoe.mirai.event.EventChannel import net.mamoe.mirai.event.GlobalEventChannel -import net.mamoe.mirai.event.events.BotInvitedJoinGroupRequestEvent -import net.mamoe.mirai.event.events.FriendMessageEvent -import net.mamoe.mirai.event.events.GroupMessageEvent -import net.mamoe.mirai.event.events.NewFriendRequestEvent -import net.mamoe.mirai.event.globalEventChannel -import net.mamoe.mirai.message.data.Image -import net.mamoe.mirai.message.data.Image.Key.queryUrl -import net.mamoe.mirai.message.data.PlainText +import net.mamoe.mirai.event.subscribeMessages import net.mamoe.mirai.utils.info -/** - * 使用 kotlin 版请把 - * `src/main/resources/META-INF.services/net.mamoe.mirai.console.plugin.jvm.JvmPlugin` - * 文件内容改成 `org.example.mirai.plugin.PluginMain` 也就是当前主类全类名 - * - * 使用 kotlin 可以把 java 源集删除不会对项目有影响 - * - * 在 `settings.gradle.kts` 里改构建的插件名称、依赖库和插件版本 - * - * 在该示例下的 [JvmPluginDescription] 修改插件名称,id和版本,etc - * - * 可以使用 `src/test/kotlin/RunMirai.kt` 在 ide 里直接调试, - * 不用复制到 mirai-console-loader 或其他启动器中调试 - */ - object PluginMain : KotlinPlugin( JvmPluginDescription( - id = "org.example.mirai-example", - name = "插件示例", + id = "top.jie65535.j24", + name = "J 24点游戏", version = "0.1.0" ) { - author("作者名称或联系方式") - info( - """ - 这是一个测试插件, - 在这里描述插件的功能和用法等. - """.trimIndent() - ) - // author 和 info 可以删除. + author("jie65535") + info("24点游戏") } ) { + private val games: MutableMap = mutableMapOf() + override fun onEnable() { logger.info { "Plugin loaded" } //配置文件目录 "${dataFolder.absolutePath}/" val eventChannel = GlobalEventChannel.parentScope(this) - eventChannel.subscribeAlways{ - //群消息 - //复读示例 - if (message.contentToString().startsWith("复读")) { - group.sendMessage(message.contentToString().replace("复读", "")) + eventChannel.subscribeMessages { + contains("24点") quoteReply { + val game = Point24() + games[this.sender.id] = game + "你抽到了 [${game.points[0]}] [${game.points[1]}] [${game.points[2]}] [${game.points[3]}]\n" + + "请用以上四组数字组合成结果为24的算式,以“答”开头验证" } - if (message.contentToString() == "hi") { - //群内发送 - group.sendMessage("hi") - //向发送者私聊发送消息 - sender.sendMessage("hi") - //不继续处理 - return@subscribeAlways - } - //分类示例 - message.forEach { - //循环每个元素在消息里 - if (it is Image) { - //如果消息这一部分是图片 - val url = it.queryUrl() - group.sendMessage("图片,下载地址$url") - } - if (it is PlainText) { - //如果消息这一部分是纯文本 - group.sendMessage("纯文本,内容:${it.content}") + startsWith("答") quoteReply { + val game = games[this.sender.id] + if (game == null) { + "你还没有抽数字哦,说“24点”来开始游戏吧" + } else { + try { + val result = game.evaluate(message.contentToString().removePrefix("答").trim()) + if (result == 24.0) { + "恭喜你,答对了!" + } else { + "答错了,计算结果为 $result" + } + } catch (e: Throwable) { + "错误:${e.message}" + } } } } - eventChannel.subscribeAlways{ - //好友信息 - sender.sendMessage("hi") - } - eventChannel.subscribeAlways{ - //自动同意好友申请 - accept() - } - eventChannel.subscribeAlways{ - //自动同意加群申请 - accept() - } } } diff --git a/src/main/kotlin/Point24.kt b/src/main/kotlin/Point24.kt new file mode 100644 index 0000000..5437832 --- /dev/null +++ b/src/main/kotlin/Point24.kt @@ -0,0 +1,55 @@ +package top.jie65535.j24 + +import net.objecthunter.exp4j.ExpressionBuilder +import net.objecthunter.exp4j.shuntingyard.ShuntingYard +import net.objecthunter.exp4j.tokenizer.NumberToken +import net.objecthunter.exp4j.tokenizer.Token +import kotlin.random.Random + +class Point24 { + var points = genPoints() + + fun regenPoints() { + points = genPoints() + } + + private fun genPoints() = arrayOf( + Random.nextInt(1, 14), + Random.nextInt(1, 14), + Random.nextInt(1, 14), + Random.nextInt(1, 14) + ) + + fun evaluate(expression: String): Double { + val tokens = ShuntingYard.convertToRPN( + expression, + null, + mapOf(), + null, + false + ) + + val nums = points.toMutableList() + for (token in tokens) { + if (token.type == Token.TOKEN_NUMBER.toInt()) { + val value = (token as NumberToken).value + var i = 0 + while (i < nums.size) + if (nums[i].toDouble() == value) + break + else ++i + if (i < nums.size) + nums.removeAt(i) + else + throw IllegalArgumentException("不能使用未允许数值") + } + } + if (nums.isNotEmpty()) + throw IllegalArgumentException("必须使用所有数值") + + return ExpressionBuilder(expression) + .implicitMultiplication(false) + .build() + .evaluate() + } +} \ 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 0bed70b..aabe4c8 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 @@ -org.example.mirai.plugin.PluginMain \ No newline at end of file +top.jie65535.j24.PluginMain \ No newline at end of file diff --git a/src/test/kotlin/RunMirai.kt b/src/test/kotlin/RunMirai.kt index 9fdb837..d0a3a59 100644 --- a/src/test/kotlin/RunMirai.kt +++ b/src/test/kotlin/RunMirai.kt @@ -1,4 +1,4 @@ -package org.example.mirai.plugin +package top.jie65535.j24 import net.mamoe.mirai.alsoLogin import net.mamoe.mirai.console.MiraiConsole @@ -9,16 +9,18 @@ import net.mamoe.mirai.console.terminal.MiraiConsoleTerminalLoader suspend fun main() { MiraiConsoleTerminalLoader.startAsDaemon() - //如果是Kotlin PluginMain.load() PluginMain.enable() - //如果是Java -// JavaPluginMain.INSTANCE.load() -// JavaPluginMain.INSTANCE.enable() - val bot = MiraiConsole.addBot(123456, "") { - fileBasedDeviceInfo() - }.alsoLogin() +// val bot = MiraiConsole.addBot(123456, "") { +// fileBasedDeviceInfo() +// }.alsoLogin() MiraiConsole.job.join() +} + +fun test() { + val game = Point24() + println(game.points) + println(game.evaluate("${game.points[0]}+${game.points[1]}+${game.points[2]}+${game.points[3]}")) } \ No newline at end of file