概览
2.0-M1 完成 2.0 重构的主要不兼容变更. 架构上联系人和 Bot 变更为接口, 方法语义更清晰, 完善 Java 支持. 消息变为纯数据对象, 原生支持序列化. 单一消息的链接更符合开发直觉.
2.0-M1 解决了大量 1.x 阶段的设计问题, 并以 简化复杂度 为重要目标重新设计 mirai-core. 所有协议接口都被整合到 IMirai
, 多平台架构和内部协议实现的简化大幅降低扩展协议的难度, 另有登录协议的版本更新 (8.4.18). 新的架构为后续实现新协议建立基础.
模块变更
mirai-core
更名为 mirai-core-api
, mirai-core-qqandroid
更名为 mirai-core
(#461).
新模块规划:
mirai-core-utils
: Mirai 内部使用的一些工具方法. 为其他两个模块共享.mirai-core-api
: 包含Message
,Event
,Contact
等所有公开接口.mirai-core
: Android QQ 8.4.18 协议实现
mirai-core
依赖 mirai-core-api
. 在开发时依赖 mirai-core-api
, 在运行时提供 mirai-core
.
目标平台简化 (Kotlin MPP)
- 现在 mirai 所有多平台模块的
common
目标为 JVM.jvm
目标为桌面 JVM.android
目标为 Android JVM. Android 目标将会在未来不久发布. - 依赖 mirai-core 的 Kotlin 多平台项目, 现在需要配置 HMPP, 且只能为 JVM 目标添加依赖.
2.0-M1
所有不兼容变更都以加粗表示.
协议
- 登录协议更新为 Android QQ 8.4.18 (感谢 @wdvxdr1123)
- 过滤好友自动回复消息 (#571 by @sandtechnology)
- 默认使用 ANDROID_PHONE 协议 (#632)
- BotFactory 调整:
- Kotlin 函数名
Bot
变为newBot
- 在所有平台去除
Context
参数 - 原
Bot(...)
构造Bot
调整为使用BotFactory.newBot(...)
- Kotlin 函数名
- 独立协议接口:
- 新增接口
IMirai
, 存放所有协议实现. - 将来会添加低级接口.
- 新增接口
Bot
Bot
变为接口.Bot
的部分静态方法更名. 在调用旧方法时会得到警告.
联系人
- 所有联系人类型全部变为接口. 涉及:
Contact
,User
,Friend
,Group
,Member
. - 新增
UserOrBot
作为User
和Bot
的公共接口. - 一些有关联系人 id 的
get
类型方法现在返回可空而不会抛出异常. 以getOrFail
代替原会抛出异常的get
. 涉及的方法列表:ContactList.get
Group.get
,Bot.getFriend
,Bot.getGroup
- Member 现在有子类 NormalMember 和 AnonymousMember.
- 原 Member 表示的普通群成员现在是 NormalMember.
- 在 2.0-M2 将会支持匿名群成员及相关扩展.
- 添加成员函数
sendMessage(String)
- 新增
UserOrBot.nudge()
消息
-
重构 MessageSource, 支持分片的多个源消息 (#618):
MessageSource.id: Int
->MessageSource.ids: IntArray
MessageSource.internalId: Int
->MessageSource.internalIds: IntArray
- 以前 id 获取失败会返回
-1
, 现在会返回空数组.
-
Message.Key
移到顶层MessageKey
, 并提供多态支持:- 现在仅
ConstrainSingle
(即每条MessageChain
中只允许出现一个的消息) 才会有伴生对象MessageKey
. - 现在连接
ConstrainSingle
时将可能替换多条消息 (适应真实情况):- 由于
Voice
等消息只能单独存在, 连接Voice
与一个MessageChain
时Voice
将会覆盖第一个MessageContent
并删除其后所有其他MessageContent
. - 多态情况下子类消息会覆盖父类消息
- 详见
AbstractPolymorphicMessageKey
- 由于
- 现在仅
消息序列化
大部分 mirai 内置 Message
现在支持 kotlinx-serialization 序列化 (#219).
注意:
-
接口的序列化使用多态序列化
PolymorphicSerializer
. 特别地, kotlinx-serialization-json 会将多态环境的Message
序列化为数组, 其第一元素为类型全限定名, 第二元素为消息数据. -
序列化还未稳定, 但将会在 2.0.0 前达到稳定, 届时会有相关文档提供.
-
At
对象中不再存储显示内容 (display
). 现在At
对象仅包含一个属性target: Long
, 显示内容会在发送消息时获取. -
ForwardMessage
现在变为无状态的data class
. 原构造方法弃用保留到下个版本.
Java 支持
- 现在所有 Kotlin 协程函数都有为 Java 使用者生成的 阻塞式方法桥.
- 由于协议被归类到
IMirai
接口, Java 用户可以正常访问所有接口.
优化和修复
- 简化
DeviceInfo
, 更好地支持序列化 (#655 by @AdoptOSS) - 弃用
DefaultLogger
, 以MiraiLogger.create
代替 (#633) - 整理事件结构: 消息相关事件由
net.mamoe.mirai.message
移动到net.mamoe.mirai.event
(#699) - 修复
Message.contentEquals
: 现在只比较两个Message
的contentToString()
. RichMessage
现在实现ConstrainSingle
currentTimeSeconds
,currentTimeMillis
变更为函数并移动到 mirai-core-utils- 修复
MessageChain.getValue
获取不正确的问题 - 更名
PokeMessage.type
为PokeMessage.pokeType
- 添加
FriendMessageEvent
和TempMessageEvent
的公共父类UserMessageEvent
(#612) - 修复监听
MessageEvent
无法获取部分GroupMessageEvent
的问题 (#620) - 现在当桌面环境验证码弹窗可用时会提前在初始化中给出提示, 更安全地打开浏览器 (#543, #694)
- 修复图片后缀检测 (修复大量图片后缀为
.mirai
的问题) (#635) - 修复通知和好友消息同步时出现大量日志的问题 (#619)
- 协议内部优化 (#666 by @AdoptOSS)
- 修复缓存未正确释放的问题 (#675)
- 提升协议稳定性
从 1.x 迁移到 2.0-M1
所有依赖 1.x 编译的项目都无法与 2.x 兼容. mirai-core 在 2.0-M1 提供源码迁移帮助, 且会在 2.0-M2 删除.
替换依赖:
net.mamoe:mirai-core
->net.mamoe:mirai-core-api
net.mamoe:mirai-core-qqandroid
->net.mamoe:mirai-core
Kotlin:
- 将
MessageChain[PlainText]
等对已删除Message.Key
的消息类型的 get 调整为MessageChain.firstIsInstanceOrNull<PlainText>()
, 或使用MessageChain.content
获取消息内容 Bot.getFriend
等函数现在会返回Friend?
, 请手动处理为null
的情况或使用getFriendOrFail
.- 其他大多数变动都提供自动迁移帮助. 在错误上使用
Alt + Enter
可自动替换 (IntelliJ IDEA 和 Android Studio), 如图.
Java:
- 消息事件包名有调整, 根据 IDE 提示自动导入引用失效的包.
- Bot 构造方法调整, 将原
BotFactoryKt.newBot(...)
替换为BotFactory.INSTANCE.newBot(...)
. - 调用
Utils.getDefaultLogger().invoke(...)
替换为MiraiLogger.create(...)
Bot.getFriend
等函数现在返回可能为null
, 请手动处理为null
的情况或使用getFriendOrFail
.
衍生项目
在 2.0-M1, 你可以使用 mirai 官方维护的项目的以下同步版本:
- mirai-console:
2.0-M1
- chat-command:
0.2.0
- mirai-api-http:
1.9.1
- mirai-native:
1.9.5
未来规划
在下一个里程碑 2.0-M2
, mirai 将主要完成:
- 稳定的消息序列化
ExternalImage
的重构 (以支持未来的文件发送)- Kotlin 扩展函数 API
- mirai 码的稳定实现
- 降低协议实现难度, 添加文档和注释
- ...
mirai 将尽快完成 2.0 重构并在 2.0 之后加快版本发布频率并包含协议更新.