what-to-play
Version:
Score aggregator for lists of games
89 lines • 3.08 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.getData = void 0;
const cheerio = require("cheerio");
const node_fetch_1 = require("node-fetch");
const querystring = require("querystring");
const search_1 = require("./search");
const util_1 = require("./util");
/**
* @param country 2-character country code defined by "ISO 3166-1 alpha-2"
*/
async function getData(game, country) {
const productData = await searchGame(game, country);
if (productData === undefined)
return undefined;
const { name, url } = productData;
// get scores from product page
const storePage = cheerio.load(await getSteamPage(url));
const reviewInfos = storePage(".user_reviews_summary_row");
let recentScore;
let allTimeScore;
// no review data e.g. unreleased game
if (reviewInfos.length === 0) {
recentScore = undefined;
allTimeScore = undefined;
}
// game is recently released
else if (reviewInfos.length === 1) {
recentScore = reviewRowToPercent(reviewInfos.get(0));
allTimeScore = recentScore;
}
else {
recentScore = reviewRowToPercent(reviewInfos.get(0));
allTimeScore = reviewRowToPercent(reviewInfos.get(1));
}
const releaseDate = storePage(storePage(".release_date .date").get(0)).text();
return {
name,
recentScore,
allTimeScore,
url,
releaseDate,
};
}
exports.getData = getData;
async function getSteamPage(url) {
const res = await (0, node_fetch_1.default)(url, {
headers: {
"Cookie": "birthtime=281318401" // bypass age restriction
}
});
return await res.text();
}
function reviewRowToPercent(r) {
if (!r.attribs || !r.attribs["data-tooltip-html"]) {
// some steam store pages have no reviews
return undefined;
}
const row = r;
const recentReviewText = row.attribs["data-tooltip-html"];
// the percent is at the start and consists of up to 3 characters followed by a % sign
const recentReviewPercentStr = recentReviewText
.substr(0, 3)
.replace(/[^0-9]/g, "");
return (0, util_1.nonNaN)(parseInt(recentReviewPercentStr), undefined);
}
async function searchGame(game, country) {
const gameStr = querystring.escape(game);
const searchUrl = `https://store.steampowered.com/search/suggest?f=games&cc=${country}&term=${gameStr}`;
const searchDropdownHTML = await getSteamPage(searchUrl);
const searchDom = cheerio.load(searchDropdownHTML);
const searchResults = searchDom(".match")
.toArray()
.map(searchDom);
const bestResult = (0, search_1.closestSearchResult)(game, searchResults, product => product.find(".match_name").text());
if (!bestResult)
return undefined;
const name = bestResult.find(".match_name").text();
const url = bestResult.attr("href");
if (!name)
(0, util_1.bug)();
if (!url)
(0, util_1.bug)();
return {
name,
url,
};
}
//# sourceMappingURL=steam.js.map