From 6c0b6473edf6a3eeead86eeeb4c27797d8b350ac Mon Sep 17 00:00:00 2001 From: Him188 Date: Wed, 16 Dec 2020 19:11:42 +0800 Subject: [PATCH] Make Group.get, Bot.getFriend, Bot.getGroup return nullable. Add getOrFail for migration --- mirai-core-api/src/commonMain/kotlin/Bot.kt | 41 +++++++++++++------ .../src/commonMain/kotlin/contact/Group.kt | 29 ++++++++----- .../src/commonMain/kotlin/contact/Member.kt | 5 +-- .../commonMain/kotlin/event/events/group.kt | 19 ++++++++- .../commonMain/kotlin/event/events/message.kt | 10 ++++- mirai-core/src/commonMain/kotlin/MiraiImpl.kt | 22 ++++------ .../commonMain/kotlin/contact/GroupImpl.kt | 10 +---- .../kotlin/message/incomingSourceImpl.kt | 9 ++-- .../protocol/packet/chat/NewContact.kt | 5 +-- .../chat/receive/MessageSvc.PbGetMsg.kt | 10 ++--- .../chat/receive/OnlinePush.PbPushGroupMsg.kt | 3 +- .../chat/receive/OnlinePush.PbPushTransMsg.kt | 6 +-- .../packet/chat/receive/OnlinePush.ReqPush.kt | 38 ++++++++--------- 13 files changed, 120 insertions(+), 87 deletions(-) diff --git a/mirai-core-api/src/commonMain/kotlin/Bot.kt b/mirai-core-api/src/commonMain/kotlin/Bot.kt index 3c8eebd7b..6719f4932 100644 --- a/mirai-core-api/src/commonMain/kotlin/Bot.kt +++ b/mirai-core-api/src/commonMain/kotlin/Bot.kt @@ -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 /** - * 获取一个好友对象. - * @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 /** - * 获取一个机器人加入的群. - * @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) diff --git a/mirai-core-api/src/commonMain/kotlin/contact/Group.kt b/mirai-core-api/src/commonMain/kotlin/contact/Group.kt index 1cb2b7171..7da7c83ac 100644 --- a/mirai-core-api/src/commonMain/kotlin/contact/Group.kt +++ b/mirai-core-api/src/commonMain/kotlin/contact/Group.kt @@ -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 /** - * 获取群成员实例. 不存在时抛出 [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 的群成员是否存在 diff --git a/mirai-core-api/src/commonMain/kotlin/contact/Member.kt b/mirai-core-api/src/commonMain/kotlin/contact/Member.kt index 77f1b66a4..42f51fe45 100644 --- a/mirai-core-api/src/commonMain/kotlin/contact/Member.kt +++ b/mirai-core-api/src/commonMain/kotlin/contact/Member.kt @@ -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) /** * 判断此成员是否为好友 diff --git a/mirai-core-api/src/commonMain/kotlin/event/events/group.kt b/mirai-core-api/src/commonMain/kotlin/event/events/group.kt index ee3285069..19476157f 100644 --- a/mirai-core-api/src/commonMain/kotlin/event/events/group.kt +++ b/mirai-core-api/src/commonMain/kotlin/event/events/group.kt @@ -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) } diff --git a/mirai-core-api/src/commonMain/kotlin/event/events/message.kt b/mirai-core-api/src/commonMain/kotlin/event/events/message.kt index 8d474179a..7d98d7e4a 100644 --- a/mirai-core-api/src/commonMain/kotlin/event/events/message.kt +++ b/mirai-core-api/src/commonMain/kotlin/event/events/message.kt @@ -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)" diff --git a/mirai-core/src/commonMain/kotlin/MiraiImpl.kt b/mirai-core/src/commonMain/kotlin/MiraiImpl.kt index 7cab3f5a1..afc7a5118 100644 --- a/mirai-core/src/commonMain/kotlin/MiraiImpl.kt +++ b/mirai-core/src/commonMain/kotlin/MiraiImpl.kt @@ -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 ?: "" } + checkGroupPermission(event.bot, event.groupId) { event::class.simpleName ?: "" } @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 ?: "" } + checkGroupPermission(event.bot, event.groupId) { event::class.simpleName ?: "" } @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 ?: "" } + checkGroupPermission(event.bot, event.groupId) { event::class.simpleName ?: "" } @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() diff --git a/mirai-core/src/commonMain/kotlin/contact/GroupImpl.kt b/mirai-core/src/commonMain/kotlin/contact/GroupImpl.kt index 3dc272333..bcc05d147 100644 --- a/mirai-core/src/commonMain/kotlin/contact/GroupImpl.kt +++ b/mirai-core/src/commonMain/kotlin/contact/GroupImpl.kt @@ -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 { require(message.isContentNotEmpty()) { "message is empty" } check(!isBotMuted) { throw BotIsBeingMutedException(this) } diff --git a/mirai-core/src/commonMain/kotlin/message/incomingSourceImpl.kt b/mirai-core/src/commonMain/kotlin/message/incomingSourceImpl.kt index ae84a2bc0..d5bc1a881 100644 --- a/mirai-core/src/commonMain/kotlin/message/incomingSourceImpl.kt +++ b/mirai-core/src/commonMain/kotlin/message/incomingSourceImpl.kt @@ -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()) } diff --git a/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/NewContact.kt b/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/NewContact.kt index 08352d9eb..bb5c1fd0a 100644 --- a/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/NewContact.kt +++ b/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/NewContact.kt @@ -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 -> { diff --git a/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/MessageSvc.PbGetMsg.kt b/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/MessageSvc.PbGetMsg.kt index 5647eb5f3..8b4ab278d 100644 --- a/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/MessageSvc.PbGetMsg.kt +++ b/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/MessageSvc.PbGetMsg.kt @@ -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 // 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 { 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() diff --git a/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/OnlinePush.PbPushGroupMsg.kt b/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/OnlinePush.PbPushGroupMsg.kt index 97141579c..f7e8c5603 100644 --- a/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/OnlinePush.PbPushGroupMsg.kt +++ b/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/OnlinePush.PbPushGroupMsg.kt @@ -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("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 { diff --git a/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/OnlinePush.PbPushTransMsg.kt b/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/OnlinePush.PbPushTransMsg.kt index 2303557cd..b23ad28c3 100644 --- a/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/OnlinePush.PbPushTransMsg.kt +++ b/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/OnlinePush.PbPushTransMsg.kt @@ -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) diff --git a/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/OnlinePush.ReqPush.kt b/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/OnlinePush.ReqPush.kt index 83872d43b..354f5d5ab 100644 --- a/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/OnlinePush.ReqPush.kt +++ b/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/receive/OnlinePush.ReqPush.kt @@ -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 = 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 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 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 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 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 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 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 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 by mapOf( 0x27L to lambda528 { bot -> fun ModFriendRemark.transform(bot: QQAndroidBot): Sequence { 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 by mapOf( fun DelFriend.transform(bot: QQAndroidBot): Sequence { 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 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 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 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 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) {