import { GoogleSpreadsheet } from 'google-spreadsheet'; import { persistently } from './persistance.js'; const NLW_ID = '1YxUE2kkvhT2E6AjnkvTf-o8iu_shSLbuFkEFcZOvieA'; const NLW_REGULAR_LEVELS_ID = 0; const NLW_PENDING_LEVELS_ID = 1134134033; const NLW_PLATFORMER_LEVELS_ID = 339121001; const fruityLevels = { 'Zur🅱️': 'Zurb', 'Violently X𝕏': 'Violently X', '🎄 Shock Therapy 🎄': 'Shock Therapy', 'Collect All Pets 🦝': 'Collect All Pets', 'Virtual Stigmata 🌚': 'Virtual Stigmata', ' Dimensional Breaking': 'Dimensional Breaking', 'Graphite Wordle': 'Graphite World', 'Matilda tha Machine': 'Matilda the Machine', 'Missing Benefi s': 'Missing Benefits', 'troll levle': 'troll level', 'gardening map': 'gardening map ', 'Flying Maze': 'Floating Outskirts', 'dickglark 3': 'nevermore', 'SHATTER': 'SHATTER ', }; const fruityCreators = { 'Kapycta9️⃣9️⃣9️⃣': 'Kapycta999', // woo unicode } const brokenColors = { '255,255,255': 'no', '255,255,137': 'significantly harder', '255,105,105': 'impossible', }; async function fetchRegularCells(sheet) { console.log('fetching regular cells'); // for brokenness await persistently(async () => await sheet.loadCells('A:A')); let broken = []; let rowID = 0; while (true) { if (rowID >= sheet.rowCount) break; const cell = sheet.getCell(rowID, 0); if (!cell || cell == null) break; try { 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 broke = brokenColors[colorString]; broken.push(broke || null); rowID++; } catch(err) { break; } } const levels = await persistently(async () => await sheet.getCellsInRange('B:B')); const creators = await persistently(async () => await sheet.getCellsInRange('C:C')); const skillsets = await persistently(async () => await sheet.getCellsInRange('E:E')); const enjoyments = await persistently(async () => await sheet.getCellsInRange('F:F')); const descriptions = await persistently(async () => await sheet.getCellsInRange('G:G')); return { levels, broken, creators, skillsets, enjoyments, descriptions }; } async function fetchPlatformerCells(sheet) { console.log('fetching platformer cells'); const levels = await persistently(async () => await sheet.getCellsInRange('A:A')); const creators = await persistently(async () => await sheet.getCellsInRange('B:B')); const skillsets = await persistently(async () => await sheet.getCellsInRange('D:D')); const enjoyments = await persistently(async () => await sheet.getCellsInRange('E:E')); const descriptions = await persistently(async () => await sheet.getCellsInRange('F:F')); return { levels, broken: Array(levels.length).fill('take a guess'), creators, skillsets, enjoyments, descriptions }; } async function fetchPendingCells(sheet) { console.log('fetching pending cells'); const levels = await persistently(async () => await sheet.getCellsInRange('B:B')); const creators = await persistently(async () => await sheet.getCellsInRange('C:C')); const skillsets = await persistently(async () => await sheet.getCellsInRange('E:E')); const enjoyments = []; const descriptions = await persistently(async () => await sheet.getCellsInRange('F:F')); return { levels, broken: Array(levels.length).fill(null), creators, skillsets, enjoyments, descriptions }; } async function fetchLevels(sheet, platformer, pending) { const { levels, broken, creators, skillsets, enjoyments, descriptions } = await ( pending ? fetchPendingCells(sheet) : (platformer ? fetchPlatformerCells(sheet) : fetchRegularCells(sheet)) ); let levelObjs = []; let lastTier = null; for (let i in levels) { const level = levels[i], creator = creators[i], skillset = skillsets[i], enjoyment = enjoyments[i], description = descriptions[i]; let broke = broken[i]; if (level.length === 0 || level[0] === '') break; if (level[0].startsWith('| ')) { lastTier = level[0].slice(2).replace(' Tier', '').trim(); continue; } if (!lastTier) continue; if (lastTier === 'Super Terrifying') break; const enjoymentStr = enjoyment && enjoyment[0]; const enjoymentParse = parseFloat(enjoymentStr || ""); const name = fruityLevels[level[0]] || level[0] || ""; if (name === 'miss you') broke = 'absolutely destroyed'; if (name === 'None Yet!') continue; const obj = { sheetIndex: parseInt(i), tier: lastTier, name: fruityLevels[level[0]] || level[0] || "", creator: creator ? (fruityCreators[creator[0]] || creator[0] || "") : "", skillset: (skillset && skillset[0] || "").trim(), enjoyment: !isNaN(enjoymentParse) ? enjoymentParse : null, description: (description && description[0] || "").trim(), broken: broke, }; levelObjs.push(obj); } return levelObjs; } let doc; async function loadSpreadsheet() { doc = new GoogleSpreadsheet(NLW_ID, { apiKey: process.env.API_KEY }); await persistently(async () => await doc.loadInfo()); // loads document properties and worksheets console.log('loaded NLW spreadsheet'); } export async function fetchAllLevels() { if (!doc) await loadSpreadsheet(); console.log('fetching NLW levels'); return { regular: await fetchLevels(doc.sheetsById[NLW_REGULAR_LEVELS_ID], false, false), pending: await fetchLevels(doc.sheetsById[NLW_PENDING_LEVELS_ID], false, true), platformer: await fetchLevels(doc.sheetsById[NLW_PLATFORMER_LEVELS_ID], true, false), }; }