diff --git a/README.md b/README.md index d577278..480140f 100644 --- a/README.md +++ b/README.md @@ -12,9 +12,9 @@ Fetches the entire list as a JSON, including levels of type `type`. `type` can b **Returns**: An array of [`NLWLevel`](#nlwlevel--level)s. -#### `/ids` +#### `/ids?type={type}` -Fetches the IDS list as a JSON. **Experimental.** +Fetches the IDS list as a JSON, including levels of type `type`. `type` can be `regular`, `platformer` or `all` and defaults to `regular`. **Experimental.** **Returns**: An array of [`IDSLevel`](#idslevel-level)s. diff --git a/ids.js b/ids.js index d481887..ba21b50 100644 --- a/ids.js +++ b/ids.js @@ -3,6 +3,7 @@ import { persistently } from './persistance.js'; const IDS_ID = '15ehtAIpCR8s04qIb8zij9sTpUdGJbmAE_LDcfVA3tcU'; const IDS_REGULAR_LEVELS_ID = 1309758655; +const IDS_PLATFORMER_LEVELS_ID = 506524049; const fruityLevels = { 'The Place': 'The Place', @@ -38,7 +39,7 @@ const colors = { } async function fetchRegularCells(sheet) { - console.log('fetching cells'); + console.log('fetching regular cells'); // we need this for formatting :) await persistently(async () => await sheet.loadCells('A:B')); @@ -70,8 +71,41 @@ async function fetchRegularCells(sheet) { return { levels, tiers, broken, creators, skillsets, descriptions }; } -async function fetchLevels(sheet) { - const { levels, tiers, broken, creators, skillsets, descriptions } = await fetchRegularCells(sheet); +async function fetchPlatformerCells(sheet) { + console.log('fetching platformer cells'); + // we need this for formatting :) + await persistently(async () => await sheet.loadCells('A:B')); + + let levels = []; + let tiers = []; + let broken = []; + + let rowID = 1; + let previousTier = 'penis tier :33'; + while (true) { + const cell = sheet.getCell(rowID, 0); + if (!cell || cell == null || cell.value == null) break; + const color = cell.backgroundColor || {}; + const colorString = Math.round((color.red || 0) * 255) + ',' + Math.round((color.green || 0) * 255) + ',' + Math.round((color.blue || 0) * 255); + let tier = colors[colorString]; + if (!tier) tier = { tier: previousTier }; + if (rowID > 50 && tier.tier === 'Fuck') tier = { tier: previousTier, broken: 'no' }; + levels.push(cell.value.toString()) + tiers.push(tier.tier); + broken.push(tier.broken || null); + previousTier = tier.tier; + rowID++; + } + + const creators = await persistently(async () => await sheet.getCellsInRange('C2:C')); + const skillsets = await persistently(async () => await sheet.getCellsInRange('E2:E')); + const descriptions = await persistently(async () => await sheet.getCellsInRange('F2:F')); + + return { levels, tiers, broken, creators, skillsets, descriptions }; +} + +async function fetchLevels(sheet, platformer) { + const { levels, tiers, broken, creators, skillsets, descriptions } = await (platformer ? fetchPlatformerCells(sheet) : fetchRegularCells(sheet)); let levelObjs = []; @@ -107,6 +141,7 @@ export async function fetchAllLevels() { console.log('fetching IDS levels'); return { - regular: await fetchLevels(doc.sheetsById[IDS_REGULAR_LEVELS_ID]), + regular: await fetchLevels(doc.sheetsById[IDS_REGULAR_LEVELS_ID], false), + platformer: await fetchLevels(doc.sheetsById[IDS_PLATFORMER_LEVELS_ID], true), }; } \ No newline at end of file diff --git a/index.js b/index.js index 87427c8..62fad2f 100644 --- a/index.js +++ b/index.js @@ -16,12 +16,13 @@ let levels = { }, ids: { regular: [], + platformer: [], }, metadata: [], }; function getAllLevels() { - return [...levels.nlw.regular, ...levels.nlw.platformer, ...levels.nlw.pending, ...levels.ids.regular]; + return [...levels.nlw.regular, ...levels.nlw.platformer, ...levels.nlw.pending, ...levels.ids.regular, ...levels.ids.platformer]; } async function exists(f) { @@ -41,6 +42,7 @@ async function loadCache() { if (await exists(path.join(cacheFolder, 'nlw-pending.json'))) levels.nlw.pending = JSON.parse(await fs.readFile(path.join(cacheFolder, 'nlw-pending.json'), 'utf8')); if (await exists(path.join(cacheFolder, 'nlw-platformer.json'))) levels.nlw.platformer = JSON.parse(await fs.readFile(path.join(cacheFolder, 'nlw-platformer.json'), 'utf8')); if (await exists(path.join(cacheFolder, 'ids-regular.json'))) levels.ids.regular = JSON.parse(await fs.readFile(path.join(cacheFolder, 'ids-regular.json'), 'utf8')); + if (await exists(path.join(cacheFolder, 'ids-platformer.json'))) levels.ids.regular = JSON.parse(await fs.readFile(path.join(cacheFolder, 'ids-platformer.json'), 'utf8')); if (await exists(path.join(cacheFolder, 'metadata.json'))) levels.metadata = JSON.parse(await fs.readFile(path.join(cacheFolder, 'metadata.json'), 'utf8')); } @@ -49,6 +51,7 @@ async function saveCache() { await fs.writeFile(path.join(cacheFolder, 'nlw-pending.json'), JSON.stringify(levels.nlw.pending)); await fs.writeFile(path.join(cacheFolder, 'nlw-platformer.json'), JSON.stringify(levels.nlw.platformer)); await fs.writeFile(path.join(cacheFolder, 'ids-regular.json'), JSON.stringify(levels.ids.regular)); + await fs.writeFile(path.join(cacheFolder, 'ids-platformer.json'), JSON.stringify(levels.ids.platformer)); await fs.writeFile(path.join(cacheFolder, 'metadata.json'), JSON.stringify(levels.metadata)); } @@ -223,7 +226,21 @@ app.get('/list', (req, res) => { }); app.get('/ids', (req, res) => { - res.json(levels.ids.regular); + let list; + if (!type || type === '' || type === 'regular') { + list = levels.ids.regular; + } else if (type === 'platformer') { + list = levels.ids.regular; + } else if (type === 'all') { + list = [ + ...levels.ids.regular.map(l => ({ type: 'regular', ...l })), + ...levels.ids.platformer.map(l => ({ type: 'platformer', ...l })), + ]; + } else { + return res.status(400); + } + + res.json(list.map(l => ({ ...(getMetadata(l) || {}), ...l }))); }); const port = process.env.PORT || 8080