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