mamoe / mirai

高效率 QQ 机器人支持库
https://mirai.mamoe.net
GNU Affero General Public License v3.0
14.28k stars 2.53k forks source link

协议内部消息类型被暴露给 `MessageReceipt.source.originalMessage` #1371

Closed Nambers closed 3 years ago

Nambers commented 3 years ago

相关issue: https://github.com/mamoe/mirai/issues/1289

代码:

private val json = Json{
        Mirai
        serializersModule = MessageSerializers.serializersModule
        ignoreUnknownKeys = true
    }
       val a = ForwardMessageBuilder(c)
        t.content.value.forEach {
            a.add(ForwardMessage.Node(it.id, it.time, it.name, MiraiCode.deserializeMiraiCode(it.message)))
        }
        val re = a.build().sendTo(c1)
        return json.encodeToString(MessageSource.Serializer, re.source)

报错日志:

2021-06-27 22:08:41 V/Bot 6********: Group(788189105) <- ForwardMessage(preview=[ea: hahaha, ea: hahaha], title=群聊的聊天记录, brief=[聊天记录], source=聊天记录, summary=查看 2 条转发消息, nodeList=[Node(senderId=1*********, time=1, senderName=ea, messageChain=hahaha), Node(senderId=1*********, time=-100, senderName=ea, messageChain=hahaha)])
2021-06-27 22:08:41 V/Bot 6********: Event: GroupMessagePostSendEvent(target=Group(788189105), message=ForwardMessage(preview=[ea: hahaha, ea: hahaha], title=群聊的聊天记录, brief=[聊天记录], source=聊天记录, summary=查看 2 条转发消息, nodeList=[Node(senderId=1*********, time=1, senderName=ea, messageChain=hahaha), Node(senderId=1*********, time=-100, senderName=ea, messageChain=hahaha)]), exception=null, receipt=net.mamoe.mirai.message.MessageReceipt@a7f9602)
Class 'ForwardMessageInternal' is not registered for polymorphic serialization in the scope of 'SingleMessage'.
Mark the base class as 'sealed' or register the serializer explicitly.
{"data":{"botid":6********,"text":"{\"content\":{\"id\":788189105,\"id2\":0,\"type\":2,\"value\":[{\"id\":1*********,\"message\":\"hahaha\",\"name\":\"ea\",\"time\":1},{\"id\":1*********,\"message\":\"hahaha\",\"name\":\"ea\",\"time\":-100}]},\"groupid\":0,\"id\":788189105,\"type\":2}"},"type":16}
2021-06-27 22:08:41 E/Bot 6********: MiraiCP Error:
kotlinx.serialization.SerializationException: Class 'ForwardMessageInternal' is not registered for polymorphic serialization in the scope of 'SingleMessage'.
Mark the base class as 'sealed' or register the serializer explicitly.
    at kotlinx.serialization.internal.AbstractPolymorphicSerializerKt.throwSubtypeNotRegistered(AbstractPolymorphicSerializer.kt:103)
    at kotlinx.serialization.internal.AbstractPolymorphicSerializerKt.throwSubtypeNotRegistered(AbstractPolymorphicSerializer.kt:113)
    at kotlinx.serialization.PolymorphicSerializerKt.findPolymorphicSerializer(PolymorphicSerializer.kt:96)
    at kotlinx.serialization.json.internal.PolymorphicKt.findActualSerializer(Polymorphic.kt:29)
    at kotlinx.serialization.json.internal.PolymorphicKt.access$findActualSerializer(Polymorphic.kt:1)
    at kotlinx.serialization.json.internal.StreamingJsonEncoder.encodeSerializableValue(StreamingJsonEncoder.kt:273)
    at kotlinx.serialization.encoding.AbstractEncoder.encodeSerializableElement(AbstractEncoder.kt:80)
    at kotlinx.serialization.internal.ListLikeSerializer.serialize(CollectionSerializers.kt:69)
    at net.mamoe.mirai.message.data.MessageChain$Serializer.serialize(MessageChain.kt:262)
    at net.mamoe.mirai.message.data.MessageChain$Serializer.serialize(MessageChain.kt:257)
    at kotlinx.serialization.json.internal.StreamingJsonEncoder.encodeSerializableValue(StreamingJsonEncoder.kt:270)
    at kotlinx.serialization.encoding.AbstractEncoder.encodeSerializableElement(AbstractEncoder.kt:80)
    at net.mamoe.mirai.internal.message.MessageSourceSerializerImpl$SerialData$$serializer.serialize(MessageSerializersImpl.kt:44)
    at net.mamoe.mirai.internal.message.MessageSourceSerializerImpl$SerialData$$serializer.serialize(MessageSerializersImpl.kt:44)
    at net.mamoe.mirai.internal.message.MessageSourceSerializerImpl$special$$inlined$map$1.serialize(MessageSerializersImpl.kt:230)
    at net.mamoe.mirai.internal.message.MessageSourceSerializerImpl.serialize(MessageSerializersImpl.kt)
    at net.mamoe.mirai.internal.message.MessageSourceSerializerImpl.serialize(MessageSerializersImpl.kt:31)
    at kotlinx.serialization.json.internal.StreamingJsonEncoder.encodeSerializableValue(StreamingJsonEncoder.kt:270)
    at kotlinx.serialization.json.Json.encodeToString(Json.kt:73)
    at tech.eritquearcus.miraicp.shared.publicShared.buildforwardMsg(publicShared.kt:505)
    at tech.eritquearcus.miraicp.shared.publicShared$buildforwardMsg$1.invokeSuspend(publicShared.kt)
    at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
    at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
    at kotlinx.coroutines.EventLoopImplBase.processNextEvent(EventLoop.common.kt:274)
    at kotlinx.coroutines.BlockingCoroutine.joinBlocking(Builders.kt:85)
    at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking(Builders.kt:59)
    at kotlinx.coroutines.BuildersKt.runBlocking(Unknown Source)
    at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking$default(Builders.kt:38)
    at kotlinx.coroutines.BuildersKt.runBlocking$default(Unknown Source)
    at tech.eritquearcus.miraicp.shared.CPP_lib$Companion.KBuildforward(CPP_lib.kt:151)
    at tech.eritquearcus.miraicp.shared.CPP_lib$Companion.KOperation(CPP_lib.kt:272)
    at tech.eritquearcus.miraicp.shared.CPP_lib.KOperation(CPP_lib.kt)
    at tech.eritquearcus.miraicp.shared.CPP_lib.Event(Native Method)
    at tech.eritquearcus.miraicp.shared.publicShared$onEnable$2.invokeSuspend(publicShared.kt:664)
    at tech.eritquearcus.miraicp.shared.publicShared$onEnable$2.invoke(publicShared.kt)
    at tech.eritquearcus.miraicp.shared.publicShared$onEnable$2.invoke(publicShared.kt)
    at net.mamoe.mirai.event.EventChannel$subscribeAlways$1.invokeSuspend(EventChannel.kt:431)
    at net.mamoe.mirai.event.EventChannel$subscribeAlways$1.invoke(EventChannel.kt)
    at net.mamoe.mirai.event.EventChannel$subscribeAlways$1.invoke(EventChannel.kt)
    at net.mamoe.mirai.event.EventChannel$filter$1$intercepted$thisIntercepted$1.invokeSuspend(EventChannel.kt:145)
    at net.mamoe.mirai.event.EventChannel$filter$1$intercepted$thisIntercepted$1.invoke(EventChannel.kt)
    at net.mamoe.mirai.event.EventChannel$filter$1$intercepted$thisIntercepted$1.invoke(EventChannel.kt)
    at net.mamoe.mirai.event.EventChannel$filter$1$intercepted$thisIntercepted$1.invokeSuspend(EventChannel.kt:145)
    at net.mamoe.mirai.event.EventChannel$filter$1$intercepted$thisIntercepted$1.invoke(EventChannel.kt)
    at net.mamoe.mirai.event.EventChannel$filter$1$intercepted$thisIntercepted$1.invoke(EventChannel.kt)
    at net.mamoe.mirai.internal.event.Handler$onEvent$2.invokeSuspend(InternalEventListeners.kt:48)
    at net.mamoe.mirai.internal.event.Handler$onEvent$2.invoke(InternalEventListeners.kt)
    at net.mamoe.mirai.internal.event.Handler$onEvent$2.invoke(InternalEventListeners.kt)
    at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:89)
    at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:165)
    at kotlinx.coroutines.BuildersKt.withContext(Unknown Source)
    at net.mamoe.mirai.internal.event.Handler.onEvent(InternalEventListeners.kt:48)
    at net.mamoe.mirai.internal.event.InternalEventListenersKt.process(InternalEventListeners.kt:144)
    at net.mamoe.mirai.internal.event.InternalEventListenersKt.callAndRemoveIfRequired(InternalEventListeners.kt:107)
    at net.mamoe.mirai.event._EventBroadcast.broadcastImpl(Event.kt:174)
    at net.mamoe.mirai.IMirai.broadcastEvent(IMirai.kt:310)
    at net.mamoe.mirai.internal.MiraiImpl.broadcastEvent$suspendImpl(MiraiImpl.kt:291)
    at net.mamoe.mirai.internal.MiraiImpl.broadcastEvent(MiraiImpl.kt)
    at net.mamoe.mirai.event._EventBroadcast.broadcastPublic$suspendImpl(Event.kt:161)
    at net.mamoe.mirai.event._EventBroadcast.broadcastPublic(Event.kt)
    at net.mamoe.mirai.event.EventKt.broadcast(Event.kt:148)
    at net.mamoe.mirai.internal.network.components.EventDispatcherImpl$broadcast$2.invokeSuspend(EventDispatcher.kt:75)
    at net.mamoe.mirai.internal.network.components.EventDispatcherImpl$broadcast$2.invoke(EventDispatcher.kt)
    at net.mamoe.mirai.internal.network.components.EventDispatcherImpl$broadcast$2.invoke(EventDispatcher.kt)
    at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:89)
    at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:165)
    at kotlinx.coroutines.BuildersKt.withContext(Unknown Source)
    at net.mamoe.mirai.internal.network.components.EventDispatcherImpl.broadcast$suspendImpl(EventDispatcher.kt:74)
    at net.mamoe.mirai.internal.network.components.EventDispatcherImpl.broadcast(EventDispatcher.kt)
    at net.mamoe.mirai.internal.network.components.EventDispatcherImpl$broadcastAsync$job$1.invokeSuspend(EventDispatcher.kt:90)
    at net.mamoe.mirai.internal.network.components.EventDispatcherImpl$broadcastAsync$job$1.invoke(EventDispatcher.kt)
    at net.mamoe.mirai.internal.network.components.EventDispatcherImpl$broadcastAsync$job$1.invoke(EventDispatcher.kt)
    at kotlinx.coroutines.intrinsics.UndispatchedKt.startCoroutineUndispatched(Undispatched.kt:55)
    at kotlinx.coroutines.CoroutineStart.invoke(CoroutineStart.kt:112)
    at kotlinx.coroutines.AbstractCoroutine.start(AbstractCoroutine.kt:126)
    at kotlinx.coroutines.BuildersKt__Builders_commonKt.launch(Builders.common.kt:56)
    at kotlinx.coroutines.BuildersKt.launch(Unknown Source)
    at net.mamoe.mirai.internal.network.components.EventDispatcherImpl.broadcastAsync-kKe4JaQ(EventDispatcher.kt:87)
    at net.mamoe.mirai.internal.network.components.EventDispatcher.broadcastAsync-kKe4JaQ$default(EventDispatcher.kt:35)
    at net.mamoe.mirai.internal.network.components.EventBroadcasterPacketHandler.impl(PacketHandler.kt:85)
    at net.mamoe.mirai.internal.network.components.EventBroadcasterPacketHandler.handlePacket(PacketHandler.kt:72)
    at net.mamoe.mirai.internal.network.components.PacketHandlerChain.handlePacket(PacketHandler.kt:40)
    at net.mamoe.mirai.internal.network.handler.NetworkHandlerSupport$collectReceived$1.invokeSuspend(NetworkHandlerSupport.kt:87)
    at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
    at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
    at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:571)
    at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:750)
    at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:678)
    at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:665)

版本

Him188 commented 3 years ago

For mamoe:

问题是 build 得到的 ForwardMessage 会在 transformSpecialMessages 时上传并变成 ForwardMessageInternal 再传递给 factory 发送, 并以这个 internal 结果构造了 receipt.

那么同理 Dice 等类型也可能有问题

我打算在 ForwardMessageInternal 加一个运行时 origin 属性, 在构造 receipt 前进行 light refine