diff --git a/mirai-core/src/commonMain/kotlin/contact/SendMessageHandler.kt b/mirai-core/src/commonMain/kotlin/contact/SendMessageHandler.kt index 6d009fea1..62ad2d36f 100644 --- a/mirai-core/src/commonMain/kotlin/contact/SendMessageHandler.kt +++ b/mirai-core/src/commonMain/kotlin/contact/SendMessageHandler.kt @@ -365,7 +365,7 @@ internal class GroupTempSendMessageHandler( MessageSvcPbSendMsg::createToTemp } -internal class GroupSendMessageHandler( +internal open class GroupSendMessageHandler( override val contact: GroupImpl, ) : SendMessageHandler() { override val messageSvcSendMessage: (client: QQAndroidClient, contact: GroupImpl, message: MessageChain, fragmented: Boolean, sourceCallback: (Deferred) -> Unit) -> List = diff --git a/mirai-core/src/jvmTest/kotlin/AbstractTestWithMiraiImpl.kt b/mirai-core/src/jvmTest/kotlin/AbstractTestWithMiraiImpl.kt index 805a83203..d1b1ded38 100644 --- a/mirai-core/src/jvmTest/kotlin/AbstractTestWithMiraiImpl.kt +++ b/mirai-core/src/jvmTest/kotlin/AbstractTestWithMiraiImpl.kt @@ -10,13 +10,11 @@ package net.mamoe.mirai.internal -import net.mamoe.mirai.IMirai import net.mamoe.mirai.Mirai -import net.mamoe.mirai.internal.test.AbstractTest import org.junit.jupiter.api.AfterEach import org.junit.jupiter.api.BeforeEach -internal abstract class AbstractTestWithMiraiImpl : IMirai by MiraiImpl(), AbstractTest() { +internal abstract class AbstractTestWithMiraiImpl : MiraiImpl() { private val originalImpl = Mirai @BeforeEach diff --git a/mirai-core/src/jvmTest/kotlin/message/data/MessageReceiptTest.kt b/mirai-core/src/jvmTest/kotlin/message/data/MessageReceiptTest.kt new file mode 100644 index 000000000..2d656259d --- /dev/null +++ b/mirai-core/src/jvmTest/kotlin/message/data/MessageReceiptTest.kt @@ -0,0 +1,82 @@ +/* + * 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. + * + * https://github.com/mamoe/mirai/blob/master/LICENSE + */ + +package net.mamoe.mirai.internal.message.data + +import kotlinx.coroutines.CompletableDeferred +import kotlinx.coroutines.Deferred +import net.mamoe.mirai.Bot +import net.mamoe.mirai.internal.AbstractTestWithMiraiImpl +import net.mamoe.mirai.internal.MockBot +import net.mamoe.mirai.internal.contact.* +import net.mamoe.mirai.internal.contact.info.GroupInfoImpl +import net.mamoe.mirai.internal.message.ForwardMessageInternal +import net.mamoe.mirai.internal.message.OnlineMessageSourceToGroupImpl +import net.mamoe.mirai.internal.network.QQAndroidClient +import net.mamoe.mirai.internal.network.protocol.data.jce.StTroopNum +import net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacket +import net.mamoe.mirai.internal.test.runBlockingUnit +import net.mamoe.mirai.message.data.* +import net.mamoe.mirai.utils.currentTimeSeconds +import org.junit.jupiter.api.Test +import kotlin.test.assertEquals +import kotlin.test.assertIs +import kotlin.test.assertSame + +internal class MessageReceiptTest : AbstractTestWithMiraiImpl() { + override suspend fun uploadMessageHighway( + bot: Bot, + sendMessageHandler: SendMessageHandler<*>, + message: Collection, + isLong: Boolean, + ): String { + return "id" + } + + private val bot = MockBot() + + /** + * This test is very ugly but we cannot do anything else. + */ // We need #1304 + @Test + fun `refine ForwardMessageInternal for MessageReceipt`() = runBlockingUnit { + val group = + GroupImpl(bot, bot.coroutineContext, 1, GroupInfoImpl(StTroopNum(1, 1, dwGroupOwnerUin = 2)), sequenceOf()) + + val forward = buildForwardMessage(group) { + 2 says "ok" + } + val message = forward.toMessageChain() + + val handler = object : GroupSendMessageHandler(group) { + override val messageSvcSendMessage: (client: QQAndroidClient, contact: GroupImpl, message: MessageChain, fragmented: Boolean, sourceCallback: (Deferred) -> Unit) -> List = + { _, contact, message, fragmented, sourceCallback -> + + assertIs(message[ForwardMessageInternal]) + assertSame(forward, message[ForwardMessageInternal]?.origin) + + sourceCallback(CompletableDeferred(OnlineMessageSourceToGroupImpl( + group, + internalIds = intArrayOf(1), + sender = bot, + target = group, + time = currentTimeSeconds().toInt(), + originalMessage = message //, + // sourceMessage = message + ))) + listOf() + } + } + val result = handler.sendMessage(message, message, SendMessageStep.FIRST) + + assertIs(result.source.originalMessage[ForwardMessage]) + assertEquals(message, result.source.originalMessage) + assertSame(forward, result.source.originalMessage[ForwardMessage]) + } +} \ No newline at end of file