nlw-api/nlw.js

149 lines
5.5 KiB
JavaScript
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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),
};
}