From e1ffaa541072e57bb90998df2aa82f5c473c8b1f Mon Sep 17 00:00:00 2001 From: Him188 Date: Sun, 27 Jun 2021 17:25:05 +0800 Subject: [PATCH] Fix incorrect coroutine scope created for contacts in `IMirai.newFriend` and `IMirai.newStranger` --- mirai-core/src/commonMain/kotlin/MiraiImpl.kt | 8 ++++---- .../src/commonMain/kotlin/contact/AbstractContact.kt | 7 +++---- .../src/commonMain/kotlin/contact/AbstractMember.kt | 4 ++-- mirai-core/src/commonMain/kotlin/contact/AbstractUser.kt | 5 +++-- .../src/commonMain/kotlin/contact/AnonymousMemberImpl.kt | 4 ++-- mirai-core/src/commonMain/kotlin/contact/FriendImpl.kt | 5 ++--- mirai-core/src/commonMain/kotlin/contact/GroupImpl.kt | 4 ++-- mirai-core/src/commonMain/kotlin/contact/StrangerImpl.kt | 4 ++-- 8 files changed, 20 insertions(+), 21 deletions(-) diff --git a/mirai-core/src/commonMain/kotlin/MiraiImpl.kt b/mirai-core/src/commonMain/kotlin/MiraiImpl.kt index bc3692c51..4406f7511 100644 --- a/mirai-core/src/commonMain/kotlin/MiraiImpl.kt +++ b/mirai-core/src/commonMain/kotlin/MiraiImpl.kt @@ -338,8 +338,8 @@ internal open class MiraiImpl : IMirai, LowLevelApiAccessor { override fun newFriend(bot: Bot, friendInfo: FriendInfo): FriendImpl { return FriendImpl( bot.asQQAndroidBot(), - bot.coroutineContext + SupervisorJob(bot.supervisorJob), - friendInfo + bot.coroutineContext, + friendInfo.impl(), ) } @@ -347,8 +347,8 @@ internal open class MiraiImpl : IMirai, LowLevelApiAccessor { override fun newStranger(bot: Bot, strangerInfo: StrangerInfo): StrangerImpl { return StrangerImpl( bot.asQQAndroidBot(), - bot.coroutineContext + SupervisorJob(bot.supervisorJob), - strangerInfo + bot.coroutineContext, + strangerInfo.impl(), ) } diff --git a/mirai-core/src/commonMain/kotlin/contact/AbstractContact.kt b/mirai-core/src/commonMain/kotlin/contact/AbstractContact.kt index 76eef94d6..2440a0a9e 100644 --- a/mirai-core/src/commonMain/kotlin/contact/AbstractContact.kt +++ b/mirai-core/src/commonMain/kotlin/contact/AbstractContact.kt @@ -9,15 +9,14 @@ package net.mamoe.mirai.internal.contact -import kotlinx.coroutines.Job -import kotlinx.coroutines.SupervisorJob import net.mamoe.mirai.contact.Contact import net.mamoe.mirai.internal.QQAndroidBot +import net.mamoe.mirai.utils.childScopeContext import kotlin.coroutines.CoroutineContext internal abstract class AbstractContact( final override val bot: QQAndroidBot, - coroutineContext: CoroutineContext, + parentCoroutineContext: CoroutineContext, ) : Contact { - final override val coroutineContext: CoroutineContext = coroutineContext + SupervisorJob(coroutineContext[Job]) + final override val coroutineContext: CoroutineContext = parentCoroutineContext.childScopeContext() } \ No newline at end of file diff --git a/mirai-core/src/commonMain/kotlin/contact/AbstractMember.kt b/mirai-core/src/commonMain/kotlin/contact/AbstractMember.kt index 17bf99da2..0e08270ef 100644 --- a/mirai-core/src/commonMain/kotlin/contact/AbstractMember.kt +++ b/mirai-core/src/commonMain/kotlin/contact/AbstractMember.kt @@ -18,9 +18,9 @@ import kotlin.coroutines.CoroutineContext internal abstract class AbstractMember( final override val group: GroupImpl, - coroutineContext: CoroutineContext, + parentCoroutineContext: CoroutineContext, memberInfo: MemberInfo, -) : AbstractUser(group.bot, coroutineContext, memberInfo), Member { +) : AbstractUser(group.bot, parentCoroutineContext, memberInfo), Member { final override val info: MemberInfoImpl = memberInfo.cast() override val nameCard: String get() = info.nameCard diff --git a/mirai-core/src/commonMain/kotlin/contact/AbstractUser.kt b/mirai-core/src/commonMain/kotlin/contact/AbstractUser.kt index bc9222711..41874e0fe 100644 --- a/mirai-core/src/commonMain/kotlin/contact/AbstractUser.kt +++ b/mirai-core/src/commonMain/kotlin/contact/AbstractUser.kt @@ -41,9 +41,10 @@ internal val User.info: UserInfo? get() = this.castOrNull()?.info internal abstract class AbstractUser( bot: QQAndroidBot, - coroutineContext: CoroutineContext, + parentCoroutineContext: CoroutineContext, userInfo: UserInfo, -) : User, AbstractContact(bot, coroutineContext) { +) : User, AbstractContact(bot, parentCoroutineContext) { + final override val id: Long = userInfo.uin final override var nick: String = userInfo.nick final override val remark: String = userInfo.remark diff --git a/mirai-core/src/commonMain/kotlin/contact/AnonymousMemberImpl.kt b/mirai-core/src/commonMain/kotlin/contact/AnonymousMemberImpl.kt index a3dcb35e5..abef0d842 100644 --- a/mirai-core/src/commonMain/kotlin/contact/AnonymousMemberImpl.kt +++ b/mirai-core/src/commonMain/kotlin/contact/AnonymousMemberImpl.kt @@ -19,9 +19,9 @@ import kotlin.coroutines.CoroutineContext internal class AnonymousMemberImpl( group: GroupImpl, - coroutineContext: CoroutineContext, + parentCoroutineContext: CoroutineContext, memberInfo: MemberInfo, -) : AnonymousMember, AbstractMember(group, coroutineContext, memberInfo) { +) : AnonymousMember, AbstractMember(group, parentCoroutineContext, memberInfo) { init { requireNotNull(memberInfo.anonymousId) { "anonymousId must not be null" } } diff --git a/mirai-core/src/commonMain/kotlin/contact/FriendImpl.kt b/mirai-core/src/commonMain/kotlin/contact/FriendImpl.kt index d0d80a0ba..35cf93d25 100644 --- a/mirai-core/src/commonMain/kotlin/contact/FriendImpl.kt +++ b/mirai-core/src/commonMain/kotlin/contact/FriendImpl.kt @@ -63,13 +63,12 @@ internal inline fun Friend.checkIsFriendImpl(): FriendImpl { internal class FriendImpl( bot: QQAndroidBot, - coroutineContext: CoroutineContext, + parentCoroutineContext: CoroutineContext, internal val friendInfo: FriendInfo, -) : Friend, AbstractUser(bot, coroutineContext, friendInfo) { +) : Friend, AbstractUser(bot, parentCoroutineContext, friendInfo) { @Suppress("unused") // bug val lastMessageSequence: AtomicInt = atomic(-1) val friendPkgMsgParsingCache = C2CPkgMsgParsingCache() - override suspend fun delete() { check(bot.friends[this.id] != null) { "Friend ${this.id} had already been deleted" diff --git a/mirai-core/src/commonMain/kotlin/contact/GroupImpl.kt b/mirai-core/src/commonMain/kotlin/contact/GroupImpl.kt index 73ce1e1bc..a297aadf6 100644 --- a/mirai-core/src/commonMain/kotlin/contact/GroupImpl.kt +++ b/mirai-core/src/commonMain/kotlin/contact/GroupImpl.kt @@ -68,11 +68,11 @@ internal fun Group.checkIsGroupImpl(): GroupImpl { @Suppress("PropertyName") internal class GroupImpl( bot: QQAndroidBot, - coroutineContext: CoroutineContext, + parentCoroutineContext: CoroutineContext, override val id: Long, groupInfo: GroupInfo, members: Sequence, -) : Group, AbstractContact(bot, coroutineContext) { +) : Group, AbstractContact(bot, parentCoroutineContext) { companion object val uin: Long = groupInfo.uin diff --git a/mirai-core/src/commonMain/kotlin/contact/StrangerImpl.kt b/mirai-core/src/commonMain/kotlin/contact/StrangerImpl.kt index 6600d8b56..2b900bf58 100644 --- a/mirai-core/src/commonMain/kotlin/contact/StrangerImpl.kt +++ b/mirai-core/src/commonMain/kotlin/contact/StrangerImpl.kt @@ -49,9 +49,9 @@ internal inline fun Stranger.checkIsImpl(): StrangerImpl { internal class StrangerImpl( bot: QQAndroidBot, - coroutineContext: CoroutineContext, + parentCoroutineContext: CoroutineContext, internal val strangerInfo: StrangerInfo, -) : Stranger, AbstractUser(bot, coroutineContext, strangerInfo) { +) : Stranger, AbstractUser(bot, parentCoroutineContext, strangerInfo) { @Suppress("unused") // bug val lastMessageSequence: AtomicInt = atomic(-1) override suspend fun delete() {