高效率 QQ 机器人支持库
UnsupportedSliderCaptchaException
的错误提示
java.lang.ArrayIndexOutOfBoundsException: arraycopy: last destination index 4132 out of bounds for byte[4096]
(#2309)
2.13.0 包含对 2.13 前几个预览版本的修复和一些优化
ANDROID_PHONE
登录时提示 "当前QQ版本过低,请升级至最新版本后再登录。" 的问题 (#2298, #2312 by @cssxsh)
已知
ANDROID_WATCH
可能仍然无法登录
此问题由 2.13.O-M1 引入, 在 2.13.0-RC 尝试过修复但没有成功解决. 本次修复已被验证可用.
LoginSolver.onSolveUnsafeDeviceLoginVerify
增加了默认实现
所以在实现
LoginSolver
就不需要覆盖这个已经被弃用的方法了. 请覆盖新增的支持短信验证的onSolveDeviceVerification
替代.
如果你好奇, commit 为 81a09549. 实际上它只会在很少的情况下有影响.
在
Group
类增加了引导等
因为阿里云代理不太稳定. 目前仍然优先尝试速度更快的阿里云代理, 在失败时会使用 Central 仓库.
以解决在 2.13 以前编译的插件的兼容性问题
kotlin.UninitializedPropertyAccessException
的问题 (#2317)
此问题非 2.13 引入
broadcastMsgSyncEvent
增加了 OtherClient
参数
不兼容旧版 (2.13.0-RC, 2.13.0-RC2) 代码
2.13.0-RC2 包含对 2.13 的补充和对 2.13.0-RC 的修复.
Invalid number format: 'msfwifi'
导致的立刻断开连接Bot.close
时出现 StackOverflowError
的问题 (#2266)Could not resolve net.mamoe:mirai-core-api:2.13.0-RC
) (#2270)java.lang.NoClassDefFoundError: okhttp3/Request$Builder
的问题 (#2263)此问题非 2.13 引入
2.13.0-RC 包含:
mirai-core-api
去除了对 kotlinx-coroutines-jdk8
的依赖.nextEvent
和 nextEventOrNull
新增 intercept
参数, 可在满足条件时拦截事件 (#1668, #2177 by @Nambers)好友分组定名为
FriendGroup
.
Friend.friendGroup
获取该好友所属分组.Bot.friendGroups
获取好友分组列表并操作分组.Group.active
获取群的活跃数据.Member.active
获取该成员的活跃数据.AbstractExternalResource.input
的默认实现
在实现自定义
ExternalResource
时可能有帮助
ANDROID_WATCH
和 MACOS
的协议信息 (#2228 by @cssxsh)HeartbeatFailedException
的问题 (#2175)现在不再有循环引用, 而且更简洁
CancellationException
将会被替换为真实原因
此修复也包含在 2.12.3
自 2.13.0-M1
也公开了进度条 API 供插件使用. 见
MiraiConsole.newProcessProgress()
.
/login
登录时使用可用的自动登录配置 (#2209 by @cssxsh)mirai-console-frontend-base
MiraiLogger.Factory
API 创建日志以帮助区分 mirai-console 和 mirai-console-loader
新增 Core 模拟测试框架 mirai-core-mock
. 版本号与 mirai-core
相同. 相关文档 (#1304, #1521)
使用模拟测试框架可以构造虚拟 Bot, 模拟收到各种事件.
2.13.0-M1 包含:
以下内容正在进行中, 将发布在 2.13.0-RC:
将 Ktor 嵌入 mirai-core 并且不公开 (#2096, #2084)
mirai 内部现在使用 Ktor 2.0 并且不公开.
所有曾经借由 mirai-core-api 获得 Ktor 依赖的用户都将需要显式定义 Ktor 依赖. 但是这将会解决版本兼容问题. 用户可以任选 Ktor 1 或者 Ktor 2
Audio
现在继承 ConstrainSingle
(#2093)
所以它将会只能单独作为内容存在于消息链中
这不会影响现在以正确逻辑编写的代码, 但可能影响一些边界情况
mirai-core 新增 native 编译目标, 可编译为动态链接库或可执行文件 (#2048)
native 编译目标是 Kotlin/Native, 不依赖 JVM. 支持 macOS, Windows, Linux.
目前只可以使用 Kotlin/Native 开发. C API 的导出正计划中.
特别感谢 @AdoptOSS 的帮助:
支持修改好友备注 (#554, #2112)
friend.remark
由val
变为var
, 修改时会触发FriendRemarkChangeEvent
.
在 Image
序列化时支持全部属性 (#2036 by @cssxsh)
以前只会输出
imageId
, 现在还会输出width
等全部必要属性. 兼容旧版本, 在读取时会使用默认0
值.
它现在完全支持全平台.
修复了一些元素的序列化可能有不期望行为的问题, 例如在不应该有type
(classDiscriminator
) 的时候有或相反.
正确支持并验证了@Contextual
.这可能导致新的问题, 建议在试用本测试版时测试是否还能正常工作并及时反馈问题以避免正式版本仍有问题
CommandSenderOnMessage
, 修正 CommandSender
的部分扩展的行为 (#2105)OtherClientCommandSenderOnMessageSync
(#1878, #1879 by @cssxsh, #2085)2.12 带来以下主要更新:
EventChannel
到协程 Flow
的对接;弃用 EmptyMessageChain
,以 emptyMessageChain()
函数替换 (#1997)
因为内部结构有变更,见下文。Java 可以
MessageUtils.emptyMessageChain()
替换。
MarketFace.contentToString
现在在原本会返回空字符串的情况下会返回 "[商城表情]"
(#2030 by
@cssxsh)
原本会返回空字符串是因为服务器提供的表情名称可能为空。
修复 FileMessage
的序列化名称 (#2041 by @cssxsh)
以前错误地使用了
Image
,现在改为FileMessage
。以前序列化的FileMessage
可能会无法反序列化。
Image.equals
现在会比较全部属性
而不是只比较
imageId
。因为现在图片没有一些详细属性时可能无法发送。
弃用 EventDisabled
属性 (#1911)
它可以关闭事件功能,但这并不是明智的做法。
弃用 GroupEntranceAnnouncementChangeEvent
(#1873)
这个事件在 2.7 增加
Announcements
时就已经无效了。
MessageChain
实现的性能,现在在大量调用 Message.plus
构造消息链也能获得与 MessageChainBuilder
相当的性能。(#1997)
只修改了内部实现,API 及行为都没有变化。
EventChannel.asFlow
获得事件通道的 Flow<...>
(#1911)
协程
Flow
很适合承载事件广播功能,拥有更高的通用性和扩展性。(mirai 未使用是因为在 miraiEventChannel
设计之时Flow
还未稳定)
EventChannel.exceptionHandler()
(#1953)BotConfiguration.disableAccountSecretes
关闭 account.secrets
account.secrets 保存账号的会话信息。 它可加速登录过程,也可能可以减少出现验证码的次数。如果遇到一段时间后无法接收消息通知等同步问题时可尝试禁用。
部分的消息类型的 toString
将包含更多属性,涉及:
Image
现在图片没有一些详细属性时可能无法发送,因此属性也与 imageId 一样重要。更多的信息将帮助调试。
MessageSource
QuoteReply
FileMessage
重写消息协议层与发送消息流程 (#1997)
可扩展,易于测试,为将来支持频道和模块化等做准备。这不会影响现有的功能。
为 ForwardMessage.BuilderNode
实现 toString
EventChannel
事件异常处理机制 (#1911)
现在广播方不会收到来自监听方的事件,监听方有全部责任处理自己的异常,未处理的异常会通过默认日志输出。
nextEvent
和 syncFromEvent
:
Event
、EventChannel
、Listener
-Dmirai.event.trace=true
启用
这将会在遇到异常时输出注册事件监听器时的 stacktrace,以及记录每一个事件的广播。
.mirai
的问题 (#1111)现在在开发介绍文档中能访问 mirai-console 相关文档,在《准备工作》中也能了解启动 console 的方式。
Bot.close
的自动登出增加超时CommandContext
,支持在指令中获得原消息链 (#2099)
三种内置指令
RawCommand
、SimpleCommand
和CompositeCommand
的 Kotlin 以及 Java 版(J
前缀)都支持。参考文档。 能获得原消息链也就能获得MessageMetadata
(#1835)。
JSimpleCommand
和 JCompositeCommand
修改 CommandArgumentContext
参考文档。
PluginCustomCommandSender
可供插件实现 CommandSender
(#1964)MiraiConsole.shutdown
来优雅地关闭 Console (#1959, #2016)
优雅指的是会禁用插件,依次停止各种服务并保存数据。
当有插件依赖这个失败的插件时,也会禁用相关插件。 实际上该功能可由前端选择是否开启。mirai 官方的终端前端以及 Mirai Android 都会启用该功能。
若 A 依赖 B,现在会先卸载 A 再卸载 B。
现在可以使用 Ktor 2.0
PluginManager.getPluginDescription
不再需要插件已被加载 (#2052)
这可能帮助实现
PluginLoader
。
警告在插件中使用
GlobalEventChannel
的危险性。
runConsole
启动模拟 Mirai Console
实例 (#2056, #2058)
解决了在 IDEA 直接运行 RunTerminal 时出现
NoClassDefError
等错误的问题 (#2055)。现在在 IDEA 新生成的项目可以选择 Mirai 文件夹中的Run Mirai Console
来启动测试。详见 文档。
shadowLink
打包的依赖在其他依赖也引用时无效的问题 (#2070)