Make Group.get, Bot.getFriend, Bot.getGroup return nullable. Add getOrFail for migration

This commit is contained in:
Him188 2020-12-16 19:11:42 +08:00
parent c6eef9f68e
commit 6c0b6473ed
13 changed files with 120 additions and 87 deletions

View File

@ -130,30 +130,43 @@ public abstract class Bot internal constructor(
@MiraiExperimentalApi
public abstract val asFriend: Friend
@Deprecated("Use asFriend instead", ReplaceWith("asFriend"))
@PlannedRemoval("2.0-M2")
public inline val selfQQ: Friend
get() = asFriend
/**
* 机器人的好友列表. 与服务器同步更新
* 好友列表. 与服务器同步更新.
*/
public abstract val friends: ContactList<Friend>
/**
* 获取一个好友对象.
* @throws [NoSuchElementException] 当不存在这个好友时抛出
* [对方 QQ 号码][id] 获取一个好友对象, 在获取失败时返回 `null`.
*/
public fun getFriend(id: Long): Friend =
friends.firstOrNull { it.id == id } ?: throw NoSuchElementException("friend $id")
public fun getFriend(id: Long): Friend? =
friends.firstOrNull { it.id == id }
/**
* 机器人加入的群列表. 与服务器同步更新
* [对方 QQ 号码][id] 获取一个好友对象, 在获取失败时抛出 [NoSuchElementException].
*/
public fun getFriendOrFail(id: Long): Friend = getFriend(id) ?: throw NoSuchElementException("friend $id")
/**
* 加入的群列表. 与服务器同步更新.
*/
public abstract val groups: ContactList<Group>
/**
* 获取一个机器人加入的群.
* @throws NoSuchElementException 当不存在这个群时抛出
* [群号码][id] 获取一个群对象, 在获取失败时返回 `null`.
*/
public fun getGroup(id: Long): Group =
groups.firstOrNull { it.id == id } ?: throw NoSuchElementException("group $id")
public fun getGroup(id: Long): Group? =
groups.firstOrNull { it.id == id }
/**
* [群号码][id] 获取一个群对象, 在获取失败时抛出 [NoSuchElementException].
*/
public fun getGroupOrFail(id: Long): Group = getGroup(id) ?: throw NoSuchElementException("group $id")
// endregion
@ -225,8 +238,12 @@ public inline fun Bot.containsFriend(id: Long): Boolean = this.friends.contains(
@JvmSynthetic
public inline fun Bot.containsGroup(id: Long): Boolean = this.groups.contains(id)
@Deprecated("Use getFriend", ReplaceWith("this.getFriend(id)"))
@PlannedRemoval("2.0-M2")
@JvmSynthetic
public inline fun Bot.getFriendOrNull(id: Long): Friend? = this.friends.getOrNull(id)
public inline fun Bot.getFriendOrNull(id: Long): Friend? = this.getFriend(id)
@Deprecated("Use getGroup", ReplaceWith("this.getGroup(id)"))
@PlannedRemoval("2.0-M2")
@JvmSynthetic
public inline fun Bot.getGroupOrNull(id: Long): Group? = this.groups.getOrNull(id)
public inline fun Bot.getGroupOrNull(id: Long): Group? = this.getGroup(id)

View File

@ -20,10 +20,7 @@ import net.mamoe.mirai.event.events.*
import net.mamoe.mirai.message.MessageReceipt
import net.mamoe.mirai.message.MessageReceipt.Companion.recall
import net.mamoe.mirai.message.data.*
import net.mamoe.mirai.utils.ExternalImage
import net.mamoe.mirai.utils.MiraiExperimentalApi
import net.mamoe.mirai.utils.OverFileSizeMaxException
import net.mamoe.mirai.utils.get
import net.mamoe.mirai.utils.*
import java.io.InputStream
/**
@ -89,22 +86,34 @@ public interface Group : Contact, CoroutineScope {
/**
* 群成员列表, 不含机器人自己, 含群主.
* [Group] 实例创建的时候查询一次. 并与事件同步事件更新
*
* [Group] 实例创建的时候查询一次. 并与事件同步事件更新.
*/
public val members: ContactList<Member>
/**
* 获取群成员实例. 不存在时抛出 [kotlin.NoSuchElementException]
* [id] [Bot.id] 时返回 [botAsMember]
* 获取群成员实例. 不存在时返回 `null`.
*
* [id] [Bot.id] 时返回 [botAsMember].
*/
@Throws(NoSuchElementException::class)
public operator fun get(id: Long): Member
public operator fun get(id: Long): Member?
@Deprecated("Use get", ReplaceWith("get(id)"))
@PlannedRemoval("2.0-M2")
/**
* 获取群成员实例, 不存在则 null
* [id] [Bot.id] 时返回 [botAsMember]
*/
public fun getOrNull(id: Long): Member?
public fun getOrNull(id: Long): Member? = get(id)
/**
* 获取群成员实例. 不存在时抛出 [kotlin.NoSuchElementException].
*
* [id] [Bot.id] 时返回 [botAsMember].
*/
public fun getOrFail(id: Long): Member =
get(id) ?: throw NoSuchElementException("member $id not found in group ${this.id}")
/**
* 检查此 id 的群成员是否存在

View File

@ -15,7 +15,6 @@ import net.mamoe.kjbb.JvmBlockingBridge
import net.mamoe.mirai.Bot
import net.mamoe.mirai.JavaFriendlyAPI
import net.mamoe.mirai.event.events.*
import net.mamoe.mirai.getFriendOrNull
import net.mamoe.mirai.message.MessageReceipt
import net.mamoe.mirai.message.MessageReceipt.Companion.recall
import net.mamoe.mirai.message.action.MemberNudge
@ -182,12 +181,12 @@ public interface Member : User {
*
* @throws IllegalStateException 当此成员不是好友时抛出
*/
public fun Member.asFriend(): Friend = this.bot.getFriendOrNull(this.id) ?: error("$this is not a friend")
public fun Member.asFriend(): Friend = this.bot.getFriend(this.id) ?: error("$this is not a friend")
/**
* 得到此成员作为好友的对象, 当此成员不是好友时返回 `null`
*/
public fun Member.asFriendOrNull(): Friend? = this.bot.getFriendOrNull(this.id)
public fun Member.asFriendOrNull(): Friend? = this.bot.getFriend(this.id)
/**
* 判断此成员是否为好友

View File

@ -325,7 +325,10 @@ public data class BotInvitedJoinGroupRequestEvent internal constructor(
*/
public val invitorNick: String
) : BotEvent, Packet, AbstractEvent() {
public val invitor: Friend get() = this.bot.getFriend(invitorId)
/**
* 邀请人. 若在事件发生后邀请人已经被删除好友, [invitor] `null`.
*/
public val invitor: Friend? get() = this.bot.getFriend(invitorId)
@JvmField
internal val responded: AtomicBoolean = AtomicBoolean(false)
@ -362,20 +365,32 @@ public data class MemberJoinRequestEvent internal constructor(
*/
val fromNick: String
) : BotEvent, Packet, AbstractEvent() {
public val group: Group get() = this.bot.getGroup(groupId)
/**
* 相关群. 若在事件发生后机器人退出这个群, [group] `null`.
*/
public val group: Group? get() = this.bot.getGroup(groupId)
@JvmField
@PublishedApi
internal val responded: AtomicBoolean = AtomicBoolean(false)
/**
* 同意这个请求
*/
@JvmBlockingBridge
public suspend fun accept(): Unit = Mirai.acceptMemberJoinRequest(this)
/**
* 拒绝这个请求
*/
@JvmBlockingBridge
@JvmOverloads
public suspend fun reject(blackList: Boolean = false, message: String = ""): Unit =
Mirai.rejectMemberJoinRequest(this, blackList, message)
/**
* 忽略这个请求.
*/
@JvmBlockingBridge
public suspend fun ignore(blackList: Boolean = false): Unit = Mirai.ignoreMemberJoinRequest(this, blackList)
}

View File

@ -366,7 +366,7 @@ public sealed class MessageRecallEvent : BotEvent, AbstractEvent() {
}
public val MessageRecallEvent.GroupRecall.author: Member
get() = if (authorId == bot.id) group.botAsMember else group[authorId]
get() = if (authorId == bot.id) group.botAsMember else group.getOrFail(authorId)
public val MessageRecallEvent.FriendRecall.isByBot: Boolean get() = this.operator == bot.id
// val MessageRecallEvent.GroupRecall.isByBot: Boolean get() = (this as GroupOperableEvent).isByBot
@ -491,7 +491,13 @@ public class GroupMessageEvent(
public override val subject: Group get() = group
public override val source: OnlineMessageSource.Incoming.FromGroup get() = message.source as OnlineMessageSource.Incoming.FromGroup
public inline fun At.asMember(): Member = group[this.target]
@Deprecated("Use targetMember", ReplaceWith("this.targetMember"))
@Suppress("NOTHING_TO_INLINE")
public inline fun At.asMember(): Member = group.getOrFail(target)
@get:JvmSynthetic // TODO: 2020/12/16 move to extensions by 2.0-M2
public inline val At.targetMember: Member?
get(): Member? = group[this.target]
public override fun toString(): String =
"GroupMessageEvent(group=${group.id}, senderName=$senderName, sender=${sender.id}, permission=${permission.name}, message=$message)"

View File

@ -108,15 +108,13 @@ internal open class MiraiImpl : IMirai, LowLevelApiAccessor {
override suspend fun acceptMemberJoinRequest(event: MemberJoinRequestEvent) {
@Suppress("DuplicatedCode")
checkGroupPermission(event.bot, event.group) { event::class.simpleName ?: "<anonymous class>" }
checkGroupPermission(event.bot, event.groupId) { event::class.simpleName ?: "<anonymous class>" }
@Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER")
check(event.responded.compareAndSet(false, true)) {
"the request $this has already been responded"
}
check(!event.group.members.contains(event.fromId)) {
"the request $this is outdated: Another operator has already responded it."
}
if (event.group?.contains(event.fromId) == true) return
_lowLevelSolveMemberJoinRequestEvent(
bot = event.bot,
@ -131,15 +129,13 @@ internal open class MiraiImpl : IMirai, LowLevelApiAccessor {
@Suppress("DuplicatedCode")
override suspend fun rejectMemberJoinRequest(event: MemberJoinRequestEvent, blackList: Boolean, message: String) {
checkGroupPermission(event.bot, event.group) { event::class.simpleName ?: "<anonymous class>" }
checkGroupPermission(event.bot, event.groupId) { event::class.simpleName ?: "<anonymous class>" }
@Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER")
check(event.responded.compareAndSet(false, true)) {
"the request $this has already been responded"
}
check(!event.group.members.contains(event.fromId)) {
"the request $this is outdated: Another operator has already responded it."
}
if (event.group?.contains(event.fromId) == true) return
_lowLevelSolveMemberJoinRequestEvent(
bot = event.bot,
@ -153,11 +149,11 @@ internal open class MiraiImpl : IMirai, LowLevelApiAccessor {
)
}
private inline fun checkGroupPermission(eventBot: Bot, eventGroup: Group, eventName: () -> String) {
val group = eventBot.getGroupOrNull(eventGroup.id)
private inline fun checkGroupPermission(eventBot: Bot, groupId: Long, eventName: () -> String) {
val group = eventBot.getGroup(groupId)
?: kotlin.run {
error(
"A ${eventName()} is outdated. Group ${eventGroup.id} not found for bot ${eventBot.id}. " +
"A ${eventName()} is outdated. Group $groupId not found for bot ${eventBot.id}. " +
"This is because bot isn't in the group anymore"
)
@ -167,7 +163,7 @@ internal open class MiraiImpl : IMirai, LowLevelApiAccessor {
}
override suspend fun ignoreMemberJoinRequest(event: MemberJoinRequestEvent, blackList: Boolean) {
checkGroupPermission(event.bot, event.group) { event::class.simpleName ?: "<anonymous class>" }
checkGroupPermission(event.bot, event.groupId) { event::class.simpleName ?: "<anonymous class>" }
@Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER")
check(event.responded.compareAndSet(false, true)) {
"the request $this has already been responded"
@ -568,7 +564,7 @@ internal open class MiraiImpl : IMirai, LowLevelApiAccessor {
it.message.ensureSequenceIdAvailable()
}
val group = getGroup(groupCode)
val group = getGroupOrFail(groupCode)
val time = currentTimeSeconds()
val sequenceId = client.atomicNextMessageSequenceId()

View File

@ -250,25 +250,17 @@ internal class GroupImpl(
}
)
override operator fun get(id: Long): Member {
override operator fun get(id: Long): Member? {
if (id == bot.id) {
return botAsMember
}
return members.firstOrNull { it.id == id }
?: throw NoSuchElementException("member $id not found in group $uin")
}
override fun contains(id: Long): Boolean {
return bot.id == id || members.firstOrNull { it.id == id } != null
}
override fun getOrNull(id: Long): Member? {
if (id == bot.id) {
return botAsMember
}
return members.firstOrNull { it.id == id }
}
override suspend fun sendMessage(message: Message): MessageReceipt<Group> {
require(message.isContentNotEmpty()) { "message is empty" }
check(!isBotMuted) { throw BotIsBeingMutedException(this) }

View File

@ -72,7 +72,7 @@ internal class MessageSourceFromFriendImpl(
override val internalIds: IntArray get() = intArrayOf(msg.msgBody.richText.attr!!.random)
override val time: Int get() = msg.msgHead.msgTime
override val originalMessage: MessageChain by lazy { msg.toMessageChain(bot, bot.id, 0, false) }
override val sender: Friend get() = bot.getFriend(msg.msgHead.fromUin)
override val sender: Friend get() = bot.getFriendOrFail(msg.msgHead.fromUin)
private val jceData by lazy { msg.toJceDataFriendOrTemp(internalIds) }
@ -125,7 +125,10 @@ internal class MessageSourceFromTempImpl(
override val ids: IntArray get() = sequenceIds//
override val time: Int get() = msg.msgHead.msgTime
override val originalMessage: MessageChain by lazy { msg.toMessageChain(bot, 0, false) }
override val sender: Member get() = with(msg.msgHead) { bot.getGroup(c2cTmpMsgHead!!.groupUin)[fromUin] }
override val sender: Member
get() = with(msg.msgHead) {
bot.getGroupOrFail(c2cTmpMsgHead!!.groupUin).getOrFail(fromUin)
}
private val jceData by lazy { msg.toJceDataFriendOrTemp(internalIds) }
override fun toJceData(): ImMsgBody.SourceMsg = jceData
@ -149,7 +152,7 @@ internal data class MessageSourceFromGroupImpl(
msg.msgHead.groupInfo?.groupCode
?: error("cannot find groupCode for MessageSourceFromGroupImpl. msg=${msg._miraiContentToString()}")
) as GroupImpl).run {
getOrNull(msg.msgHead.fromUin)
get(msg.msgHead.fromUin)
?: msg.msgBody.richText.elems.firstOrNull { it.anonGroupMsg != null }?.run {
newAnonymous(anonGroupMsg!!.anonNick.encodeToString())
}

View File

@ -17,7 +17,6 @@ import net.mamoe.mirai.event.events.BotInvitedJoinGroupRequestEvent
import net.mamoe.mirai.event.events.BotLeaveEvent
import net.mamoe.mirai.event.events.MemberJoinRequestEvent
import net.mamoe.mirai.event.events.NewFriendRequestEvent
import net.mamoe.mirai.getGroupOrNull
import net.mamoe.mirai.internal.QQAndroidBot
import net.mamoe.mirai.internal.message.contextualBugReportException
import net.mamoe.mirai.internal.network.Packet
@ -192,14 +191,14 @@ internal class NewContact {
null
}
5 -> {
val group = bot.getGroupOrNull(groupCode) ?: return null
val group = bot.getGroup(groupCode) ?: return null
when (groupMsgType) {
13 -> { // 成员主动退出, 机器人是管理员, 接到通知
// 但无法获取是哪个成员.
null
}
7 -> { // 机器人被踢
val operator = group[actionUin]
val operator = group[actionUin] ?: return null
BotLeaveEvent.Kick(operator)
}
else -> {

View File

@ -29,7 +29,6 @@ import net.mamoe.mirai.event.events.BotJoinGroupEvent
import net.mamoe.mirai.event.events.FriendMessageEvent
import net.mamoe.mirai.event.events.MemberJoinEvent
import net.mamoe.mirai.event.events.TempMessageEvent
import net.mamoe.mirai.getFriendOrNull
import net.mamoe.mirai.internal.QQAndroidBot
import net.mamoe.mirai.internal.contact.GroupImpl
import net.mamoe.mirai.internal.contact.checkIsFriendImpl
@ -206,11 +205,12 @@ internal object MessageSvcPbGetMsg : OutgoingPacketFactory<MessageSvcPbGetMsg.Re
if (msg.msgHead.authUin == bot.id) {
// 邀请入群
return@mapNotNull bot.createGroupForBot(msg.msgHead.fromUin)?.let {
return@mapNotNull bot.createGroupForBot(msg.msgHead.fromUin)?.let { group ->
// package: 27 0B 60 E7 01 CA CC 69 8B 83 44 71 47 90 06 B9 DC C0 ED D4 B1 00 30 33 44 30 42 38 46 30 39 37 32 38 35 43 34 31 38 30 33 36 41 34 36 31 36 31 35 32 37 38 46 46 43 30 41 38 30 36 30 36 45 38 31 43 39 41 34 38 37
// package: groupUin + 01 CA CC 69 8B 83 + invitorUin + length(06) + string + magicKey
val invitorUin = msg.msgBody.msgContent.sliceArray(10..13).toInt().toLongUnsigned()
BotJoinGroupEvent.Invite(it[invitorUin])
val invitor = group[invitorUin] ?: return@let null
BotJoinGroupEvent.Invite(invitor)
}
} else {
@ -322,7 +322,7 @@ internal object MessageSvcPbGetMsg : OutgoingPacketFactory<MessageSvcPbGetMsg.Re
}
return@mapNotNull null
}
val friend = bot.getFriendOrNull(msg.msgHead.fromUin) ?: return@mapNotNull null
val friend = bot.getFriend(msg.msgHead.fromUin) ?: return@mapNotNull null
friend.checkIsFriendImpl()
if (!bot.firstLoginSucceed) {
@ -352,7 +352,7 @@ internal object MessageSvcPbGetMsg : OutgoingPacketFactory<MessageSvcPbGetMsg.Re
}
141 -> {
val tmpHead = msg.msgHead.c2cTmpMsgHead ?: return@mapNotNull null
val member = bot.getGroupByUinOrNull(tmpHead.groupUin)?.getOrNull(msg.msgHead.fromUin)
val member = bot.getGroupByUinOrNull(tmpHead.groupUin)?.get(msg.msgHead.fromUin)
?: return@mapNotNull null
member.checkIsMemberImpl()

View File

@ -19,7 +19,6 @@ import net.mamoe.mirai.event.Event
import net.mamoe.mirai.event.broadcast
import net.mamoe.mirai.event.events.GroupMessageEvent
import net.mamoe.mirai.event.events.MemberCardChangeEvent
import net.mamoe.mirai.getGroupOrNull
import net.mamoe.mirai.internal.QQAndroidBot
import net.mamoe.mirai.internal.contact.GroupImpl
import net.mamoe.mirai.internal.contact.MemberImpl
@ -73,7 +72,7 @@ internal object OnlinePushPbPushGroupMsg : IncomingPacketFactory<Packet?>("Onlin
}
val group =
bot.getGroupOrNull(pbPushMsg.msg.msgHead.groupInfo!!.groupCode) as GroupImpl? ?: return null // 机器人还正在进群
bot.getGroup(pbPushMsg.msg.msgHead.groupInfo!!.groupCode) as GroupImpl? ?: return null // 机器人还正在进群
val sender = if (anonymous != null) {
group.newAnonymous(anonymous.anonNick.encodeToString())
} else {

View File

@ -125,7 +125,7 @@ internal object OnlinePushPbPushTransMsg :
)
}
} else {
val newOwner = group.getOrNull(to) ?: group.newMember(object : MemberInfo {
val newOwner = group.get(to) ?: group.newMember(object : MemberInfo {
override val nameCard: String
get() = ""
override val permission: MemberPermission
@ -230,7 +230,7 @@ internal object OnlinePushPbPushTransMsg :
bot.groups.delegate.remove(group)
}
} else {
val member = group.getOrNull(target) as? MemberImpl ?: return null
val member = group.get(target) as? MemberImpl ?: return null
return MemberLeaveEvent.Quit(member.also {
member.cancel(CancellationException("Leaved actively"))
group.members.delegate.remove(member)
@ -245,7 +245,7 @@ internal object OnlinePushPbPushTransMsg :
bot.groups.delegate.remove(group)
}
} else {
val member = group.getOrNull(target) as? MemberImpl ?: return null
val member = group.get(target) as? MemberImpl ?: return null
return MemberLeaveEvent.Kick(member.also {
member.cancel(CancellationException("Being kicked"))
group.members.delegate.remove(member)

View File

@ -26,8 +26,6 @@ import net.mamoe.mirai.contact.Friend
import net.mamoe.mirai.contact.Member
import net.mamoe.mirai.data.FriendInfo
import net.mamoe.mirai.event.events.*
import net.mamoe.mirai.getFriendOrNull
import net.mamoe.mirai.getGroupOrNull
import net.mamoe.mirai.internal.QQAndroidBot
import net.mamoe.mirai.internal.contact.*
import net.mamoe.mirai.internal.network.MultiPacketBySequence
@ -86,7 +84,7 @@ internal object OnlinePushReqPush : IncomingPacketFactory<OnlinePushReqPush.ReqP
val packets: Sequence<Packet> = reqPushMsg.vMsgInfos.deco(bot.client) { msgInfo ->
when (msgInfo.shMsgType.toInt()) {
732 -> {
val group = bot.getGroupOrNull(readUInt().toLong())
val group = bot.getGroup(readUInt().toLong())
?: return@deco emptySequence() // group has not been initialized
GroupImpl.checkIsInstance(group)
@ -183,7 +181,7 @@ private object Transformers732 : Map<Int, Lambda732> by mapOf(
if (operatorUin == bot.id) {
return@lambda732 emptySequence()
}
val operator = group.getOrNull(operatorUin) ?: return@lambda732 emptySequence()
val operator = group[operatorUin] ?: return@lambda732 emptySequence()
readUInt().toLong() // time
this.discardExact(2)
val target = readUInt().toLong()
@ -213,7 +211,7 @@ private object Transformers732 : Map<Int, Lambda732> by mapOf(
}
}
val member = group.getOrNull(target) ?: return@lambda732 emptySequence()
val member = group[target] ?: return@lambda732 emptySequence()
member.checkIsMemberImpl()
if (member.muteTimeRemaining == timeSeconds) {
@ -228,7 +226,7 @@ private object Transformers732 : Map<Int, Lambda732> by mapOf(
// anonymous
0x0e to lambda732 { group: GroupImpl, _: QQAndroidBot ->
// 匿名
val operator = group.getOrNull(readUInt().toLong()) ?: return@lambda732 emptySequence()
val operator = group[readUInt().toLong()] ?: return@lambda732 emptySequence()
val new = readInt() == 0
if (group.settings.isAnonymousChatEnabled == new) {
return@lambda732 emptySequence()
@ -257,8 +255,8 @@ private object Transformers732 : Map<Int, Lambda732> by mapOf(
run {
when (key) {
"action_str" -> action = value
"uin_str1" -> from = group[value.toLong()]
"uin_str2" -> target = group[value.toLong()]
"uin_str1" -> from = group[value.toLong()] ?: return@lambda732 emptySequence()
"uin_str2" -> target = group[value.toLong()] ?: return@lambda732 emptySequence()
"suffix_str" -> suffix = value
}
}
@ -358,7 +356,7 @@ private object Transformers732 : Map<Int, Lambda732> by mapOf(
val operator =
if (recallReminder.uin == bot.id) group.botAsMember
else group.getOrNull(recallReminder.uin) ?: return@lambda732 emptySequence()
else group[recallReminder.uin] ?: return@lambda732 emptySequence()
return@lambda732 recallReminder.recalledMsgList.asSequence().mapNotNull { pkg ->
when {
@ -522,8 +520,8 @@ internal object Transformers528 : Map<Long, Lambda528> by mapOf(
}.forEach { (key, value) ->
when (key) {
"action_str" -> action = value
"uin_str1" -> from = bot.getFriend(value.toLong())
"uin_str2" -> target = bot.getFriend(value.toLong())
"uin_str1" -> from = bot.getFriend(value.toLong()) ?: return@lambda528 emptySequence()
"uin_str2" -> target = bot.getFriend(value.toLong()) ?: return@lambda528 emptySequence()
"suffix_str" -> suffix = value
}
}
@ -553,7 +551,7 @@ internal object Transformers528 : Map<Long, Lambda528> by mapOf(
//好友输入状态
0x115L to lambda528 { bot ->
val body = vProtobuf.loadAs(Submsgtype0x115.SubMsgType0x115.MsgBody.serializer())
val friend = bot.getFriendOrNull(body.fromUin)
val friend = bot.getFriend(body.fromUin)
val item = body.msgNotifyItem
return@lambda528 if (friend != null && item != null) {
sequenceOf(FriendInputStatusChangedEvent(friend, item.eventType == 1))
@ -565,7 +563,7 @@ internal object Transformers528 : Map<Long, Lambda528> by mapOf(
0x27L to lambda528 { bot ->
fun ModFriendRemark.transform(bot: QQAndroidBot): Sequence<Packet> {
return this.msgFrdRmk.asSequence().mapNotNull {
val friend = bot.getFriendOrNull(it.fuin) ?: return@mapNotNull null
val friend = bot.getFriend(it.fuin) ?: return@mapNotNull null
val old: String
friend.checkIsFriendImpl().friendInfo.checkIsInfoImpl()
.also { info -> old = info.remark }
@ -577,7 +575,7 @@ internal object Transformers528 : Map<Long, Lambda528> by mapOf(
fun DelFriend.transform(bot: QQAndroidBot): Sequence<Packet> {
return this.uint64Uins.asSequence().mapNotNull {
val friend = bot.getFriendOrNull(it) ?: return@mapNotNull null
val friend = bot.getFriend(it) ?: return@mapNotNull null
if (bot.friends.delegate.remove(friend)) {
FriendDeleteEvent(friend)
} else null
@ -591,14 +589,14 @@ internal object Transformers528 : Map<Long, Lambda528> by mapOf(
// 群名
val new = info.value.encodeToString()
val group = bot.getGroupOrNull(this.groupCode) ?: return@mapNotNull null
val group = bot.getGroup(this.groupCode) ?: return@mapNotNull null
group.checkIsGroupImpl()
val old = group.name
if (new == old) return@mapNotNull null
val operator = if (this.cmdUin == bot.id) null
else group.getOrNull(this.cmdUin) ?: return@mapNotNull null
else group[this.cmdUin] ?: return@mapNotNull null
group._name = new
@ -644,9 +642,9 @@ internal object Transformers528 : Map<Long, Lambda528> by mapOf(
when (info.field) {
1 -> { // name card
val new = info.value
val group = bot.getGroupOrNull(this.groupCode) ?: return@mapNotNull null
val group = bot.getGroup(this.groupCode) ?: return@mapNotNull null
group.checkIsGroupImpl()
val member = group.getOrNull(this.uin) ?: return@mapNotNull null
val member = group[this.uin] ?: return@mapNotNull null
member.checkIsMemberImpl()
val old = member.nameCard
@ -678,7 +676,7 @@ internal object Transformers528 : Map<Long, Lambda528> by mapOf(
if (uin == bot.id) {
return sequenceOf(BotAvatarChangedEvent(bot))
}
val friend = bot.getFriendOrNull(uin) ?: return emptySequence()
val friend = bot.getFriend(uin) ?: return emptySequence()
return sequenceOf(FriendAvatarChangedEvent(friend))
}
@ -697,7 +695,7 @@ internal object Transformers528 : Map<Long, Lambda528> by mapOf(
add(BotNickChangedEvent(bot, from, to))
}
} else {
val friend = (bot.getFriendOrNull(uin) ?: return@forEach) as FriendImpl
val friend = (bot.getFriend(uin) ?: return@forEach) as FriendImpl
val info = friend.friendInfo
val from = info.nick
when (info) {