github mamoe/mirai 2.0-M1

latest releases: v2.16.0, v2.16.0-RC, v2.15.0...
pre-release3 years ago

概览

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(...)
  • 独立协议接口:
    • 新增接口 IMirai, 存放所有协议实现.
    • 将来会添加低级接口.

Bot

  • Bot 变为接口.
  • Bot 的部分静态方法更名. 在调用旧方法时会得到警告.

联系人

  • 所有联系人类型全部变为接口. 涉及: Contact, User, Friend, Group, Member.
  • 新增 UserOrBot 作为 UserBot 的公共接口.
  • 一些有关联系人 id 的 get 类型方法现在返回可空而不会抛出异常. 以 getOrFail 代替原会抛出异常的 get. 涉及的方法列表:
    • ContactList.get
    • Group.get,
    • Bot.getFriend, Bot.getGroup
  • Member 现在有子类 NormalMemberAnonymousMember.
    • 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 与一个 MessageChainVoice 将会覆盖第一个 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: 现在只比较两个 MessagecontentToString().
  • RichMessage 现在实现 ConstrainSingle
  • currentTimeSeconds, currentTimeMillis 变更为函数并移动到 mirai-core-utils
  • 修复 MessageChain.getValue 获取不正确的问题
  • 更名 PokeMessage.typePokeMessage.pokeType
  • 添加 FriendMessageEventTempMessageEvent 的公共父类 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 官方维护的项目的以下同步版本:

未来规划

在下一个里程碑 2.0-M2, mirai 将主要完成:

  • 稳定的消息序列化
  • ExternalImage 的重构 (以支持未来的文件发送)
  • Kotlin 扩展函数 API
  • mirai 码的稳定实现
  • 降低协议实现难度, 添加文档和注释
  • ...

mirai 将尽快完成 2.0 重构并在 2.0 之后加快版本发布频率并包含协议更新.

Don't miss a new mirai release

NewReleases is sending notifications on new releases.