diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/ContactImpl.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/ContactImpl.kt index e218225b1..3d26048fd 100644 --- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/ContactImpl.kt +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/ContactImpl.kt @@ -26,6 +26,9 @@ internal class QQImpl(bot: QQAndroidBot, override val coroutineContext: Coroutin TODO("not implemented") } + override val isOnline: Boolean + get() = true + override suspend fun queryProfile(): Profile { TODO("not implemented") } @@ -40,11 +43,16 @@ internal class QQImpl(bot: QQAndroidBot, override val coroutineContext: Coroutin } -internal class MemberImpl(bot: QQAndroidBot, group: Group, override val coroutineContext: CoroutineContext, override val id: Long) : ContactImpl(), Member { - override val group: Group by group.unsafeWeakRef() +internal class MemberImpl( + qq: QQImpl, + group: GroupImpl, + override val coroutineContext: CoroutineContext +) : ContactImpl(), Member, QQ by qq { + override val group: GroupImpl by group.unsafeWeakRef() + val qq: QQImpl by qq.unsafeWeakRef() + override val permission: MemberPermission get() = TODO("not implemented") - override val bot: QQAndroidBot by bot.unsafeWeakRef() override suspend fun mute(durationSeconds: Int): Boolean { TODO("not implemented") @@ -54,26 +62,6 @@ internal class MemberImpl(bot: QQAndroidBot, group: Group, override val coroutin TODO("not implemented") } - override suspend fun queryProfile(): Profile { - TODO("not implemented") - } - - override suspend fun queryPreviousNameList(): PreviousNameList { - TODO("not implemented") - } - - override suspend fun queryRemark(): FriendNameRemark { - TODO("not implemented") - } - - override suspend fun sendMessage(message: MessageChain) { - TODO("not implemented") - } - - override suspend fun uploadImage(image: ExternalImage): ImageId { - TODO("not implemented") - } - } @@ -89,7 +77,7 @@ internal class GroupImpl(bot: QQAndroidBot, override val coroutineContext: Corou override val members: ContactList = ContactList(LockFreeLinkedList()) override fun getMember(id: Long): Member = - members.delegate.filteringGetOrAdd({ it.id == id }, { MemberImpl(bot as QQAndroidBot, this, coroutineContext, id) }) + members.delegate.filteringGetOrAdd({ it.id == id }, { MemberImpl(bot.getQQ(id) as QQImpl, this, coroutineContext) }) override suspend fun updateGroupInfo(): GroupInfo { TODO("not implemented") diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidBotNetworkHandler.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidBotNetworkHandler.kt index f3eb44953..b63ec5f14 100644 --- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidBotNetworkHandler.kt +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidBotNetworkHandler.kt @@ -310,19 +310,33 @@ internal class QQAndroidBotNetworkHandler(bot: QQAndroidBot) : BotNetworkHandler /** * 发送一个包, 并挂起直到接收到指定的返回包或超时(3000ms) */ - suspend fun OutgoingPacket.sendAndExpect(timoutMillis: Long = 3000): E { + suspend fun OutgoingPacket.sendAndExpect(timeoutMillis: Long = 3000, retry: Int = 1): E { + require(timeoutMillis > 0) { "timeoutMillis must > 0" } + require(retry >= 0) { "retry must >= 0" } + val handler = PacketListener(commandName = commandName, sequenceId = sequenceId) packetListeners.addLast(handler) bot.logger.info("Send: ${this.commandName}") + var lastException: Exception? = null + repeat(retry + 1) { + try { + return doSendAndReceive(timeoutMillis, handler) + } catch (e: Exception) { + lastException = e + } + } + throw lastException!! + } + + private suspend inline fun OutgoingPacket.doSendAndReceive(timeoutMillis: Long = 3000, handler: PacketListener): E { channel.send(delegate) - return withTimeoutOrNull(timoutMillis) { + return withTimeoutOrNull(timeoutMillis) { @Suppress("UNCHECKED_CAST") handler.await() as E - // 不要 `withTimeout`. timeout 的异常会不知道去哪了. } ?: net.mamoe.mirai.qqandroid.utils.inline { packetListeners.remove(handler) - error("timeout when sending ${commandName}") + error("timeout when sending $commandName") } } diff --git a/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/ContactImpl.kt b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/ContactImpl.kt index b648de090..dcf769fe9 100644 --- a/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/ContactImpl.kt +++ b/mirai-core-timpc/src/commonMain/kotlin/net.mamoe.mirai.timpc/network/ContactImpl.kt @@ -139,6 +139,9 @@ internal class QQImpl @PublishedApi internal constructor(bot: TIMPCBot, override } } + override val isOnline: Boolean + get() = true + override suspend fun queryProfile(): Profile = withTIMPCBot { RequestProfileDetailsPacket(bot.uin, id, sessionKey).sendAndExpect().profile } diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/Member.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/Member.kt index 7fea786a3..b7f8b823f 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/Member.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/contact/Member.kt @@ -13,6 +13,7 @@ interface Member : QQ, Contact { /** * 所在的群 */ + @WeakRefProperty val group: Group /**