UNPKG

overwatch-api-server

Version:
1 lines 16.8 kB
{"version":3,"sources":["stats.js"],"names":["MAX_RETRIES","getHTML","platform","region","tag","callback","url","options","uri","encodeURI","encoding","parseHTML","results","$","cheerio","load","isFound","text","Error","parsed","user","level","first","portrait","attr","permission","endorsementLevel","last","endorsementFrameEl","sportsmanshipValue","data","shotcallerValue","teammateValue","starEl","html","rankEl","endorsementFrame","slice","replace","star","rank","stats","topHeroCategories","quickplay","competitive","Object","keys","forEach","k","topHeroesEls","find","topHeroes","each","i","el","stat","hero","img","push","statCategories","item","els","closest","statsArr","title","value","next","toLowerCase","transform","endorsement","sportsmanship","rate","parseFloat","toFixed","shotcaller","teammate","parseInt","frame","icon","starsMatch","path","basename","split","rankMatch","stars","prestige","json","username","async","auto","apply","err"],"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 { getPrestigeLevel, getPrestigeStars, retryRequest } from './utils';\nimport { createEndorsementSVG } from './svg';\n\nconst MAX_RETRIES = 3;\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 return retryRequest(options, MAX_RETRIES, callback);\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 .EndorsementIcon-tooltip 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 starEl: $('.player-rank').html(),\n rankEl: $('.player-level').html(),\n }\n\n if (parsed.endorsementFrameEl) {\n parsed.endorsementFrame = $('.masthead .EndorsementIcon').attr('style').slice(21, -1).replace(/ /g, '');\n }\n\n if (parsed.starEl !== null) {\n parsed.star = $('.player-level .player-rank').attr('style').slice(21, -1).replace(/ /g, '');\n }\n\n if (parsed.rankEl !== null) {\n parsed.rank = $('.player-level').attr('style').slice(21, -1).replace(/ /g, '');\n }\n\n const stats = {};\n\n // Top Heroes.\n const topHeroCategories = {\n quickplay: {\n 'played': '0x0860000000000021',\n 'games_won': '0x0860000000000039',\n 'weapon_accuracy': '0x086000000000002F',\n 'eliminations_per_life': '0x08600000000003D2',\n 'multikill_best': '0x0860000000000346',\n 'objective_kills_average': '0x086000000000039C',\n },\n competitive: {\n 'played': '0x0860000000000021',\n 'games_won': '0x0860000000000039',\n 'win_rate': '0x08600000000003D1',\n 'weapon_accuracy': '0x086000000000002F',\n 'eliminations_per_life': '0x08600000000003D2',\n 'multikill_best': '0x0860000000000346',\n 'objective_kills_average': '0x086000000000039C',\n }\n };\n\n // Quickplay.\n stats['top_heroes'] = { quickplay: {} };\n Object.keys(topHeroCategories.quickplay).forEach((k) => {\n const topHeroesEls = $(`#quickplay [data-category-id=\"${topHeroCategories.quickplay[k]}\"]`)\n .find('.progress-category-item');\n let topHeroes = [];\n topHeroesEls.each(function(i, el) {\n const stat = {};\n stat.hero = $(this).find('.ProgressBar-title').text();\n stat.img = $(this).find('.ProgressBar-thumb').attr('src');\n stat[k] = $(this).find('.ProgressBar-description').text();\n topHeroes.push(stat);\n });\n stats['top_heroes']['quickplay'][k] = topHeroes;\n });\n\n // Competitive.\n stats['top_heroes']['competitive'] = {};\n Object.keys(topHeroCategories.competitive).forEach((k) => {\n const topHeroesEls = $(`#competitive [data-category-id=\"${topHeroCategories.competitive[k]}\"]`)\n .find('.progress-category-item');\n let topHeroes = [];\n topHeroesEls.each(function(i, el) {\n const stat = {};\n stat.hero = $(this).find('.ProgressBar-title').text();\n stat.img = $(this).find('.ProgressBar-thumb').attr('src');\n stat[k] = $(this).find('.ProgressBar-description').text();\n topHeroes.push(stat);\n });\n stats['top_heroes']['competitive'][k] = topHeroes;\n });\n\n //\n // Career Stats\n //\n const statCategories = [\n 'Combat',\n 'Match Awards',\n 'Assists',\n 'Average',\n 'Miscellaneous',\n 'Best',\n 'Game'\n ];\n\n // Quickplay Stats.\n statCategories.forEach(function(item) {\n const els = $(`#quickplay [data-category-id=\"0x02E00000FFFFFFFF\"] h5:contains(\"${item}\")`).closest('table').find('tbody tr');\n let statsArr = [];\n els.each(function(i, el) {\n let stat = {};\n stat.title = $(this).find('td').first().text();\n stat.value = $(this).find('td').next().text();\n statsArr.push(stat);\n });\n item = item.replace(' ', '_').toLowerCase();\n stats[item] = { quickplay: [] };\n stats[item]['quickplay'] = statsArr;\n });\n\n // Competitive Stats.\n statCategories.forEach(function(item) {\n const els = $(`#competitive [data-category-id=\"0x02E00000FFFFFFFF\"] h5:contains(\"${item}\")`).closest('table').find('tbody tr');\n let statsArr = [];\n els.each(function(i, el) {\n let stat = {};\n stat.title = $(this).find('td').first().text();\n stat.value = $(this).find('td').next().text();\n statsArr.push(stat);\n });\n item = item.replace(' ', '_').toLowerCase();\n stats[item]['competitive'] = [];\n stats[item]['competitive'] = statsArr;\n });\n\n return callback(null, { stats, parsed });\n}\n\n// Transform the data into a json object we can serve.\nfunction transform(results, callback) {\n const { parseHTML } = results;\n const { stats, parsed } = parseHTML;\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,\n };\n endorsement.icon = createEndorsementSVG(endorsement);\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 stats: stats\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}"]}