mirror of
https://github.com/mamoe/mirai.git
synced 2025-02-13 03:16:05 +08:00
Fix longMessage size detect
This commit is contained in:
parent
d432c5f1d0
commit
e3a8ae8d90
@ -30,6 +30,8 @@ import net.mamoe.mirai.qqandroid.network.highway.HighwayHelper
|
|||||||
import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.TroopManagement
|
import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.TroopManagement
|
||||||
import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.image.ImgStore
|
import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.image.ImgStore
|
||||||
import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.receive.MessageSvc
|
import net.mamoe.mirai.qqandroid.network.protocol.packet.chat.receive.MessageSvc
|
||||||
|
import net.mamoe.mirai.qqandroid.utils.chineseLength
|
||||||
|
import net.mamoe.mirai.qqandroid.utils.sumUpTo
|
||||||
import net.mamoe.mirai.qqandroid.utils.toIpV4AddressString
|
import net.mamoe.mirai.qqandroid.utils.toIpV4AddressString
|
||||||
import net.mamoe.mirai.utils.*
|
import net.mamoe.mirai.utils.*
|
||||||
import kotlin.contracts.ExperimentalContracts
|
import kotlin.contracts.ExperimentalContracts
|
||||||
@ -271,7 +273,7 @@ internal class GroupImpl(
|
|||||||
return members.delegate.filteringGetOrNull { it.id == id }
|
return members.delegate.filteringGetOrNull { it.id == id }
|
||||||
}
|
}
|
||||||
|
|
||||||
@OptIn(MiraiExperimentalAPI::class)
|
@OptIn(MiraiExperimentalAPI::class, LowLevelAPI::class)
|
||||||
@JvmSynthetic
|
@JvmSynthetic
|
||||||
override suspend fun sendMessage(message: Message): MessageReceipt<Group> {
|
override suspend fun sendMessage(message: Message): MessageReceipt<Group> {
|
||||||
check(!isBotMuted) { "bot is muted. Remaining seconds=$botMuteRemaining" }
|
check(!isBotMuted) { "bot is muted. Remaining seconds=$botMuteRemaining" }
|
||||||
@ -281,11 +283,14 @@ internal class GroupImpl(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (message !is LongMessage) {
|
if (message !is LongMessage) {
|
||||||
val length = event.message.toString().length
|
if (event.message.sumUpTo(800) { it, upTo ->
|
||||||
if (length > 4000
|
when (it) {
|
||||||
|| event.message.count { it is Image } > 3
|
is QuoteReply -> 700
|
||||||
|| (event.message.any<QuoteReply>() && (event.message.any<Image>() || length > 100))
|
is Image -> 300
|
||||||
) {
|
is PlainText -> it.stringValue.chineseLength(upTo)
|
||||||
|
else -> it.toString().length
|
||||||
|
}
|
||||||
|
} >= 800) {
|
||||||
return bot._lowLevelSendLongGroupMessage(this.id, message)
|
return bot._lowLevelSendLongGroupMessage(this.id, message)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -28,4 +28,30 @@ internal fun Int.toIpV4AddressString(): String {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal fun String.chineseLength(upTo: Int): Int {
|
||||||
|
return this.sumUpTo(upTo) { if (it in '\u0391'..'\uFFE5') 3 else 1 }
|
||||||
|
}
|
||||||
|
|
||||||
|
internal inline fun <T> Iterable<T>.sumUpTo(upTo: Int, selector: (T, remaining: Int) -> Int): Int {
|
||||||
|
var sum = 0
|
||||||
|
for (element in this) {
|
||||||
|
if (sum >= upTo) {
|
||||||
|
return sum
|
||||||
|
}
|
||||||
|
sum += selector(element, (upTo - sum).coerceAtLeast(0))
|
||||||
|
}
|
||||||
|
return sum
|
||||||
|
}
|
||||||
|
|
||||||
|
internal inline fun CharSequence.sumUpTo(upTo: Int, selector: (Char) -> Int): Int {
|
||||||
|
var sum: Int = 0
|
||||||
|
for (element in this) {
|
||||||
|
sum += selector(element)
|
||||||
|
if (sum >= upTo) {
|
||||||
|
return sum
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sum
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user