nlw-api/nlw.js

162 lines
5.3 KiB
JavaScript
Raw 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';
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 Maze',
};
const brokenColors = {
'0,0,0': 'no',
'67,67,67': 'slightly',
'102,102,102': 'very',
'74,134,232': 'no',
'60,120,216': 'slightly',
'17,85,204': 'very',
'0,255,255': 'no',
'69,129,142': 'slightly',
'19,79,92': 'very',
'0,255,0': 'no',
'106,168,79': 'slightly',
'56,118,29': 'very',
'255,255,0': 'no',
'241,194,50': 'slightly',
'191,144,0': 'very',
'255,153,0': 'no',
'230,145,56': 'slightly',
'180,95,6': 'very',
'255,0,0': 'no',
'204,0,0': 'slightly',
'153,0,0': 'very',
'255,0,255': 'no',
'166,77,121': 'slightly',
'116,27,71': 'very',
'153,0,255': 'no',
'103,78,167': 'slightly',
'53,28,117': 'very',
'176,135,235': 'no',
'164,92,246': 'slightly',
'101,78,135': 'very',
'204,204,204': 'no',
'183,183,183': 'slightly',
'153,153,153': 'very',
};
async function fetchRegularCells(sheet) {
console.log('fetching regular cells');
// for brokenness
await sheet.loadCells('A:A');
let broken = [];
let rowID = 0;
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 broke = brokenColors[colorString];
broken.push(broke || null);
rowID++;
}
const levels = await sheet.getCellsInRange('A:A');
const creators = await sheet.getCellsInRange('B:B');
const skillsets = await sheet.getCellsInRange('D:D');
const enjoyments = await sheet.getCellsInRange('E:E');
const descriptions = await sheet.getCellsInRange('F:F');
return { levels, broken, creators, skillsets, enjoyments, descriptions };
}
async function fetchPlatformerCells(sheet) {
console.log('fetching platformer cells');
const levels = await sheet.getCellsInRange('A:A');
const creators = await sheet.getCellsInRange('B:B');
const skillsets = await sheet.getCellsInRange('D:D');
const enjoyments = await sheet.getCellsInRange('E:E');
const descriptions = 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 sheet.getCellsInRange('B:B');
const creators = await sheet.getCellsInRange('C:C');
const skillsets = await sheet.getCellsInRange('E:E');
const enjoyments = [];
const descriptions = 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 && creator[0] || "").trim(),
skillset: (skillset && skillset[0] || "").trim(),
enjoyment: !isNaN(enjoymentParse) ? enjoymentParse : null,
description: (description && description[0] || "").trim(),
broken: broke,
};
levelObjs.push(obj);
}
return levelObjs;
}
const doc = new GoogleSpreadsheet(NLW_ID, { apiKey: process.env.API_KEY });
await doc.loadInfo(); // loads document properties and worksheets
console.log('loaded NLW spreadsheet');
export async function fetchAllLevels() {
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),
};
}