本教程實爲mirai的mirai-console插件教程
用到的概念有
mcl
- 指mirai-console-loader,mirai-console官方啓動器
mirai
- mirai 是一個在全平臺下運行,提供 QQ Android 協議支持的高效率機器人庫,根據AGPLv3
開源java
如下爲一些官方資料
mirai官方github庫
mirai-console官方github庫
mirai-console-loader(mcl)官方啓動器官方github庫
這三者的關係能夠參考這裏
官方實例git
另,如下是一些資源:
筆者整理的mirai-console插件kotlin版實例
筆者備份的mirai啓動器github
下載mcl所須要的是>=1.8版本的openjdk,openjdk15下載地址,下載教程參考搜索引擎web
最好用openjdk而不是甲骨文(Oracle)的jdk,緣由json
推薦IDEA吧,其餘的也能夠,主要是IDEA挺好用的
能夠選擇安裝的官方插件:
Mirai Console IntelliJ 提供錯誤檢查等功能
Kotlin Jvm Blocking Bridge 幫助 Java 用戶調用 Kotlin suspend 函數
詳細參考官方文檔緩存
官方地址
教程同見官方說明框架
可能的報錯:jvm
java.lang.NoSuchMethodError: net.mamoe.mirai.utils.MiraiLogger$Companion.setDefaultLoggerCreator(Lkotlin/jvm/functions/Function1;)V
環境異常
使用插件建立的是舊版的框架,mcl和mirai現已不支持舊版框架maven
從官方實例或者筆者整理的mirai-console插件kotlin版實例中下載最新版的框架到本地,而後用IDE打開文件夾,而後gradle依賴在下載裏面都寫清楚了ide
src/main/resources/plugin.yml
裏改插件信息和入口點settings.gradle.kts
裏改生成的插件.jar名稱RunMiraikt
這個配置能夠在ide裏運行,不用複製到mcl或其餘啓動器buildPlugin
這個任務能夠生成.jar插件src/main/kotlin/PluginMain
主類內也能夠修改插件信息插件實例代碼
mirai-example-kotlin
│ build.gradle.kts gradle依賴列表 │ settings.gradle.kts gradle設置 │ ├─.gradle gradle緩存目錄 ├─.idea idea項目配置緩存位置 ├─.run │ RunMiraiKt.run.xml IDE中運行任務配置,即RunMiraiKt源文件 │ ├─gradle grdle文件 │ ├─run RunMiraiKt默認運行目錄 │ └─src ├─main │ ├─kotlin │ │ PluginMain.kt 插件主類 │ │ │ └─resources │ │ plugin.yml 插件信息配置 │ └─test └─kotlin RunMirai.kt RunMiraiKt任務配置
//插件信息 import net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription //主類繼承 import net.mamoe.mirai.console.plugin.jvm.KotlinPlugin //機器人被拉進羣的事件 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 //日誌組件(logger)發控制檯信息函數 import net.mamoe.mirai.utils.info //消息(messageChain)中的圖片類型 import net.mamoe.mirai.message.data.Image //消息(messageChain)中的純文本類型 import net.mamoe.mirai.message.data.PlainText //監聽器 import net.mamoe.mirai.event.Listener //監聽範圍 import net.mamoe.mirai.event.globalEventChannel //協程範圍? import kotlin.coroutines.EmptyCoroutineContext
監聽和事件參考官方文檔
object PluginMain : KotlinPlugin( JvmPluginDescription( id = "org.example.mirai-example", version = "0.1.0" ) ) { }
其中,kotlinPlugin
指繼承plugin父類,JvmPluginDescription
指聲明插件消息和版本
override fun onEnable() { //或logger.info("xxx") logger.info { "Plugin loaded" } }
用kotlin關鍵字override
實現插件啓用函數,而後用logger.info()
進行日誌輸出,其中logger
是kotlinPlugin
類內成員,除了.info()
還有.warning()
輸出警告和.error()
輸出報錯
用subscribeAlways<>{}
這個函數在onEnable
函數中開啓監聽
globalEventChannel().subscribeAlways( GroupMessageEvent::class, EmptyCoroutineContext, Listener.ConcurrencyKind.CONCURRENT ) { //羣消息 if (message.contentToString().startsWith("復讀")) { group.sendMessage(message.contentToString().replace("復讀", "")) } if (message.contentToString() == "hi") { group.sendMessage("hi") } message.forEach { //循環每一個元素在消息裏 if (it is Image) { //若是消息這一部分是圖片 } if (it is PlainText) { //若是消息這一部分是純文本 } } } globalEventChannel().subscribeAlways( FriendMessageEvent::class, EmptyCoroutineContext, Listener.ConcurrencyKind.CONCURRENT ) { //好友信息 } globalEventChannel().subscribeAlways( NewFriendRequestEvent::class, EmptyCoroutineContext, Listener.ConcurrencyKind.CONCURRENT ) { //自動贊成好友申請 accept() } globalEventChannel().subscribeAlways( BotInvitedJoinGroupRequestEvent::class, EmptyCoroutineContext, Listener.ConcurrencyKind.CONCURRENT ) { //自動贊成加羣申請 accept() }
這些代碼是筆者整理的mirai-console插件kotlin版實例中的內容
package org.example.mirai.plugin import net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription import net.mamoe.mirai.console.plugin.jvm.KotlinPlugin import net.mamoe.mirai.event.Listener 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.utils.info import net.mamoe.mirai.message.data.Image import net.mamoe.mirai.message.data.PlainText import kotlin.coroutines.EmptyCoroutineContext /* 在src/main/resources/plugin.yml裏改插件信息和入口點 在settings.gradle.kts裏改生成的插件.jar名稱 用runmiraikt這個配置能夠在ide裏運行,不用複製到mcl或其餘啓動器 */ object PluginMain : KotlinPlugin( JvmPluginDescription( id = "org.example.mirai-example", version = "0.1.0" ) ) { override fun onEnable() { logger.info { "Plugin loaded" } //配置文件目錄 "${dataFolder.absolutePath}/" globalEventChannel().subscribeAlways( GroupMessageEvent::class, EmptyCoroutineContext, Listener.ConcurrencyKind.CONCURRENT ) { //羣消息 if (message.contentToString().startsWith("復讀")) { group.sendMessage(message.contentToString().replace("復讀", "")) } if (message.contentToString() == "hi") { group.sendMessage("hi") } message.forEach { //循環每一個元素在消息裏 if (it is Image) { //若是消息這一部分是圖片 } if (it is PlainText) { //若是消息這一部分是純文本 } } } globalEventChannel().subscribeAlways( FriendMessageEvent::class, EmptyCoroutineContext, Listener.ConcurrencyKind.CONCURRENT ) { //好友信息 } globalEventChannel().subscribeAlways( NewFriendRequestEvent::class, EmptyCoroutineContext, Listener.ConcurrencyKind.CONCURRENT ) { //自動贊成好友申請 accept() } globalEventChannel().subscribeAlways( BotInvitedJoinGroupRequestEvent::class, EmptyCoroutineContext, Listener.ConcurrencyKind.CONCURRENT ) { //自動贊成加羣申請 accept() } } }
plugins { val kotlinVersion = "1.4.21" kotlin("jvm") version kotlinVersion kotlin("plugin.serialization") version kotlinVersion id("net.mamoe.mirai-console") version "2.0-M2" } group = "org.example" version = "0.1.0" repositories { //國內鏡像源 maven { url =uri("https://mirrors.huaweicloud.com/repository/maven") } maven { url =uri("https://maven.aliyun.com/nexus/content/repositories/jcenter")} maven { url =uri("https://dl.bintray.com/kotlin/kotlin-eap")} mavenLocal() mavenCentral() jcenter() maven("https://dl.bintray.com/kotlin/kotlin-eap") } dependencies{ implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.21") }
其中2.0-M2
是目前最新開發版本,請自行經過官方文檔選擇版本
把/src/test/kotlin/RunMirai.kt
中的qq號和密碼改爲你的
若是在根目錄下沒有run文件夾,則可能報錯,新建一個就行了
若是任務報錯先配置任務
而後配置登陸配置
用IDE中gradle的buldplugin
任務能夠在buid/mirai/
下生成一個.jar插件文件
把這個.jar文件放到mcl的plugin文件夾下,而後用cmd或者直接打開mcl.cmd運行
有什麼評論區問,之後再補充
相關qq羣 1044565129