UNPKG

what-to-play

Version:

Score aggregator for lists of games

165 lines 8.11 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getJson = exports.getData = exports.getCsv = exports.aggregateScore = exports.csvHeaderRow = exports.csvHeaders = void 0; const gog = require("./gog"); const hltb = require("./howlongtobeat"); const metacritic = require("./metacritic"); const steam = require("./steam"); const spreadsheet_1 = require("./spreadsheet"); const util_1 = require("./util"); exports.csvHeaders = [ "Game", "Aggregate Score", "Metacritic Name", "Metacritic Critic Score", "Metacritic User Score", "Metacritic Release Date", "Steam Name", "Steam All Time % Positive", "Steam Recent % Positive", "Steam Release Date", "GOG Name", "GOG Score", "How Long to Beat Name", "How Long to Beat: Main Story", "How Long to Beat: Main Story + Extra", "How Long to Beat: Completionist", ]; exports.csvHeaderRow = exports.csvHeaders.join(","); function aggregateScore(gogData, metacriticData, steamResult) { let scores = []; const gog_score = gogData === null || gogData === void 0 ? void 0 : gogData.score; const metacritic_metascore = metacriticData === null || metacriticData === void 0 ? void 0 : metacriticData.metascore; const metacritic_userscore = metacriticData === null || metacriticData === void 0 ? void 0 : metacriticData.userscore; const steam_allTimeScore = steamResult === null || steamResult === void 0 ? void 0 : steamResult.allTimeScore; const steam_recentScore = steamResult === null || steamResult === void 0 ? void 0 : steamResult.recentScore; // make all scores out of 100 if (gog_score !== undefined) { scores.push(gog_score * 20); } if (metacritic_metascore !== undefined) { scores.push(metacritic_metascore); } if (metacritic_userscore !== undefined) { scores.push(metacritic_userscore * 10); } if (steam_allTimeScore !== undefined) { scores.push(steam_allTimeScore); } if (steam_recentScore !== undefined) { scores.push(steam_recentScore); } if (scores.length === 0) { return undefined; } return parseFloat((0, util_1.average)(scores).toFixed(1)); } exports.aggregateScore = aggregateScore; const aggregateScoreFormula = (function () { // get cell references const gog_score = exports.csvHeaders.indexOf("GOG Score") + 1; const metacritic_metascore = exports.csvHeaders.indexOf("Metacritic Critic Score") + 1; const metacritic_userscore = exports.csvHeaders.indexOf("Metacritic User Score") + 1; const steam_allTimeScore = exports.csvHeaders.indexOf("Steam All Time % Positive") + 1; const steam_recentScore = exports.csvHeaders.indexOf("Steam Recent % Positive") + 1; const gog_score_cell = (0, spreadsheet_1.getCellInCol)(gog_score); const metacritic_metascore_cell = (0, spreadsheet_1.getCellInCol)(metacritic_metascore); const metacritic_userscore_cell = (0, spreadsheet_1.getCellInCol)(metacritic_userscore); const steam_allTimeScore_cell = (0, spreadsheet_1.getCellInCol)(steam_allTimeScore); const steam_recentScore_cell = (0, spreadsheet_1.getCellInCol)(steam_recentScore); const cells = [ gog_score_cell, metacritic_metascore_cell, metacritic_userscore_cell, steam_allTimeScore_cell, steam_recentScore_cell, ]; // normalise the scores to be out of 100 const scoreExpressions = [ `(${gog_score_cell} * 20)`, `(${metacritic_metascore_cell})`, `(${metacritic_userscore_cell} * 10)`, `(${steam_allTimeScore_cell})`, `(${steam_recentScore_cell})`, ]; // average the scores, ensure blank cells don't contribute to the average const average = `(${scoreExpressions.join(" + ")}) / ${(0, spreadsheet_1.count)(cells)}`; return `=IFERROR(${average}, "")`; })(); /** * @param game Game to get data for * @param platforms An array of platforms to consider Metacritic reviews for * @param country 2-character country code defined by "ISO 3166-1 alpha-2", used by Steam */ async function getCsv(game, platforms, country) { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k; const buffer = []; const data = await getData(game, platforms, country); const newData = { "Game": data.game, "Aggregate Score": aggregateScoreFormula, "Metacritic Name": (0, util_1.bindUndefined)(data.metacritic, m => (0, spreadsheet_1.toHyperlink)(m.url, m.name)), "Metacritic Critic Score": ((_a = data.metacritic) === null || _a === void 0 ? void 0 : _a.metascore) ? (0, spreadsheet_1.toHyperlink)(data.metacritic.metascoreUrl, data.metacritic.metascore) : "", "Metacritic User Score": ((_b = data.metacritic) === null || _b === void 0 ? void 0 : _b.userscore) ? (0, spreadsheet_1.toHyperlink)(data.metacritic.userscoreUrl, data.metacritic.userscore) : "", "Metacritic Release Date": (_c = data.metacritic) === null || _c === void 0 ? void 0 : _c.releaseDate, "Steam Name": (0, util_1.bindUndefined)(data.steam, s => (0, spreadsheet_1.toHyperlink)(s.url, s.name)), "Steam All Time % Positive": (_d = data.steam) === null || _d === void 0 ? void 0 : _d.allTimeScore, "Steam Recent % Positive": (_e = data.steam) === null || _e === void 0 ? void 0 : _e.recentScore, "Steam Release Date": (_f = data.steam) === null || _f === void 0 ? void 0 : _f.releaseDate, "GOG Name": (0, util_1.bindUndefined)(data.gog, g => (0, spreadsheet_1.toHyperlink)(g.url, g.name)), "GOG Score": (_g = data.gog) === null || _g === void 0 ? void 0 : _g.score, "How Long to Beat Name": (0, util_1.bindUndefined)(data.hltb, h => (0, spreadsheet_1.toHyperlink)(h.url, h.name)), "How Long to Beat: Main Story": (_h = data.hltb) === null || _h === void 0 ? void 0 : _h.times.mainStory, "How Long to Beat: Main Story + Extra": (_j = data.hltb) === null || _j === void 0 ? void 0 : _j.times.mainPlusExtra, "How Long to Beat: Completionist": (_k = data.hltb) === null || _k === void 0 ? void 0 : _k.times.completionist, }; // iterate through in the same order every time guaranteed for (const key of exports.csvHeaders) { buffer.push((0, util_1.csvFriendly)((0, util_1.printable)(newData[key]))); } return buffer.join(","); } exports.getCsv = getCsv; /** * @param game Game to get data for * @param platforms An array of platforms to consider Metacritic reviews for * @param country 2-character country code defined by "ISO 3166-1 alpha-2", used by Steam */ async function getData(game, platforms, country) { const handleError = (err, website) => { console.error(`Error: code failure, when getting "${game}" from ${website}`); console.error(err); return undefined; }; const gogDataProm = gog.getData(game).catch(err => handleError(err, "GOG")); const metacriticDataProm = metacritic.getData(game, platforms).catch(err => handleError(err, "Metacritic")); const steamDataProm = steam.getData(game, country).catch(err => handleError(err, "Steam")); const hltbDataProm = hltb.getData(game).catch(err => handleError(err, "How Long to Beat")); // spawn all promises before blocking on their results const gogData = await gogDataProm; const metacriticData = await metacriticDataProm; const steamData = await steamDataProm; return { game, aggregateScore: aggregateScore(gogData, metacriticData, steamData), gog: gogData, metacritic: metacriticData, steam: steamData, hltb: await hltbDataProm, }; } exports.getData = getData; /** * @param game Game to get data for * @param platforms An array of platforms to consider Metacritic reviews for * @param country 2-character country code defined by "ISO 3166-1 alpha-2", used by Steam */ async function getJson(game, platforms, country) { return JSON.stringify(await getData(game, platforms, country)); } exports.getJson = getJson; //# sourceMappingURL=output.js.map