mirror of
https://github.com/mamoe/mirai.git
synced 2025-01-08 17:20:11 +08:00
Use delegate
This commit is contained in:
parent
cc853ce078
commit
6e22272adf
@ -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<Member> = 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")
|
||||
|
@ -310,19 +310,33 @@ internal class QQAndroidBotNetworkHandler(bot: QQAndroidBot) : BotNetworkHandler
|
||||
/**
|
||||
* 发送一个包, 并挂起直到接收到指定的返回包或超时(3000ms)
|
||||
*/
|
||||
suspend fun <E : Packet> OutgoingPacket.sendAndExpect(timoutMillis: Long = 3000): E {
|
||||
suspend fun <E : Packet> 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 <E : Packet> 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")
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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<RequestProfileDetailsResponse>().profile
|
||||
}
|
||||
|
@ -13,6 +13,7 @@ interface Member : QQ, Contact {
|
||||
/**
|
||||
* 所在的群
|
||||
*/
|
||||
@WeakRefProperty
|
||||
val group: Group
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user