From 68a9d49237fa3f081a0d8ad2ecf7ce75232aef45 Mon Sep 17 00:00:00 2001 From: Him188 Date: Mon, 11 May 2020 15:15:52 +0800 Subject: [PATCH 1/5] Add a java way to broadcast an event --- .../kotlin/net.mamoe.mirai/event/Event.kt | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/Event.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/Event.kt index 9f5c91f52..9ef4971cd 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/Event.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/Event.kt @@ -12,9 +12,12 @@ package net.mamoe.mirai.event import kotlinx.coroutines.CoroutineScope +import net.mamoe.mirai.JavaFriendlyAPI import net.mamoe.mirai.event.internal.broadcastInternal import net.mamoe.mirai.utils.MiraiExperimentalAPI import net.mamoe.mirai.utils.SinceMirai +import net.mamoe.mirai.utils.internal.runBlocking +import kotlin.jvm.JvmName import kotlin.jvm.JvmSynthetic import kotlin.jvm.Volatile @@ -140,7 +143,9 @@ interface CancellableEvent : Event { /** * 广播一个事件的唯一途径. + * @see __broadcastJava */ +@JvmSynthetic suspend fun E.broadcast(): E = apply { if (this is BroadcastControllable && !this.shouldBroadcast) { return@apply @@ -148,6 +153,21 @@ suspend fun E.broadcast(): E = apply { this@broadcast.broadcastInternal() // inline, no extra cost } +/** + * 在 Java 广播一个事件的唯一途径. + * + * 调用方法: `EventKt.broadcast(event)` + */ +@Suppress("FunctionName") +@JvmName("broadcast") +@JavaFriendlyAPI +fun E.__broadcastJava(): E = apply { + if (this is BroadcastControllable && !this.shouldBroadcast) { + return@apply + } + runBlocking { this@__broadcastJava.broadcastInternal() } +} + /** * 设置为 `true` 以关闭事件. * 所有的 `subscribe` 都能正常添加到监听器列表, 但所有的广播都会直接返回. From 7f33f48f98bdb55f95d787a77e956e0fa749021c Mon Sep 17 00:00:00 2001 From: Him188 Date: Mon, 11 May 2020 15:28:20 +0800 Subject: [PATCH 2/5] Improve docs --- mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/Event.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/Event.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/Event.kt index 9ef4971cd..8328f73d6 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/Event.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/Event.kt @@ -35,6 +35,8 @@ import kotlin.jvm.Volatile * * @see [broadcast] 广播事件 * @see [CoroutineScope.subscribe] 监听事件 + * + * @see CancellableEvent 可被取消的事件 */ interface Event { /** From aa12684050980475937c8c41141a47d8709907f2 Mon Sep 17 00:00:00 2001 From: Him188 Date: Mon, 11 May 2020 15:28:31 +0800 Subject: [PATCH 3/5] Let ContactOrBot implements CoroutineScope --- .../commonMain/kotlin/net.mamoe.mirai/contact/ContactOrBot.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/ContactOrBot.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/ContactOrBot.kt index dd76a4cd3..766ce8d99 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/ContactOrBot.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/ContactOrBot.kt @@ -9,6 +9,7 @@ package net.mamoe.mirai.contact +import kotlinx.coroutines.CoroutineScope import net.mamoe.mirai.Bot /** @@ -18,7 +19,7 @@ import net.mamoe.mirai.Bot * @see Contact * @see Bot */ -interface ContactOrBot { +interface ContactOrBot : CoroutineScope { /** * QQ 号或群号. */ From 29012d74c1497763b7067113d7b44300d8e22f5c Mon Sep 17 00:00:00 2001 From: Him188 Date: Mon, 11 May 2020 15:50:18 +0800 Subject: [PATCH 4/5] Add docs --- .../kotlin/net.mamoe.mirai/utils/MiraiLogger.kt | 2 ++ .../kotlin/net/mamoe/mirai/BotFactory.kt | 11 ++++++++--- .../kotlin/net/mamoe/mirai/BotFactoryJvm.kt | 17 ----------------- 3 files changed, 10 insertions(+), 20 deletions(-) delete mode 100644 mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/BotFactoryJvm.kt diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/MiraiLogger.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/MiraiLogger.kt index 19303e301..82c19fec2 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/MiraiLogger.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/MiraiLogger.kt @@ -28,6 +28,8 @@ import kotlin.jvm.JvmOverloads * **注意:** 请为日志做好分类, 即不同的模块使用不同的 [MiraiLogger]. * 如, [Bot] 中使用 identity 为 "Bot(qqId)" 的 [MiraiLogger] * 而 [Bot] 的网络处理中使用 identity 为 "BotNetworkHandler" 的. + * + * Java 调用: `Utils.getDefaultLogger().invoke(identity)` */ var DefaultLogger: (identity: String?) -> MiraiLogger = { PlatformLogger(it) } diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/BotFactory.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/BotFactory.kt index 0bb569206..cb9d4c579 100644 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/BotFactory.kt +++ b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/BotFactory.kt @@ -47,6 +47,8 @@ actual interface BotFactory { /** * 自动加载现有协议的 [BotFactory], 并使用指定的 [配置][configuration] 构造 [Bot] 实例 + * + * Java 调用方式: `BotFactoryJvm.newBot(...)` */ @JvmName("newBot") @JvmOverloads @@ -63,6 +65,8 @@ inline fun Bot(context: Context, qq: Long, password: String, configuration: (Bot /** * 自动加载现有协议的 [BotFactory], 并使用指定的 [配置][configuration] 构造 [Bot] 实例 + * + * Java 调用方式: `BotFactoryJvm.newBot(...)` */ @JvmName("newBot") @JvmOverloads @@ -79,6 +83,8 @@ inline fun Bot(qq: Long, password: String, configuration: (BotConfiguration.() - /** * 自动加载现有协议的 [BotFactory], 并使用指定的 [配置][configuration] 构造 [Bot] 实例 + * + * Java 调用方式: `BotFactoryJvm.newBot(...)` */ @JvmName("newBot") @JvmOverloads @@ -100,6 +106,8 @@ inline fun Bot(context: Context, qq: Long, passwordMd5: ByteArray, configuration /** * 自动加载现有协议的 [BotFactory], 并使用指定的 [配置][configuration] 构造 [Bot] 实例 + * + * Java 调用方式: `BotFactoryJvm.newBot(...)` */ @JvmName("newBot") @JvmOverloads @@ -114,9 +122,6 @@ inline fun Bot(qq: Long, passwordMd5: ByteArray, configuration: (BotConfiguratio factory.Bot(ContextImpl(), qq, passwordMd5, BotConfiguration().apply(configuration)) - - - // Do not use ServiceLoader. Probably not working on MPP @PublishedApi internal val factory: BotFactory = run { diff --git a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/BotFactoryJvm.kt b/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/BotFactoryJvm.kt deleted file mode 100644 index 726ca00f2..000000000 --- a/mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/BotFactoryJvm.kt +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright 2020 Mamoe Technologies and contributors. - * - * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证. - * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link. - * - * https://github.com/mamoe/mirai/blob/master/LICENSE - */ - -@file:JvmName("BotFactoryJvm") -@file:Suppress("FunctionName", "unused") - -package net.mamoe.mirai - -import net.mamoe.mirai.utils.BotConfiguration -import net.mamoe.mirai.utils.Context -import net.mamoe.mirai.utils.ContextImpl From 644af5e2aafaef1b612a77876914674462e99039 Mon Sep 17 00:00:00 2001 From: Him188 Date: Mon, 11 May 2020 16:05:41 +0800 Subject: [PATCH 5/5] Add docs --- .github/机器人和联系人架构.png | Bin 0 -> 14140 bytes CONTRIBUTING.md | 7 +- README.md | 5 +- docs/.mirai_images/d548dae5.png | Bin 0 -> 15594 bytes docs/.mirai_images/e02dc13d.png | Bin 0 -> 5479 bytes docs/guide_quick_start.md | 21 +++--- docs/mirai.md | 112 ++++++++++++++++++++++++++++++++ 7 files changed, 127 insertions(+), 18 deletions(-) create mode 100644 .github/机器人和联系人架构.png create mode 100644 docs/.mirai_images/d548dae5.png create mode 100644 docs/.mirai_images/e02dc13d.png create mode 100644 docs/mirai.md diff --git a/.github/机器人和联系人架构.png b/.github/机器人和联系人架构.png new file mode 100644 index 0000000000000000000000000000000000000000..a92865f786ccd18d467b7921291efea6a6594070 GIT binary patch literal 14140 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 b?ESe_9X4Qn@g4jsj?O^GSi3^&>fQeVpM-MQ literal 0 HcmV?d00001 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 73f41116d..8fde54efb 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -6,6 +6,8 @@ mirai 欢迎一切形式的代码贡献。你可以通过以下几种途径向 m ## 主仓库 `mirai-core` +**阅读文档**: [docs/mirai.md](docs/mirai.md) + ### 代码优化 优化功能设计或实现, 或是引入一个新的设计(建议先通过 issue 与我们达成共识) @@ -13,15 +15,10 @@ mirai 欢迎一切形式的代码贡献。你可以通过以下几种途径向 m 为 mirai 添加更广泛的协议支持。 ### 注意事项 -- mirai 框架已经把实现协议需要做的工作最小化. 为避免工作重复, 请务必熟悉 `net.mamoe.mirai.utils` 和 `net.mamoe.mirai.qqandroid.utils` 中工具类 - mirai 使用 [`kotlinx.io`](https://github.com/Kotlin/kotlinx-io) IO 库 -- mirai 为多平台项目, 请务必考虑多平台兼容性 -- mirai 为全协程实现, 请在有必要的时候考虑并发安全性 - 尽量不要引用新的库 - 遵守 Kotlin 代码规范(提交前使用 IDE 格式化代码 (commit 时勾选 'Reformat code')) -- 熟悉 [`PacketFactory`](https://github.com/mamoe/mirai/blob/master/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/PacketFactory.kt) 架构 - 不要手动拆解数据包. 请一定使用 `kotlinx.serialization` 拆解 ProtoBuf, 使用 mirai 的 `Jce` 序列化器拆解 Jce 数据包, 使用 `kotlinx.serialization` 拆解 Json 数据. -- 必须保证高代码效率(使用 `ByteArrayPool`,`WeakRef` 等) ## 社区 diff --git a/README.md b/README.md index 71b2f7e26..bed859ce8 100644 --- a/README.md +++ b/README.md @@ -84,7 +84,7 @@ mirai 既可以作为项目中的 QQ 协议支持库, 也可以作为单独的 ### 开发者 -**了解 mirai 架构**: [Wiki](https://github.com/mamoe/mirai/wiki/Home) +**阅读文档**: [docs/mirai.md](docs/mirai.md) #### 使用 mirai 作为服务器,为 mirai 开发插件 @@ -130,10 +130,9 @@ Demos: [mirai-demos](https://github.com/mamoe/mirai-demos) ## 更新日志 -* 在 [Project](https://github.com/mamoe/mirai/projects/3) 查看已支持功能和计划 * 在 [CHANGELOG](https://github.com/mamoe/mirai/blob/master/CHANGELOG.md) 查看版本更新记录 (仅发布的版本) -## [贡献](https://github.com/mamoe/mirai/blob/master/CONTRIBUTING.md) +## [贡献](CONTRIBUTING.md) 我们欢迎一切形式的贡献。 我们也期待有更多人能加入 mirai 的开发。 diff --git a/docs/.mirai_images/d548dae5.png b/docs/.mirai_images/d548dae5.png new file mode 100644 index 0000000000000000000000000000000000000000..ba958f3b420459c356c671e4e66d7a6ec7b57200 GIT binary patch literal 15594 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 F{{w-KjyM1S literal 0 HcmV?d00001 diff --git a/docs/.mirai_images/e02dc13d.png b/docs/.mirai_images/e02dc13d.png new file mode 100644 index 0000000000000000000000000000000000000000..88a55007cd074ee4a56aafb6a70315308577de78 GIT binary patch literal 5479 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 literal 0 HcmV?d00001 diff --git a/docs/guide_quick_start.md b/docs/guide_quick_start.md index 771a6ae17..7b9062fc1 100644 --- a/docs/guide_quick_start.md +++ b/docs/guide_quick_start.md @@ -1,14 +1,12 @@ # Mirai Guide - Quick Start -由于 mirai 项目在快速推进中,因此内容时有变动,本文档的最后更新日期为```2020/3/26```,对应版本```0.30.1``` +由于 mirai 项目在快速推进中,因此内容时有变动,本文档的最后更新日期为```2020/5/11```,对应版本```1.0-RC2-1``` 本文适用于对 Kotlin 较熟悉的开发者, 使用 mirai 作为第三方依赖库引用任意一个 Kotlin, Java 或其他 JVM 平台的项目 **若你希望一份更基础的教程**, 请参阅: [mirai-guide-getting-started](guide_getting_started.md) -**若你希望使用 Java 开发**, 请参阅: [mirai-japt](https://github.com/mamoe/mirai-japt) - ## 构建需求 - Kotlin 1.3.71 (必须) @@ -76,7 +74,6 @@ implementation("net.mamoe:mirai-core-qqandroid-common:VERSION") **android** (Android 平台源集) **注意**: 在 [KT-37152](https://youtrack.jetbrains.com/issue/KT-37152) 修复前, mirai 无法支持 Android 平台目标. - ```kotlin implementation("net.mamoe:mirai-core-qqandroid-android:VERSION") ``` @@ -85,12 +82,16 @@ implementation("net.mamoe:mirai-core-qqandroid-android:VERSION") ```kotlin val bot = Bot(qqId, password).alsoLogin() -bot.subscribeMessages { - "你好" reply "你好!" - contains("图片"){ File("C:\\image.png").sendAsImage() } +bot.subscribeAlways { event -> + if (event.message.content.contains("你好")) { + reply("你好!") + } else if (event.message.content.contains("你好")) { + File("C:\\image.png").uploadAsImage() + } } -bot.subscribeAlways { - if (it.kind == BECOME_OPERATOR) - reply("${it.member.id} 成为了管理员") + +bot.subscribeAlways { event -> + if (event.kind == BECOME_OPERATOR) + reply("${event.member.id} 成为了管理员") } ``` diff --git a/docs/mirai.md b/docs/mirai.md new file mode 100644 index 000000000..dea61d4d1 --- /dev/null +++ b/docs/mirai.md @@ -0,0 +1,112 @@ +# mirai +欢迎来到 mirai 文档. + +本文档基于 mirai 1.0.0, 最后修改时间为 2020/5/11 + +## 声明 +1. mirai 为完全免费的开源项目. mirai 项目维护者和贡献者 (下文简称 '我们') 不通过任何方式收取任何费用, 也不提供任何稳定性保障. +2. mirai 不允许被用于任何违反相关法律法规的工作, 包括但不限于: 盗取账号密码, 盗窃用户资金, 群发违禁内容. 因此我们没有支持设备锁验证, 也没有支持免密登录 (在非常用地点登录会频繁要求输入验证码). +3. mirai 不提供任何可能促进上述违法行为的功能, 包括但不限于: 收发红包, 收发转账, 主动添加好友. +4. mirai 不公开任何协议接口. 不支持任何协议扩展. + +## 项目整体架构 +mirai 项目整体由 核心 (`mirai-core`) 与 控制台(`mirai-console`) 组成. + + +- [`mirai-core`](../mirai-core) 是机器人服务支持**库**. 提供所有机器人相关 API. **本身只包含抽象类和接口, 具体由协议模块实现**. + 可用的协议模块: + - [`mirai-core-qqandroid`](../mirai-core-qqandroid): Android QQ 8.3.0 版本协议实现. + + `mirai-core` 设计为一个 **`支持库`**, 意味着它可以被独立依赖, 在任意项目中使用. 详见下文. + + +- `mirai-core-qqandroid` 继承 `mirai-core`, 是 Android QQ 协议的实现. 在使用时只需参考 `mirai-core` 的 API. + + +- [`mirai-console`](https://github.com/mamoe/mirai-console) 是基于 `mirai-core` 的, 支持插件加载, 指令系统, 和配置等的**控制台框架**. + console 由 '后端' 和 '前端' 组成. + `mirai-console` 即为后端, 包含所有开发时需要用到的功能. + 可用的前端: + - 命令行: `mirai-console` 内置命令行后端. + - 基于 JavaFX 的图形端: [`mirai-console-graphical`](https://github.com/mamoe/mirai-console/tree/master/mirai-console-graphical) + - Unix 友好的终端: [`mirai-console-terminal`](https://github.com/mamoe/mirai-console/tree/master/mirai-console-terminal) + + +**注意**: `mirai-core` 于 2020 年 6 月发布的 `1.0.0` 版本正式进入稳定更新阶段, +**而 `mirai-console` 仍处于快速迭代阶段, 任何 API 都有可能在不经过警告的情况下改动, 任何 API 都不具有任何稳定性.** + +## `mirai-core` + +`mirai-core` 仅包含抽象类和接口和一些扩展方法, 且拥有非常完整的 KDoc (源码内文档). 此处没有必要过多赘述. + +你可以在这里快速地大致了解 mirai 的全部 API. + +要能看懂下文, 建议至少学习 Java, Kotlin 或 C# 其中一门语言. + +### 准备 + +mirai 全部使用 Kotlin, 若你无法理解部分 API, 可先简略阅读 Kotlin 参考: [kotlincn.net](https://www.kotlincn.net/docs/reference/) +有关协程 (`suspend`)部分, mirai 做了大量的兼容性转换以让 Java 使用相同的 API 阻塞地调用一个协程函数. +因此, 对于函数如 `suspend fun sendMessage(Message)`, Java 使用者也可以直接调用它. + +### 开始 + +1. [实验性 API 注解 MiraiExperimentalAPI](../mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/Annotations.kt#L41-L54) + +2. '机器人' 和 '联系人' + 1. [ContactOrBot](../mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/ContactOrBot.kt) + 2. [机器人对象 Bot](../mirai-core/src/commonMain/kotlin/net.mamoe.mirai/Bot.kt) + 3. [Contact](../mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/Contact.kt) + 4. [用户对象 User](../mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/User.kt) + 5. [好友对象 Friend](../mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/Friend.kt) + 6. [群对象 Group](../mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/Group.kt) + 7. [群成员对象 Member](../mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/Member.kt) + + 总结: [机器人和联系人架构](../.github/机器人和联系人架构.png). 其中 `CoroutineScope` 为 Kotlin 协程作用域, Java 使用者可忽略. + + +3. '消息' + 1. [消息对象 Message](../mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/Message.kt) + 特别注意, `Message` 分为 单个消息(`SingleMessage`) 和 多个消息, 即消息链(`MessageChain` ). + // TODO 此处还有更详细的扩展 API 解释, 待更新 + 2. [消息链 MessageChain](../mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/MessageChain.kt) + // TODO 此处还有更详细的扩展 API 解释, 待更新 + 3. 接下来可按需阅读各类型消息 [各类型消息](../mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/). 一个文件包含一种消息. + + +4. '事件' + mirai 支持异步的事件系统. + 1. [事件接口 Event](../mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/Event.kt) + 2. [广播事件 Event.broadcast](../mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/Event.kt) + 3. - Kotlin: [函数式监听事件 subscribe](../mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/subscriber.kt) + - Kotlin & Java: [方法反射监听事件 JvmMethodListeners](../mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/event/JvmMethodListeners.kt) + 4. 内建事件列表 [README](../mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/events/README.md). + 注意: mirai 将接收到的消息事件独立放置在 `net.mamoe.mirai.message` 下, 并命名为 `MessageEvent`. 并为他们实现了一些扩展. 详见 [MessageEvent.kt](../mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/MessageEvent.kt) + 5. 事件工具类和工具函数 (仅 Kotlin) (可以跳过本节): + 标注 (*) 的几种处理方式可能需要比较好的 Kotlin 技能才能理解并正确使用. 建议在不熟悉时不要使用它们. + - 挂起当前协程, 直到返回下一个事件实例: [nextEvent](../mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/nextEvent.kt) + - 挂起当前协程, 并从一个事件中同步一个值: [syncFromEvent](../mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/linear.kt) + - (*) 消息事件监听 DSL: [subscribeMessages](../mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/subscribeMessages.kt) + - (*) 协程 `select` 语法的监听方式: [selectMessages](../mirai-core/src/commonMain/kotlin/net.mamoe.mirai/event/select.kt) + - (*) 挂起协程并等待下一个与 `this` 语境相同的事件 [MessageEvent.nextMessage](../mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/utils.kt#L50) + + + +一切准备就绪. 现在开始构造 `Bot` 实例: + +1. `Bot` 的配置: [BotConfiguration](../mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/BotConfiguration.kt) + 可大致了解或跳过. 一般使用默认属性即可. +2. 构造 `Bot` 实例: [BotFactory](../mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/BotFactory.kt#L23), [newBot](../mirai-core/src/jvmMain/kotlin/net/mamoe/mirai/BotFactory.kt#L53) + +另外地, 你还可以了解 mirai 提供的多平台日志系统 (为了同时支持控制台和独立依赖): [MiraiLogger](../mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/MiraiLogger.kt), 也可以跳过这个内容 + +### 使用 + +使用 mirai 作为一个依赖库: 阅读 [Quick Start](../docs/guide_quick_start.md) 配置依赖. +使用 mirai 作为控制台框架: 使用 [mirai-console](https://github.com/mamoe/mirai-console) 开发插件 + +## `mirai-core-qqandroid` +`mirai-core` 的实现部分. 不提供任何说明. 使用者无需考虑任何协议实现过程. + +## `mirai-console` +此模块处于实验性阶段, 可能没有很好地文档支持, 详见 [mirai-console](https://github.com/mamoe/mirai-console) \ No newline at end of file