- 修复 ListenerHost Java 兼容性问题 (#443, #446 by @Karlatemp)
- 修复 JvmMethodEvents
T.registerEvents
注册时错误判断@NotNull
注解的问题 (#436)
- 修复最后一个 mirai 码之后的消息无法解析的问题 (#431 @cxy654849388)
- 支持 Android 手表协议 (
BotConfiguration.MiraiProtocol.ANDROID_WATCH
) EventHandler
现在支持Nothing
类型.- 修复无需同意直接进群时,在加载新群信息完成前收到消息过早处理的问题 (#370)
- 修复在某些情况下,管理员邀请群Bot加群会被误判为群成员申请加群的问题 (#402 by @kenvix)
- 修复从其他客户端加群时未同步的问题 (#404, #410)
- 修复
ConfigPushSvc.PushReq
解析失败的问题 (#417) - 修复
_lowLevelGetGroupActiveData
- 修复
SimpleListenerHost.coroutineScope
潜在的 Job 被覆盖的问题
- 修复上传图片失败时内存泄露的问题 (#385)
- 修复大量图片同时上传时出错的问题 (#387)
- 修复在一些情况下 BotOfflineEvent 没有正常处理而无法继续接收消息的问题 (#376)
- 修复 Bot 在某个群 T 出某个人导致 Bot 终止的问题 (#372)
- 修复
@PlannedRemoval
的文档
- 添加
BotConfiguration.json
, 作为序列化时使用的 Json format, 修复潜在的因 kotlinx.serialization 进行不兼容更新而导致的不兼容.
不兼容变更:
- Image.imageId 后缀由
.mirai
变为图片文件实际类型, 如.png
,.jpg
. 兼容原.mirai
后缀.
修复:
- 修复 friendlist.GetTroopListReqV2:java.lang.IllegalStateException: type mismatch 10 (#405)
主要:
- 添加实验性
CodableMessage
作为支持 mirai 码的Message
的接口. - 支持 mirai 码 解析; 新模块
mirai-serialization
- 实现
MessagePreSendEvent
和MessagePostSendEvent
(#339).
不兼容变更:
- 重命名实验性 API
CustomMessage.Factory.serialize
到CustomMessage.Factory.dump
- 重命名实验性 API
CustomMessage.Factory.deserialize
到CustomMessage.Factory.load
- 弃用
MessageSendEvent
(#339). 迁移计划: WARNING in 1.1.0, ERROR in 1.2.0, REMOVE in 1.3.0 - 调整
VipFace
的 mirai 码表示, 详见 mirai 码规范 Face.toString()
现在返回表情名称, 如 "[偷笑]", 而不是 "[表情]" (#345 @goldimax)
优化和修复:
- 修复群头像的获取不正确的问题 (#340)
- 将
PttMessage
与Voice
标注@MiraiExperimentalAPI
(missing) - 删除
Message.plus(another: Flow<Message>)
的@ExperimentalCoroutinesApi
- 提升发送群消息的稳定性
- 一些文档优化
- 其他内部优化
- 提升在上个版本中弃用的 API 的弃用等级
- 新增
Bot.botInstancesSequence
- 修复日志中的时间未更新的问题
- 修复在某些情况下,Bot登录的时候无限重连 (#361)
- 优化一些文档注释
- 新增临时会话消息发送事件:
TempMessageSendEvent
(#338) - 新增
Bot.isOnline
(#342)
- 修复日志重定向到文件后无换行的问题
- 修复 Bot 被邀请入群事件的解析, 添加
BotJoinGroupEvent.Invite
(#344) - 修复 IPv6 地址支持 (#334)
- 修复一些 KDoc (#337)
- 优化一些内部的日志的显示
ContactOrBot
现在继承CoroutineScope
- 在没有手动指定
deviceInfo
时构建 Bot 将会发出警告, 须手动选择使用randomDeviceInfo
或fileBasedDeviceInfo
或自定义, 详见 BotConfiguration.kt: Lines 69-72
- 引入
SimpleListenerHost
以帮助 Java 处理事件监听 - 添加 Java 广播事件的方式:
EventKt.broadcast(Event)
- 添加
Bot.getInstanceOrNull
- 改进 JVM 平台的
PlatformLogger
, 添加DirectoryLogger
,SingleFileLogger
以提供重定向日志的快捷方式 - 统一日志格式, 使用 (正则)
^([\w-]*\s[\w:]*)\s(\w)\/(.*?):\s(.+)$
. 详见 PlatformLogger.jvm.kt: Line 46
- 弃用
Bot.queryUrl(Image)
, 改用image.queryUrl()
扩展. (保留兼容到 1.2.0) - 弃用
Bot.accept*
,Bot.reject*
等相应入群请求等事件的方法, 改用事件的成员函数. (保留兼容到 1.2.0)
- 修复
Bot
实例化时NPE
问题 - 修复网络状态差时
Bot
网络模块无法处理分包的问题 - 修复当无 Bot 在线时调用
image.queryUrl()
抛出的异常与 KDoc 描述不符的问题 - 修复
BotJoinGroupEvent
重复广播问题 - 修复邀请 Bot 进群时事件处理异常的问题 (#319)
- 修复当
Event
被实现为一个 Kotlinobject
时无法正常拦截事件的问题 - 修复图片链接获取为空的问题 (#318)
- 修复成员被移除群后可能发生内存泄露的问题
- 修复异常没有正确输出到日志的问题
- 修复一些
DefaultLogger
的不恰当使用的问题 - 修复
UnknownHostException
未被正常捕获的问题
- 在 Bot 被禁言时忽略
reply
方式创建的监听器 (subscribeMessages
DSL) - 使用更宽松的方式读取
device.json
- 将
Bot.selfQQ
标注@MiraiExperimentalAPI
- 提高默认心跳超时时间
- 改进多处 KDoc
- 更新 kotlinx-coroutines-core 到 1.3.7
- ... 忽略了内部变动
修复一个 VerifyError
主要内容:
- 增强网络稳定性 (#298, #317), 修复
Bot.close
或 Bot 离线后没有从Bot.botInstances
中删除的问题 (#317) subscribeMessages
现在默认使用MONITOR
优先级MessageChain
现在继承List<SingleMessage>
- 新增
messageChainOf(vararg Message)
- 支持 Bot 头像更改事件:
BotAvatarChangedEvent
(#271) - 支持好友头像更改事件:
FriendAvatarChangedEvent
- 新增
nextEventOrNull
: 挂起当前协程, 直到监听到事件的广播, 返回这个事件实例. 超时时返回null
- 弃用
Bot.subscribe.*
,Bot.nextMessage
,Bot.subscribe.*Messages
:
为了更好的协程生命周期管理, 这些函数已经被隐藏, 保留二进制兼容到 1.3.0.
现有源代码不会被破坏, 但将不再筛选事件的Bot
实例. 在 mirai 决定好替代的 API 前需要手动筛选. (即不影响目前单 Bot 运行的服务) - 支持在事件监听时使用 Kotlin 函数引用:
suspend fun onMessage(event: GroupMessageEvent): ListeningStatus { return ListeningStatus.LISTENING } scope.subscribe(::onMessage /*, priority=..., concurrency=... */)
- 支持反射式事件监听, 改善 Java 的事件监听体验. 示例查看 JvmMethodEventsTest.kt: Line 22
- 添加
typealias EventPriority = Listener.EventPriority
- 优化
Face
的构造器: 现在Face
拥有一个参数为id
的公开构造器 - 让
ContactList
实现接口Collection
- 弃用
QuoteReply.time
等语意不明的扩展 (无法区分time
是source
的时间还是QuoteReply
自身时间)
优化 & 修复:
- 删除
FileCacheStrategy.newImageCache(URL, format: String)
中的format
参数 - 隐藏
MessageChain
原有Iterable
相关 API (兼容现有代码) - 修复
Message.repeat
- 修复
MemberJoinEvent
比MemberJoinRequestEvent
早广播的问题 (#288) - 修复 Bot 接受好友申请时 groupId 处理错误 (#309)
- 修复
MessageSubscribersBuilder
一处 KDoc 错误 (#308 @wuxianucw) - 修复 Android 平台
BufferedImage ClassNotDefFound
的问题 - 优化
MessageSource.internalId
KDoc - 优化 重连时的计时显示 (#311 @Karlatemp)
- 优化
Bot.getInstance
找不到相关Bot
实例时的异常信息 - 将
MessageMetadata.contentToString
定义为final
- 忽略了 732 类型同步消息 (原启动后会大量显示)
- 忽略 'VIP 进群提示' 的群同步消息
- 让随机设备信息更随机
- 其他一些内部优化 (无公开 API 变更)
特别感谢 @Karlatemp (#279)
-
支持事件拦截:
Event.intercept()
,Event.isIntercepted
-
支持事件优先级:
HIGHEST, HIGH, NORMAL, LOW, LOWEST
和MONITOR
事件广播时按监听器的优先级从高到低依次调用, 在任意一个监听器 拦截事件(Event.intercept()
) 后停止广播, 不调用后续监听器.
最后调用MONITOR
级别的监听器. -
在
subscribe
,subscribeAlways
,nextMessage
,syncFromEvent
,subscribeMessages
等所有事件监听函数中添加priority
参数, 默认使用NORMAL
优先级.
兼容1.0
以前的 API 到1.2.0
, 旧版本 API 使用MONITOR
级别.
- 新增
FileCacheStrategy
, 可管理上传图片等操作时的缓存行为. - 内置内存缓存 (
FileCacheStrategy.MemoryCache
) 与默认使用的临时文件 (FileCacheStrategy.TempCache
) 缓存, 可选临时文件存放目录 - 新增
BotConfiguration.fileCacheStrategy
, 为单个Bot
指定缓存策略 - 在图片上传 (无论是否成功) 删除临时文件
- 图片上传失败时支持自动重试
- 修复部分情况下文件没有关闭的问题 (#302)
- 因新架构为懒惰处理, 弃用所有
*.suspendToExternalImage
(#299)
-
原有
ContactMessage
实际上是一个事件, 而其命名与消息Message
易产生迷惑.
弃用 (兼容到1.2.0
):MessagePacket
MessagePacketBase
进行如下更名:
ContactMessage
->MessageEvent
FriendMessage
->FriendMessageEvent
GroupMessage
->GroupMessageEvent
TempMessage
->TempMessageEvent
暂未决定是否提供
UserMessageEvent
作为TempMessageEvent
和FriendMessageEvent
的公共父类. -
优化扩展函数结构, 统一放置在
MessageEventExtensions
, 以使MessageEvent
结构清晰.
- 可选, 且默认作为平板身份登录, 与手机电脑不冲突.
- 可通过
BotConfiguration.protocol
切换协议.
MessageChain.get
现在返回可空的Message
. 可迁移到MessageChain.getOrFail
.- 添加
nextEvent
: 挂起当前协程, 直到监听到事件[E]
的广播, 返回这个事件实例. - 删除部分冗长的如
nextMessageContainingOrNullAsync
等函数. - 添加
Message.content
扩展属性作为Message.contentToString()
的捷径 - 简化图片结构, 弃用
OnlineFriendImage
,OnlineGroupImage
,OfflineGroupImage
,OfflineFriendImage
这四个类. - 修复关闭验证码窗口后阻塞协程的问题 (#296)
- 删除全部
0.x.x
版本更新时做的兼容 - 删除全部
@SinceMirai("0.x.0")
- 支持接收群语音消息
- 优化图片 ID 正则表达式
- 优化大量 KDoc
- 优化上传图片和长消息时的日志内容
- 允许引用回复离线的消息源 (在
MessageChain.quote
时消息链中的MessageSource
可以为OfflineMessageSource
) - 拆分 JCE 序列化到独立的库 (#300)
- 在重连时增加计时
- 简化
MemberPermission
比较 - 在消息事件中使用强引用 (#303)
- 修复邀请机器人进群事件无法解析的问题 (#301)
开发版本. 频繁更新, 不保证高稳定性
在 1.0.0
正式版发布时, 所有为旧版本做的兼容都将删除, 因此请尽快迁移.
Message
不再继承CharSequence
(兼容到1.0.0
)- 废弃
XmlMessage
和JsonMessage
. 需使用ServiceMessage
并手动指定serviceId
- 修复登录时概率失败的问题
- 提高事件处理稳定性
- Java 事件默认
LOCKED
, 而不是CONCURRENT
- 弃用
PlainText.stringValue
, 以PlainText.content
替代 - 将
VipFace
作为PlainText
发送, 而不是抛出异常 - 修复
BufferedImage.toExternalImage
降低图片质量的问题
- 优化登录初始化, 提高稳定性 (#282)
- 支持 VIP 表情的解析:
VipFace
(不支持发送) - 支持更多的戳一戳消息 (
PokeMessage
) 类型 - 修复 Android 平台的正则语法错误问题
- 修复
BotInvitedJoinRequestEvent.ignore
- 提升
LockFreeLinkedList
遍历性能, 即ContactList
遍历性能 - 将
LockFreeLinkedList
标注@MiraiInternalAPI
并计划于 1.0.0 修改为internal
- 支持匿名消息解析 (#277)
- 修复部分情况下撤回失败的问题
- 修复部分情况下解析群名片错误的问题
- 修复解析匿名群成员错误的问题
- 修复
LoginSolver
Swing
选择问题 - 添加
NoStandardInputForCaptchaException
, 在无可用标准输入时中断登录
- 添加
Message.isContentEmpty()
和Message.isContentNotEmpty()
- 在发送消息前检查是否为空 (#268)
- 修复重复收到一些事件的问题 (#259)
- 支持所有图片的下载链接获取 (#250)
- 修复部分情况下验证码窗口无法显示的问题 (#270)
- 构造
ForwardMessage
时不允许ForwardMessage.nodeList
为空.
- 完善
Message
相关的 KDoc - 在支持图像界面的环境下弹出验证码输入 (#257)
- 修复无法通过 id 发送图片的问题 (#262)
- 修复彩色群名解析不全的问题 (#263)
- 修复长消息发送失败的问题 (#256)
- 撤销
Bot.instances
更改, 添加新的Bot.botInstances
以兼容以前代码 - 修复密码错误时未停止重连的问题
- 修复
ForwardMessage
无法从firstOrNull
获取的问题
二进制不兼容的修改: Bot.instances
现在返回 List<Bot>
, 而不是 List<WeakRef<Bot>>
由于他们在 JVM 签名相同, 无法做兼容.
原有 Member
继承 QQ
, QQ
继承 Contact
架构改变.
新架构为:
- 弃用
QQ
命名 (二进制兼容到 1.0.0) - 新增
User
继承Contact
, 作为Member
和Friend
的父类 Member
继承User
Friend
继承User
由于 Member
不再是 QQ
子类, 而原本表示 '好友' 意义的 QQ
删除,
需要根据实际情况替换 QQ
的引用为 Friend
或 Group
因修改, 新增以下 API:
fun Member.asFriend(): Friend
: 得到此成员作为好友的对象或抛出异常fun Member.asFriendOrNull(): Friend
: 得到此成员作为好友的对象或返回null
inline val Member.isFriend: Boolean
: 判断此成员是否为好友
同时有以下修改:
val User.nameCardOrNick
: 获取非空群名片 (如果是群员) 或昵称- 弃用
fun Member.isMuted()
而改为属性val Member.isMuted
- 构造所有类型图片时只接受唯一一个参数
imageId: String
. - 所有类型图片只能获取唯一一个属性
imageId: String
(以前可以获取长宽等数据) - 提高发送图片的性能
- 优化
BufferedImage.toExternalImage
的性能 - 统一图片后缀:
{ ... }.mirai
-
新增合并转发及其 DSL
-
新增
OfflineMessageSource
构造 -
新增
MessageSource
修改:MessageSource.copyAmend(block)
-
修复 'sequence not yet available' 问题 (#)
-
修复好友消息的消息源 id 错误的问题 (#247)
-
如果群成员是好友, 则发送好友消息, 而不是临时会话消息.
-
添加
MessageSource.internalId
以便将来使用 -
添加
OnlineMessageSource.toOffline
-
添加
ContactMessage.time
-
添加
ContactMessage.senderName
可使用 DSL 构造离线消息, 修改其发送人, 发送时间, 发送内容等. 这对于跨群转发等情况十分有用.
MessageSourceBuilder.kt: Line 90
DSL 总览:
val source: OfflineMessageSource = bot.buildMessageSource {
bot sendTo target // 指定发送人和发送目标
metadata(source) // 从另一个消息源复制 id, internalId, time
messages { // 指定消息内容
+"hi"
}
}
合并转发: ForwardMessage
DSL: ForwardMessageBuilder
DSL 总览:
buildForwardMessage {
123456789 named "鸽子 A" says "咕"
100200300 named "鸽子 C" at 1582315452 says "咕咕咕" // at 设置时间
987654321 named "鸽子 B" says "咕"
myFriend says "咕"
bot says { // 构造消息链, 同 `buildMessageChain`
+"发个图片试试"
+Image("{90CCED1C-2D64-313B-5D66-46625CAB31D7}.jpg")
}
}
不支持解析别人的转发.
- 支持 bot 名片被其他人修改时的同步
- 修复登录时遇到服务器不可用时无法继续重连的问题
- 更名
Identified
到ContactOrBot
, 去掉其 '实验性' 注解 Bot.instances
现在返回List<Bot>
, 而不是List<WeakRef<Bot>>
(二进制兼容)- 更名
subscribingGet
到syncFromEvent
, 并将其定义为稳定 API. - 更名
subscribingGetAsync
到asyncFromEvent
, 并将其定义为稳定 API. - 添加接受
eventClass: KClass<Event>
参数的事件监听subscribe
- 在
MessageSubscribersBuilder
添加sentBy(User)
,sentFrom(Group)
,atAll
,at
DSL - 修复某些时候未处理
BotOfflineEvent.Force
的问题
- 新增自定义消息 (实验性):
CustomMessage
- 新增
MessageChain.contentEquals
- 新增
Message.isPlain
,Message.isNotPlain
- 新增
MessageChain.allContent
,MessageChain.noneContent
- 修复
CombinedMessage.toString
顺序错误, 添加缓存 - 新增
BotConfiguration.inheritCoroutineContext
- 将 Java API
MessageChain.getOrNull
更名为MessageChain.firstOrNull
- 将 Java API
MessageChain.get
更名为MessageChain.first
- 将 Java API
MessageReceipt.recall(long)
更名为MessageReceipt.recallIn(long)
以与其他 API 保持一致 - 优化
MessageChainBuilder
构建逻辑
- 上传长消息和图片时允许重试, 提高稳定性
- 优化无网络时的重连逻辑
- 在
Message
中添加equals
和hashCode
, 将部分类型消息定义为data class
MessageSource.id
现在返回非 0 序列号- 实现已撤回判断, 同一个
MessageSource
只能撤回一次
- 修复 #220: 无法正常解析邀请机器人进群的富文本消息
- 修复 #236: 删除无用的 getter 方法生成
- 修复上传长消息时报错错误的问题
新增:
- 在群名修改事件(
GroupNameChangeEvent
)中支持获取操作人 - 修复 #229, 引入
ServiceMessage
作为JsonMessage
,XmlMessage
的父类并处理所有类型富文本消息解析 - 将所有
RichMessage
标注MiraiExperimentalAPI
以警告将来改动
问题修复:
- 修复潜在的长消息上传失败问题
- 简化
MessageSubscriberBuilder
DSL, 整理linear.kt
,subscribers.kt
- 修复启动时概率解析失败 ConfigPushSvc.PushReq
- 修复 #228: 登录时没有因
LoginFailedException
中断 - 重构登录重连控制, 确保单一进程
- 处理无网络连接问题, 在无网络时将不尝试登录而等待网络连接
- 修复 #227: Android 最新版无法编译
- 修复 #226: BotUnmuteEvent
- 修复 #225: 重复接收到群消息撤回问题
- 修复 #220: 无法正常解析邀请机器人进群的富文本消息
- 修复 #217: 解析 OnlinePush confess 状态时没有覆盖全面
- 优化遇到未知消息时的日志
- 修复
OnlineMessageSource.Incoming.target
类型错误 - 引入实验性
Identified
接口作为Contact
和Bot
的公共接口 - 加快图片 MD5 计算过程
- 加快图片上传过程
- 其他小优化
从 0.37.1
起 JVM 平台依赖无需带 "-jvm" 模块名
即原 "mirai-core-jvm" 和 "mirai-core-qqandroid-jvm" 均需去掉 "-jvm", 变为 "mirai-core" 和 "mirai-core-qqandroid"
- 登录时尝试多个服务器, 随服务器需求切换服务器 (解决潜在的无法登录的问题) (#52)
- 优化带有
QuoteReply
时的消息长度估算 - 添加
MessageChainBuilder.build
, 效果同asMessageChain
- 在
ContactMessage
中添加At.isBot
- 在
MessageSubscribersBuilder
中添加String.invoke
,atBot
DSL
- 支持主动退群:
Group.quit
,BotLeaveEvent.Active
- 支持临时消息撤回
- 支持好友消息撤回
- 修复一个内存泄露问题
- 修复彩色群名片读取失败的问题
- 修复退群事件重复广播的问题 (#221)
- 修复
botPermission
- 删除一些无用的调试输出
- 支持临时会话:
TempMessage
(#16) - 支持群员主动加入事件
MemberJoinEvent.Active
- 添加
subscribeTempMessages
等相关 DSL - 添加
FriendAddEvent
,FriendDeleteEvent
(#216) - 修复各种事件重复广播的问题 (#173, #212)
- 修复
OfflineMessageSource.id
- 修复
Member.kick
- 修复彩色群名片读取, 支持群名片更改事件 (#210)
- 增加超时 (#175)
- 支持合并转发消息的解析, 修复部分情况下长消息解析失败的问题
- 修复新成员加入时没有添加进成员列表的问题 (#172)
- 新增处理加好友请求:
NewFriendRequestEvent
- 新增处理加群请求:
MemberJoinRequestEvent
- 现在
MessageSource.originalMessage
也可以获取到MessageSource
- 支持机器人加入了大量群时的群列表获取
- 优化 init 过程
- 添加更清晰的错误日志
- 修复撤回自己发送的消息时的权限判定
- 修复
botAsMember.nameCard
修改时需要管理员权限的问题 - 修复
MessageSource.key
- 修复其他一些小问题
- 修复长消息判定.
- 为
selectMessages
,selectMessagesUnit
添加可选筛选 context 的参数:filterContext: Boolean
- 统一消息日志
- 加快重连速度
Message
改动 (二进制兼容):
- 添加
Message.contentToString
以转换为最接近官方消息的字符串 - 添加
ConstrainSingle
的Message
类型以保证一个消息链中只存在一个QuoteReply
和一个MessageSource
CombinedMessage
现在实现接口MessageChian
并变为internal
以降低复杂度 (使用MessageChain
替换CombinedMessage
的引用).Message.plus
现在返回MessageChain
而不是CombinedMessage
- 弃用
NullMessageChain
(使用null
替代) Message
中eq
,contains
等函数移动至SingleMessage
以避免歧义.- 更名
MessageChain.any<reified M>
到MessageChain.anyInInstance<reified M>
以与标准库的Iterable.any
区分 - 更名
MessageChain.first<reified M>
到MessageChain.firstIsInstance<reified M>
以与标准库的Iterable.first
区分 - 更名
MessageChain.firstOrNull<reified M>
到MessageChain.firstIsInstanceOrNull<reified M>
以与标准库的Iterable.firstOrNull
区分
- 重构
MessageSource
, 支持直接获取相关对象, 支持所有类型的引用. - 简化引用回复, 现在只需要
source.quote()
即可创建引用 (而不需要sender
参数) - 现在可通过
QuoteReply.source
获取源消息, 且可以撤回该消息或再次引用. - 支持闪照: 可通过
Image.flash()
将普通图片转为闪照. - 支持
Bot.nick
(#93) - 修复消息长度判断 (#195) (实验性)
- 修复 Android 目标上
SystemDeviceInfo.imei
可能会抛出 NPE 的问题 - 修复
GroupNameChangeEvent
重复广播的问题 - 修复
ContactMessage.nextMessageContaining
- 修复
selectMessage
时无法正常完结, 和 timeout 没有被取消的问题 - 修复 #133, #197, #187, #180, #77, #192
- 使用 Kotlin 1.3.71, 兼容原使用 Kotlin 1.4-M1 编译的代码.
- 优化
BotConfiguration
, 去掉 DSL 操作, 使用fileBasedDeviceInfo(filename)
等函数替代. (兼容原操作方式, 计划于0.34.0
删除) - 调整长消息判定权重, 具体为: Chinese char=4, English char=1, Quote=700, Image=800, 其他消息类型转换为字符串后判断长度.
- 添加
ContactMessage
以替代MessagePacket<*, *>
的情况 - 添加
MessageTooLargeException
- 使用
Bot.id
替代Bot.uin
- 在
Dispatchers.IO
协程调度器中执行 Java API 创建的事件处理. - 修复 Java API
Member.kick
参数message
没有正常传递的问题 - 将部分意外定义为 public 的 API 改为 internal.
- 将部分 internal API 从
mirai-core
移至mirai-core-qqandroid
- 修复 At 在手机上显示错误的问题
- 修复 #178
- 修复长文本长度检测, 提高判断性能
- 修复特殊的好友图片 ID 无法构造为消息
- 新增
AtAll.display
- 所有消息元素统一
toString
:[mirai:image:ID]
,[mirai:face:ID]
,[mirai:at:TARGET]
,[mirai:poke:TYPE,ID]
,[mirai:quote:ID]
等 (仍为实验性)
- 修复重复解析禁言事件的问题 (#83)
- 支持长消息发送, 单条消息最多含 4500 字符和 50 张图片
- 支持戳一戳消息:
PokeMessage
- 修复 重复收到好友消息 (#129), 私聊图片出错 (#165)
- 为
MessageChain.toString
增加缓存 (非原子), 以提升长消息处理的性能 - 发消息失败时将抛出带提示的异常
- 添加
MessageSource
将被重写的警告
- 修复一些事件解析失败的问题
此版本为二进制不兼容更新, 全部使用者都需要重新编译.
源码兼容的改变:
- 删除全部
@Depreacted
兼容 - 删除全部多余的
@JvmName
以兼容将来的改变 (新 MPP 模块等级制架构) - 调整部分函数的 JVM 可见性
- 内联部分
MessageChain
工具函数 - 更新到 Kotlin 1.4-M1 (如何更新到 Kotlin 1.4-M1)
源码不兼容的改变:
- 群设置由
Group
移动到独立的GroupSettings
- 调整 API 可见性: 将除
BotFactory
外mirai-core-qqandroid
中全部 API 改为internal
消息部分:
SingleMessage
实现接口CharSequence
和Comparable<String>
- 为
FriendImage
,GroupImage
,OnlineImage
,OfflineImage
增加companion object Key
- 调整
RichMessage
, 将所有子类聚合到一个文件 - 移动
XmlMessageHelper
为RichMessage.Compation
- 命名调整:
buildXMLMessage
改为buildXmlMessage
- 修复
CombinedMessage
中错误的left
和element
事件部分:
- 加强
selectMessages
, 增加回复, 引用回复, 默认值, 超时支持: 原处理方式:
val message = nextMessageOrNull(10.secondsToMillis) ?: kotlin.run {
quoteReply("请在 10 秒内发送一张图片")
return@case
}
val image = message.getOrNull(OnlineImage) ?: kotlin.run {
reply(message.quote() + "请发送一张图片")
return@case
}
reply(message.quote() + image.originUrl)
使用 selectMessages
DSL:
selectMessagesUnit {
has<OnlineImage>() quoteReply {
message[OnlineImage].originUrl
}
timeout(10.secondsToMillis) quoteReply {
"请在 10 秒内发送图片以获取链接"
}
defaultQuoteReply {
"请发送一张图片"
}
}
- 确保二进制兼容, #155
- 修复 Android 上 ECDH init 失败问题, #154
- 引入新消息监听 DSL:
whileSelectMessages
, 简化连续监听过程
bot.subscribeMessages {
"开启复读模式" `->` {
reply("成功开启")
whileSelectMessages {
"stop" `->` {
reply("已关闭复读")
false // 停止循环
}
default {
reply(message)
true // 继续循环
}
}
reply("复读模式结束")
}
}
- 引入新消息监听 DSL:
selectMessages
, 简化筛选监听过程
bot.subscribeMessages {
"test" `->` {
reply("choose option: 'hello', 'hi'")
val value: String = selectMessages {
"hello" `->` { "123" }
"hi" `->` { "222" }
default { "default value" }
}
reply(value)
}
}
- 监听消息的 DSL 新增
infix fun String.->(block)
- 处理
StatSvc.ReqMSFOffline
(#150) Contact.sendMessage
现在接受Message
参数, 而不是MessageChain
以兼容CombinedMessage
Member.sendMessage
现在返回MessageReceipt<Member>
而不是 QQ 泛型- 调整 JVM
MessageUtils
中一些方法的可见性 (@JvmSynthetic
) - 调整命名:
OfflineImage.queryOriginUrl
改为OfflineImage.queryUrl
- 允许手动重新初始化
Bot
(BotNetworkHandler.init
), 确保重初始化资源释放
- 修复 Jce 反序列化在部分情况下出错的问题, 修复 #145
- 新增群公告低级 API
- 新增群活跃数据低级 API
- 修复 #141, #143, #131
- 更多原生表情 (
Face
)
- 支持
XML
,Json
,LightApp
等RichMessage
- 新增
MessageChain.repeat
与MessageChain.times
- JVM 平台下
PlatformLogger
可重定向输出 - 修复
NullMessageChain.equals
判断不正确的问题 - 新增
PlainText.of
以应对一些特殊情况
- 重写 Jce 序列化, 提升反序列性能
- 更新
Kotlin
版本到 1.3.70 - 更新
kotlinx.coroutines
,atomicfu
,kotlinx.coroutines
依赖版本
- 使用
kotlinx.io
而不是ktor.io
- 修复 #111, #108, #116, #112
- 适配 8.2.7 版本(2020 年 3 月)协议
- 全面的
Image
类型: Online/Offline Image, Friend/Group Image - 修复查询图片链接时好友图片链接错误的问题
- 修复 bugs: #105, #106, #107
- 修复
Member
的委托QQ
弱引用被释放的问题 - 用
Bot.friends
替代Bot.qqs
- 用
Bot.containsFriend
,Bot.containsGroup
替代Bot.contains
- 新增
BotFactory.Bot(String, ByteArray)
用 md5 密码登录 - 为
BotFactory
等类型的一些扩展指定JvmName
- 移动
Bot.QQ
到低级 API
-
Java 完全友好: Java 使用者可以同 Kotlin 方式直接阻塞式或异步(Future)调用 API
-
新增
MessageSource.originalMessage: MessageChain
以获取源消息内容 -
群消息的撤回现在已稳定 (
Bot.recall
) -
现在可以引用回复机器人自己发送的消息:
MessageReceipt.quoteReply
-
新增
MessageRecallEvent
-
整理
MessageChain
的构造, 优化性能 -
整理所有网络层代码, 弃用
kotlinx.io
而使用io.ktor.utils.io
-
其他杂项优化
-
修复上传图片
-
一些问题修复
-
大量杂项优化
-
MessageReceipt.source
现在为 public. 可获取源消息 id -
修复上传好友图片失败的问题
-
上传群图片现在分包缓存, 优化性能
-
重构
MessageChain
, 引入CombinedMessage
. (兼容大部分原 API) -
新增
MessageChainBuilder
,buildMessageChain
-
ExternalImage
现在接收多种输入参数 -
修复访问好友消息回执
.sequenceId
时抛出异常的问题
- 支持好友消息的引用回复
- 更加结构化的
QuoteReply
架构, 支持引用任意群/好友消息回复给任意群/好友.
-
支持图片下载:
image.channel(): ByteReadChannel
,image.url()
-
添加
LockFreeLinkedList<E>.iterator
-
添加
LockFreeLinkedList<E>.forEachNode
-
并行处理事件监听
-
添加
nextMessageContaining
和相关可空版本 -
'撤回' 从
Contact
移动到Bot
-
删除
MessageSource.sourceMessage
-
让 MessageSource 拥有唯一的 long 类型 id, 删除原
uid
和sequence
结构. -
修复
Message.eq
歧义
- 支持机器人撤回群消息 (含自己发送的消息):
Group.recall
,MessageReceipt.recall
- 支持一定时间后自动撤回:
Group.recallIn
,MessageReceipt.recallIn
sendMessage
返回MessageReceipt
以实现撤回功能- 添加
MessageChain.addOrRemove
- 添加
ContactList.firstOrNull
,ContactList.first
- 新的异步事件监听方式:
subscribingGetAsync
启动一个协程并从一个事件从获取返回值到Deferred
. - 新的线性事件监听方式:
subscribingGet
挂起当前协程并从一个事件从获取返回值.
使用该示例, 发送两条消息, 一条为 "禁言", 另一条包含一个 At
case("禁言") {
val value: At = nextMessage { message.any(At) }[At]
value.member().mute(10)
}
示例 2:
case("复读下一条") {
reply(nextMessage().message)
}
- 修复一些情况下
At
无法发送的问题 - 统一 ImageId: 群消息收到的 ImageId 均为
{xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx}.jpg
形式(固定长度 37) - 支持成员主动离开事件的解析 (#51)
-
添加
MessageSource.time
-
添加事件监听时额外的
coroutineContext
-
为一些带有
operator
的事件添加.isByBot
的属性扩展 -
优化事件广播逻辑, 修复可能无法触发监听的问题
-
为所有
Contact
添加toString()
(#80) -
支持成员禁言状态和时间查询
Member.muteTimeRemaining
-
修复
At
的display
(#73), 同时修复QuoteReply
无法显示问题 (#54). -
广播
BotReloginEvent
(#78) -
支持机器人自身禁言时间的更新和查询 (#82)
-
支持原生表情
Face
-
修正
groupCardOrNick
为nameCardOrNick
-
增加
MessageChain.foreachContent(lambda)
和Message.hasContent(): Boolean
-
提高重连速度
-
修复重连后某些情况不会心跳
-
修复收包时可能产生异常
-
添加
Bot.subscribe
等筛选 Bot 实例的监听方法 -
其他一些小问题修复
-
优化重连处理逻辑
-
确保好友消息和历史事件在初始化结束前同步完成
-
同步好友消息记录时不广播
-
为
MiraiLogger
添加 common propertyval isEnabled: Boolean
-
修复 #62: 掉线重连后无 heartbeat
-
修复 #65:
Bot
close 后仍会重连 -
修复 #70: ECDH is not available on Android platform
-
从服务器收到的事件将会额外使用
bot.logger
记录 (verbose). -
降低包记录的等级:
info
->verbose
-
改善
Bot
的 log 记录 -
加载好友列表失败时会重试
-
改善
Bot
或NetworkHandler
关闭时取消 job 的逻辑 -
修复初始化(init)时同步历史好友消息时出错的问题
- 放弃使用
atomicfu
以解决其编译错误的问题. (#60)
- 修复无法引入依赖的问题.
-
尝试修复
atomicfu
编译错误的问题 -
查询群信息失败后重试
-
统一异常处理: 所有群成员相关操作无权限时均抛出异常而不返回
false
. -
初始化未完成时缓存接收的所有事件包 (#46)
-
解析群踢人事件时忽略找不到的群成员
-
登录完成后广播事件
BotOnlineEvent
-
新增事件:
BotReloginEvent
和BotOfflineEvent.Dropped
-
AtAll
现在实现Message.Key
-
新增
BotConfiguration
DSL, 支持自动将设备信息存储在文件系统等 -
新增
MessageSource.quote(Member)
-
更好的网络层连接逻辑
-
密码错误后不再重试登录
-
掉线后尝试快速重连, 失败则普通重连 (#47)
-
有原因的登录失败时将抛出特定异常:
LoginFailedException
-
默认心跳时间调整为 60s
-
解决一些验证码无法识别的问题
-
忽略一些不需要处理的事件(机器人主动操作触发的事件)
-
支持 at 全体成员:
AtAll
-
支持
AtAll
的发送和解析 -
修复某些情况下禁言处理异常
小优化:
- 在
GroupMessage
添加quoteReply(Message)
, 可快速引用消息并回复 - 为
CoroutineScope.subscribeMessages
添加返回值. 返回 lambda 的返回值 - 在验证码无法处理时记录更多信息
- 优化
At
的空格处理 (自动为At
之后的消息添加空格) - 删除
BotConfiguration
中一些过时的设置
- 修改 BotFactory, 添加
context
参数. - currentTimeMillis 减少不必要对象创建
- 优化无锁链表性能 (大幅提升
addAll
性能)
-qqanroid
安卓协议发布, 基于最新 QQ, 版本 8.2.0
支持的功能:
- 登录: 密码登录. 设备锁支持, 不安全状态支持, 图片验证码支持, 滑动验证码支持.
- 消息: 文字消息, 图片消息(含表情消息), 群员 At, 引用回复.
- 列表: 群列表, 群员列表, 好友列表均已稳定.
- 群操作: 查看和修改群名, 查看和修改群属性(含全体禁言, 坦白说, 自动批准加入, 匿名聊天, 允许成员拉人), 设置和解除成员禁言, 查看和修改成员名片, 踢出成员.
- 消息事件: 接受群消息和好友消息并解析
- 群事件: 群员加入, 群员离开, 禁言和解除禁言, 群属性(含全体禁言, 坦白说, 匿名聊天, 允许成员拉人)改动.
HTTP API 已完成, by @ryoii.
详见 README
Mirai 仍处于快速迭代状态. 将来仍可能会有 API 改动.
- 监听消息时允许使用条件式的表达式, 如:
(contains("1") and has<Image>()){
reply("Your message has a string '1' and an image contained")
}
(contains("1") or endsWith("2")){
}
原有单一条件语法不变:
contains("1"){
}
"Hello" reply "World"
- Message: 修复
eq
无法正确判断的问题; 性能优化. - 简化 logger 结构(API 不变).
- 事件
cancelled
属性修改为val
(以前是var
withprivate set
)
- 弃用
BotAccount.id
. 将来它可能会被改名成为邮箱等账号. QQ 号码需通过bot.uin
获取. Gender
由inline class
改为 enumString.chain()
改为String.toChain()
List<Message>.chain()
改为List<Message>.toChain()
-timpc- 修复在有入群验证时无法解析群资料的问题 (#30)
TIMPC
- Fix #27, 群成员找不到的问题
- 一些小优化
- 修复有时表情消息无法解析的问题
- 为心跳增加重试, 降低掉线概率
- 消息中的换行输出为 \n
- 其他一些小问题修复
- 事件处理抛出异常时不停止监听
- 添加
Bot(qq, password, config=Default)
- 一些性能优化
- 修复一个由 atomicfu 的 bug 导致的 VerifyError
- 添加
ExternalImageAndroid
- 事件处理抛出异常时正确地停止监听
Bot 构造
Bot
构造时修改 BotConfiguration
而不是登录时.
移除 CoroutineScope.Bot
移除 suspend Bot(...)
添加 Bot(..., BotConfiguration.() -> Unit)
添加 Bot(..., BotConfiguration = BotConfiguration.Default)
其他
全面的在线状态 (OnlineStatus
)
移动部分文件, 模块化
事件优化
更快的监听过程
现在监听不再是 suspend
, 而必须显式指定 CoroutineScope
. 详见 Subscribers.kt
删除原本的 bot.subscribe 等监听模式.
其他
Contact
现在实现接口 CoroutineScope
协议模块独立
现在 mirai-core
只提供基础的抽象类. 具体的各协议实现为 mirai-core-PROTOCOL
.
这些模块都继承自 mirai-core
.
现在, 要使用 mirai, 必须依赖于特定的协议模块, 如 mirai-core-timpc
.
查阅 API 时请查看 mirai-core
.
每个模块只提供少量的额外方法. 我们会给出详细列表.
在目前的开发中您无需考虑多协议兼容.
Bot 构造
协议抽象后构造 Bot 需指定协议的 BotFactory
.
在 JVM 平台, Mirai 通过 classname 自动加载协议模块的 BotFactory
, 因此若您只使用一套协议, 则无需修改现行源码
事件
大部分事件包名修改.
UInt -> Long
修改全部 QQ ID, Group ID 的类型由 UInt 为 Long.
此为 API 不兼容更新, 请将所有无符号标志 u
删除即可. 如 123456u
改为 123456
另还有其他 API 的包名或签名修改. 请使用 IDE 自动修补 import 即可.
- 修复 GroupId.toGroupInternalId 错误
- 修复解析群消息时小概率出现的一个错误
- 修复有时群资料无法获取的情况
- 现在
At.qq
,Long.qq
等函数不再是suspend
协议
- 现在查询群资料时可处理群号无效的情况
- 现在能正常分辨禁言事件包
功能
- 增加无锁链表: LockFreeLinkedList, 并将 ContactList 的实现改为该无锁链表
- ContactSystem.getQQ 不再是
suspend
- ContactSystem.getGroup 仍是
suspend
, 原因为需要查询群资料. 在群 ID 无效时抛出GroupNotFoundException
优化
- 日志中, 发送给服务器的包将会被以名字记录, 而不是 id
- 修复验证码包发出后无回复 (错误的验证码包)
- 修复 bug
- 优化 JVM 平台上需要验证码时的提示
- 删除 klock 依赖, 添加 Time.kt. 待将来 kotlin Duration 稳定后替换为 Duration
- 使所有协议相关类
internal
- 去掉一些
close
的不应该有的suspend
QQ
,Member
,Group
现在继承接口CoroutineScope
- 将
LoginResult
由inline class
修改为enum class
- 添加和修改了
BotAccount
和Bot
的构造器
- 修复禁言时间范围错误的问题
- 禁言的扩展函数现在会传递实际函数的返回值
协议
- 重新分析验证码包, 解决一些无法解析的情况. (这可能会产生新的问题, 遇到后请提交 issue)
- 重新分析提交密码包
- 提交验证码仍可能出现问题 (已在
0.7.5
修复)
功能
- XML 消息 DSL 构造支持 (实验性) (暂不支持发送)
- 群成员列表现在包含群主 (原本就应该包含)
- 在消息事件处理中添加获取
.qq()
和.group()
的扩展函数. - 现在处理群消息时 sender 为 Member (以前为 QQ)
- 修改
Message.concat
为Message.followedBy
- 修改成员权限
OPERATOR
为ADMINISTRATOR
- bot.subscribeAll<>() 等函数的 handler lambda 的 receiver 由 Bot 改变为 BotSession; 此变动不会造成现有代码的修改, 但并不兼容旧版本编译的代码
性能优化
- 内联 ContactList
- 2 个 Contact.sendMessage 重载改为内联扩展函数 (需要添加 import)
- 其他小优化
- 新增: 无法解析密码包/验证码包时的调试输出. 以兼容更多的设备情况
- 新增:
MessagePacket
下At.qq()
捷径获取 QQ
- 新增: 禁言群成员 (
Member.mute(TimeSpan|Duration|MonthsSpan|Int|UInt)
) - 新增: 解禁群成员 (
Member.unmute()
) - 修复: ContactList key 无法匹配 (Kotlin 内联类型泛型投影错误)