what-to-play
Version:
Score aggregator for lists of games
165 lines • 8.11 kB
JavaScript
;
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