overwatch-api-server
Version:
An Unoffical Overwatch HTTP API
1 lines • 17.7 kB
Source Map (JSON)
{"version":3,"sources":["profile.js"],"names":["getHTML","platform","region","tag","callback","url","options","uri","encodeURI","encoding","err","res","body","parseHTML","results","$","cheerio","load","isFound","text","Error","parsed","user","level","first","portrait","attr","permission","endorsementLevel","last","endorsementFrameEl","sportsmanshipValue","data","shotcallerValue","teammateValue","quickplayWonEl","next","html","quickplayPlayedEl","quickplayTimePlayedEl","compWonEl","compPlayedEl","compLostEl","compDrawEl","compTimePlayedEl","compRankEl","levelFrameEl","starEl","rankEl","compRankImgTank","compRankImgDamage","compRankImgSupport","compRankElTank","compRankElDamage","compRankElSupport","levelFrame","slice","replace","endorsementFrame","star","rank","transform","endorsement","sportsmanship","value","rate","parseFloat","toFixed","shotcaller","teammate","parseInt","frame","icon","won","lost","draw","played","time","quickplay","trim","competitive","starsMatch","path","basename","split","rankMatch","stars","prestige","json","username","games","undefined","win_rate","playtime","tank","rank_img","damage","support","async","auto","apply"],"mappings":"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","sourceRoot":"C:\\Users\\Alf\\Source\\overwatch-api\\api\\src\\parser\\","sourcesContent":["import path from 'path';\nimport async from 'async';\nimport cheerio from 'cheerio';\nimport request from 'request';\nimport { getPrestigeLevel, getPrestigeStars } from './utils';\nimport { createEndorsementSVG } from './svg';\n\n\n// Get HTML from playoverwatch career page.\nfunction getHTML(platform, region, tag, callback) {\n const url = platform === 'pc'\n ? `https://playoverwatch.com/en-us/career/${platform}/${region}/${tag}`\n : `https://playoverwatch.com/en-us/career/${platform}/${tag}`;\n\n const options = {\n uri: encodeURI(url),\n encoding: 'utf8'\n }\n\n return request(options, (err, res, body) => {\n return callback(err, body);\n });\n}\n\n// Begin html parsing.\nfunction parseHTML(results, callback) {\n const $ = cheerio.load(results.getHTML);\n\n // Check if profile exists.\n const isFound = $('.content-box h1').text() !== 'Profile Not Found';\n if (!isFound) {\n return callback(new Error('Profile not found'));\n }\n\n const parsed = {\n user: $('.header-masthead').text(),\n level: $('.player-level div').first().text(),\n portrait: $('.player-portrait').attr('src'),\n permission: $('.masthead-permission-level-text').text(),\n endorsementLevel: $('.masthead .endorsement-level div').last().text(),\n endorsementFrameEl: $('.masthead .EndorsementIcon').attr('style'),\n sportsmanshipValue: $('.masthead .EndorsementIcon-border--sportsmanship').data('value'),\n shotcallerValue: $('.masthead .EndorsementIcon-border--shotcaller').data('value'),\n teammateValue: $('.masthead .EndorsementIcon-border--teammate').data('value'),\n quickplayWonEl: $('#quickplay td:contains(\"Games Won\")').next().html(),\n quickplayPlayedEl: $('#quickplay td:contains(\"Games Played\")').next().html(),\n quickplayTimePlayedEl: $('#quickplay td:contains(\"Time Played\")').next().html(),\n compWonEl: $('#competitive td:contains(\"Games Won\")').next().html(),\n compPlayedEl: $('#competitive td:contains(\"Games Played\")').next().html(),\n compLostEl: $('#competitive td:contains(\"Games Lost\")').next().html(),\n compDrawEl: $('#competitive td:contains(\"Games Tied\")').next().html(),\n compTimePlayedEl: $('#competitive td:contains(\"Time Played\")').next().html(),\n compRankEl: $('.competitive-rank'),\n levelFrameEl: $('.player-level').attr('style'),\n starEl: $('.player-rank').attr('style'),\n rankEl: $('.player-level').attr('style'),\n }\n\n if (parsed.compRankEl !== null) {\n parsed.compRankImgTank = $('.competitive-rank div[data-ow-tooltip-text=\"Tank Skill Rating\"] img').attr('src') || null;\n parsed.compRankImgDamage = $('.competitive-rank div[data-ow-tooltip-text=\"Damage Skill Rating\"] img').attr('src') || null;\n parsed.compRankImgSupport = $('.competitive-rank div[data-ow-tooltip-text=\"Support Skill Rating\"] img').attr('src') || null;\n parsed.compRankElTank = $('.competitive-rank div[data-ow-tooltip-text=\"Tank Skill Rating\"]').next().html();\n parsed.compRankElDamage = $('.competitive-rank div[data-ow-tooltip-text=\"Damage Skill Rating\"]').next().html();\n parsed.compRankElSupport = $('.competitive-rank div[data-ow-tooltip-text=\"Support Skill Rating\"]').next().html();\n }\n\n if (parsed.levelFrameEl) {\n parsed.levelFrame = parsed.levelFrameEl.slice(21, -1).replace(/ /g, '');\n }\n\n if (parsed.endorsementFrameEl) {\n parsed.endorsementFrame = parsed.endorsementFrameEl.slice(21, -1).replace(/ /g, '');\n }\n\n if (parsed.starEl) {\n parsed.star = parsed.starEl.slice(21, -1).replace(/ /g, '');\n }\n\n if (parsed.rankEl) {\n parsed.rank = parsed.rankEl.slice(21, -1).replace(/ /g, '');\n }\n return callback(null, parsed);\n}\n\n// Transform the data into a json object we can serve.\nfunction transform(results, callback) {\n const { parseHTML: parsed } = results;\n\n const endorsement = {\n sportsmanship: { value: parsed.sportsmanshipValue, rate: parseFloat((parsed.sportsmanshipValue * 100).toFixed(2)) },\n shotcaller: { value: parsed.shotcallerValue, rate: parseFloat((parsed.shotcallerValue * 100).toFixed(2)) },\n teammate: { value: parsed.teammateValue, rate: parseFloat((parsed.teammateValue * 100).toFixed(2)) },\n level: parseInt(parsed.endorsementLevel),\n frame: parsed.endorsementFrame || null,\n };\n endorsement.icon = createEndorsementSVG(endorsement);\n\n const won = {};\n const lost = {};\n const draw = {};\n const played = {};\n const time = {};\n\n if (parsed.quickplayWonEl !== null) {\n won.quickplay = parsed.quickplayWonEl.trim().replace(/,/g, '');\n }\n\n if (parsed.quickplayPlayedEl !== null) {\n played.quickplay = parsed.quickplayPlayedEl.trim().replace(/,/g, '');\n }\n\n if (parsed.quickplayTimePlayedEl !== null) {\n time.quickplay = parsed.quickplayTimePlayedEl.trim().replace(/,/g, '');\n }\n\n if (parsed.compWonEl !== null) {\n won.competitive = parsed.compWonEl.trim().replace(/,/g, '');\n }\n\n if (parsed.compLostEl !== null) {\n lost.competitive = parsed.compLostEl.trim().replace(/,/g, '');\n }\n\n if (parsed.compDrawEl !== null) {\n draw.competitive = parsed.compDrawEl.trim().replace(/,/g, '');\n }\n\n if (parsed.compPlayedEl !== null) {\n played.competitive = parsed.compPlayedEl.trim().replace(/,/g, '');\n }\n\n if (parsed.compTimePlayedEl !== null) {\n time.competitive = parsed.compTimePlayedEl.trim().replace(/,/g, '');\n }\n\n // Calculate the prestige level.\n let level = parsed.level;\n if (parsed.star && parsed.rank) {\n const starsMatch = path.basename(parsed.star).split('.').slice(0, -1)[0];\n const rankMatch = path.basename(parsed.rank).split('.').slice(0, -1)[0];\n const stars = starsMatch ? getPrestigeStars(starsMatch) : 0;\n const rank = rankMatch ? getPrestigeLevel(rankMatch) : 0;\n const prestige = parseInt(stars) + parseInt(rank);\n level = parseInt(parsed.level) + (parseInt(prestige) * 100);\n }\n\n const json = {\n username: parsed.user,\n level: parseInt(level),\n portrait: parsed.portrait,\n endorsement: endorsement,\n private: parsed.permission === 'Private Profile',\n games: {\n quickplay: {\n won: parseInt(won.quickplay),\n played: parseInt(played.quickplay) || undefined \n },\n competitive: {\n won: parseInt(won.competitive),\n lost: parseInt(lost.competitive),\n draw: parseInt(draw.competitive) || 0,\n played: parseInt(played.competitive),\n win_rate: parseFloat((parseInt(won.competitive) / (parseInt(played.competitive - parseInt(draw.competitive))) * 100).toFixed(2)),\n },\n },\n playtime: { quickplay: time.quickplay, competitive: time.competitive },\n competitive: { \n tank: {\n rank: parseInt(parsed.compRankElTank), \n rank_img: parsed.compRankImgTank \n },\n damage: {\n rank: parseInt(parsed.compRankElDamage), \n rank_img: parsed.compRankImgDamage\n },\n support: {\n rank: parseInt(parsed.compRankElSupport), \n rank_img: parsed.compRankImgSupport\n }\n },\n levelFrame: parsed.levelFrame,\n star: parsed.star\n }\n\n return callback(null, json);\n}\n\nexport default function(platform, region, tag, callback) {\n async.auto({\n getHTML: async.apply(getHTML, platform, region, tag),\n parseHTML: ['getHTML', async.apply(parseHTML)],\n transform: ['getHTML', 'parseHTML', async.apply(transform)],\n }, function(err, results) {\n if (err) {\n return callback(err);\n }\n return callback(null, results.transform);\n });\n}"]}