diff --git a/mirai-core-api/src/commonMain/kotlin/message/code/CodableMessage.kt b/mirai-core-api/src/commonMain/kotlin/message/code/CodableMessage.kt index 223fb3659..9e42f8d2c 100644 --- a/mirai-core-api/src/commonMain/kotlin/message/code/CodableMessage.kt +++ b/mirai-core-api/src/commonMain/kotlin/message/code/CodableMessage.kt @@ -9,6 +9,7 @@ package net.mamoe.mirai.message.code +import net.mamoe.mirai.message.code.MiraiCode.parseMiraiCode import net.mamoe.mirai.message.data.* import net.mamoe.mirai.utils.MiraiExperimentalApi @@ -16,7 +17,7 @@ import net.mamoe.mirai.utils.MiraiExperimentalApi /** * 可以使用 mirai 码表示的 [Message] 类型. * - * 从字符串解析 mirai 码:[parseMiraiCode] + * 从字符串解析 mirai 码:[MiraiCode.parseMiraiCode] * * @see At * @see AtAll @@ -25,6 +26,8 @@ import net.mamoe.mirai.utils.MiraiExperimentalApi * @see Image * @see FlashImage * @see PokeMessage + * + * @see MiraiCode */ public interface CodableMessage : Message { /** diff --git a/mirai-core-api/src/commonMain/kotlin/message/code/MiraiCode.kt b/mirai-core-api/src/commonMain/kotlin/message/code/MiraiCode.kt index dda99fef8..d76eb0df5 100644 --- a/mirai-core-api/src/commonMain/kotlin/message/code/MiraiCode.kt +++ b/mirai-core-api/src/commonMain/kotlin/message/code/MiraiCode.kt @@ -7,8 +7,6 @@ * https://github.com/mamoe/mirai/blob/master/LICENSE */ -@file:JvmMultifileClass -@file:JvmName("MiraiCode") @file:Suppress("unused") package net.mamoe.mirai.message.code @@ -20,19 +18,49 @@ import net.mamoe.mirai.message.data.MessageChain import net.mamoe.mirai.utils.safeCast /** - * 解析形如 "[mirai:]" 的 mirai 码, 即 [Message.toString] 返回的内容. + * Mirai 码相关操作. */ -@JvmOverloads -public fun String.parseMiraiCode(contact: Contact? = null): MessageChain = parseMiraiCodeImpl(contact) +public object MiraiCode { + /** + * 解析形如 "[mirai:]" 的 mirai 码, 即 [Message.toString] 返回的内容. + */ + @JvmOverloads + @JvmStatic + public fun String.parseMiraiCode(contact: Contact? = null): MessageChain = parseMiraiCodeImpl(contact) -public fun Iterable.toMiraiCode(): String = iterator().toMiraiCode() -public fun Sequence.toMiraiCode(): String = iterator().toMiraiCode() -public fun Array.toMiraiCode(): String = iterator().toMiraiCode() -public fun Iterator.toMiraiCode(): String = buildString { - this@toMiraiCode.forEach { - it.safeCast()?.appendMiraiCodeTo(this) + /** + * 转换得到 mirai 码. + */ + @JvmStatic + public fun Iterable.toMiraiCode(): String = iterator().toMiraiCode() + + /** + * 转换得到 mirai 码. + */ + @JvmStatic + public fun Sequence.toMiraiCode(): String = iterator().toMiraiCode() + + /** + * 转换得到 mirai 码. + */ + @JvmStatic + public fun Array.toMiraiCode(): String = iterator().toMiraiCode() + + /** + * 转换得到 mirai 码. + */ + @JvmStatic + public fun Iterator.toMiraiCode(): String = buildString { + this@toMiraiCode.forEach { + it.safeCast()?.appendMiraiCodeTo(this) + } } -} -@Suppress("EXTENSION_SHADOWED_BY_MEMBER")// for better Java API. -public fun CodableMessage.toMiraiCode(): String = this.toMiraiCode() // member function + /** + * 转换得到 mirai 码. + * @see CodableMessage.toMiraiCode + */ + @Suppress("EXTENSION_SHADOWED_BY_MEMBER")// for better Java API. + @JvmStatic + public fun CodableMessage.toMiraiCode(): String = this.toMiraiCode() // member function +} diff --git a/mirai-core-api/src/commonMain/kotlin/message/code/internal/impl.kt b/mirai-core-api/src/commonMain/kotlin/message/code/internal/impl.kt index d85efa46c..6d87eb554 100644 --- a/mirai-core-api/src/commonMain/kotlin/message/code/internal/impl.kt +++ b/mirai-core-api/src/commonMain/kotlin/message/code/internal/impl.kt @@ -1,5 +1,5 @@ /* - * Copyright 2019-2020 Mamoe Technologies and contributors. + * Copyright 2019-2021 Mamoe Technologies and contributors. * * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证. * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link. @@ -13,7 +13,6 @@ package net.mamoe.mirai.message.code.internal import net.mamoe.mirai.contact.Contact import net.mamoe.mirai.message.data.* -import net.mamoe.mirai.utils.MiraiInternalApi internal fun String.parseMiraiCodeImpl(contact: Contact?): MessageChain = buildMessageChain { @@ -38,7 +37,7 @@ internal fun String.parseMiraiCodeImpl(contact: Contact?): MessageChain = buildM } } -internal fun String.forEachMiraiCode(block: (origin: String, name: String?, args: String) -> Unit) { +private fun String.forEachMiraiCode(block: (origin: String, name: String?, args: String) -> Unit) { var pos = 0 var lastPos = 0 val len = length - 7 // [mirai: @@ -98,7 +97,7 @@ internal fun String.forEachMiraiCode(block: (origin: String, name: String?, args } } -internal object MiraiCodeParsers : Map by mapOf( +private object MiraiCodeParsers : Map by mapOf( "at" to MiraiCodeParser(Regex("""(\d*)""")) { (target) -> At(target.toLong()) }, @@ -128,13 +127,12 @@ internal object MiraiCodeParsers : Map by mapOf( } ) -internal class MiraiCodeParser( +private class MiraiCodeParser( val argsRegex: Regex, val mapper: Contact?.(MatchResult.Destructured) -> Message? ) -@MiraiInternalApi -public fun StringBuilder.appendAsMiraiCode(value: String): StringBuilder = apply { +internal fun StringBuilder.appendStringAsMiraiCode(value: String): StringBuilder = apply { value.forEach { char -> when (char) { '[', ']', @@ -148,9 +146,8 @@ public fun StringBuilder.appendAsMiraiCode(value: String): StringBuilder = apply } } -@Suppress("RegExpRedundantEscape") -internal val DECODE_MIRAI_CODE_REGEX = """\\.""".toRegex() -internal val DECODE_MIRAI_CODE_TRANSLATOR: (MatchResult) -> String = { +private val DECODE_MIRAI_CODE_REGEX = """\\.""".toRegex() +private val DECODE_MIRAI_CODE_TRANSLATOR: (MatchResult) -> String = { when (it.value[1]) { 'n' -> "\n" 'r' -> "\r" @@ -159,4 +156,4 @@ internal val DECODE_MIRAI_CODE_TRANSLATOR: (MatchResult) -> String = { } } -internal fun String.decodeMiraiCode() = replace(DECODE_MIRAI_CODE_REGEX, DECODE_MIRAI_CODE_TRANSLATOR) +private fun String.decodeMiraiCode() = replace(DECODE_MIRAI_CODE_REGEX, DECODE_MIRAI_CODE_TRANSLATOR) diff --git a/mirai-core-api/src/commonMain/kotlin/message/data/HummerMessage.kt b/mirai-core-api/src/commonMain/kotlin/message/data/HummerMessage.kt index 8fc3bebdf..3c30310f4 100644 --- a/mirai-core-api/src/commonMain/kotlin/message/data/HummerMessage.kt +++ b/mirai-core-api/src/commonMain/kotlin/message/data/HummerMessage.kt @@ -16,7 +16,7 @@ package net.mamoe.mirai.message.data import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import net.mamoe.mirai.message.code.CodableMessage -import net.mamoe.mirai.message.code.internal.appendAsMiraiCode +import net.mamoe.mirai.message.code.internal.appendStringAsMiraiCode import net.mamoe.mirai.message.data.VipFace.Kind import net.mamoe.mirai.utils.MiraiExperimentalApi import net.mamoe.mirai.utils.MiraiInternalApi @@ -173,7 +173,7 @@ public data class PokeMessage @MiraiInternalApi constructor( @MiraiExperimentalApi override fun appendMiraiCodeTo(builder: StringBuilder) { - builder.append("[mirai:poke:").appendAsMiraiCode(name) + builder.append("[mirai:poke:").appendStringAsMiraiCode(name) .append(',').append(pokeType).append(',').append(id) .append(']') } diff --git a/mirai-core-api/src/commonMain/kotlin/message/data/MessageChain.kt b/mirai-core-api/src/commonMain/kotlin/message/data/MessageChain.kt index 567b734ad..9e856436e 100644 --- a/mirai-core-api/src/commonMain/kotlin/message/data/MessageChain.kt +++ b/mirai-core-api/src/commonMain/kotlin/message/data/MessageChain.kt @@ -24,6 +24,7 @@ import kotlinx.serialization.json.Json import net.mamoe.mirai.event.events.MessageEvent import net.mamoe.mirai.message.MessageSerializers import net.mamoe.mirai.message.code.CodableMessage +import net.mamoe.mirai.message.code.MiraiCode import net.mamoe.mirai.message.data.MessageSource.Key.quote import net.mamoe.mirai.message.data.MessageSource.Key.recall import net.mamoe.mirai.utils.MiraiExperimentalApi @@ -60,9 +61,10 @@ import kotlin.streams.asSequence * @see orElse 属性委托扩展 * @see getValue 属性委托扩展 * @see flatten 扁平化 + * + * @see MiraiCode mirai 码 */ @Serializable(MessageChain.Serializer::class) -@Suppress("FunctionName", "DeprecatedCallableAddReplaceWith", "INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") public interface MessageChain : Message, List, RandomAccess, CodableMessage { /** * 元素数量. [EmptyMessageChain] 不参加计数. diff --git a/mirai-core-api/src/commonMain/kotlin/message/data/PlainText.kt b/mirai-core-api/src/commonMain/kotlin/message/data/PlainText.kt index d78f28ca0..47a81a994 100644 --- a/mirai-core-api/src/commonMain/kotlin/message/data/PlainText.kt +++ b/mirai-core-api/src/commonMain/kotlin/message/data/PlainText.kt @@ -16,7 +16,7 @@ package net.mamoe.mirai.message.data import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import net.mamoe.mirai.message.code.CodableMessage -import net.mamoe.mirai.message.code.internal.appendAsMiraiCode +import net.mamoe.mirai.message.code.internal.appendStringAsMiraiCode import net.mamoe.mirai.utils.MiraiExperimentalApi /** @@ -37,7 +37,7 @@ public data class PlainText( @MiraiExperimentalApi override fun appendMiraiCodeTo(builder: StringBuilder) { - builder.appendAsMiraiCode(content) + builder.appendStringAsMiraiCode(content) } public companion object { diff --git a/mirai-core-api/src/commonMain/kotlin/message/data/RichMessage.kt b/mirai-core-api/src/commonMain/kotlin/message/data/RichMessage.kt index e3a181438..fccb12731 100644 --- a/mirai-core-api/src/commonMain/kotlin/message/data/RichMessage.kt +++ b/mirai-core-api/src/commonMain/kotlin/message/data/RichMessage.kt @@ -16,7 +16,7 @@ package net.mamoe.mirai.message.data import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import net.mamoe.mirai.message.code.CodableMessage -import net.mamoe.mirai.message.code.internal.appendAsMiraiCode +import net.mamoe.mirai.message.code.internal.appendStringAsMiraiCode import net.mamoe.mirai.utils.MiraiExperimentalApi import net.mamoe.mirai.utils.safeCast import kotlin.annotation.AnnotationTarget.* @@ -106,7 +106,7 @@ public data class LightApp(override val content: String) : RichMessage, CodableM @MiraiExperimentalApi override fun appendMiraiCodeTo(builder: StringBuilder) { - builder.append("[mirai:app:").appendAsMiraiCode(content).append(']') + builder.append("[mirai:app:").appendStringAsMiraiCode(content).append(']') } } @@ -167,7 +167,7 @@ public interface ServiceMessage : RichMessage, CodableMessage { @MiraiExperimentalApi override fun appendMiraiCodeTo(builder: StringBuilder) { - builder.append("[mirai:service:").append(serviceId).append(',').appendAsMiraiCode(content).append(']') + builder.append("[mirai:service:").append(serviceId).append(',').appendStringAsMiraiCode(content).append(']') } } diff --git a/mirai-core-api/src/commonTest/kotlin/message/code/TestMiraiCode.kt b/mirai-core-api/src/commonTest/kotlin/message/code/TestMiraiCode.kt index 2a5736c38..01830b038 100644 --- a/mirai-core-api/src/commonTest/kotlin/message/code/TestMiraiCode.kt +++ b/mirai-core-api/src/commonTest/kotlin/message/code/TestMiraiCode.kt @@ -9,6 +9,7 @@ package net.mamoe.mirai.message.code +import net.mamoe.mirai.message.code.MiraiCode.parseMiraiCode import net.mamoe.mirai.message.data.* import org.junit.jupiter.api.Test import kotlin.test.assertEquals