Closed ofbwyx closed 10 months ago
PS: load 传入的是 path 路径而不是 id
然后是在执行 yee 这个命令时报错的吗, 如果是贴一下他的代码 如果不是 (也就是说在跑这个命令里面的内容前就报错了) 那就不用贴 (可以通过在命令内容第一行加一个日志看看有没有执行到)
然后更新一下最新版本 v2.15.0-RC2 , 一些使用可能有变化, 详见:https://github.com/Nambers/MiraiCP/tree/dev/cpp/examples 示例
理论上你点那个忽略 MiraiCP还能继续跑
麻烦日志详细一点,以及复现代码也贴上来看一下,比如如何注册定时器之类的,帮助我们更好地定位到问题
顺便 @Nambers 也提到的,load
传入的是dll文件路径,因为我们允许用户unload
之后重新编译,更新插件的id、路径,所以不会去做缓存已经卸载掉的id和文件系统上的路径信息这种不利于热更新的操作,如果不是需要完整地替换掉dll,不建议用reload
v2.15.0 的下一个版本修复
感谢对 load 问题的提醒,但我似乎不会升级 2.15.0(不懂咋编译啥的
hi 插件中目前有俩内容,一个是有戳一戳时候发消息,另一个就跑命令。命令的内容只有在 log 输出 yee
这一个。戳一戳是能正常用的,而只有在两个插件同时启用并且触发命令时候会报错。(代码在下面)
神奇的是报错后不去点,继续发命令还是能正常执行,但另一个插件会崩掉。
忽略后是没法继续跑的,Process exited with -1073740791
。
今天测试发现点击重试跟没点的效果相同,但输入 pluginlist
之后 Process exited with -1073740791
附上写得很丑的代码:
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");
}
});
}
之后我们会尝试复现,以及打算重构Command系统,预计修复要等一段时间了
fixed in v2.16.0 (will release soon)
Code of Conduct
问题描述
在同时使用不止一个插件(我同时有两个插件)时,若注册了一个指令,在触发时会导致错误,并且使另一个(或许是其余所有插件)出现错误并无法使用,在点掉报错后程序停止运行。
我使用的插件 Hi 中注册了一个指令,效果是输出 log
yee
;插件 fr24 中没有注册指令但有定时器。图中红框,禁用 fr24 后 hi 能正常使用命令,但黄框重新启用插件后导致了错误。
日志
No response
版本
2.14.0
组件
不属于上述项或我不知道属于哪一项
编译器
Microsoft Visual C++ (MSVC)
系统
Windows
架构
x86-64/amd64