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" ) + " \n Dice版本不满足要求(" + 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" ) + " \n Dice版本不满足要求(" + to_string (j[" dice_build" ]) + " ):" + url);
186+ break ;
193187 }
194- else {
195- msg.set (" err" , msg.get_str (" err" ) + " \n git 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" ) + " \n git 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" ) + " \n git 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" ) + " \n pkg解压无文件" + 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" ) + " \n git 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" ) + " \n pkg解压无文件" + 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" ) + " \n pkg解压无文件" + 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" ) + " \n pkg解压无文件" + 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 ());
0 commit comments