[Review] MiraiCode:

- Add object MiraiCode for mirai code utilities
- Internal optimizations
This commit is contained in:
Him188 2021-01-08 09:19:13 +08:00
parent b4f60582fd
commit 9c995284f0
8 changed files with 65 additions and 34 deletions

View File

@ -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 {
/**

View File

@ -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 码相关操作.
*/
public object MiraiCode {
/**
* 解析形如 "[mirai:]" mirai , [Message.toString] 返回的内容.
*/
@JvmOverloads
public fun String.parseMiraiCode(contact: Contact? = null): MessageChain = parseMiraiCodeImpl(contact)
@JvmOverloads
@JvmStatic
public fun String.parseMiraiCode(contact: Contact? = null): MessageChain = parseMiraiCodeImpl(contact)
public fun Iterable<Message>.toMiraiCode(): String = iterator().toMiraiCode()
public fun Sequence<Message>.toMiraiCode(): String = iterator().toMiraiCode()
public fun Array<out Message>.toMiraiCode(): String = iterator().toMiraiCode()
public fun Iterator<Message>.toMiraiCode(): String = buildString {
/**
* 转换得到 mirai .
*/
@JvmStatic
public fun Iterable<Message>.toMiraiCode(): String = iterator().toMiraiCode()
/**
* 转换得到 mirai .
*/
@JvmStatic
public fun Sequence<Message>.toMiraiCode(): String = iterator().toMiraiCode()
/**
* 转换得到 mirai .
*/
@JvmStatic
public fun Array<out Message>.toMiraiCode(): String = iterator().toMiraiCode()
/**
* 转换得到 mirai .
*/
@JvmStatic
public fun Iterator<Message>.toMiraiCode(): String = buildString {
this@toMiraiCode.forEach {
it.safeCast<CodableMessage>()?.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
}

View File

@ -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<String, MiraiCodeParser> by mapOf(
private object MiraiCodeParsers : Map<String, MiraiCodeParser> by mapOf(
"at" to MiraiCodeParser(Regex("""(\d*)""")) { (target) ->
At(target.toLong())
},
@ -128,13 +127,12 @@ internal object MiraiCodeParsers : Map<String, MiraiCodeParser> 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)

View File

@ -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(']')
}

View File

@ -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<SingleMessage>, RandomAccess, CodableMessage {
/**
* 元素数量. [EmptyMessageChain] 不参加计数.

View File

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

View File

@ -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(']')
}
}

View File

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