Nambers / MiraiCP

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

注册指令导致的错误 #198

Closed ofbwyx closed 10 months ago

ofbwyx commented 1 year ago

Code of Conduct

问题描述

在同时使用不止一个插件(我同时有两个插件)时,若注册了一个指令,在触发时会导致错误,并且使另一个(或许是其余所有插件)出现错误并无法使用,在点掉报错后程序停止运行。

我使用的插件 Hi 中注册了一个指令,效果是输出 log yee;插件 fr24 中没有注册指令但有定时器。

V$AF$A}O4$178 D`A6 QLX0

图中红框,禁用 fr24 后 hi 能正常使用命令,但黄框重新启用插件后导致了错误。

日志

No response

版本

2.14.0

组件

不属于上述项或我不知道属于哪一项

编译器

Microsoft Visual C++ (MSVC)

系统

Windows

架构

x86-64/amd64

Nambers commented 1 year ago

PS: load 传入的是 path 路径而不是 id

然后是在执行 yee 这个命令时报错的吗, 如果是贴一下他的代码 如果不是 (也就是说在跑这个命令里面的内容前就报错了) 那就不用贴 (可以通过在命令内容第一行加一个日志看看有没有执行到)

然后更新一下最新版本 v2.15.0-RC2 , 一些使用可能有变化, 详见:https://github.com/Nambers/MiraiCP/tree/dev/cpp/examples 示例

Antares0982 commented 1 year ago

理论上你点那个忽略 MiraiCP还能继续跑

麻烦日志详细一点,以及复现代码也贴上来看一下,比如如何注册定时器之类的,帮助我们更好地定位到问题

顺便 @Nambers 也提到的,load传入的是dll文件路径,因为我们允许用户unload之后重新编译,更新插件的id、路径,所以不会去做缓存已经卸载掉的id和文件系统上的路径信息这种不利于热更新的操作,如果不是需要完整地替换掉dll,不建议用reload

Nambers commented 1 year ago

v2.15.0 的下一个版本修复

ofbwyx commented 1 year ago

感谢对 load 问题的提醒,但我似乎不会升级 2.15.0(不懂咋编译啥的

hi 插件中目前有俩内容,一个是有戳一戳时候发消息,另一个就跑命令。命令的内容只有在 log 输出 yee 这一个。戳一戳是能正常用的,而只有在两个插件同时启用并且触发命令时候会报错。(代码在下面)

神奇的是报错后不去点,继续发命令还是能正常执行,但另一个插件会崩掉。

image

忽略后是没法继续跑的,Process exited with -1073740791

image

今天测试发现点击重试跟没点的效果相同,但输入 pluginlist 之后 Process exited with -1073740791

image

image

附上写得很丑的代码:

Hi 插件

    class Test :public IRawCommand {
    public:
        IRawCommand::Config config() override { return { "Test",{"test"}}; }
        void onCommand(std::shared_ptr<Contact> c, const Bot& b, const MessageChain& a) override {
            //if (c.get()->toJson()["id"] == 80000000)return;
            //Group g(c.get()->toJson()["groupId"], c.get()->toJson()["botId"]);
            //g.sendMessage("咕");
            Logger::logger.warning("yee");
        }
        Test() = default;
    };
void onEnable() override {
        CommandManager::registerCommand<Command::Test>();
        Event::registerEvent<NudgeEvent>([](NudgeEvent e) {
            if (e.target.get()->id() == e.target.get()->botid() && time(0) >= NudgeCD) {
                for (int i = 0; i < set["NudgeG"].size(); i++)
                    if ((i == 0 && set["NudgeG"][0] == -1) || set["NudgeG"][i] == e.subject.get()->id()) { // 找到开启了戳一戳的群
                        Group g(e.subject.get()->id(), e.subject.get()->botid());
                        int rd = myrand() % (set["NudgeR"].size()+1);
                        if (rd == set["NudgeR"].size()) Member(e.from.get()->id(), e.subject.get()->id(), e.subject.get()->botid()).sendNudge(); // 戳回去
                        else {
                            MessageChain msg = msg.deserializationFromMiraiCode(set["NudgeR"][rd]);
                            g.sendMessage(msg); // 发送消息
                        }
                        NudgeCD = time(0) + 10;
                        break;
                    }
            }
        });
}

Fr24 插件(其中 python 函数用于访问网页)

    void onEnable() override {

        schedule(1, "399642824"); // 注册 30 min 计时器

        Event::registerEvent<TimeOutEvent>([](TimeOutEvent e) {

            Logger::logger.info("Time Out!");
            schedule(1800, e.msg); // 下一轮计时

            json rsp = python("https://www.flightradar24.com/flights/most-tracked"); // Fr24 爬取
            Logger::logger.info(rsp);

            if ((!rsp["data"][0]["squawk"].is_null() && rsp["data"][0]["squawk"] != "7600") || (int)rsp["data"][0]["clicks"] >= 10000)
                for (int i = 0; i < set["Fr24G"].size(); i++) {
                    if ((int)rsp["data"][0]["clicks"] >= 10000)Group(set["Fr24G"][i], atoll(e.msg.c_str())).sendMessage("有超过一万人正在关注的航班:\n" + rsp["data"][0].dump() + "\n数据来源:https://www.flightradar24.com");
                    else Group(set["Fr24G"][i], atoll(e.msg.c_str())).sendMessage("可能出现异常的航班:\n" + rsp["data"][0].dump() + "\n数据来源:https://www.flightradar24.com");
                }
            });

        Event::registerEvent<GroupMessageEvent>([](GroupMessageEvent e) {   

            if (e.message.toMiraiCode() == (string)"Fr24"|| e.message.toMiraiCode() == (string)"fr24") {
                json rsp = python("https://www.flightradar24.com/flights/most-tracked"); // Fr24 爬取
                e.group.sendMessage("当前关注最多的航班:\n" + rsp["data"][0].dump() + "\n数据来源:https://www.flightradar24.com");
            }

            });
    }
Antares0982 commented 1 year ago

之后我们会尝试复现,以及打算重构Command系统,预计修复要等一段时间了

Nambers commented 10 months ago

fixed in v2.16.0 (will release soon)