mirror of
https://github.com/mamoe/mirai.git
synced 2025-02-07 18:12:32 +08:00
Fix message limit
This commit is contained in:
parent
3b87f1fb31
commit
f93813c34e
@ -32,7 +32,6 @@ import net.mamoe.mirai.internal.network.protocol.packet.chat.receive.createToGro
|
|||||||
import net.mamoe.mirai.internal.network.protocol.packet.chat.voice.PttStore
|
import net.mamoe.mirai.internal.network.protocol.packet.chat.voice.PttStore
|
||||||
import net.mamoe.mirai.internal.network.protocol.packet.list.ProfileService
|
import net.mamoe.mirai.internal.network.protocol.packet.list.ProfileService
|
||||||
import net.mamoe.mirai.internal.utils.GroupPkgMsgParsingCache
|
import net.mamoe.mirai.internal.utils.GroupPkgMsgParsingCache
|
||||||
import net.mamoe.mirai.internal.utils.estimateLength
|
|
||||||
import net.mamoe.mirai.message.MessageReceipt
|
import net.mamoe.mirai.message.MessageReceipt
|
||||||
import net.mamoe.mirai.message.data.*
|
import net.mamoe.mirai.message.data.*
|
||||||
import net.mamoe.mirai.utils.*
|
import net.mamoe.mirai.utils.*
|
||||||
@ -154,17 +153,15 @@ internal class GroupImpl(
|
|||||||
throw EventCancelledException("exception thrown when broadcasting GroupMessagePreSendEvent", it)
|
throw EventCancelledException("exception thrown when broadcasting GroupMessagePreSendEvent", it)
|
||||||
}.message.asMessageChain()
|
}.message.asMessageChain()
|
||||||
|
|
||||||
val length = chain.estimateLength(this, 703) // 阈值为700左右,限制到3的倍数
|
var length: Int = 0
|
||||||
var imageCnt = 0 // 通过下方逻辑短路延迟计算
|
var imageCnt: Int = 0
|
||||||
|
chain.verityLength(message, this, lengthCallback = {
|
||||||
|
length = it
|
||||||
|
}, imageCntCallback = {
|
||||||
|
imageCnt = it
|
||||||
|
})
|
||||||
|
|
||||||
if (length > 5000 || chain.count { it is Image }.apply { imageCnt = this } > 50) {
|
if (length > 702 || imageCnt > 2) { // 阈值为700左右,限制到3的倍数
|
||||||
throw MessageTooLargeException(
|
|
||||||
this, message, chain,
|
|
||||||
"message(${chain.joinToString("", limit = 10)}) is too large. Allow up to 50 images or 5000 chars"
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (length > 702 || imageCnt > 2) {
|
|
||||||
return MiraiImpl.lowLevelSendGroupLongOrForwardMessage(
|
return MiraiImpl.lowLevelSendGroupLongOrForwardMessage(
|
||||||
bot,
|
bot,
|
||||||
this.id,
|
this.id,
|
||||||
|
@ -20,6 +20,7 @@ import net.mamoe.mirai.internal.message.MessageSourceToFriendImpl
|
|||||||
import net.mamoe.mirai.internal.message.ensureSequenceIdAvailable
|
import net.mamoe.mirai.internal.message.ensureSequenceIdAvailable
|
||||||
import net.mamoe.mirai.internal.network.protocol.packet.chat.receive.MessageSvcPbSendMsg
|
import net.mamoe.mirai.internal.network.protocol.packet.chat.receive.MessageSvcPbSendMsg
|
||||||
import net.mamoe.mirai.internal.network.protocol.packet.chat.receive.createToFriend
|
import net.mamoe.mirai.internal.network.protocol.packet.chat.receive.createToFriend
|
||||||
|
import net.mamoe.mirai.internal.utils.estimateLength
|
||||||
import net.mamoe.mirai.message.*
|
import net.mamoe.mirai.message.*
|
||||||
import net.mamoe.mirai.message.data.*
|
import net.mamoe.mirai.message.data.*
|
||||||
import net.mamoe.mirai.utils.cast
|
import net.mamoe.mirai.utils.cast
|
||||||
@ -49,6 +50,7 @@ internal suspend fun <T : User> Friend.sendMessageImpl(
|
|||||||
}.getOrElse {
|
}.getOrElse {
|
||||||
throw EventCancelledException("exception thrown when broadcasting FriendMessagePreSendEvent", it)
|
throw EventCancelledException("exception thrown when broadcasting FriendMessagePreSendEvent", it)
|
||||||
}.message.asMessageChain()
|
}.message.asMessageChain()
|
||||||
|
chain.verityLength(message, this, {}, {})
|
||||||
|
|
||||||
chain.firstIsInstanceOrNull<QuoteReply>()?.source?.ensureSequenceIdAvailable()
|
chain.firstIsInstanceOrNull<QuoteReply>()?.source?.ensureSequenceIdAvailable()
|
||||||
|
|
||||||
@ -89,6 +91,29 @@ internal fun Contact.logMessageSent(message: Message) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal inline fun MessageChain.verityLength(
|
||||||
|
message: Message, target: Contact,
|
||||||
|
lengthCallback: (Int) -> Unit,
|
||||||
|
imageCntCallback: (Int) -> Unit
|
||||||
|
) {
|
||||||
|
contract {
|
||||||
|
callsInPlace(lengthCallback, InvocationKind.EXACTLY_ONCE)
|
||||||
|
callsInPlace(imageCntCallback, InvocationKind.EXACTLY_ONCE)
|
||||||
|
}
|
||||||
|
|
||||||
|
val chain = this
|
||||||
|
val length = estimateLength(target, 5001)
|
||||||
|
lengthCallback(length)
|
||||||
|
if (length > 5000 || count { it is Image }.apply { imageCntCallback(this) } > 50) {
|
||||||
|
throw MessageTooLargeException(
|
||||||
|
target, message, this,
|
||||||
|
"message(${
|
||||||
|
chain.joinToString("", limit = 10)
|
||||||
|
}) is too large. Allow up to 50 images or 5000 chars"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Suppress("RemoveRedundantQualifierName") // compiler bug
|
@Suppress("RemoveRedundantQualifierName") // compiler bug
|
||||||
internal fun net.mamoe.mirai.event.events.MessageEvent.logMessageReceived() {
|
internal fun net.mamoe.mirai.event.events.MessageEvent.logMessageReceived() {
|
||||||
fun renderGroupMessage(group: Group, senderName: String, sender: Member, message: MessageChain): String {
|
fun renderGroupMessage(group: Group, senderName: String, sender: Member, message: MessageChain): String {
|
||||||
|
Loading…
Reference in New Issue
Block a user