diff --git a/docs/ConciseAPI.md b/docs/ConciseAPI.md new file mode 100644 index 00000000000..f9ecdb8aa7b --- /dev/null +++ b/docs/ConciseAPI.md @@ -0,0 +1,199 @@ +# Mirai - Concise API + +> 注: +> - 本章节展示关于 `mirai-core-api` 比较常用的 API 示例 +> - 请配合 `mirai-core-api` 源码查看 +> - 本章仅提供 API 粗略介绍 + +---------------------- + +# Bots + +## BotFactory + +`BotFactory` 用于创建一个新的 `Bot`, 详情请看 [Bots.md](Bots.md) + +```kotlin +val bot = BotFactory.newBot(/*....*/) + +// Java +Bot bot = BotFactory.INSTANCE.newBot(/*....*/); +Bot bot = Mirai.getInstance().getBotFactory().newBot(/*....*/); +``` + +# Misc utils + +## Logger + +Mirai 全部的日志都通过 `MiraiLogger` 输出, 查看 `MiraiLogger` 源码注释获得更多信息 + +## ExternalResource + +`ExternalResource` 代表一个外部文件, 可用于 文件上传, 图片发送, etc. + +构造 `ExternalResource` 可以通过以下方法构造 + +```kotlin +// kotlin +File("foo.txt").toExternalResource() + +// java +ExternalResource.create(new File("foo.txt")) +``` + +`ExternalResource.create()` 内置支持的数据类型有 `java.io.File`, `java.io.RandomAccessFile`, +`byte[]`, `java.io.InputStream` + +> 注: +> - `ExternalResource` 和 `java.io.InputStream` 等资源一样, 需要手动关闭 `close()` +> - 使用 `java.io.InputStream`, `java.io.RandomAccessFile` 构造 `ExternalResource` +> 时, 需要关闭 `java.io.InputStream` 或 `java.io.RandomAccessFile` + + +```kotlin +// Example + +// kotlin +val inputStream: InputStream = TODO() +val resource = inputStream.use { it.toExternalResource() } + +// java +ExternalResource resource; +try (InputStream inputStream = TODO()) { + resource = ExternalResource.create(inputStream); +} catch (IOException exception) { + // on Exception catch + throw new RuntimeException("Can't create a new external resource", exception); +} + +``` + +# Contact & Message + +## Send Image + +### Origin send image + +最原始的发送图片的方法,就是先 `uploadImage` 然后 `sendMessage` + +Kotlin 可以使用自动补全得到相关方法 + +> `contact.uploadImage // IDEA 补全` + +Java 可以使用 `contact.uploadImage(ExternalResource)` 来得到一个图片对象 +(~~这也是为啥 ExternalResource 在前面~~) +也可以使用 `Contact` 内的静态方法 + +```java +Image i = Contact.uploadImage(/*....*/); +Image i = ExternalResource.uploadAsImage(/*...*/); +``` + +### sendImage + +`sendImage` 相当于先进行 `uploadImage` 然后再 `sendMessage` + +Kotlin 可以使用自动补全得到相关方法 + +> `contact.sendImage // IDEA 补全` + +由于 `sendImage` 是 `Contact` 和 `ExternalResource` 内的静态方法, +Java 可以使用下述方法调用 + +```java +Contact.sendImage(/**/); +ExternalResource.sendAsImage(/*...*/); +``` + +## Send Voice + +发送语音与发送图片的区别不大,都是先 `upload` 然后 `send` + +> - 在 2.7.0 之前,只有群聊 (`Group`) 支持语音, 2.7.0 之后支持私聊语音 +> - 每次发送新语言都重新 `upload`, 避免复用 `Voice` 对象 +> - **只支持 `amr` 和 `silk` 格式** + +要得到一个语音对象, 需要先 `uploadVoice` + +Kotlin 可以使用自动补全得到相关方法 + +> `contact.uploadVoice // IDEA 补全` + +Java 可以使用 `contact.uploadVoice(ExternalResource)` 来得到一个语音对象 +(~~这也是为啥 ExternalResource 在前面~~) +也可以使用 `ExternalResource` 定义的扩展方法 + +```java +contact.sendMessage(ExternalResource.uploadAsVoice(/*...*/)); +``` + +## Members + +`Member` 对象分为 `NormalMember`(正常的群成员) 和 `AnonymousMember`(匿名) + +对 `Member` 操作时需要具体操作时应该先判断是否为 `NormalMember` 然后强转 + +```kotlin +// kotlin +if (member is NormalMember) { // kotlin smart cast +} +``` +```java +// java +if (member instanceof NormalMember) { + NormalMember nMember = (NormalMember) member; +} +``` + +## Recall Message + +撤回信息可以通过 `MessageChain` 或者 `MessageSource` 撤回。 + +```kotlin +subscribeAlways {// this: MessageEvent + this.message.recall() + + this.message.source.recall() + + // Java + MessageSource.recall(event.getMessage()); + MessageSource.recall(event.getMessage().getOrFail(MessageSource.Key)); +} +``` + +# Events + +常用事件 + +| Name | Desc | +| :---------------- | :------------ | +| MessageEvent | Bot 收到一条新消息 | +| NewFriendRequestEvent | 你有一条新的好友申请 | +| MemberJoinEvent | 有新群成员加入群 | +| MemberLeaveEvent | 群成员离开群聊 | +| BotInvitedJoinGroupRequestEvent | Bot 收到了一个加群邀请 | +| BotJoinGroupEvent | Bot 加入了一个群聊 | +| MemberJoinRequestEvent | 新的入群申请 | + +### MessageEvent + +当直接监听 `MessageEvent` 时,可以考虑排除 Bot 信息同步事件 `MessageSyncEvent` + +`MessageSyncEvent` 是 `Bot` 账号在其他客户端发送消息时同步到 mirai 的事件 + +```kotlin +eventChannel.subscribeAlways { // this: MessageEvent + if (this is MessageSyncEvent) return@subscribeAlways +} +``` + +# IMirai + +`Mirai API` 接口. 是 `Mirai API` 与 Mirai 协议实现对接的接口. + +`IMirai` 内定义的接口都是较底层的 API, 如果无必要, 尽量避免使用 `IMirai` 相关的方法 + +最底层的方法位于 `LowLevelApiAccessor` 内, 其方法都使用 `@LowLeveApi` 标注, +`IMirai` 接口继承 `LowLevelApiAccessor` + +使用 `IMirai` 的标准 API 有稳定性保障, 但是由 `@LowLevelApi` 标注的方法无保障 diff --git a/docs/CoreAPI.md b/docs/CoreAPI.md index 183af8be990..c58595fad02 100644 --- a/docs/CoreAPI.md +++ b/docs/CoreAPI.md @@ -11,4 +11,8 @@ - 事件 [Events](Events.md) - 消息 [Messages](Messages.md) +*附录* + +- 常用 API [ConciseAPI](ConciseAPI.md) + > 希望改进文档? 请在 [#848](https://github.com/mamoe/mirai/discussions/848) 提出建议