mirror of
https://github.com/mamoe/mirai.git
synced 2025-03-06 09:00:14 +08:00
[Review] MiraiCode:
- Add object MiraiCode for mirai code utilities - Internal optimizations
This commit is contained in:
parent
b4f60582fd
commit
9c995284f0
@ -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 {
|
||||
/**
|
||||
|
@ -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<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 {
|
||||
this@toMiraiCode.forEach {
|
||||
it.safeCast<CodableMessage>()?.appendMiraiCodeTo(this)
|
||||
/**
|
||||
* 转换得到 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
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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(']')
|
||||
}
|
||||
|
@ -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] 不参加计数.
|
||||
|
@ -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 {
|
||||
|
@ -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(']')
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user