UNPKG

what-to-play

Version:

Score aggregator for lists of games

89 lines 3.08 kB
"use strict"; 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