Commit 6ea11c9a authored by Him188's avatar Him188

Convert sendMessage to inline extension

parent c2d89b61
......@@ -18,6 +18,7 @@ import io.ktor.util.pipeline.PipelineContext
import io.ktor.util.pipeline.PipelineInterceptor
import net.mamoe.mirai.Bot
import net.mamoe.mirai.addFriend
import net.mamoe.mirai.contact.sendMessage
import net.mamoe.mirai.getGroup
import net.mamoe.mirai.getQQ
import net.mamoe.mirai.utils.io.hexToBytes
......
......@@ -15,6 +15,7 @@ import net.mamoe.mirai.network.protocol.tim.packet.login.LoginResult
import net.mamoe.mirai.network.protocol.tim.packet.login.isSuccess
import net.mamoe.mirai.utils.BotConfiguration
import net.mamoe.mirai.utils.DefaultLogger
import net.mamoe.mirai.utils.MiraiInternalAPI
import net.mamoe.mirai.utils.MiraiLogger
import net.mamoe.mirai.utils.internal.coerceAtLeastOrFail
import net.mamoe.mirai.utils.io.logStacktrace
......@@ -153,6 +154,7 @@ class Bot(val account: BotAccount, val logger: MiraiLogger, context: CoroutineCo
inner class ContactSystem internal constructor() {
val bot: Bot get() = this@Bot
@UseExperimental(MiraiInternalAPI::class)
@Suppress("PropertyName")
internal val _groups = MutableContactList<Group>()
internal lateinit var groupsUpdater: Job
......@@ -161,6 +163,7 @@ class Bot(val account: BotAccount, val logger: MiraiLogger, context: CoroutineCo
val groups: ContactList<Group> = ContactList(_groups)
@Suppress("PropertyName")
@UseExperimental(MiraiInternalAPI::class)
internal val _qqs = MutableContactList<QQ>() //todo 实现群列表和好友列表获取
internal lateinit var qqUpdaterJob: Job
private val qqsLock = Mutex()
......@@ -172,6 +175,7 @@ class Bot(val account: BotAccount, val logger: MiraiLogger, context: CoroutineCo
*
* 注: 这个方法是线程安全的
*/
@UseExperimental(MiraiInternalAPI::class)
suspend fun getQQ(id: UInt): QQ =
if (_qqs.containsKey(id)) _qqs[id]!!
else qqsLock.withLock {
......@@ -190,6 +194,7 @@ class Bot(val account: BotAccount, val logger: MiraiLogger, context: CoroutineCo
*
* 注: 这个方法是线程安全的
*/
@UseExperimental(MiraiInternalAPI::class)
suspend fun getGroup(id: GroupId): Group = id.value.let {
if (_groups.containsKey(it)) _groups[it]!!
else groupsLock.withLock {
......@@ -208,6 +213,7 @@ class Bot(val account: BotAccount, val logger: MiraiLogger, context: CoroutineCo
suspend inline fun GroupId.group(): Group = getGroup(this)
suspend inline fun GroupInternalId.group(): Group = getGroup(this)
@UseExperimental(MiraiInternalAPI::class)
suspend fun close() {
network.close()
this.coroutineContext.cancelChildren()
......
......@@ -8,6 +8,7 @@ import net.mamoe.mirai.message.MessageChain
import net.mamoe.mirai.message.chain
import net.mamoe.mirai.message.singleChain
import net.mamoe.mirai.network.BotSession
import net.mamoe.mirai.utils.MiraiInternalAPI
import net.mamoe.mirai.withSession
import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.InvocationKind
......@@ -36,13 +37,11 @@ interface Contact {
* 速度太快会被服务器屏蔽(无响应). 在测试中不延迟地发送 6 条消息就会被屏蔽之后的数据包 1 秒左右.
*/
suspend fun sendMessage(message: MessageChain)
}
suspend inline fun Contact.sendMessage(message: Message) = sendMessage(message.chain())
//这两个方法应写为扩展函数, 但为方便 import 还是写在这里
suspend fun sendMessage(plain: String) = sendMessage(plain.singleChain())
suspend fun sendMessage(message: Message) = sendMessage(message.chain())
}
suspend inline fun Contact.sendMessage(plain: String) = sendMessage(plain.singleChain())
/**
* 以 [BotSession] 作为接收器 (receiver) 并调用 [block], 返回 [block] 的返回值.
......@@ -59,7 +58,8 @@ inline fun <R> Contact.withSession(block: BotSession.() -> R): R {
/**
* 只读联系人列表
*/
class ContactList<C : Contact> @PublishedApi internal constructor(internal val mutable: MutableContactList<C>) : Map<UInt, C> {
@UseExperimental(MiraiInternalAPI::class)
inline class ContactList<C : Contact>(internal val mutable: MutableContactList<C>) : Map<UInt, C> {
/**
* ID 列表的字符串表示.
* 如:
......@@ -87,13 +87,11 @@ class ContactList<C : Contact> @PublishedApi internal constructor(internal val m
/**
* 可修改联系人列表. 只会在内部使用.
*/
@PublishedApi
internal class MutableContactList<C : Contact> : MutableMap<UInt, C> {
@MiraiInternalAPI
inline class MutableContactList<C : Contact>(private val delegate: MutableMap<UInt, C> = linkedMapOf()) : MutableMap<UInt, C> {
override fun toString(): String = asIterable().joinToString(separator = ", ", prefix = "ContactList(", postfix = ")") { it.value.toString() }
// TODO: 2019/12/2 应该使用属性代理, 但属性代理会导致 UInt 内联错误. 等待 kotlin 修复后替换
private val delegate = linkedMapOf<UInt, C>()
override val size: Int get() = delegate.size
override fun containsKey(key: UInt): Boolean = delegate.containsKey(key)
......
......@@ -3,6 +3,7 @@
package net.mamoe.mirai.message
import net.mamoe.mirai.contact.Contact
import net.mamoe.mirai.contact.sendMessage
import net.mamoe.mirai.network.protocol.tim.packet.action.FriendImagePacket
import net.mamoe.mirai.utils.ExternalImage
......
......@@ -3,6 +3,7 @@
package net.mamoe.mirai.message
import net.mamoe.mirai.contact.Contact
import net.mamoe.mirai.contact.sendMessage
/**
* 可发送的或从服务器接收的消息.
......
......@@ -10,6 +10,7 @@ import net.mamoe.mirai.message.internal.toPacket
import net.mamoe.mirai.network.BotNetworkHandler
import net.mamoe.mirai.network.protocol.tim.TIMProtocol
import net.mamoe.mirai.network.protocol.tim.packet.*
import net.mamoe.mirai.utils.MiraiInternalAPI
import net.mamoe.mirai.utils.io.*
import net.mamoe.mirai.withSession
......@@ -44,6 +45,7 @@ data class RawGroupInfo(
*/
val members: Map<UInt, MemberPermission>
) : GroupPacket.GroupPacketResponse {
@UseExperimental(MiraiInternalAPI::class)
suspend inline fun parseBy(group: Group): GroupInfo = group.bot.withSession {
return GroupInfo(
group,
......
......@@ -8,6 +8,7 @@ import net.mamoe.mirai.Bot
import net.mamoe.mirai.BotAccount
import net.mamoe.mirai.alsoLogin
import net.mamoe.mirai.contact.QQ
import net.mamoe.mirai.contact.sendMessage
import net.mamoe.mirai.event.*
import net.mamoe.mirai.message.*
import net.mamoe.mirai.network.protocol.tim.packet.action.uploadImage
......
......@@ -13,6 +13,7 @@ import kotlinx.coroutines.launch
import kotlinx.io.core.readBytes
import net.mamoe.mirai.Bot
import net.mamoe.mirai.contact.QQ
import net.mamoe.mirai.contact.sendMessage
import net.mamoe.mirai.event.subscribeMessages
import net.mamoe.mirai.login
import net.mamoe.mirai.message.Image
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment