[Review] OtherClient:

- Change Bot.otherClients to ContactList<OtherClient>
- Change OtherClient.id to delegate info.appId
- Stabilize OtherClientInfo
This commit is contained in:
Him188 2021-01-08 11:42:44 +08:00
parent 1885db5523
commit b32090bf2a
7 changed files with 19 additions and 40 deletions

View File

@ -1,5 +1,5 @@
/*
* Copyright 2019-2020 Mamoe Technologies and contributors.
* Copyright 2019-2021 Mamoe Technologies and contributors.
*
* 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
* Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
@ -85,7 +85,7 @@ public interface Bot : CoroutineScope, ContactOrBot, UserOrBot {
/**
* 其他设备列表
*/
public val otherClients: OtherClientList
public val otherClients: ContactList<OtherClient>
/**

View File

@ -1,5 +1,5 @@
/*
* Copyright 2019-2020 Mamoe Technologies and contributors.
* Copyright 2019-2021 Mamoe Technologies and contributors.
*
* 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
* Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
@ -21,6 +21,7 @@ import net.mamoe.mirai.utils.BotConfiguration.MiraiProtocol.ANDROID_PHONE
import net.mamoe.mirai.utils.ExternalResource
import net.mamoe.mirai.utils.MiraiExperimentalApi
import net.mamoe.mirai.utils.MiraiInternalApi
import net.mamoe.mirai.utils.toLongUnsigned
/**
* 其他设备. 如当 [Bot] [ANDROID_PHONE] 登录时, 还可以有其他设备以 [ANDROID_PAD], iOS, PC 或其他设备登录.
@ -34,9 +35,11 @@ public interface OtherClient : Contact {
public override val bot: Bot
/**
* [Bot.id] 相同
* 识别 id, 仅运行时使用.
*
* id 由其他客户端控制, 重启可能会变化.
*/
public override val id: Long get() = bot.id
public override val id: Long get() = info.appId.toLongUnsigned()
override suspend fun sendMessage(message: Message): MessageReceipt<OtherClient> {
throw UnsupportedOperationException("OtherClientImpl.sendMessage is not yet supported.")
@ -47,14 +50,10 @@ public interface OtherClient : Contact {
}
}
@MiraiInternalApi
public inline val OtherClient.appId: Int
get() = info.appId
public inline val OtherClient.platform: Platform get() = info.platform
public inline val OtherClient.deviceName: String get() = info.deviceName
public inline val OtherClient.deviceKind: String get() = info.deviceKind
@MiraiExperimentalApi
public data class OtherClientInfo @MiraiInternalApi constructor(
/**
@ -62,6 +61,7 @@ public data class OtherClientInfo @MiraiInternalApi constructor(
*
* 不可能有 [appId] 相同的两个客户端t在线.
*/
@MiraiInternalApi
public val appId: Int,
/**
@ -99,6 +99,7 @@ public enum class Platform(
MOBILE(2, 2), // android
WINDOWS(1, 3),
@MiraiExperimentalApi
UNKNOWN(0, 0)
;

View File

@ -1,25 +0,0 @@
/*
* Copyright 2019-2020 Mamoe Technologies and contributors.
*
* 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
* Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
*
* https://github.com/mamoe/mirai/blob/master/LICENSE
*/
package net.mamoe.mirai.contact
import net.mamoe.mirai.utils.MiraiExperimentalApi
import net.mamoe.mirai.utils.MiraiInternalApi
import java.util.concurrent.ConcurrentLinkedQueue
public class OtherClientList internal constructor(
@MiraiInternalApi @JvmField
public val delegate: MutableCollection<OtherClient> = ConcurrentLinkedQueue()
) : Collection<OtherClient> by delegate {
@MiraiExperimentalApi
public operator fun get(appId: Int): OtherClient? = this.find { it.appId == appId }
public fun getOrFail(appId: Int): OtherClient =
get(appId) ?: throw NoSuchElementException("OtherClient with appId=$appId not found.")
}

View File

@ -21,7 +21,8 @@ import io.ktor.util.*
import kotlinx.coroutines.*
import kotlinx.coroutines.sync.Mutex
import net.mamoe.mirai.Bot
import net.mamoe.mirai.contact.OtherClientList
import net.mamoe.mirai.contact.ContactList
import net.mamoe.mirai.contact.OtherClient
import net.mamoe.mirai.event.*
import net.mamoe.mirai.event.Listener.EventPriority.MONITOR
import net.mamoe.mirai.event.events.BotEvent
@ -79,7 +80,7 @@ internal abstract class AbstractBot<N : BotNetworkHandler> constructor(
GlobalEventChannel.filterIsInstance<BotEvent>().filter { it.bot === this@AbstractBot }
val otherClientsLock = Mutex() // lock sync
override val otherClients: OtherClientList = OtherClientList()
override val otherClients: ContactList<OtherClient> = ContactList()
/**
* Close server connection, resend login packet, BUT DOESN'T [BotNetworkHandler.init]

View File

@ -1,5 +1,5 @@
/*
* Copyright 2019-2020 Mamoe Technologies and contributors.
* Copyright 2019-2021 Mamoe Technologies and contributors.
*
* 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
* Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
@ -18,6 +18,9 @@ import net.mamoe.mirai.message.data.Message
import net.mamoe.mirai.utils.ExternalResource
import kotlin.coroutines.CoroutineContext
internal inline val OtherClient.appId: Int
get() = info.appId
internal class OtherClientImpl(
bot: Bot,
coroutineContext: CoroutineContext,

View File

@ -22,7 +22,6 @@ import net.mamoe.mirai.Mirai
import net.mamoe.mirai.contact.Group
import net.mamoe.mirai.contact.MemberPermission
import net.mamoe.mirai.contact.NormalMember
import net.mamoe.mirai.contact.appId
import net.mamoe.mirai.data.MemberInfo
import net.mamoe.mirai.event.AbstractEvent
import net.mamoe.mirai.event.Event

View File

@ -1,5 +1,5 @@
/*
* Copyright 2019-2020 Mamoe Technologies and contributors.
* Copyright 2019-2021 Mamoe Technologies and contributors.
*
* 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
* Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
@ -16,11 +16,11 @@ import kotlinx.io.core.ByteReadPacket
import kotlinx.serialization.protobuf.ProtoBuf
import net.mamoe.mirai.Mirai
import net.mamoe.mirai.contact.ClientKind
import net.mamoe.mirai.contact.appId
import net.mamoe.mirai.event.events.BotOfflineEvent
import net.mamoe.mirai.event.events.OtherClientOfflineEvent
import net.mamoe.mirai.event.events.OtherClientOnlineEvent
import net.mamoe.mirai.internal.QQAndroidBot
import net.mamoe.mirai.internal.contact.appId
import net.mamoe.mirai.internal.createOtherClient
import net.mamoe.mirai.internal.message.contextualBugReportException
import net.mamoe.mirai.internal.network.Packet