1
0
mirror of https://github.com/mamoe/mirai.git synced 2025-03-07 17:50:11 +08:00

Convert sendMessage to inline extension

This commit is contained in:
Him188 2019-12-04 20:57:26 +08:00
parent c2d89b611a
commit 6ea11c9ac3
8 changed files with 22 additions and 11 deletions
mirai-api-http/src/main/kotlin/net.mamoe.mirai.api.http
mirai-core/src/commonMain/kotlin/net.mamoe.mirai
Bot.kt
contact
message
network/protocol/tim/packet/action
mirai-demos
mirai-demo-1/src/main/java/demo/subscribe
mirai-demo-android/src/main/kotlin/net/mamoe/mirai/demo

View File

@ -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

View File

@ -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()

View File

@ -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,14 +37,12 @@ interface Contact {
* 速度太快会被服务器屏蔽(无响应). 在测试中不延迟地发送 6 条消息就会被屏蔽之后的数据包 1 秒左右.
*/
suspend fun sendMessage(message: MessageChain)
//这两个方法应写为扩展函数, 但为方便 import 还是写在这里
suspend fun sendMessage(plain: String) = sendMessage(plain.singleChain())
suspend fun sendMessage(message: Message) = sendMessage(message.chain())
}
suspend inline fun Contact.sendMessage(message: Message) = sendMessage(message.chain())
suspend inline fun Contact.sendMessage(plain: String) = sendMessage(plain.singleChain())
/**
* [BotSession] 作为接收器 (receiver) 并调用 [block], 返回 [block] 的返回值.
* 这个方法将能帮助使用在 [BotSession] 中定义的一些扩展方法, [BotSession.sendAndExpectAsync]
@ -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)

View File

@ -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

View File

@ -3,6 +3,7 @@
package net.mamoe.mirai.message
import net.mamoe.mirai.contact.Contact
import net.mamoe.mirai.contact.sendMessage
/**
* 可发送的或从服务器接收的消息.

View File

@ -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,

View File

@ -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

View File

@ -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