2024-02-05 17:27:25 +01:00
|
|
|
|
import { GoogleSpreadsheet } from 'google-spreadsheet';
|
2024-02-29 11:39:58 +01:00
|
|
|
|
import { persistently } from './persistance.js';
|
2024-02-05 17:27:25 +01:00
|
|
|
|
|
|
|
|
|
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 ',
|
2024-02-17 12:06:33 +01:00
|
|
|
|
'Flying Maze': 'Floating Outskirts',
|
2024-02-22 22:06:39 +01:00
|
|
|
|
'dickglark 3': 'nevermore',
|
2024-02-22 23:02:30 +01:00
|
|
|
|
'SHATTER': 'SHATTER ',
|
2024-02-05 17:27:25 +01:00
|
|
|
|
};
|
|
|
|
|
|
2024-02-22 23:02:30 +01:00
|
|
|
|
const fruityCreators = {
|
|
|
|
|
'Kapycta9️⃣9️⃣9️⃣': 'Kapycta999', // woo unicode
|
|
|
|
|
}
|
|
|
|
|
|
2024-02-05 19:26:05 +01:00
|
|
|
|
const brokenColors = {
|
2024-02-26 18:32:44 +01:00
|
|
|
|
'255,255,255': 'no',
|
|
|
|
|
'255,255,137': 'significantly harder',
|
|
|
|
|
'255,105,105': 'impossible',
|
2024-02-05 19:26:05 +01:00
|
|
|
|
};
|
|
|
|
|
|
2024-02-05 17:27:25 +01:00
|
|
|
|
async function fetchRegularCells(sheet) {
|
|
|
|
|
console.log('fetching regular cells');
|
2024-02-05 19:26:05 +01:00
|
|
|
|
|
|
|
|
|
// for brokenness
|
2024-02-29 11:39:58 +01:00
|
|
|
|
await persistently(async () => await sheet.loadCells('A:A'));
|
2024-02-05 19:26:05 +01:00
|
|
|
|
|
|
|
|
|
let broken = [];
|
|
|
|
|
|
|
|
|
|
let rowID = 0;
|
|
|
|
|
while (true) {
|
2024-04-19 18:44:57 +02:00
|
|
|
|
if (rowID >= sheet.rowCount) break;
|
2024-02-05 19:26:05 +01:00
|
|
|
|
const cell = sheet.getCell(rowID, 0);
|
2024-02-26 18:32:44 +01:00
|
|
|
|
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;
|
|
|
|
|
}
|
2024-02-05 19:26:05 +01:00
|
|
|
|
}
|
|
|
|
|
|
2024-02-29 11:39:58 +01:00
|
|
|
|
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'));
|
2024-02-05 19:26:05 +01:00
|
|
|
|
return { levels, broken, creators, skillsets, enjoyments, descriptions };
|
2024-02-05 17:27:25 +01:00
|
|
|
|
}
|
|
|
|
|
async function fetchPlatformerCells(sheet) {
|
|
|
|
|
console.log('fetching platformer cells');
|
2024-02-29 11:39:58 +01:00
|
|
|
|
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'));
|
2024-02-05 19:26:05 +01:00
|
|
|
|
return { levels, broken: Array(levels.length).fill('take a guess'), creators, skillsets, enjoyments, descriptions };
|
2024-02-05 17:27:25 +01:00
|
|
|
|
}
|
|
|
|
|
async function fetchPendingCells(sheet) {
|
|
|
|
|
console.log('fetching pending cells');
|
2024-02-29 11:39:58 +01:00
|
|
|
|
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'));
|
2024-02-05 17:27:25 +01:00
|
|
|
|
const enjoyments = [];
|
2024-02-29 11:39:58 +01:00
|
|
|
|
const descriptions = await persistently(async () => await sheet.getCellsInRange('F:F'));
|
2024-02-05 19:26:05 +01:00
|
|
|
|
return { levels, broken: Array(levels.length).fill(null), creators, skillsets, enjoyments, descriptions };
|
2024-02-05 17:27:25 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async function fetchLevels(sheet, platformer, pending) {
|
2024-02-05 19:26:05 +01:00
|
|
|
|
const { levels, broken, creators, skillsets, enjoyments, descriptions } = await (
|
2024-02-05 17:27:25 +01:00
|
|
|
|
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];
|
2024-02-05 19:26:05 +01:00
|
|
|
|
let broke = broken[i];
|
2024-02-05 17:27:25 +01:00
|
|
|
|
|
|
|
|
|
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 || "");
|
|
|
|
|
|
2024-02-05 19:26:05 +01:00
|
|
|
|
const name = fruityLevels[level[0]] || level[0] || "";
|
|
|
|
|
if (name === 'miss you') broke = 'absolutely destroyed';
|
2024-02-16 14:15:51 +01:00
|
|
|
|
if (name === 'None Yet!') continue;
|
2024-02-05 19:26:05 +01:00
|
|
|
|
|
2024-02-05 17:27:25 +01:00
|
|
|
|
const obj = {
|
|
|
|
|
sheetIndex: parseInt(i),
|
|
|
|
|
tier: lastTier,
|
|
|
|
|
name: fruityLevels[level[0]] || level[0] || "",
|
2024-02-22 23:02:30 +01:00
|
|
|
|
creator: creator ? (fruityCreators[creator[0]] || creator[0] || "") : "",
|
2024-02-05 18:33:52 +01:00
|
|
|
|
skillset: (skillset && skillset[0] || "").trim(),
|
2024-02-05 17:27:25 +01:00
|
|
|
|
enjoyment: !isNaN(enjoymentParse) ? enjoymentParse : null,
|
2024-02-05 18:33:52 +01:00
|
|
|
|
description: (description && description[0] || "").trim(),
|
2024-02-05 19:26:05 +01:00
|
|
|
|
broken: broke,
|
2024-02-05 17:27:25 +01:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
levelObjs.push(obj);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return levelObjs;
|
|
|
|
|
}
|
|
|
|
|
|
2024-02-29 10:55:33 +01:00
|
|
|
|
let doc;
|
|
|
|
|
|
|
|
|
|
async function loadSpreadsheet() {
|
|
|
|
|
doc = new GoogleSpreadsheet(NLW_ID, { apiKey: process.env.API_KEY });
|
2024-02-29 11:39:58 +01:00
|
|
|
|
await persistently(async () => await doc.loadInfo()); // loads document properties and worksheets
|
2024-02-29 10:55:33 +01:00
|
|
|
|
console.log('loaded NLW spreadsheet');
|
|
|
|
|
}
|
2024-02-05 18:33:52 +01:00
|
|
|
|
|
2024-02-05 17:27:25 +01:00
|
|
|
|
export async function fetchAllLevels() {
|
2024-02-29 10:55:33 +01:00
|
|
|
|
if (!doc) await loadSpreadsheet();
|
|
|
|
|
|
2024-02-05 17:27:25 +01:00
|
|
|
|
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),
|
|
|
|
|
};
|
|
|
|
|
}
|