开发版本. 频繁更新, 不保证高稳定性
0.40.0 2020/4/29在 1.0.0 正式版发布时, 所有为旧版本做的兼容都将删除, 因此请尽快迁移.
Message 不再继承 CharSequence (兼容到 1.0.0)XmlMessage 和 JsonMessage. 需使用 ServiceMessage 并手动指定 serviceIdLOCKED, 而不是 CONCURRENTPlainText.stringValue, 以 PlainText.content 替代VipFace 作为 PlainText 发送, 而不是抛出异常BufferedImage.toExternalImage 降低图片质量的问题0.39.5 2020/4/28VipFace (不支持发送)PokeMessage) 类型BotInvitedJoinRequestEvent.ignoreLockFreeLinkedList 遍历性能, 即 ContactList 遍历性能LockFreeLinkedList 标注 @MiraiInternalAPI 并计划于 1.0.0 修改为 internal0.39.4 2020/4/27LoginSolver Swing 选择问题NoStandardInputForCaptchaException, 在无可用标准输入时中断登录0.39.3 2020/4/25Message.isContentEmpty() 和 Message.isContentNotEmpty()ForwardMessage 时不允许 ForwardMessage.nodeList 为空.0.39.2 2020/4/240.39.1 2020/4/24Bot.instances 更改, 添加新的 Bot.botInstances 以兼容以前代码ForwardMessage 无法从 firstOrNull 获取的问题0.39.0 2020/4/23二进制不兼容的修改: Bot.instances 现在返回 List<Bot>, 而不是 List<WeakRef<Bot>> 由于他们在 JVM 签名相同, 无法做兼容.
原有 Member 继承 QQ, QQ 继承 Contact 架构改变.
新架构为:
QQ 命名 (二进制兼容到 1.0.0)User 继承 Contact, 作为 Member 和 FriendMember 继承 UserFriend 继承 User由于 Member 不再是 QQ 子类, 而原本表示 '好友' 意义的 QQ 删除,
需要根据实际情况替换 QQ 的引用为 Friend 或 Group
因修改, 新增以下 API:
fun Member.asFriend(): Friend: 得到此成员作为好友的对象或抛出异常fun Member.asFriendOrNull(): Friend: 得到此成员作为好友的对象或返回 nullinline val Member.isFriend: Boolean: 判断此成员是否为好友同时有以下修改:
val User.nameCardOrNick: 获取非空群名片 (如果是群员) 或昵称fun Member.isMuted() 而改为属性 val Member.isMutedimageId: String.imageId: String (以前可以获取长宽等数据)BufferedImage.toExternalImage 的性能{ ... }.miraiOfflineMessageSource 构造MessageSource 修改: MessageSource.copyAmend(block)MessageSource.internalId 以便将来使用添加 OnlineMessageSource.toOffline
添加 ContactMessage.time
添加 ContactMessage.senderName
OfflineMessageSource 构造可使用 DSL 构造离线消息, 修改其发送人, 发送时间, 发送内容等. 这对于跨群转发等情况十分有用.
OfflineMessageSource.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")
}
}
不支持解析别人的转发.
Identified 到 ContactOrBot, 去掉其 '实验性' 注解Bot.instances 现在返回 List<Bot>, 而不是 List<WeakRef<Bot>> (二进制兼容)subscribingGet 到 syncFromEvent, 并将其定义为稳定 API.subscribingGetAsync 到 asyncFromEvent, 并将其定义为稳定 API.eventClass: KClass<Event> 参数的事件监听 subscribeMessageSubscribersBuilder 添加 sentBy(User), sentFrom(Group), atAll, at DSLBotOfflineEvent.Force 的问题0.38.0 2020/4/20CustomMessageMessageChain.contentEqualsMessage.isPlain, Message.isNotPlainMessageChain.allContent, MessageChain.noneContentCombinedMessage.toString 顺序错误, 添加缓存BotConfiguration.inheritCoroutineContextMessageChain.getOrNull 更名为 MessageChain.firstOrNullMessageChain.get 更名为 MessageChain.firstMessageReceipt.recall(long) 更名为 MessageReceipt.recallIn(long) 以与其他 API 保持一致MessageChainBuilder 构建逻辑0.37.5 2020/4/20Message 中添加 equals 和 hashCode, 将部分类型消息定义为 data classMessageSource.id 现在返回非 0 序列号MessageSource 只能撤回一次0.37.4 2020/4/170.37.3 2020/4/15新增:
GroupNameChangeEvent)中支持获取操作人ServiceMessage 作为 JsonMessage, XmlMessage 的父类并处理所有类型富文本消息解析RichMessage 标注 MiraiExperimentalAPI 以警告将来改动问题修复:
MessageSubscriberBuilder DSL, 整理 linear.kt, subscribers.ktLoginFailedException 中断0.37.2 2020/4/13OnlineMessageSource.Incoming.target 类型错误Identified 接口作为 Contact 和 Bot 的公共接口0.37.1 2020/4/12从 0.37.1 起 JVM 平台依赖无需带 "-jvm" 模块名
即原 "mirai-core-jvm" 和 "mirai-core-qqandroid-jvm" 均需去掉 "-jvm", 变为 "mirai-core" 和 "mirai-core-qqandroid"
QuoteReply 时的消息长度估算MessageChainBuilder.build, 效果同 asMessageChainContactMessage 中添加 At.isBotMessageSubscribersBuilder 中添加 String.invoke, atBot DSL0.37.0 2020/4/11Group.quit, BotLeaveEvent.Active0.36.1 2020/4/10botPermission0.36.0 2020/4/10TempMessage (#16)MemberJoinEvent.ActivesubscribeTempMessages 等相关 DSLFriendAddEvent, FriendDeleteEvent (#216)OfflineMessageSource.idMember.kick0.35.0 2020/4/8NewFriendRequestEventMemberJoinRequestEventMessageSource.originalMessage 也可以获取到 MessageSourcebotAsMember.nameCard 修改时需要管理员权限的问题MessageSource.key0.34.0 2020/4/6selectMessages, selectMessagesUnit 添加可选筛选 context 的参数: filterContext: BooleanMessage 改动 (二进制兼容):
Message.contentToString 以转换为最接近官方消息的字符串ConstrainSingle 的 Message 类型以保证一个消息链中只存在一个 QuoteReply 和一个 MessageSourceCombinedMessage 现在实现接口 MessageChian 并变为 internal 以降低复杂度 (使用 MessageChain 替换 CombinedMessage 的引用).Message.plus 现在返回 MessageChain 而不是 CombinedMessageNullMessageChain (使用 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 区分0.33.0 2020/4/4MessageSource, 支持直接获取相关对象, 支持所有类型的引用.source.quote() 即可创建引用 (而不需要 sender 参数)QuoteReply.source 获取源消息, 且可以撤回该消息或再次引用.Image.flash() 将普通图片转为闪照.Bot.nick (#93)SystemDeviceInfo.imei 可能会抛出 NPE 的问题GroupNameChangeEvent 重复广播的问题ContactMessage.nextMessageContainingselectMessage 时无法正常完结, 和 timeout 没有被取消的问题0.32.0 2020/4/2BotConfiguration, 去掉 DSL 操作, 使用 fileBasedDeviceInfo(filename) 等函数替代. (兼容原操作方式, 计划于 0.34.0 删除)ContactMessage 以替代 MessagePacket<*, *> 的情况MessageTooLargeExceptionBot.id 替代 Bot.uinDispatchers.IO 协程调度器中执行 Java API 创建的事件处理.Member.kick 参数 message 没有正常传递的问题mirai-core 移至 mirai-core-qqandroid0.31.4 2020/3/310.31.3 2020/3/310.31.2 2020/3/30AtAll.displaytoString: [mirai:image:ID], [mirai:face:ID], [mirai:at:TARGET], [mirai:poke:TYPE,ID], [mirai:quote:ID] 等 (仍为实验性)0.31.1 2020/3/290.31.0 2020/3/29PokeMessageMessageChain.toString 增加缓存 (非原子), 以提升长消息处理的性能MessageSource 将被重写的警告0.30.1 2020/3/260.30.0 2020/3/24此版本为二进制不兼容更新, 全部使用者都需要重新编译.
源码兼容的改变:
@Depreacted 兼容@JvmName 以兼容将来的改变 (新 MPP 模块等级制架构)MessageChain 工具函数源码不兼容的改变:
Group 移动到独立的 GroupSettingsBotFactory 外 mirai-core-qqandroid 中全部 API 改为 internal消息部分:
SingleMessage 实现接口 CharSequence 和 Comparable<String>FriendImage, GroupImage, OnlineImage, OfflineImage 增加 companion object KeyRichMessage, 将所有子类聚合到一个文件XmlMessageHelper 为 RichMessage.CompationbuildXMLMessage 改为 buildXmlMessageCombinedMessage 中错误的 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 {
"请发送一张图片"
}
}
0.29.1 2020/3/220.29.0 2020/3/22引入新消息监听 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), 确保重初始化资源释放
0.28.0 2020/3/190.27.0 2020/3/8XML, Json, LightApp 等 RichMessage0.26.2 2020/3/8MessageChain.repeat 与 MessageChain.timesPlatformLogger 可重定向输出NullMessageChain.equals 判断不正确的问题PlainText.of 以应对一些特殊情况0.26.1 2020/3/8Kotlin 版本到 1.3.70kotlinx.coroutines, atomicfu, kotlinx.coroutines 依赖版本0.26.0 2020/3/70.25.0 2020/3/6Image 类型: Online/Offline Image, Friend/Group Image0.24.1 2020/3/3Member 的委托 QQ 弱引用被释放的问题Bot.friends 替代 Bot.qqsBot.containsFriend, Bot.containsGroup 替代 Bot.containsBotFactory.Bot(String, ByteArray) 用 md5 密码登录BotFactory 等类型的一些扩展指定 JvmNameBot.QQ 到低级 API0.24.0 2020/3/1MessageSource.originalMessage: MessageChain 以获取源消息内容Bot.recall)MessageReceipt.quoteReply新增 MessageRecallEvent
整理 MessageChain 的构造, 优化性能
整理所有网络层代码, 弃用 kotlinx.io 而使用 io.ktor.utils.io
其他杂项优化
0.23.0 2020/2/28大量杂项优化
MessageReceipt.source 现在为 public. 可获取源消息 id
修复上传好友图片失败的问题
上传群图片现在分包缓存, 优化性能
0.22.0 2020/2/24MessageChain, 引入 CombinedMessage. (兼容大部分原 API)MessageChainBuilder, buildMessageChainExternalImage 现在接收多种输入参数
修复访问好友消息回执 .sequenceId 时抛出异常的问题
0.21.0 2020/2/23QuoteReply 架构, 支持引用任意群/好友消息回复给任意群/好友.0.20.0 2020/2/23支持图片下载: image.channel(): ByteReadChannel, image.url()
添加 LockFreeLinkedList<E>.iterator
添加 LockFreeLinkedList<E>.forEachNode
并行处理事件监听
添加 nextMessageContaining 和相关可空版本
'撤回' 从 Contact 移动到 Bot
删除 MessageSource.sourceMessage
让 MessageSource 拥有唯一的 long 类型 id, 删除原 uid 和 sequence 结构.
修复 Message.eq 歧义
0.19.1 2020/2/21Group.recall, MessageReceipt.recallGroup.recallIn, MessageReceipt.recallInsendMessage 返回 MessageReceipt 以实现撤回功能MessageChain.addOrRemoveContactList.firstOrNull, ContactList.firstsubscribingGetAsync 启动一个协程并从一个事件从获取返回值到 Deferred.subscribingGet 挂起当前协程并从一个事件从获取返回值.nextMessage 挂起当前协程并等待下一条消息:使用该示例, 发送两条消息, 一条为 "禁言", 另一条包含一个 At
case("禁言") {
val value: At = nextMessage { message.any(At) }[At]
value.member().mute(10)
}
示例 2:
case("复读下一条") {
reply(nextMessage().message)
}
At 无法发送的问题{xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx}.jpg 形式(固定长度 37)0.18.0 2020/2/20MessageSource.timecoroutineContextoperator 的事件添加 .isByBot 的属性扩展为所有 Contact 添加 toString() (#80)
支持成员禁言状态和时间查询 Member.muteTimeRemaining
广播 BotReloginEvent (#78)
支持机器人自身禁言时间的更新和查询 (#82)
0.17.0 2020/2/20FacegroupCardOrNick 为 nameCardOrNick增加 MessageChain.foreachContent(lambda) 和 Message.hasContent(): Boolean
提高重连速度
修复重连后某些情况不会心跳
修复收包时可能产生异常
0.16.0 2020/2/19Bot.subscribe 等筛选 Bot 实例的监听方法其他一些小问题修复
优化重连处理逻辑
确保好友消息和历史事件在初始化结束前同步完成
同步好友消息记录时不广播
0.15.5 2020/2/19MiraiLogger 添加 common property val isEnabled: BooleanBot close 后仍会重连修复 #70: ECDH is not available on Android platform
从服务器收到的事件将会额外使用 bot.logger 记录 (verbose).
降低包记录的等级: info -> verbose
改善 Bot 的 log 记录
加载好友列表失败时会重试
改善 Bot 或 NetworkHandler 关闭时取消 job 的逻辑
修复初始化(init)时同步历史好友消息时出错的问题
0.15.4 2020/2/18atomicfu 以解决其编译错误的问题. (#60)0.15.3 2020/2/180.15.2 2020/2/18尝试修复 atomicfu 编译错误的问题
查询群信息失败后重试
0.15.1 2020/2/15统一异常处理: 所有群成员相关操作无权限时均抛出异常而不返回 false.
初始化未完成时缓存接收的所有事件包 (#46)
解析群踢人事件时忽略找不到的群成员
登录完成后广播事件 BotOnlineEvent
0.15.0 2020/2/14BotReloginEvent 和 BotOfflineEvent.DroppedAtAll 现在实现 Message.KeyBotConfiguration DSL, 支持自动将设备信息存储在文件系统等新增 MessageSource.quote(Member)
更好的网络层连接逻辑
密码错误后不再重试登录
掉线后尝试快速重连, 失败则普通重连 (#47)
有原因的登录失败时将抛出特定异常: LoginFailedException
默认心跳时间调整为 60s
解决一些验证码无法识别的问题
忽略一些不需要处理的事件(机器人主动操作触发的事件)
0.14.0 2020/2/13支持 at 全体成员: AtAll
支持 AtAll 的发送和解析
修复某些情况下禁言处理异常
小优化:
GroupMessage 添加 quoteReply(Message), 可快速引用消息并回复CoroutineScope.subscribeMessages 添加返回值. 返回 lambda 的返回值At 的空格处理 (自动为 At 之后的消息添加空格)BotConfiguration 中一些过时的设置0.13.0 2020/2/12context 参数.addAll 性能)-qqanroid
安卓协议发布, 基于最新 QQ, 版本 8.2.0
支持的功能:
HTTP API 已完成, by @ryoii.
详见 README
Mirai 仍处于快速迭代状态. 将来仍可能会有 API 改动.
0.12.0 2020/1/19监听消息时允许使用条件式的表达式, 如:
(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"
eq 无法正确判断的问题; 性能优化.cancelled 属性修改为 val (以前是 var with private set)0.11.0 2020/1/12BotAccount.id. 将来它可能会被改名成为邮箱等账号. QQ 号码需通过 bot.uin 获取.Gender 由 inline class 改为 enumString.chain() 改为 String.toChain()List<Message>.chain() 改为 List<Message>.toChain()
-timpc0.10.6 2020/1/8TIMPC
0.10.5 2020/1/30.10.4 2020/1/1Bot(qq, password, config=Default)0.10.3 2020/1/1ExternalImageAndroid0.10.1 2019/12/30Bot 构造
Bot 构造时修改 BotConfiguration 而不是登录时.
移除 CoroutineScope.Bot
移除 suspend Bot(...)
添加 Bot(..., BotConfiguration.() -> Unit)
添加 Bot(..., BotConfiguration = BotConfiguration.Default)
其他
全面的在线状态 (OnlineStatus)
移动部分文件, 模块化
0.10.0 2019/12/23事件优化
更快的监听过程
现在监听不再是 suspend, 而必须显式指定 CoroutineScope. 详见 Subscribers.kt
删除原本的 bot.subscribe 等监听模式.
其他
Contact 现在实现接口 CoroutineScope
0.9.0 2019/12/20协议模块独立
现在 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 即可.
0.8.2 2019/12/150.8.1 2019/12/15At.qq, Long.qq 等函数不再是 suspend0.8.0 2019/12/14协议
功能
suspendsuspend, 原因为需要查询群资料. 在群 ID 无效时抛出 GroupNotFoundException优化
0.7.5 2019/12/090.7.4 2019/12/080.7.3 2019/12/070.7.2 2019/12/07internalclose 的不应该有的 suspendQQ, Member, Group 现在继承接口 CoroutineScopeLoginResult 由 inline class 修改为 enum classBotAccount 和 Bot 的构造器0.7.1 2019/12/050.7.0 2019/12/04协议
0.7.5 修复)功能
.qq() 和 .group() 的扩展函数.Message.concat 为 Message.followedByOPERATOR 为 ADMINISTRATOR性能优化
0.6.1 2019/12/03MessagePacket 下 At.qq() 捷径获取 QQ0.6.0 2019/12/02Member.mute(TimeSpan|Duration|MonthsSpan|Int|UInt))Member.unmute())