Skip to content

Commit cacc31a

Browse files
committed
fix(mod): install
恢复.mod get远程获取功能
1 parent a765da8 commit cacc31a

File tree

2 files changed

+107
-98
lines changed

2 files changed

+107
-98
lines changed

Dice/DiceMod.cpp

Lines changed: 105 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
* Dice! QQ Dice Robot for TRPG
1010
* Copyright (C) 2018-2021 w4123溯洄
11-
* Copyright (C) 2019-2024 String.Empty
11+
* Copyright (C) 2019-2025 String.Empty
1212
*
1313
* This program is free software: you can redistribute it and/or modify it under the terms
1414
* of the GNU Affero General Public License as published by the Free Software Foundation,
@@ -172,39 +172,42 @@ void DiceModManager::mod_install(DiceEvent& msg) {
172172
return;
173173
}
174174
for (auto& url : sourceList) {
175-
if (!Network::GET(url + name + "/descriptor.json", desc)) {
176-
msg.set("err", msg.get_str("err") + "\n访问" + url + name + "失败:" + desc);
175+
if (!Network::GET(url, desc)) {
176+
msg.set("err", msg.get_str("err") + "\n访问" + url + "失败:" + desc);
177177
continue;
178178
}
179179
try {
180180
if (desc.find("404") == 0)continue;
181-
fifo_json j = fifo_json::parse(desc);
182-
if (j.count("dice_build") && j["dice_build"] > Dice_Build) {
183-
msg.set("err", msg.get_str("err") + "\nDice版本不满足要求(" + to_string(j["dice_build"]) + "):" + url);
184-
continue;
185-
}
186-
#ifndef __ANDROID__
187-
if (j.count("repo") && !j["repo"].empty()) {
188-
string repo{ j["repo"] };
189-
if (mod_clone(name, repo)) {
190-
msg.set("mod_ver", modList[name]->ver.exp);
191-
msg.replyMsg("strModInstalled");
192-
return;
181+
fifo_json data = fifo_json::parse(desc);
182+
fifo_json mods = data["data"];
183+
for (auto j : mods) {
184+
if (j.count("dice_build") && j["dice_build"] > Dice_Build) {
185+
msg.set("err", msg.get_str("err") + "\nDice版本不满足要求(" + to_string(j["dice_build"]) + "):" + url);
186+
break;
193187
}
194-
else {
195-
msg.set("err", msg.get_str("err") + "\ngit clone失败:" + repo);
196-
continue;
188+
#ifndef __ANDROID__
189+
if (j.count("repo") && !j["repo"].empty()) {
190+
string repo{ j["repo"] };
191+
if (mod_clone(name, repo)) {
192+
msg.set("mod_ver", modList[name]->ver.exp);
193+
msg.replyMsg("strModInstalled");
194+
return;
195+
}
196+
else {
197+
msg.set("err", msg.get_str("err") + "\ngit clone失败:" + repo);
198+
break;
199+
}
197200
}
198-
}
199201
#endif //ANDROID
200-
if (j.count("pkg")) {
201-
string pkg{ j["pkg"] };
202-
std::string des;
203-
if (mod_dlpkg(name, pkg, des)) {
204-
msg.set("mod_ver", des);
205-
msg.replyMsg("strModInstalled");
202+
if (j.count("pkg")) {
203+
string pkg{ j["pkg"] };
204+
std::string des;
205+
if (mod_dlpkg(name, pkg, des)) {
206+
msg.set("mod_ver", des);
207+
msg.replyMsg("strModInstalled");
208+
}
209+
else msg.set("err", msg.get_str("err") + des);
206210
}
207-
else msg.set("err", msg.get_str("err") + des);
208211
}
209212
msg.set("err", msg.get_str("err") + "\n未写出mod地址(repo/pkg):" + url + name);
210213
}
@@ -224,61 +227,64 @@ void DiceModManager::mod_reinstall(DiceEvent& msg) {
224227
auto mod{ modList[name] };
225228
msg.set("ex_ver", mod->ver.exp);
226229
for (auto& url : sourceList) {
227-
if (!Network::GET(url + name, desc)) {
230+
if (!Network::GET(url, desc)) {
228231
msg.set("err", msg.get_str("err") + "\n访问" + url + name + "失败:" + desc);
229232
continue;
230233
}
231234
try {
232-
fifo_json j = fifo_json::parse(desc);
233235
//todo: dice_build check
236+
fifo_json data = fifo_json::parse(desc);
237+
fifo_json mods = data["data"];
238+
for (auto j : mods) {
234239
#ifndef __ANDROID__
235-
if (j.count("repo") && !j["repo"].empty()) {
236-
string repo{ j["repo"] };
237-
auto idx{ mod->index };
238-
mod->free();
239-
fs::remove_all(DiceDir / "mod" / name, ec1);
240-
mod = std::make_shared<DiceMod>(DiceMod{ name,modOrder.size(),repo});
241-
modList[name] = mod;
242-
modOrder[idx] = mod;
243-
if (!mod->loaded) {
244-
msg.set("err", msg.get_str("err") + "\ngit clone失败:" + repo);
245-
continue;
246-
}
247-
save();
248-
build();
249-
msg.set("mod_ver", mod->ver.exp);
250-
msg.replyMsg("strModReinstalled");
251-
return;
252-
}
253-
#endif //ANDROID
254-
if (j.count("pkg")) {
255-
string pkg{ j["pkg"] };
256-
std::string des;
257-
if (!Network::GET(pkg, des)) {
258-
msg.set("err", msg.get_str("err") + "\n下载失败(" + pkg + "):" + des);
259-
continue;
260-
}
261-
fs::remove_all(DiceDir / "mod" / name, ec1);
262-
Zip::extractZip(des, DiceDir / "mod");
263-
auto pathJson{ DiceDir / "mod" / (name + ".json") };
264-
if (!fs::exists(pathJson)) {
265-
msg.set("err", msg.get_str("err") + "\npkg解压无文件" + name + ".json");
266-
continue;
267-
}
268-
string err;
269-
if (mod->loadDesc(err)) {
240+
if (j["name"] == name && j.count("repo") && !j["repo"].empty()) {
241+
string repo{ j["repo"] };
242+
auto idx{ mod->index };
243+
mod->free();
244+
fs::remove_all(DiceDir / "mod" / name, ec1);
245+
mod = std::make_shared<DiceMod>(DiceMod{ name,modOrder.size(),repo });
246+
modList[name] = mod;
247+
modOrder[idx] = mod;
248+
if (!mod->loaded) {
249+
msg.set("err", msg.get_str("err") + "\ngit clone失败:" + repo);
250+
break;
251+
}
270252
save();
271253
build();
272254
msg.set("mod_ver", mod->ver.exp);
273255
msg.replyMsg("strModReinstalled");
274256
return;
275257
}
276-
else {
277-
msg.set("err", msg.get_str("err") + "\n" + err + "(" + url + name + ")");
278-
continue;
258+
#endif //ANDROID
259+
if (j["name"] == name && j.count("pkg")) {
260+
string pkg{ j["pkg"] };
261+
std::string des;
262+
if (!Network::GET(pkg, des)) {
263+
msg.set("err", msg.get_str("err") + "\n下载失败(" + pkg + "):" + des);
264+
break;
265+
}
266+
fs::remove_all(DiceDir / "mod" / name, ec1);
267+
Zip::extractZip(des, DiceDir / "mod");
268+
auto pathJson{ DiceDir / "mod" / (name + ".json") };
269+
if (!fs::exists(pathJson)) {
270+
msg.set("err", msg.get_str("err") + "\npkg解压无文件" + name + ".json");
271+
continue;
272+
}
273+
string err;
274+
if (mod->loadDesc(err)) {
275+
save();
276+
build();
277+
msg.set("mod_ver", mod->ver.exp);
278+
msg.replyMsg("strModReinstalled");
279+
return;
280+
}
281+
else {
282+
msg.set("err", msg.get_str("err") + "\n" + err + "(" + url + ")");
283+
break;
284+
}
279285
}
280286
}
281-
msg.set("err", msg.get_str("err") + "\n未写出mod地址(repo/pkg):" + url + name);
287+
msg.set("err", msg.get_str("err") + "\n未找到mod地址(repo/pkg):" + url);
282288
} catch (std::exception& e) {
283289
console.log("安装" + url + name + "失败:" + e.what(), 0b01);
284290
msg.set("err", msg.get_str("err") + "\n" + url + name + ":" + e.what());
@@ -311,44 +317,47 @@ void DiceModManager::mod_update(DiceEvent& msg) {
311317
#endif //ANDROID
312318
string desc;
313319
for (auto& url : sourceList) {
314-
if (!Network::GET(url + name, desc)) {
320+
if (!Network::GET(url, desc)) {
315321
console.log("访问" + url + name + "失败:" + desc, 0);
316322
msg.set("err", msg.get_str("err") + "\n访问" + url + name + "失败:" + desc);
317323
continue;
318324
}
319325
try {
320-
fifo_json j = fifo_json::parse(desc);
321-
if (!j.count("ver") || !j.count("pkg"))continue;
322-
Version ver{ j["ver"] };
323-
if (mod->ver < ver) {
324-
string pkg{ j["pkg"] };
325-
if (!Network::GET(pkg, des)) {
326-
msg.set("err", msg.get_str("err") + "\n下载失败(" + pkg + "):" + des);
327-
continue;
328-
}
329-
std::error_code ec1;
330-
fs::remove_all(DiceDir / "mod" / name, ec1);
331-
Zip::extractZip(des, DiceDir / "mod");
332-
auto pathJson{ DiceDir / "mod" / (name + ".json") };
333-
if (!fs::exists(pathJson)) {
334-
msg.set("err", msg.get_str("err") + "\npkg解压无文件" + name + ".json");
335-
continue;
336-
}
337-
string err;
338-
if (mod->loadDesc(err)) {
339-
build();
340-
msg.set("mod_ver", mod->ver.exp);
341-
msg.replyMsg("strModUpdated");
342-
return;
326+
fifo_json data = fifo_json::parse(desc);
327+
fifo_json mods = data["data"];
328+
for (auto j : mods) {
329+
if (!j.count("ver") || !j.count("pkg") || j["name"] != name)continue;
330+
Version ver{ j["ver"] };
331+
if (mod->ver < ver) {
332+
string pkg{ j["pkg"] };
333+
if (!Network::GET(pkg, des)) {
334+
msg.set("err", msg.get_str("err") + "\n下载失败(" + pkg + "):" + des);
335+
continue;
336+
}
337+
std::error_code ec1;
338+
fs::remove_all(DiceDir / "mod" / name, ec1);
339+
Zip::extractZip(des, DiceDir / "mod");
340+
auto pathJson{ DiceDir / "mod" / (name + ".json") };
341+
if (!fs::exists(pathJson)) {
342+
msg.set("err", msg.get_str("err") + "\npkg解压无文件" + name + ".json");
343+
continue;
344+
}
345+
string err;
346+
if (mod->loadDesc(err)) {
347+
build();
348+
msg.set("mod_ver", mod->ver.exp);
349+
msg.replyMsg("strModUpdated");
350+
return;
351+
}
352+
else {
353+
msg.set("err", msg.get_str("err") + "\n" + err + "(" + url + name + ")");
354+
continue;
355+
}
343356
}
344357
else {
345-
msg.set("err", msg.get_str("err") + "\n" + err + "(" + url + name + ")");
346-
continue;
358+
msg.set("err", "无更新于" + mod->ver.exp + "的版本!");
347359
}
348360
}
349-
else {
350-
msg.set("err", "无更新于" + mod->ver.exp + "的版本!");
351-
}
352361
} catch (std::exception& e) {
353362
console.log("安装" + url + name + "失败:" + e.what(), 0b01);
354363
msg.set("err", msg.get_str("err") + "\n" + url + name + ":" + e.what());

Dice/DiceMod.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#pragma once
22
/*
33
* 资源模块
4-
* Copyright (C) 2019-2024 String.Empty
4+
* Copyright (C) 2019-2025 String.Empty
55
*/
66

77
#include <utility>
@@ -142,7 +142,7 @@ class DiceModManager {
142142
vector<string> sourceList = {
143143
"https://raw.gitmirror.com/Dice-Developer-Team/DiceModIndex/main/index",
144144
"https://mirror.ghproxy.com/https://raw.githubusercontent.com/Dice-Developer-Team/DiceModIndex/main/index",
145-
"https://gitee.com/diceki/DiceModIndex/raw/main/",
145+
"https://gitee.com/diceki/DiceModIndex/raw/main/index",
146146
//"https://raw.sevencdn.com/Dice-Developer-Team/DiceModIndex/main/index",
147147
};
148148
//custom

0 commit comments

Comments
 (0)