UNPKG

overwatch-api

Version:

An Unoffical Overwatch API.

159 lines (131 loc) 5.29 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = _default; var _async = _interopRequireDefault(require("async")); var _cheerio = _interopRequireDefault(require("cheerio")); var _utils = require("./utils"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } var MAX_RETRIES = 3; // Get HTML from playoverwatch career page. function getHTML(platform, region, tag, callback) { var url = "https://overwatch.blizzard.com/en-us/career/".concat(tag, "/"); var ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:112.0) Gecko/20100101 Firefox/112.0'; var options = { uri: encodeURI(url), headers: { 'User-Agent': ua }, encoding: 'utf8' }; return (0, _utils.retryRequest)(options, MAX_RETRIES, callback); } // Begin html parsing. function parseHTML(results, callback) { var $ = _cheerio["default"].load(results.getHTML); // Check if profile exists. var isFound = $('.heading').text() !== 'Page Not Found'; if (!isFound) { return callback(new Error('Profile not found')); } var parsed = { user: $('.Profile-player--name').text(), portrait: $('.Profile-player--portrait').attr('src'), title: $('.Profile-player---title').text(), permission: $('.Profile-private---msg').text(), endorsementImage: $('.Profile-playerSummary--endorsement').attr('src'), quickplayWonEl: $('.stats.quickPlay-view p:contains("Games Won")').next().html(), quickplayPlayedEl: $('.stats.quickPlay-view p:contains("Games Played")').next().html(), quickplayTimePlayedEl: $('.stats.quickPlay-view p:contains("Time Played")').next().html(), compWonEl: $('.stats.competitive-view p:contains("Games Won")').next().html(), compPlayedEl: $('.stats.competitive-view p:contains("Games Played")').next().html(), compLostEl: $('.stats.competitive-view p:contains("Games Lost")').next().html(), compDrawEl: $('.stats.competitive-view p:contains("Games Tied")').next().html(), compTimePlayedEl: $('.stats.competitive-view p:contains("Time Played")').next().html(), compRankEls: $('.Profile-playerSummary--rankWrapper').find('.Profile-playerSummary--roleWrapper') }; if (parsed.compRankEls) { var r = {}; parsed.compRankEls.each(function (i, elem) { var rankImgSrc = $(elem).find('img.Profile-playerSummary--rank').attr('src'); var roleImgSrc = $(elem).find('.Profile-playerSummary--role img').attr('src'); var rankParsed = rankImgSrc.split('/').pop().split('#')[0].split('-'); var role = roleImgSrc.split('/').pop().split('#')[0].split('-')[0]; var rank = "".concat(rankParsed[0].replace('Tier', ''), " ").concat(rankParsed[1]); var obj = { rank: rank, icon: rankImgSrc }; r[role] = obj; }); parsed.ranks = r; } return callback(null, parsed); } // Transform the data into a json object we can serve. function transform(results, callback) { var parsed = results.parseHTML; var won = {}; var lost = {}; var draw = {}; var played = {}; var time = {}; if (parsed.quickplayWonEl !== null) { won.quickplay = parsed.quickplayWonEl.trim().replace(/,/g, ''); } if (parsed.quickplayPlayedEl !== null) { played.quickplay = parsed.quickplayPlayedEl.trim().replace(/,/g, ''); } if (parsed.quickplayTimePlayedEl !== null) { time.quickplay = parsed.quickplayTimePlayedEl.trim().replace(/,/g, ''); } if (parsed.compWonEl !== null) { won.competitive = parsed.compWonEl.trim().replace(/,/g, ''); } if (parsed.compLostEl !== null) { lost.competitive = parsed.compLostEl.trim().replace(/,/g, ''); } if (parsed.compDrawEl !== null) { draw.competitive = parsed.compDrawEl.trim().replace(/,/g, ''); } if (parsed.compPlayedEl !== null) { played.competitive = parsed.compPlayedEl.trim().replace(/,/g, ''); } if (parsed.compTimePlayedEl !== null) { time.competitive = parsed.compTimePlayedEl.trim().replace(/,/g, ''); } var json = { username: parsed.user, portrait: parsed.portrait, endorsement: parsed.endorsementImage, "private": parsed.permission === 'THIS PROFILE IS CURRENTLY PRIVATE', games: { quickplay: { won: parseInt(won.quickplay), played: parseInt(played.quickplay) || undefined }, competitive: { won: parseInt(won.competitive), lost: parseInt(lost.competitive), draw: parseInt(draw.competitive) || 0, played: parseInt(played.competitive), win_rate: parseFloat((parseInt(won.competitive) / parseInt(played.competitive - parseInt(draw.competitive)) * 100).toFixed(2)) } }, playtime: { quickplay: time.quickplay, competitive: time.competitive }, competitive: parsed.ranks }; return callback(null, json); } function _default(platform, region, tag, callback) { _async["default"].auto({ getHTML: _async["default"].apply(getHTML, platform, region, tag), parseHTML: ['getHTML', _async["default"].apply(parseHTML)], transform: ['getHTML', 'parseHTML', _async["default"].apply(transform)] }, function (err, results) { if (err) { return callback(err); } return callback(null, results.transform); }); }