Панель видит моды Build 42 и названия больших сборок
В Build 42 mod.info лежит не в корне мода, а в папке версии: common, 42, 42.16. Сканер смотрел только в корень, и такие моды выглядели нескачанными с неизвестным Mod ID — включить их через панель было нельзя. На реальной мастерской находилось 237 модов из 399. Названия из мастерской фронтенд запрашивал одним списком, а эндпоинт не принимает больше двухсот идентификаторов за раз. У сборки на 284 пакета запрос падал целиком, ошибка молча проглатывалась, и вместо названий оставались одни номера. Теперь запрос идёт партиями, а полная неудача больше не остаётся незамеченной. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
+28
-5
@@ -1267,13 +1267,36 @@ function renderMods() {
|
||||
.join("") || `<li class="muted">${t("mods.empty")}</li>`;
|
||||
}
|
||||
|
||||
// LOOKUP_BATCH — сколько идентификаторов уходит в Steam за раз. Сервер не
|
||||
// принимает больше двух сотен, а у крупной сборки их втрое больше: одним
|
||||
// запросом список названий не пришёл бы вовсе.
|
||||
const LOOKUP_BATCH = 100;
|
||||
|
||||
async function lookupWorkshopTitles() {
|
||||
if (!mods.workshop.length) return;
|
||||
const data = await post("/api/mods/lookup", { ids: mods.workshop });
|
||||
(data.items || []).forEach((item) => {
|
||||
mods.details[item.id] = item;
|
||||
});
|
||||
renderMods();
|
||||
|
||||
let failure = null;
|
||||
let received = 0;
|
||||
for (let from = 0; from < mods.workshop.length; from += LOOKUP_BATCH) {
|
||||
const ids = mods.workshop.slice(from, from + LOOKUP_BATCH);
|
||||
try {
|
||||
const data = await post("/api/mods/lookup", { ids });
|
||||
(data.items || []).forEach((item) => {
|
||||
mods.details[item.id] = item;
|
||||
received++;
|
||||
});
|
||||
// Рисуем по мере ответов: у сотен модов ожидание заметно.
|
||||
renderMods();
|
||||
} catch (error) {
|
||||
failure = error;
|
||||
}
|
||||
}
|
||||
|
||||
// Без интернета названий не будет, и это не ошибка панели — но молчать тоже
|
||||
// нельзя: иначе непонятно, почему вместо названий одни номера.
|
||||
if (failure && received === 0) {
|
||||
toast(t("mods.titlesFailed", { reason: failure.message }), "err");
|
||||
}
|
||||
}
|
||||
|
||||
// moveEnabled двигает мод в списке загрузки на delta позиций.
|
||||
|
||||
@@ -225,6 +225,7 @@ const STRINGS = {
|
||||
"mods.mapsTitle": "Карты (Map)",
|
||||
"mods.mapsPlaceholder": "Например: Muldraugh, KY",
|
||||
"mods.mapsHint": "Каждая карта с новой строки. Первой должна идти карта мода, последней — базовая.",
|
||||
"mods.titlesFailed": "Названия модов не получены из мастерской: {reason}",
|
||||
"mods.caseTitle": "Регистр имён файлов модов",
|
||||
"mods.caseHint": "Игра приводит путь к файлам анимаций в нижний регистр целиком, включая имя папки мода. На Linux такие файлы не находятся, и сервер сыплет в лог ошибки AnimNode.Parse. Кнопка кладёт рядом строчные ссылки — файлы модов при этом не меняются. Запускайте после каждой докачки модов.",
|
||||
"mods.caseApply": "Разложить строчные ссылки",
|
||||
@@ -575,6 +576,7 @@ const STRINGS = {
|
||||
"mods.mapsTitle": "Maps (Map)",
|
||||
"mods.mapsPlaceholder": "For example: Muldraugh, KY",
|
||||
"mods.mapsHint": "One map per line. The mod map goes first, the base map last.",
|
||||
"mods.titlesFailed": "Could not get the mod titles from the workshop: {reason}",
|
||||
"mods.caseTitle": "Mod file name case",
|
||||
"mods.caseHint": "The game lowercases the whole path to animation files, the mod folder name included. On Linux those files are not found and the server floods the log with AnimNode.Parse errors. The button puts lowercase symlinks next to them — mod files themselves are left alone. Run it after every mod download.",
|
||||
"mods.caseApply": "Create lowercase links",
|
||||
|
||||
Reference in New Issue
Block a user