cyanray / mirai-cpp

本项目为 mirai-api-http 的 C++ 封装,方便使用 C++ 开发基于 mirai-api-http 插件。
GNU Affero General Public License v3.0
148 stars 38 forks source link

websocket 连接正常,但是无法触发事件处理函数 #123

Closed Yastruhank closed 2 years ago

Yastruhank commented 2 years ago

你好。我在成功与mirai-apt-http建立连接之后尝试注册监听事件,但是事件发生后,注册的回调函数并没有被执行。在mirai主程序处能看到事件,并且不需要监听的发送消息功能也能正常使用,请问这是怎么回事呢?

cyanray commented 2 years ago

检查一下mah的配置文件,有没有开启ws(websocket)

内容大概是:

adapter:
- http
- ws

理论上没开启ws应该要抛出异常,但是不知道为何没有抛出异常。(难以抽出时间维护该项目,该问题可能长期存在)

Yastruhank commented 2 years ago

检查一下mah的配置文件,有没有开启ws(websocket)

内容大概是:

adapter:
- http
- ws

理论上没开启ws应该要抛出异常,但是不知道为何没有抛出异常。(难以抽出时间维护该项目,该问题可能长期存在)

mah的配置文件中是开启了ws的,并且在mirai主程序的控制台输出中也显示 Mirai HTTP API: adaptors: [http,ws]

cyanray commented 2 years ago

是所有事件都无法触发回调函数吗,具体是哪个事件呢? 有试过 FriendMessage, GroupMessage, Message 这类事件吗,有些不常用事件缺乏测试,可能哪里写错了没发现导致无法触发。

也试试捕捉事件解析错误:

bot.On<EventParsingError>([&](EventParsingError e)
{
    try
    {
        e.Rethrow();
    }
    catch (const std::exception& ex)
    {
        cout << "解析事件时出现错误: " << ex.what() << endl;
    }
});

更有可能是网络问题,检查 hostname,port 有没有设置错误。

Yastruhank commented 2 years ago

是所有事件都无法触发回调函数吗,具体是哪个事件呢? 有试过 FriendMessage, GroupMessage, Message 这类事件吗,有些不常用事件缺乏测试,可能哪里写错了没发现导致无法触发。

也试试捕捉事件解析错误:

bot.On<EventParsingError>([&](EventParsingError e)
{
    try
    {
        e.Rethrow();
    }
    catch (const std::exception& ex)
    {
        cout << "解析事件时出现错误: " << ex.what() << endl;
    }
});

更有可能是网络问题,检查 hostname,port 有没有设置错误。

是所有事件都无法触发,包括例程也是。这个函数我也试了,也没有被触发。hostname和port应该没有配置出错。请问程序有日志系统之类的东西用来分析吗?

cyanray commented 2 years ago

是所有事件都无法触发回调函数吗,具体是哪个事件呢? 有试过 FriendMessage, GroupMessage, Message 这类事件吗,有些不常用事件缺乏测试,可能哪里写错了没发现导致无法触发。 也试试捕捉事件解析错误:

bot.On<EventParsingError>([&](EventParsingError e)
{
    try
    {
        e.Rethrow();
    }
    catch (const std::exception& ex)
    {
        cout << "解析事件时出现错误: " << ex.what() << endl;
    }
});

更有可能是网络问题,检查 hostname,port 有没有设置错误。

是所有事件都无法触发,包括例程也是。这个函数我也试了,也没有被触发。hostname和port应该没有配置出错。请问程序有日志系统之类的东西用来分析吗?

那就只能是网络问题了。

你可以试着在 mirai_bot.cpp 的这一行 打断点,看看新事件到达时会不会触发断点,如果不会,说明 Websocket 没成功建立连接。

然后在 websocketClient.cpp 的这一行打断点,检查局部变量 response_buffer 的内容。(我猜测可能还没执行到这里就抛出异常了)

Yastruhank commented 2 years ago

是所有事件都无法触发回调函数吗,具体是哪个事件呢? 有试过 FriendMessage, GroupMessage, Message 这类事件吗,有些不常用事件缺乏测试,可能哪里写错了没发现导致无法触发。 也试试捕捉事件解析错误:

bot.On<EventParsingError>([&](EventParsingError e)
{
    try
    {
        e.Rethrow();
    }
    catch (const std::exception& ex)
    {
        cout << "解析事件时出现错误: " << ex.what() << endl;
    }
});

更有可能是网络问题,检查 hostname,port 有没有设置错误。

是所有事件都无法触发,包括例程也是。这个函数我也试了,也没有被触发。hostname和port应该没有配置出错。请问程序有日志系统之类的东西用来分析吗?

那就只能是网络问题了。

你可以试着在 mirai_bot.cpp 的这一行 打断点,看看新事件到达时会不会触发断点,如果不会,说明 Websocket 没成功建立连接。

然后在 websocketClient.cpp 的这一行打断点,检查局部变量 response_buffer 的内容。(我猜测可能还没执行到这里就抛出异常了)

有进入第一个断点,在第二个断电response_buffe的内容是101 switching protocois

QQ截图20211017172303

cyanray commented 2 years ago

是所有事件都无法触发回调函数吗,具体是哪个事件呢? 有试过 FriendMessage, GroupMessage, Message 这类事件吗,有些不常用事件缺乏测试,可能哪里写错了没发现导致无法触发。 也试试捕捉事件解析错误:

bot.On<EventParsingError>([&](EventParsingError e)
{
    try
    {
        e.Rethrow();
    }
    catch (const std::exception& ex)
    {
        cout << "解析事件时出现错误: " << ex.what() << endl;
    }
});

更有可能是网络问题,检查 hostname,port 有没有设置错误。

是所有事件都无法触发,包括例程也是。这个函数我也试了,也没有被触发。hostname和port应该没有配置出错。请问程序有日志系统之类的东西用来分析吗?

那就只能是网络问题了。 你可以试着在 mirai_bot.cpp 的这一行 打断点,看看新事件到达时会不会触发断点,如果不会,说明 Websocket 没成功建立连接。 然后在 websocketClient.cpp 的这一行打断点,检查局部变量 response_buffer 的内容。(我猜测可能还没执行到这里就抛出异常了)

有进入第一个断点,在第二个断电response_buffe的内容是101 switching protocois

QQ截图20211017172303

看起来没有问题啊,图中显示你收到了刚建立连接时MAH发的一个包,试着给你的机器人发条消息触发消息事件,看看还能进入第一个断点吗。

会不会是因为网络原因断开连接了,记得处理 LostConnection 事件

Yastruhank commented 2 years ago

是所有事件都无法触发回调函数吗,具体是哪个事件呢? 有试过 FriendMessage, GroupMessage, Message 这类事件吗,有些不常用事件缺乏测试,可能哪里写错了没发现导致无法触发。 也试试捕捉事件解析错误:

bot.On<EventParsingError>([&](EventParsingError e)
{
    try
    {
        e.Rethrow();
    }
    catch (const std::exception& ex)
    {
        cout << "解析事件时出现错误: " << ex.what() << endl;
    }
});

更有可能是网络问题,检查 hostname,port 有没有设置错误。

是所有事件都无法触发,包括例程也是。这个函数我也试了,也没有被触发。hostname和port应该没有配置出错。请问程序有日志系统之类的东西用来分析吗?

那就只能是网络问题了。 你可以试着在 mirai_bot.cpp 的这一行 打断点,看看新事件到达时会不会触发断点,如果不会,说明 Websocket 没成功建立连接。 然后在 websocketClient.cpp 的这一行打断点,检查局部变量 response_buffer 的内容。(我猜测可能还没执行到这里就抛出异常了)

有进入第一个断点,在第二个断电response_buffe的内容是101 switching protocois QQ截图20211017172303

看起来没有问题啊,图中显示你收到了刚建立连接时MAH发的一个包,试着给你的机器人发条消息触发消息事件,看看还能进入第一个断点吗。

会不会是因为网络原因断开连接了,记得处理 LostConnection 事件

发送消息后有进入第一个断点

QQ截图20211017172303

但是没有进入回调函数

QQ截图20211017175100

cyanray commented 2 years ago

这问题有点奇怪,我也看不懂了……

截图里你收到了 FriendInputStatusChangedEvent 事件,第一个断点你是否进入了两次?(第二次才是真正的好友消息事件) 试试 bot.On 看看能不能触发 FriendInputStatusChangedEvent 事件的回调函数。

cyanray commented 2 years ago

也可以加Q群 1013323391,可能交流方便点。// TODO: 将真实原因和解决方案回复在该帖子。

cyanray commented 2 years ago

错误原因:注释了 magic_enum 的断言,虽然通过编译,但是 magic_enum 不能正常工作。 解决方法:升级 MinGW

magic_enum 对编译器的要求: