开发入门篇 /02/ Hello Mirai!


Hello Mirai

在上一章中,你学会了如何搭建开发环境,现在,让我们先让插件在测试环境跑起来吧!

测试

启动 mirai-console 实例

提示

该部分仅适用于 gradle 项目,且 mirai-console-gradle 版本在 2.12.0 以上

使用命令行 /gradlew runConsole

或者在 idea 中使用 Gradle 的 Task Configuration 22-09-12_idea64_g8kjiywawp.png 点击后会自动生成 Run/Debug Configuration 22-09-12_idea64_3aascaxgtc.png

启动 mirai-console 实例 (旧)

提示

该部分适用于 maven 或其他无法使用 runConsole 的环境,但是模拟效果不好。

首先,在 src/kotlin/test 目录 (不存在就创建) 新建一个 kotlin 类 RunTerminal.kt,代码如下,请复制并按照注释提示自行替换插件主类和补充 import。

@OptIn(ConsoleExperimentalApi::class)
suspend fun main() {
    // 设置工作目录为 ./run/
    val runDir = File("run")
    if (!runDir.exists()) runDir.mkdirs()
    MiraiConsoleTerminalLoader.startAsDaemon(MiraiConsoleImplementationTerminal(runDir.toPath()))

    // 举个例子,假如你的主类叫做 ExamplePlugin
    // kotlin: ExamplePlugin
    // java: ExamplePlugin.INSTANCE
    val pluginInstance = /*将此处替换为插件主类*/

    pluginInstance.load() // 主动加载插件, Console 会调用 插件主类.onLoad
    pluginInstance.enable() // 主动启用插件, Console 会调用 插件主类.onEnable

    //val bot = MiraiConsole.addBot(123456, "").alsoLogin() // 登录一个测试环境的 Bot

    MiraiConsole.job.join()
}

点击 suspend fun main() 左边绿色的 图标,点击运行调试均可启动测试,请记住启动测试的方法,按需使用。

你好,世界

你已经能进行测试了,接下来编写代码让你的机器人回复你吧!

提示

若使用 mirai-console,写到 onEnable 里
若单纯使用 mirai-core,爱写哪里写哪里 (你觉得什么时候该注册监听器就什么时候执行),保证在机器人登录之前执行就行

// kotlin

// 获取当前携程的事件频道,用于注册监听器
// 如果是在 mirai-core,请使用 GlobalEventChannel.context(携程)
// 一般来说除非实在没办法,否则必须指定携程上下文
val channel = globalEventChannel()
// 监听好友消息
channel.subscribeAlways<FriendMessageEvent> {
    // do sth you want like this
    if (message.content.contains("hello")) {
        sender.sendMessage("Hello Mirai :)");
    }
}
// java

// 获取当前携程的事件频道,用于注册监听器
// 如果是在 mirai-core,请使用 GlobalEventChannel.INSTANCE
// 一般来说除非实在没办法,否则必须指定携程上下文
EventChannel<Event> channel = GlobalEventChannel.INSTANCE.context(this.getCoroutineContext());
channel.subscribeAlways(FriendMessageEvent.class, event -> {
    // do sth you want like this
    if (event.getMessage().contentToString().contains("hello")) {
        event.getSender().sendMessage("Hello Mirai :)");
    }
});

你不需要深究这些代码是什么意思,你只需要知道这样写可以实现这个功能就好。详细的解读将在以后的章节中呈现,稍安勿躁。

写好之后,运行测试,登录机器人,并使用你的 QQ 客户端向机器人发送好友消息 hello 来检验成果吧!

最后,请尝试修改其中的数值,并尝试利用 IDEA 的代码补全修改代码,获取收到的消息来自的 QQ 号、昵称等信息发送回去,实现比较简单的功能。

构建插件

提示

该部分仅适用于 mirai-console,且仅适用于已安装 mirai-console 的 Gradle 插件的项目

在 IDEA 右侧你可以看到 Gradle 选项卡,在里面展开 项目名→Tasks→mirai 即可找到构建插件的两个任务

qq图片20220831123624.png

运行 buildPlugin 任务,将构建适用于 mirai-console 2.11 及以上的插件,使用的依赖将不会被打包进插件 jar,而是生成一个列表放入 /META-INF/mirai-console-plugin/ 里的 dependencies-private.txtdependencies-shared.txt。加载插件时 mirai-console 会读这个列表自动帮你下载并链接依赖库。这样构建的插件,后缀名为 .mirai2.jar

运行 buildPluginLegacy 任务,将构建适用于 mirai-console 2.11 以下的插件,使用的依赖将会被 shadowJar 打包进插件 jar 里。这样构建的插件,后缀名为 .mirai.jar

构建的插件文件将会在 /build/mirai/ 目录出现。

使用代码登录机器人

提示

在仅使用 mirai-core 的开发中,使用代码登录机器人是非常重要的。如果使用 mirai-console,除非有特殊需求。请使用自带的自动登录。

以下是登录QQ号 114514 密码 1919810 的示例。

一目了然,不言而喻。

// kotlin
val bot = BotFactory.newBot(114514L, "1919810") {
    // 这里是机器人配置
    // 比如使用文件储存设备信息
    fileBasedDeviceInfo()
}
// java
Bot bot = BotFactory.INSTANCE.newBot(114514L, "1919810", new BotConiguration() {{
    // 这里是机器人配置
    // 比如使用文件储存设备信息
    fileBasedDeviceInfo()
}}};

需要注意的是,执行 fileBasedDeviceInfo() 或者 fileBasedDeviceInfo("device_114514.json") 之类在 BotConfiguration 里的方法,只是修改了某个设置,这些设置大多是在机器人登录时使用,并不是说执行了这个方法就具体执行了某些功能,有的人说了他十遍甚至九遍还不懂。(恼)

完成

你已经掌握 mirai 最简单的用法了,接下来通过了解事件系统,一步一步前进吧。

开发入门篇 /03/ 事件系统