Nambers / MiraiCP

c++ SDK of Mirai
https://eritque-arcus.tech/MiraiCP/
GNU Affero General Public License v3.0
177 stars 31 forks source link

将GroupMessageEvent中的PlainText对象传递给MessageChain::add后,在发送消息时报错 #171

Closed KeqingMoe closed 1 year ago

KeqingMoe commented 1 year ago

Code of Conduct

问题描述

我直接把GroupMessageEvent事件中的一个PlainText对象加入另一个MessageChain后再发送。然后当我发消息给机器人时,在e.group.sendMessage(msg)处报错,代码如下:

Event::registerEvent<GroupMessageEvent>([](GroupMessageEvent e){
    bool atMe=false;
    for(auto i:e.message){
        if(i.getType()==SingleMessageType::At_t){
            atMe=true;
        }
    }
    MessageChain msg;
    msg.add(PlainText{"Hello! "});
    if(atMe){
        for(auto i:e.message){
            if(i.getType()==SingleMessageType::At_t&&i.getVal<At>().target==e.bot.botid()){
                msg.add(At{e.sender.id()});
            }else{
                msg.add(*i);
            }
        }
    }
    try{
        e.group.sendMessage(msg);
    }catch(std::exception& ex){
        MessageChain msg;
        msg.add(At{e.sender.id()});
        msg.add(PlainText{" Sorry, an exception caught: "});
        msg.add(PlainText{ex.what()});
        e.group.sendMessage(msg);
    }
});

目前我只测试了两种情况:此错误在发送GroupMessageEvent事件中的PlainText对象会出现,如果发送的是At不会出现,且提供自己创建的对象则行为一切正常。

日志

2023.01.25 18:31:40 [INFO ] MiraiCP - [XXXXXXXXXX(XXXXXXXX)] XXXXXX(XXXXXXXXXX) -> @XXXXXXXXXX 1111
2023.01.25 18:31:40 [ERROR] MiraiCP - Polymorphic serializer was not found for class discriminator 'miraicode'
JSON input: {"content":" 1111","type":"miraicode"}
2023.01.25 18:31:40 [ERROR] MiraiCP - {"data":"{\"contact\":{\"botId\":XXXXXXXXXX,\"groupId\":XXXXXXXX,\"id\":XXXXXXXX,\"type\":2},\"message\":\"[{\\\"content\\\":\\\"Hello! \\\",\\\"type\\\":\\\"PlainText\\\"},{\\\"target\\\":XXXXXXXXXX,\\\"type\\\":\\\"At\\\"},{\\\"content\\\":\\\" 1111\\\",\\\"type\\\":\\\"miraicode\\\"}]\"}","type":1}
> kotlinx.serialization.json.internal.JsonDecodingException: Polymorphic serializer was not found for class discriminator 'miraicode'
JSON input: {"content":" 1111","type":"miraicode"}
        at kotlinx.serialization.json.internal.JsonExceptionsKt.JsonDecodingException(JsonExceptions.kt:24)
        at kotlinx.serialization.json.internal.JsonExceptionsKt.JsonDecodingException(JsonExceptions.kt:32)
        at kotlinx.serialization.json.internal.PolymorphicKt.throwSerializerNotFound(Polymorphic.kt:76)
        at kotlinx.serialization.json.internal.PolymorphicKt.decodeSerializableValuePolymorphic(Polymorphic.kt:66)
        at kotlinx.serialization.json.internal.StreamingJsonDecoder.decodeSerializableValue(StreamingJsonDecoder.kt:38)
        at kotlinx.serialization.encoding.AbstractDecoder.decodeSerializableValue(AbstractDecoder.kt:43)
        at kotlinx.serialization.encoding.AbstractDecoder.decodeSerializableElement(AbstractDecoder.kt:70)
        at kotlinx.serialization.json.internal.StreamingJsonDecoder.decodeSerializableElement(StreamingJsonDecoder.kt:111)
        at kotlinx.serialization.encoding.CompositeDecoder$DefaultImpls.decodeSerializableElement$default(Decoding.kt:537)
        at kotlinx.serialization.internal.CollectionLikeSerializer.readElement(CollectionSerializers.kt:80)
        at kotlinx.serialization.internal.AbstractCollectionSerializer.readElement$default(CollectionSerializers.kt:51)
        at kotlinx.serialization.internal.AbstractCollectionSerializer.merge(CollectionSerializers.kt:36)
        at kotlinx.serialization.internal.AbstractCollectionSerializer.deserialize(CollectionSerializers.kt:43)
        at net.mamoe.mirai.message.data.MessageChain$Serializer.deserialize(MessageChain.kt:276)
        at net.mamoe.mirai.message.data.MessageChain$Serializer.deserialize(MessageChain.kt:272)
        at kotlinx.serialization.json.internal.PolymorphicKt.decodeSerializableValuePolymorphic(Polymorphic.kt:59)
        at  kotlinx.serialization.json.internal.StreamingJsonDecoder.decodeSerializableValue(StreamingJsonDecoder.kt:38)
        at kotlinx.serialization.json.Json.decodeFromString(Json.kt:100)
        at net.mamoe.mirai.message.data.MessageChain$Companion.deserializeFromJsonString(MessageChain.kt:298)
        at net.mamoe.mirai.message.data.MessageChain$Companion.deserializeFromJsonString$default(MessageChain.kt:294)
        at tech.eritquearcus.miraicp.shared.PublicShared.sendMsg(PublicShared.kt:195)
        at tech.eritquearcus.miraicp.shared.Packets$Incoming$operations$2.invoke(Packet.kt:352)
        at tech.eritquearcus.miraicp.shared.Packets$Incoming$operations$2.invoke(Packet.kt:352)
        at tech.eritquearcus.miraicp.shared.CPPLib$operation$1.invokeSuspend(CPPLib.kt:62)
        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:284)
        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.CPPLib.operation(CPPLib.kt:59)
        at tech.eritquearcus.miraicp.shared.CPPLibMultiplatform.KOperation(CPPLibMultiplatform.kt:45)
2023.01.25 18:31:40 [INFO ] MiraiCP - Send message for Group(XXXXXXXXX) is [mirai:at:XXXXXXXXXX] Sorry, an exception caught: MiraiCP内部无法预料的错误:reach a error area, Contact::sendMsgImp

版本

v2.13.1

组件

LibLoader

编译器

MinGW

系统

Windows

架构

x86-64/amd64

Antares0982 commented 1 year ago

额是这么回事,你的这行

msg.add(*i);

首先你进行了一次解指针,但是解的是父类指针,抹掉了子类的类型,然后被add()加进去的时候类型变成了基类类型,本身的信息全都丢了。我们这个add()函数提供给你是帮助你从singleMessage的子类对象直接转发构造internal::Message的,不是用来实现多态的。你这里的i已经是internal::Message了,所以你应该改成

msg.emplace_back(i);

以及题外话,你的

for(auto i:e.message){

会把整个message里的所有internal::Message对象(智能指针)复制一次,这种时候你应该用引用

for(auto&& i:e.message){

如果不用引用的话,应该

msg.emplace_back(std::move(i));
KeqingMoe commented 1 year ago

非常感谢🫡