From 03d7048aaadd4685a7679643d80b52904ecb0670 Mon Sep 17 00:00:00 2001 From: RushanM Date: Wed, 8 Jan 2025 17:12:34 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D1=81=D1=86=D0=B5=D0=BD=D0=B0=D1=80=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/js/build_alpha.js | 136 +++++++++++++++++++++----------------- 1 file changed, 77 insertions(+), 59 deletions(-) diff --git a/.github/js/build_alpha.js b/.github/js/build_alpha.js index 6797f6b3..77fa729f 100644 --- a/.github/js/build_alpha.js +++ b/.github/js/build_alpha.js @@ -191,65 +191,83 @@ function getChangedFiles(lastTag) { // Функция для получения информации о моде из таблицы async function getModInfoFromSheet(modId, gameVer, sheets) { - const spreadsheetId = '1kGGT2GGdG_Ed13gQfn01tDq2MZlVOC9AoiD1s3SDlZE'; - const range = 'db!A1:Z1000'; - - const response = await sheets.spreadsheets.values.get({ - spreadsheetId, - range, - }); - - const rows = response.data.values; - if (!rows || rows.length === 0) return null; - - const headers = rows[0]; - const idIndex = headers.indexOf('id'); - const gameVerIndex = headers.indexOf('gameVer'); - const nameIndex = headers.indexOf('name'); - const modrinthUrlIndex = headers.indexOf('modrinthUrl'); - const cfUrlIndex = headers.indexOf('cfUrl'); - const fallbackUrlIndex = headers.indexOf('fallbackUrl'); - // Для сортировки по popularity (столбец O), используем generic индекс: - const popularityIndex = headers.indexOf('popularity'); - - // Приводим искомый мод и версию к нижнему регистру и без пробелов - const normalizedModId = modId.trim().toLowerCase(); - const normalizedGameVer = gameVer.trim().toLowerCase(); - - for (let i = 1; i < rows.length; i++) { - const row = rows[i]; - // Пропускаем пустые строки - if (!row[idIndex] && !row[nameIndex]) continue; - if (!row[gameVerIndex]) continue; - - // Анализируем id из таблицы (если пустое, пробуем по имени) - const rowIdRaw = row[idIndex] ? row[idIndex].trim().toLowerCase() : ''; - const rowNameRaw = row[nameIndex] ? row[nameIndex].trim().toLowerCase() : ''; - const rowGameVerRaw = row[gameVerIndex].trim().toLowerCase(); - - // Условие: либо совпал modId с id, либо modId встретился в названии (случай, когда id пуст) - // Дополнительно проверяем, что версия из таблицы начинается так же, как версия из пути - if ( - ((rowIdRaw && rowIdRaw === normalizedModId) || (!rowIdRaw && rowNameRaw.includes(normalizedModId))) && - rowGameVerRaw.startsWith(normalizedGameVer) - ) { - const name = row[nameIndex] || modId; - const modrinthUrl = row[modrinthUrlIndex] || ''; - const cfUrl = row[cfUrlIndex] || ''; - const fallbackUrl = row[fallbackUrlIndex] || ''; - const url = modrinthUrl || cfUrl || fallbackUrl; - - const popularity = popularityIndex !== -1 && row[popularityIndex] - ? parseInt(row[popularityIndex]) : 0; - - return { - name, - url, - popularity, - }; - } - } - return null; + const spreadsheetId = '1kGGT2GGdG_Ed13gQfn01tDq2MZlVOC9AoiD1s3SDlZE'; + const range = 'db!A1:Z1000'; + + const response = await sheets.spreadsheets.values.get({ + spreadsheetId, + range, + }); + + const rows = response.data.values; + if (!rows || rows.length === 0) return null; + + const headers = rows[0]; + const idIndex = headers.indexOf('id'); + const gameVerIndex = headers.indexOf('gameVer'); + const nameIndex = headers.indexOf('name'); + const modrinthUrlIndex = headers.indexOf('modrinthUrl'); + const cfUrlIndex = headers.indexOf('cfUrl'); + const fallbackUrlIndex = headers.indexOf('fallbackUrl'); + const popularityIndex = headers.indexOf('popularity'); + + // Приведение идентификатора и версии игры мода в надлежащий вид + const normalizedModId = modId.trim().toLowerCase(); + const normalizedGameVer = gameVer.trim().toLowerCase(); + + // Сборка всех строк, совпадающих с идентификатором или названием, игнорируя регистр + const possibleMatches = []; + for (let i = 1; i < rows.length; i++) { + const row = rows[i]; + if (!row || (!(row[idIndex] || row[nameIndex]))) { + continue; // Пропуск пустых строк + } + + const rowIdRaw = row[idIndex] ? row[idIndex].trim().toLowerCase() : ''; + const rowNameRaw = row[nameIndex] ? row[nameIndex].trim().toLowerCase() : ''; + const rowGameVerRaw = row[gameVerIndex] ? row[gameVerIndex].trim().toLowerCase() : ''; + + // 1) если у строки есть идентификатор, проверить совпадает ли он с идентификатором мода, + // 2) если у строки нет идентификатора, проверить, включает ли название мода идентификатор мода (как резервный вариант) + // (или проверить, равно ли rowNameRaw normalizedModId, чтобы получить точное совпадение). + const idMatches = rowIdRaw && (rowIdRaw === normalizedModId); + const nameMatches = + (!rowIdRaw && rowNameRaw.includes(normalizedModId)) || + rowNameRaw === normalizedModId; + + if (idMatches || nameMatches) { + possibleMatches.push({ row, rowGameVerRaw }); + } + } + + // Если совпадений нет, вернуть null + if (possibleMatches.length === 0) return null; + + // Попытка найти строку, чья версия игры начинается с заданной версии + // Если не нашлась, просто взять первое совпадение + let bestRowEntry = possibleMatches.find(entry => + entry.rowGameVerRaw && entry.rowGameVerRaw.startsWith(normalizedGameVer) + ); + if (!bestRowEntry) { + bestRowEntry = possibleMatches[0]; + } + + // Сборка возвращаемого объекта из выбранной строки + const bestRow = bestRowEntry.row; + const rowName = bestRow[nameIndex] || modId; + const modrinthUrl = bestRow[modrinthUrlIndex] || ''; + const cfUrl = bestRow[cfUrlIndex] || ''; + const fallbackUrl = bestRow[fallbackUrlIndex] || ''; + const url = modrinthUrl || cfUrl || fallbackUrl; + const popularity = popularityIndex !== -1 && bestRow[popularityIndex] + ? parseInt(bestRow[popularityIndex]) + : 0; + + return { + name: rowName, + url, + popularity, + }; } // Функция для получения информации об изменениях модов