Change sendMessage(MessageChain) to sendMessage(Message)

This commit is contained in:
Him188 2020-03-22 14:16:31 +08:00
parent 7820b43f6a
commit 53fdcd41f7
19 changed files with 170 additions and 72 deletions

View File

@ -9,19 +9,9 @@
package net.mamoe.mirai.qqandroid
import io.ktor.client.HttpClient
import io.ktor.client.request.*
import io.ktor.client.request.forms.MultiPartFormDataContent
import io.ktor.client.request.forms.formData
import kotlinx.coroutines.async
import kotlinx.coroutines.launch
import kotlinx.coroutines.withTimeoutOrNull
import kotlinx.io.core.Closeable
import kotlinx.serialization.MissingFieldException
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.JsonConfiguration
import kotlinx.serialization.json.int
import kotlinx.serialization.json.long
import net.mamoe.mirai.LowLevelAPI
import net.mamoe.mirai.contact.*
import net.mamoe.mirai.data.*
@ -30,10 +20,7 @@ import net.mamoe.mirai.event.events.*
import net.mamoe.mirai.event.events.MessageSendEvent.FriendMessageSendEvent
import net.mamoe.mirai.event.events.MessageSendEvent.GroupMessageSendEvent
import net.mamoe.mirai.message.MessageReceipt
import net.mamoe.mirai.message.data.MessageChain
import net.mamoe.mirai.message.data.MessageSource
import net.mamoe.mirai.message.data.OfflineFriendImage
import net.mamoe.mirai.message.data.OfflineGroupImage
import net.mamoe.mirai.message.data.*
import net.mamoe.mirai.qqandroid.message.MessageSourceFromSendGroup
import net.mamoe.mirai.qqandroid.network.highway.HighwayHelper
import net.mamoe.mirai.qqandroid.network.highway.postImage
@ -45,7 +32,6 @@ import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.image.LongConn
import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.receive.MessageSvc
import net.mamoe.mirai.qqandroid.utils.toIpV4AddressString
import net.mamoe.mirai.utils.*
import net.mamoe.mirai.utils.io.encodeToString
import net.mamoe.mirai.utils.io.toUHexString
import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.contract
@ -69,8 +55,9 @@ internal class QQImpl(
override val nick: String
get() = friendInfo.nick
override suspend fun sendMessage(message: MessageChain): MessageReceipt<QQ> {
val event = FriendMessageSendEvent(this, message).broadcast()
@Suppress("DuplicatedCode")
override suspend fun sendMessage(message: Message): MessageReceipt<QQ> {
val event = FriendMessageSendEvent(this, message.asMessageChain()).broadcast()
if (event.isCancelled) {
throw EventCancelledException("cancelled by FriendMessageSendEvent")
}
@ -89,6 +76,11 @@ internal class QQImpl(
return MessageReceipt(source, this, null)
}
@Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN)
override suspend fun sendMessage(message: MessageChain): MessageReceipt<QQ> {
return this.sendMessage(message as Message)
}
@OptIn(MiraiInternalAPI::class)
override suspend fun uploadImage(image: ExternalImage): OfflineFriendImage = try {
if (BeforeImageUploadEvent(this, image).broadcast().isCancelled) {
@ -220,7 +212,32 @@ internal class MemberImpl(
@MiraiExperimentalAPI
override suspend fun queryRemark(): FriendNameRemark = qq.queryRemark()
override suspend fun sendMessage(message: MessageChain): MessageReceipt<QQ> = qq.sendMessage(message)
@Suppress("DuplicatedCode")
override suspend fun sendMessage(message: Message): MessageReceipt<Member> {
val event = FriendMessageSendEvent(this, message.asMessageChain()).broadcast()
if (event.isCancelled) {
throw EventCancelledException("cancelled by FriendMessageSendEvent")
}
lateinit var source: MessageSource
bot.network.run {
check(
MessageSvc.PbSendMsg.ToFriend(
bot.client,
id,
event.message
) {
source = it
}.sendAndExpect<MessageSvc.PbSendMsg.Response>() is MessageSvc.PbSendMsg.Response.SUCCESS
) { "send message failed" }
}
return MessageReceipt(source, this, null)
}
@Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN)
override suspend fun sendMessage(message: MessageChain): MessageReceipt<out QQ> {
return this.sendMessage(message as Message)
}
override suspend fun uploadImage(image: ExternalImage): OfflineFriendImage = qq.uploadImage(image)
// endregion
@ -386,10 +403,7 @@ internal class GroupImpl(
groupInfo: GroupInfo,
members: Sequence<MemberInfo>
) : Group() {
@Suppress("\"RemoveEmptyClassBody\"") // things will go wrong after removal, don't try
companion object {
}
companion object;
override val bot: QQAndroidBot by bot.unsafeWeakRef()
val uin: Long = groupInfo.uin
@ -595,9 +609,9 @@ internal class GroupImpl(
return members.delegate.filteringGetOrNull { it.id == id }
}
override suspend fun sendMessage(message: MessageChain): MessageReceipt<Group> {
override suspend fun sendMessage(message: Message): MessageReceipt<Group> {
check(!isBotMuted) { "bot is muted. Remaining seconds=$botMuteRemaining" }
val event = GroupMessageSendEvent(this, message).broadcast()
val event = GroupMessageSendEvent(this, message.asMessageChain()).broadcast()
if (event.isCancelled) {
throw EventCancelledException("cancelled by FriendMessageSendEvent")
}
@ -619,6 +633,12 @@ internal class GroupImpl(
return MessageReceipt(source, this, botAsMember)
}
@Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN)
override suspend fun sendMessage(message: MessageChain): MessageReceipt<Group> {
return this.sendMessage(message as Message)
}
override suspend fun uploadImage(image: ExternalImage): OfflineGroupImage = try {
if (BeforeImageUploadEvent(this, image).broadcast().isCancelled) {
throw EventCancelledException("cancelled by BeforeImageUploadEvent.ToGroup")

View File

@ -18,6 +18,7 @@ import net.mamoe.mirai.event.events.ImageUploadEvent
import net.mamoe.mirai.event.events.MessageSendEvent.FriendMessageSendEvent
import net.mamoe.mirai.event.events.MessageSendEvent.GroupMessageSendEvent
import net.mamoe.mirai.message.MessageReceipt
import net.mamoe.mirai.message.data.Message
import net.mamoe.mirai.message.data.MessageChain
import net.mamoe.mirai.message.data.OfflineImage
import net.mamoe.mirai.message.data.id
@ -64,6 +65,10 @@ actual abstract class Contact : CoroutineScope, ContactJavaHappyAPI() {
*/
@JvmName("sendMessageSuspend")
@JvmSynthetic
actual abstract suspend fun sendMessage(message: Message): MessageReceipt<out Contact>
@JvmSynthetic
@Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN)
actual abstract suspend fun sendMessage(message: MessageChain): MessageReceipt<out Contact>
/**

View File

@ -58,12 +58,14 @@ actual abstract class ContactJavaHappyAPI {
*/
@Throws(EventCancelledException::class, IllegalStateException::class)
@JvmName("sendMessage")
open fun __sendMessageBlockingForJava__(message: Message): MessageReceipt<Contact> {
return runBlocking { sendMessage(message) }
open fun __sendMessageBlockingForJava__(message: Message): MessageReceipt<out Contact> {
return runBlocking {
sendMessage(message)
}
}
@JvmName("sendMessage")
open fun __sendMessageBlockingForJava__(message: String): MessageReceipt<Contact> {
open fun __sendMessageBlockingForJava__(message: String): MessageReceipt<out Contact> {
return runBlocking { sendMessage(message) }
}
@ -137,7 +139,7 @@ actual abstract class ContactJavaHappyAPI {
* @see Contact.sendMessage
*/
@JvmName("sendMessageAsync")
open fun __sendMessageAsyncForJava__(message: Message): Future<MessageReceipt<Contact>> {
open fun __sendMessageAsyncForJava__(message: Message): Future<MessageReceipt<out Contact>> {
return future { sendMessage(message) }
}
@ -146,7 +148,7 @@ actual abstract class ContactJavaHappyAPI {
* @see Contact.sendMessage
*/
@JvmName("sendMessageAsync")
open fun __sendMessageAsyncForJava__(message: String): Future<MessageReceipt<Contact>> {
open fun __sendMessageAsyncForJava__(message: String): Future<MessageReceipt<out Contact>> {
return future { sendMessage(message) }
}

View File

@ -16,6 +16,7 @@ import net.mamoe.mirai.event.events.*
import net.mamoe.mirai.event.events.MessageSendEvent.FriendMessageSendEvent
import net.mamoe.mirai.event.events.MessageSendEvent.GroupMessageSendEvent
import net.mamoe.mirai.message.MessageReceipt
import net.mamoe.mirai.message.data.Message
import net.mamoe.mirai.message.data.MessageChain
import net.mamoe.mirai.message.data.OfflineGroupImage
import net.mamoe.mirai.utils.ExternalImage
@ -179,6 +180,10 @@ actual abstract class Group : Contact(), CoroutineScope {
*/
@JvmName("sendMessageSuspend")
@JvmSynthetic
actual abstract override suspend fun sendMessage(message: Message): MessageReceipt<Group>
@Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN)
@JvmSynthetic
actual abstract override suspend fun sendMessage(message: MessageChain): MessageReceipt<Group>
/**

View File

@ -14,6 +14,10 @@ package net.mamoe.mirai.contact
import net.mamoe.mirai.Bot
import net.mamoe.mirai.JavaHappyAPI
import net.mamoe.mirai.event.events.*
import net.mamoe.mirai.event.events.MessageSendEvent.FriendMessageSendEvent
import net.mamoe.mirai.event.events.MessageSendEvent.GroupMessageSendEvent
import net.mamoe.mirai.message.MessageReceipt
import net.mamoe.mirai.message.data.Message
import net.mamoe.mirai.utils.MiraiInternalAPI
import net.mamoe.mirai.utils.WeakRefProperty
@ -101,6 +105,21 @@ actual abstract class Member : MemberJavaHappyAPI() {
@JvmSynthetic
actual abstract suspend fun unmute()
/**
* 向这个对象发送消息.
*
* @see FriendMessageSendEvent 发送好友信息事件, cancellable
* @see GroupMessageSendEvent 发送群消息事件. cancellable
*
* @throws EventCancelledException 当发送消息事件被取消
* @throws IllegalStateException 发送群消息时若 [Bot] 被禁言抛出
*
* @return 消息回执. 可进行撤回 ([MessageReceipt.recall])
*/
@JvmName("sendMessageSuspend")
@JvmSynthetic
actual abstract override suspend fun sendMessage(message: Message): MessageReceipt<Member>
/**
* 踢出该成员.
*

View File

@ -13,6 +13,7 @@ import net.mamoe.mirai.event.events.ImageUploadEvent
import net.mamoe.mirai.event.events.MessageSendEvent.FriendMessageSendEvent
import net.mamoe.mirai.event.events.MessageSendEvent.GroupMessageSendEvent
import net.mamoe.mirai.message.MessageReceipt
import net.mamoe.mirai.message.data.Message
import net.mamoe.mirai.message.data.MessageChain
import net.mamoe.mirai.message.data.OfflineFriendImage
import net.mamoe.mirai.utils.ExternalImage
@ -88,7 +89,11 @@ actual abstract class QQ : Contact(), CoroutineScope {
*/
@JvmName("sendMessageSuspend")
@JvmSynthetic
actual abstract override suspend fun sendMessage(message: MessageChain): MessageReceipt<QQ>
actual abstract override suspend fun sendMessage(message: Message): MessageReceipt<out QQ>
@JvmSynthetic
@Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN)
actual abstract override suspend fun sendMessage(message: MessageChain): MessageReceipt<out QQ>
/**
* 上传一个图片以备发送.

View File

@ -266,7 +266,7 @@ suspend inline fun Bot.recall(message: MessageChain) = this.recall(message[Messa
* @param coroutineContext 额外的 [CoroutineContext]
* @see recall
*/
fun Bot.recallIn(
inline fun Bot.recallIn(
source: MessageSource,
millis: Long,
coroutineContext: CoroutineContext = EmptyCoroutineContext
@ -282,7 +282,7 @@ fun Bot.recallIn(
* @param coroutineContext 额外的 [CoroutineContext]
* @see recall
*/
fun Bot.recallIn(
inline fun Bot.recallIn(
message: MessageChain,
millis: Long,
coroutineContext: CoroutineContext = EmptyCoroutineContext

View File

@ -7,7 +7,7 @@
* https://github.com/mamoe/mirai/blob/master/LICENSE
*/
@file:Suppress("EXPERIMENTAL_API_USAGE")
@file:Suppress("EXPERIMENTAL_API_USAGE", "NOTHING_TO_INLINE")
package net.mamoe.mirai.contact
@ -69,6 +69,10 @@ expect abstract class Contact() : CoroutineScope, ContactJavaHappyAPI {
*/
@JvmName("sendMessageSuspend")
@JvmSynthetic
abstract suspend fun sendMessage(message: Message): MessageReceipt<out Contact>
@Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN)
@JvmSynthetic
abstract suspend fun sendMessage(message: MessageChain): MessageReceipt<out Contact>
/**
@ -120,7 +124,7 @@ suspend inline fun Contact.recall(source: MessageSource) = this.bot.recall(sourc
* @see Bot.recallIn
*/
@MiraiExperimentalAPI
fun Contact.recallIn(
inline fun Contact.recallIn(
message: MessageChain,
millis: Long,
coroutineContext: CoroutineContext = EmptyCoroutineContext
@ -129,7 +133,7 @@ fun Contact.recallIn(
/**
* @see Bot.recallIn
*/
fun Contact.recallIn(
inline fun Contact.recallIn(
source: MessageSource,
millis: Long,
coroutineContext: CoroutineContext = EmptyCoroutineContext
@ -139,11 +143,5 @@ fun Contact.recallIn(
* @see Contact.sendMessage
*/
@Suppress("UNCHECKED_CAST")
suspend inline fun <C : Contact> C.sendMessage(message: Message): MessageReceipt<C> =
sendMessage(message.asMessageChain()) as? MessageReceipt<C> ?: error("Internal class cast mistake")
/**
* @see Contact.sendMessage
*/
@Suppress("UNCHECKED_CAST")
suspend inline fun <C : Contact> C.sendMessage(plain: String): MessageReceipt<C> = sendMessage(plain.toMessage())
suspend inline fun <C : Contact> C.sendMessage(plain: String): MessageReceipt<C> =
sendMessage(plain.toMessage()) as? MessageReceipt<C> ?: error("Internal class cast mistake")

View File

@ -12,17 +12,13 @@
package net.mamoe.mirai.contact
import kotlinx.coroutines.CoroutineScope
import kotlinx.serialization.SerialInfo
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import net.mamoe.mirai.Bot
import net.mamoe.mirai.data.GroupAnnouncement
import net.mamoe.mirai.data.GroupAnnouncementList
import net.mamoe.mirai.data.MemberInfo
import net.mamoe.mirai.event.events.*
import net.mamoe.mirai.event.events.MessageSendEvent.FriendMessageSendEvent
import net.mamoe.mirai.event.events.MessageSendEvent.GroupMessageSendEvent
import net.mamoe.mirai.message.MessageReceipt
import net.mamoe.mirai.message.data.Message
import net.mamoe.mirai.message.data.MessageChain
import net.mamoe.mirai.message.data.OfflineGroupImage
import net.mamoe.mirai.utils.ExternalImage
@ -185,6 +181,10 @@ expect abstract class Group() : Contact, CoroutineScope {
*/
@JvmName("sendMessageSuspend")
@JvmSynthetic
abstract override suspend fun sendMessage(message: Message): MessageReceipt<Group>
@Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN)
@JvmSynthetic
abstract override suspend fun sendMessage(message: MessageChain): MessageReceipt<Group>
/**

View File

@ -14,6 +14,8 @@ package net.mamoe.mirai.contact
import net.mamoe.mirai.Bot
import net.mamoe.mirai.JavaHappyAPI
import net.mamoe.mirai.event.events.*
import net.mamoe.mirai.message.MessageReceipt
import net.mamoe.mirai.message.data.Message
import net.mamoe.mirai.utils.MiraiInternalAPI
import net.mamoe.mirai.utils.WeakRefProperty
import kotlin.jvm.JvmName
@ -130,6 +132,21 @@ expect abstract class Member() : MemberJavaHappyAPI {
* @return `bot.hashCode() * 31 + id.hashCode()`
*/
abstract override fun hashCode(): Int
/**
* 向这个对象发送消息.
*
* @see MessageSendEvent.FriendMessageSendEvent 发送好友信息事件, cancellable
* @see MessageSendEvent.GroupMessageSendEvent 发送群消息事件. cancellable
*
* @throws EventCancelledException 当发送消息事件被取消
* @throws IllegalStateException 发送群消息时若 [Bot] 被禁言抛出
*
* @return 消息回执. 可进行撤回 ([MessageReceipt.recall])
*/
@JvmSynthetic
@JvmName("sendMessageSuspend")
abstract override suspend fun sendMessage(message: Message): MessageReceipt<Member>
}
/**

View File

@ -7,6 +7,8 @@
* https://github.com/mamoe/mirai/blob/master/LICENSE
*/
@file:Suppress("NOTHING_TO_INLINE")
package net.mamoe.mirai.contact
import net.mamoe.mirai.Bot
@ -34,38 +36,32 @@ enum class MemberPermission {
/**
* 是群主
*/
@Suppress("NOTHING_TO_INLINE")
inline fun MemberPermission.isOwner(): Boolean = this == MemberPermission.OWNER
/**
* 是管理员
*/
@Suppress("NOTHING_TO_INLINE")
inline fun MemberPermission.isAdministrator(): Boolean = this == MemberPermission.ADMINISTRATOR
/**
* 是管理员或群主
*/
@Suppress("NOTHING_TO_INLINE")
inline fun MemberPermission.isOperator(): Boolean = isAdministrator() || isOwner()
/**
* 是群主
*/
@Suppress("NOTHING_TO_INLINE")
inline fun Member.isOwner(): Boolean = this.permission.isOwner()
/**
* 是管理员
*/
@Suppress("NOTHING_TO_INLINE")
inline fun Member.isAdministrator(): Boolean = this.permission.isAdministrator()
/**
* 是管理员或群主
*/
@Suppress("NOTHING_TO_INLINE")
inline fun Member.isOperator(): Boolean = this.permission.isOperator()

View File

@ -22,6 +22,7 @@ import net.mamoe.mirai.event.events.ImageUploadEvent
import net.mamoe.mirai.event.events.MessageSendEvent.FriendMessageSendEvent
import net.mamoe.mirai.event.events.MessageSendEvent.GroupMessageSendEvent
import net.mamoe.mirai.message.MessageReceipt
import net.mamoe.mirai.message.data.Message
import net.mamoe.mirai.message.data.MessageChain
import net.mamoe.mirai.message.data.OfflineFriendImage
import net.mamoe.mirai.utils.ExternalImage
@ -98,7 +99,11 @@ expect abstract class QQ() : Contact, CoroutineScope {
*/
@JvmSynthetic
@JvmName("sendMessageSuspend")
abstract override suspend fun sendMessage(message: MessageChain): MessageReceipt<QQ>
abstract override suspend fun sendMessage(message: Message): MessageReceipt<out QQ>
@JvmSynthetic
@Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN)
abstract override suspend fun sendMessage(message: MessageChain): MessageReceipt<out QQ>
/**
* 上传一个图片以备发送.

View File

@ -84,9 +84,6 @@ abstract class MessagePacketBase<TSender : QQ, TSubject : Contact> : Packet, Bot
* 对于好友消息事件, 这个方法将会给好友 ([subject]) 发送消息
* 对于群消息事件, 这个方法将会给群 ([subject]) 发送消息
*/
suspend inline fun reply(message: MessageChain): MessageReceipt<TSubject> =
subject.sendMessage(message) as MessageReceipt<TSubject>
suspend inline fun reply(message: Message): MessageReceipt<TSubject> =
subject.sendMessage(message.asMessageChain()) as MessageReceipt<TSubject>
@ -98,9 +95,6 @@ abstract class MessagePacketBase<TSender : QQ, TSubject : Contact> : Packet, Bot
@JvmName("reply1")
suspend inline fun Message.reply(): MessageReceipt<TSubject> = reply(this)
@JvmName("reply1")
suspend inline fun MessageChain.reply(): MessageReceipt<TSubject> = reply(this)
// endregion
// region 撤回

View File

@ -12,7 +12,6 @@
package net.mamoe.mirai.message.data
import net.mamoe.mirai.contact.Contact
import net.mamoe.mirai.contact.sendMessage
import net.mamoe.mirai.message.MessageReceipt
import kotlin.jvm.JvmSynthetic
@ -109,8 +108,9 @@ interface Message {
operator fun plus(another: CharSequence): CombinedMessage = this.followedBy(another.toString().toMessage())
}
@Suppress("UNCHECKED_CAST")
suspend inline fun <C : Contact> Message.sendTo(contact: C): MessageReceipt<C> {
return contact.sendMessage(this)
return contact.sendMessage(this) as MessageReceipt<C>
}
fun Message.repeat(count: Int): MessageChain {

View File

@ -18,6 +18,7 @@ import net.mamoe.mirai.event.events.ImageUploadEvent
import net.mamoe.mirai.event.events.MessageSendEvent.FriendMessageSendEvent
import net.mamoe.mirai.event.events.MessageSendEvent.GroupMessageSendEvent
import net.mamoe.mirai.message.MessageReceipt
import net.mamoe.mirai.message.data.Message
import net.mamoe.mirai.message.data.MessageChain
import net.mamoe.mirai.message.data.OfflineImage
import net.mamoe.mirai.message.data.id
@ -63,6 +64,10 @@ actual abstract class Contact : CoroutineScope, ContactJavaHappyAPI() {
*/
@JvmName("sendMessageSuspend")
@JvmSynthetic
actual abstract suspend fun sendMessage(message: Message): MessageReceipt<out Contact>
@JvmSynthetic
@Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN)
actual abstract suspend fun sendMessage(message: MessageChain): MessageReceipt<out Contact>
/**

View File

@ -58,12 +58,12 @@ actual abstract class ContactJavaHappyAPI {
*/
@Throws(EventCancelledException::class, IllegalStateException::class)
@JvmName("sendMessage")
open fun __sendMessageBlockingForJava__(message: Message): MessageReceipt<Contact> {
open fun __sendMessageBlockingForJava__(message: Message): MessageReceipt<out Contact> {
return runBlocking { sendMessage(message) }
}
@JvmName("sendMessage")
open fun __sendMessageBlockingForJava__(message: String): MessageReceipt<Contact> {
open fun __sendMessageBlockingForJava__(message: String): MessageReceipt<out Contact> {
return runBlocking { sendMessage(message) }
}
@ -137,7 +137,7 @@ actual abstract class ContactJavaHappyAPI {
* @see Contact.sendMessage
*/
@JvmName("sendMessageAsync")
open fun __sendMessageAsyncForJava__(message: Message): Future<MessageReceipt<Contact>> {
open fun __sendMessageAsyncForJava__(message: Message): Future<MessageReceipt<out Contact>> {
return future { sendMessage(message) }
}
@ -146,7 +146,7 @@ actual abstract class ContactJavaHappyAPI {
* @see Contact.sendMessage
*/
@JvmName("sendMessageAsync")
open fun __sendMessageAsyncForJava__(message: String): Future<MessageReceipt<Contact>> {
open fun __sendMessageAsyncForJava__(message: String): Future<MessageReceipt<out Contact>> {
return future { sendMessage(message) }
}
@ -225,7 +225,7 @@ actual abstract class MemberJavaHappyAPI : QQ() {
*
* 管理员可禁言成员, 群主可禁言管理员和群员.
*
* @param durationSeconds 持续时间. 精确到秒. 范围区间表示为 `(0s, 30days]`. 超过范围则会抛出异常.
* @param seconds 持续时间. 精确到秒. 范围区间表示为 `(0s, 30days]`. 超过范围则会抛出异常.
* @return 机器人无权限时返回 `false`
*
* @see Int.minutesToSeconds
@ -286,7 +286,7 @@ actual abstract class MemberJavaHappyAPI : QQ() {
*
* 管理员可禁言成员, 群主可禁言管理员和群员.
*
* @param durationSeconds 持续时间. 精确到秒. 范围区间表示为 `(0s, 30days]`. 超过范围则会抛出异常.
* @param seconds 持续时间. 精确到秒. 范围区间表示为 `(0s, 30days]`. 超过范围则会抛出异常.
* @return 机器人无权限时返回 `false`
*
* @see Int.minutesToSeconds

View File

@ -11,13 +11,12 @@ package net.mamoe.mirai.contact
import kotlinx.coroutines.CoroutineScope
import net.mamoe.mirai.Bot
import net.mamoe.mirai.data.GroupAnnouncement
import net.mamoe.mirai.data.GroupAnnouncementList
import net.mamoe.mirai.data.MemberInfo
import net.mamoe.mirai.event.events.*
import net.mamoe.mirai.event.events.MessageSendEvent.FriendMessageSendEvent
import net.mamoe.mirai.event.events.MessageSendEvent.GroupMessageSendEvent
import net.mamoe.mirai.message.MessageReceipt
import net.mamoe.mirai.message.data.Message
import net.mamoe.mirai.message.data.MessageChain
import net.mamoe.mirai.message.data.OfflineGroupImage
import net.mamoe.mirai.utils.ExternalImage
@ -182,6 +181,10 @@ actual abstract class Group : Contact(), CoroutineScope {
*/
@JvmName("sendMessageSuspend")
@JvmSynthetic
actual abstract override suspend fun sendMessage(message: Message): MessageReceipt<Group>
@Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN)
@JvmSynthetic
actual abstract override suspend fun sendMessage(message: MessageChain): MessageReceipt<Group>
/**

View File

@ -14,6 +14,10 @@ package net.mamoe.mirai.contact
import net.mamoe.mirai.Bot
import net.mamoe.mirai.JavaHappyAPI
import net.mamoe.mirai.event.events.*
import net.mamoe.mirai.event.events.MessageSendEvent.FriendMessageSendEvent
import net.mamoe.mirai.event.events.MessageSendEvent.GroupMessageSendEvent
import net.mamoe.mirai.message.MessageReceipt
import net.mamoe.mirai.message.data.Message
import net.mamoe.mirai.utils.MiraiInternalAPI
import net.mamoe.mirai.utils.WeakRefProperty
@ -113,6 +117,21 @@ actual abstract class Member : MemberJavaHappyAPI() {
@JvmSynthetic
actual abstract suspend fun kick(message: String)
/**
* 向这个对象发送消息.
*
* @see FriendMessageSendEvent 发送好友信息事件, cancellable
* @see GroupMessageSendEvent 发送群消息事件. cancellable
*
* @throws EventCancelledException 当发送消息事件被取消
* @throws IllegalStateException 发送群消息时若 [Bot] 被禁言抛出
*
* @return 消息回执. 可进行撤回 ([MessageReceipt.recall])
*/
@JvmName("sendMessageSuspend")
@JvmSynthetic
actual abstract override suspend fun sendMessage(message: Message): MessageReceipt<Member>
/**
* 当且仅当 `[other] is [Member] && [other].id == this.id && [other].group == this.group` 时为 true
*/

View File

@ -13,6 +13,7 @@ import net.mamoe.mirai.event.events.ImageUploadEvent
import net.mamoe.mirai.event.events.MessageSendEvent.FriendMessageSendEvent
import net.mamoe.mirai.event.events.MessageSendEvent.GroupMessageSendEvent
import net.mamoe.mirai.message.MessageReceipt
import net.mamoe.mirai.message.data.Message
import net.mamoe.mirai.message.data.MessageChain
import net.mamoe.mirai.message.data.OfflineFriendImage
import net.mamoe.mirai.utils.ExternalImage
@ -88,7 +89,11 @@ actual abstract class QQ : Contact(), CoroutineScope {
*/
@JvmName("sendMessageSuspend")
@JvmSynthetic
actual abstract override suspend fun sendMessage(message: MessageChain): MessageReceipt<QQ>
actual abstract override suspend fun sendMessage(message: Message): MessageReceipt<out QQ>
@JvmSynthetic
@Deprecated("for binary compatibility", level = DeprecationLevel.HIDDEN)
actual abstract override suspend fun sendMessage(message: MessageChain): MessageReceipt<out QQ>
/**
* 上传一个图片以备发送.