cyanray / mirai-cpp

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

Dev/int 0x7 fffffff #137

Closed Int-0X7FFFFFFF closed 2 years ago

Int-0X7FFFFFFF commented 2 years ago

1.修复了样例里一个小问题 2.ImageMessage的ToJson()会导致发送图片时的报错已将代码回滚 3.不确定音频类消息会不会出现问题(我的机器人没有用到这个功能) BUG_REP_1 4.测试所使用的代码(魔改自样例)

#include <iostream>
// 使用静态库必须要在引入 mirai.h 前定义这个宏
#define MIRAICPP_STATICLIB
#include <mirai.h>
using namespace std;
using namespace Cyan;

int main(int argc, char* argv[])
{
    system("chcp 65001");
    MiraiBot bot;
    SessionOptions opts;
    opts.BotQQ = xxxxxxx_qq;                // 请修改为你的机器人QQ
    opts.HttpHostname = "localhost";        // 请修改为和 mirai-api-http 配置文件一致
    opts.WebSocketHostname = "localhost";   // 同上
    opts.HttpPort = 8080;                   // 同上
    opts.WebSocketPort = 8080;              // 同上
    opts.VerifyKey = "LINKSTART";           // 同上
    bot.Connect(opts);
    cout << "Bot working..." << endl;

    FriendImage img = bot.UploadFriendImage("./pic/setu.jpg");    //任意图片均可复现

    bot.On<FriendMessage>(
        [&](FriendMessage fm)
        {
            try
            {
                fm.Reply(MessageChain().Image(img));
            }
            catch (const std::exception& ex)
            {
                cout << ex.what() << endl;
            }
        });

    string command;
    while (cin >> command)
    {
        if (command == "exit")
        {
            bot.Disconnect();
            break;
        }
    }

    return 0;
}
Numendacil commented 2 years ago

嘶,可能是C++的?:运算符不能在后两个表达式里使用不同的类型的原因……但编译过了也挺神奇的。 ToJson()这块的修改Voice和Image是一样的,如果其中一个有问题另一个应该也需要改。目前来看可以直接回滚到之前的(反正MAH目前的版本也会把空字符串当成null处理),或者复杂一点用if else判定字符串是否为空。Set()函数应该是没有问题的不用回滚

cyanray commented 2 years ago

嘶,可能是C++的?:运算符不能在后两个表达式里使用不同的类型的原因……但编译过了也挺神奇的。 ToJson()这块的修改Voice和Image是一样的,如果其中一个有问题另一个应该也需要改。目前来看可以直接回滚到之前的(反正MAH目前的版本也会把空字符串当成null处理),或者复杂一点用if else判定字符串是否为空。Set()函数应该是没有问题的不用回滚

?:是一方面,这个不同类型在 msvc 下可以编译通过,gcc 是不行的(nullptr 被编译器当成指针,转化成 string(nullptr) 了,所以可以通过编译)。C++ 的类型都是值类型,不可以像其他语言那样赋值 null 的,你给 string 赋值 nullptr,它会把 nullptr 当成 char*去读取字符串,nullptr不可读取,就报错了。

当然,以上都是我的猜测,我这个C++语言律师还在初级阶段,手动滑稽。

我明天抽时间进行改进,到时候再合并吧。