Commit 5af1d043 authored by Him188's avatar Him188

Add `MessageChain.contentEquals`

parent f845b5cd
...@@ -17,7 +17,6 @@ import net.mamoe.mirai.utils.MiraiInternalAPI ...@@ -17,7 +17,6 @@ import net.mamoe.mirai.utils.MiraiInternalAPI
import net.mamoe.mirai.utils.PlannedRemoval import net.mamoe.mirai.utils.PlannedRemoval
import net.mamoe.mirai.utils.SinceMirai import net.mamoe.mirai.utils.SinceMirai
import kotlin.jvm.JvmName import kotlin.jvm.JvmName
import kotlin.jvm.JvmOverloads
import kotlin.jvm.JvmSynthetic import kotlin.jvm.JvmSynthetic
/** /**
...@@ -133,6 +132,61 @@ interface Message { ...@@ -133,6 +132,61 @@ interface Message {
@SinceMirai("0.34.0") @SinceMirai("0.34.0")
fun contentToString(): String fun contentToString(): String
/**
* 判断内容是否与 [another] 相等.
*
* 若本函数返回 `true`, 则表明:
* - `this` 与 [another] 的 [contentToString] 相等
* - `this` 为 [another] 的所有 [MessageContent] 都 [相等][Message.equals] 且有同样的排列顺序.
*
* @sample net.mamoe.mirai.message.data.ContentEqualsTest
*/
@SinceMirai("0.38.0")
fun contentEquals(another: Message, ignoreCase: Boolean = false): Boolean {
if (!this.contentToString().equals(another.contentToString(), ignoreCase = ignoreCase)) return false
return when {
this is SingleMessage && another is SingleMessage -> true
this is SingleMessage && another is MessageChain -> another.all { it is MessageMetadata || it is PlainText }
this is MessageChain && another is SingleMessage -> this.all { it is MessageMetadata || it is PlainText }
this is MessageChain && another is MessageChain -> {
val anotherIterator = another.iterator()
/**
* 逐个判断非 [PlainText] 的 [Message] 是否 [equals]
*/
this.forEachContent { thisElement ->
if (thisElement.isPlain()) return@forEachContent
for (it in anotherIterator) {
if (it.isPlain() || it !is MessageContent) continue
if (thisElement != it) return false
}
}
return true
}
else -> error("shouldn't be reached")
}
}
/**
* 判断内容是否与 [another] 相等.
*
* 若本函数返回 `true`, 则表明:
* - [contentToString] 与 [another] 相等
* - 若 `this` 为 [MessageChain], 则只包含 [MessageMetadata] 和 [PlainText]
*
* @sample net.mamoe.mirai.message.data.ContentEqualsTest
*/
@SinceMirai("0.38.0")
fun contentEquals(another: String, ignoreCase: Boolean = false): Boolean {
if (!this.contentToString().equals(another, ignoreCase = ignoreCase)) return false
return when (this) {
is SingleMessage -> true
is MessageChain -> this.all { it is MessageMetadata || it is PlainText }
else -> error("shouldn't be reached")
}
}
operator fun plus(another: Message): MessageChain = this.followedBy(another) operator fun plus(another: Message): MessageChain = this.followedBy(another)
// don't remove! avoid resolution ambiguity between `CharSequence` and `Message` // don't remove! avoid resolution ambiguity between `CharSequence` and `Message`
......
/*
* Copyright 2020 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.
*
* https://github.com/mamoe/mirai/blob/master/LICENSE
*/
package net.mamoe.mirai.message.data
import kotlin.test.Test
import kotlin.test.assertFalse
import kotlin.test.assertTrue
internal class ContentEqualsTest {
@Test
fun testContentEquals() {
val mySource = TestConstrainSingleMessage()
val image = Image("{01E9451B-70ED-EAE3-B37C-101F1EEBF5B5}.png")
assertTrue {
buildMessageChain {
+"test"
}.contentEquals(buildMessageChain {
+"te"
+mySource
+"st"
})
}
assertFalse {
buildMessageChain {
+"tests"
}.contentEquals(buildMessageChain {
+"te"
+"st"
})
}
assertTrue {
buildMessageChain {
+mySource
+"test"
+mySource
}.contentEquals("test")
}
assertTrue {
buildMessageChain {
+"test"
}.contentEquals(buildMessageChain {
+"te"
+"st"
+mySource
})
}
assertTrue {
buildMessageChain {
+"test"
+image
}.contentEquals(buildMessageChain {
+"te"
+mySource
+"st"
+image
})
}
assertTrue {
buildMessageChain {
+mySource
+"test"
+mySource
}.contentEquals("test")
}
assertTrue {
buildMessageChain {
+"test"
+image
}.contentEquals(buildMessageChain {
+"te"
+"st"
+image
+mySource
})
}
assertFalse {
buildMessageChain {
+image
+"test"
+mySource
}.contentEquals("test")
}
assertFalse {
buildMessageChain {
+"test"
+image
}.contentEquals("test")
}
assertFalse {
buildMessageChain {
+image
+"test"
}.contentEquals(buildMessageChain {
+"te"
+"st"
+image
+mySource
})
}
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment