overwatch-api
Version:
An Unoffical Overwatch API.
159 lines (131 loc) • 5.29 kB
JavaScript
;
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);
});
}