import { GoogleSpreadsheet } from 'google-spreadsheet'; 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', '\'10': '10', '(m)ORBJECT': 'ORBJECT', 'Dark matter (Real)': 'Dark matter', 'Versus... MR. BEAST!!!': 'Vers', // ??? 'El Dorado': 'El Dorado ', // ???? 'Photovoltaic ': 'Photovoltaic', 'Disconnect ': 'Disconnect', }; // horrid. thank you ids const colors = { '0,0,0': { tier: 'Fuck', broken: 'no' }, '74,134,232': { tier: 'Beginner', broken: 'no' }, '28,69,135': { tier: 'Beginner', broken: 'yes' }, '7,55,99': { tier: 'Beginner', broken: 'yes' }, // ???????? '0,255,255': { tier: 'Easy', broken: 'no' }, '0,171,171': { tier: 'Easy', broken: 'yes' }, '0,255,0': { tier: 'Medium', broken: 'no' }, '0,154,0': { tier: 'Medium', broken: 'yes' }, '255,255,0': { tier: 'Hard', broken: 'no' }, '191,144,0': { tier: 'Hard', broken: 'yes' }, // there's also a few 0,0,0s in very hard because i guess the IDS sheet editor like causing pain onto people like me '255,153,0': { tier: 'Very Hard', broken: 'no' }, '180,95,6': { tier: 'Very Hard', broken: 'yes' }, '255,0,0': { tier: 'Insane', broken: 'no' }, '153,0,0': { tier: 'Insane', broken: 'yes' }, '255,0,255': { tier: 'Extreme', broken: 'no' }, '161,0,161': { tier: 'Extreme', broken: 'yes' }, '153,0,255': { tier: 'Extreme', broken: 'no' }, // ???? } async function fetchRegularCells(sheet) { console.log('fetching regular 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) { if (rowID >= sheet.rowCount) break; 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 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 = []; for (let i in levels) { const level = levels[i], tier = tiers[i], broke = broken[i], creator = creators[i], skillset = skillsets[i], description = descriptions[i]; const obj = { sheetIndex: parseInt(i) + 1, tier: tier, name: fruityLevels[level] || level || "", creator: (creator && creator[0] || "").trim(), skillset: (skillset && skillset[0] || "").trim(), description: (description && description[0] || "").trim(), broken: broke, }; levelObjs.push(obj); } return levelObjs; } let doc; export async function loadSpreadsheet() { doc = new GoogleSpreadsheet(IDS_ID, { apiKey: process.env.API_KEY }); await persistently(async () => await doc.loadInfo()); // loads document properties and worksheets console.log('loaded IDS spreadsheet'); } export async function fetchAllLevels() { if (!doc) await loadSpreadsheet(); console.log('fetching IDS levels'); return { regular: await fetchLevels(doc.sheetsById[IDS_REGULAR_LEVELS_ID], false), platformer: await fetchLevels(doc.sheetsById[IDS_PLATFORMER_LEVELS_ID], true), }; }