{"version":3,"sources":["stats.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","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"],"mappings":"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","sourceRoot":"C:\\Users\\Alf\\Source\\overwatch-api\\api\\src\\parser\\","sourcesContent":["import path from 'path';\r\nimport async from 'async';\r\nimport cheerio from 'cheerio';\r\nimport request from 'request';\r\nimport { getPrestigeLevel, getPrestigeStars } from './utils';\r\nimport { createEndorsementSVG } from './svg';\r\n\r\n\r\n// Get HTML from playoverwatch career page.\r\nfunction getHTML(platform, region, tag, callback) {\r\n  const url = platform === 'pc'\r\n    ? `https://playoverwatch.com/en-us/career/${platform}/${region}/${tag}`\r\n    : `https://playoverwatch.com/en-us/career/${platform}/${tag}`;\r\n\r\n  const options = {\r\n    uri: encodeURI(url),\r\n    encoding: 'utf8'\r\n  }\r\n\r\n  return request(options, (err, res, body) => {\r\n    return callback(err, body);\r\n  });\r\n}\r\n\r\n// Begin html parsing.\r\nfunction parseHTML(results, callback) {\r\n  const $ = cheerio.load(results.getHTML);\r\n\r\n  // Check if profile exists.\r\n  const isFound = $('.content-box h1').text() !== 'Profile Not Found';\r\n  if (!isFound) {\r\n    return callback(new Error('Profile not found'));\r\n  }\r\n\r\n  const parsed = {\r\n    user: $('.header-masthead').text(),\r\n    level: $('.player-level div').first().text(),\r\n    portrait: $('.player-portrait').attr('src'),\r\n    permission: $('.masthead-permission-level-text').text(),\r\n    endorsementLevel: $('.masthead .endorsement-level div').last().text(),\r\n    endorsementFrameEl: $('.masthead .EndorsementIcon').attr('style'),\r\n    sportsmanshipValue: $('.masthead .EndorsementIcon-border--sportsmanship').data('value'),\r\n    shotcallerValue: $('.masthead .EndorsementIcon-border--shotcaller').data('value'),\r\n    teammateValue: $('.masthead .EndorsementIcon-border--teammate').data('value'),\r\n    starEl: $('.player-rank').html(),\r\n    rankEl: $('.player-level').html(),\r\n  }\r\n\r\n  if (parsed.endorsementFrameEl) {\r\n    parsed.endorsementFrame = $('.masthead .EndorsementIcon').attr('style').slice(21, -1).replace(/ /g, '');\r\n  }\r\n\r\n  if (parsed.starEl !== null) {\r\n    parsed.star = $('.player-level .player-rank').attr('style').slice(21, -1).replace(/ /g, '');\r\n  }\r\n\r\n  if (parsed.rankEl !== null) {\r\n    parsed.rank = $('.player-level').attr('style').slice(21, -1).replace(/ /g, '');\r\n  }\r\n\r\n  const stats = {};\r\n\r\n  // Top Heroes.\r\n  const topHeroCategories = {\r\n    quickplay: {\r\n      'played': '0x0860000000000021',\r\n      'games_won': '0x0860000000000039',\r\n      'weapon_accuracy': '0x086000000000002F',\r\n      'eliminations_per_life': '0x08600000000003D2',\r\n      'multikill_best': '0x0860000000000346',\r\n      'objective_kills_average': '0x086000000000039C',\r\n    },\r\n    competitive: {\r\n      'played': '0x0860000000000021',\r\n      'games_won': '0x0860000000000039',\r\n      'win_rate': '0x08600000000003D1',\r\n      'weapon_accuracy': '0x086000000000002F',\r\n      'eliminations_per_life': '0x08600000000003D2',\r\n      'multikill_best': '0x0860000000000346',\r\n      'objective_kills_average': '0x086000000000039C',\r\n    }\r\n  };\r\n\r\n  // Quickplay.\r\n  stats['top_heroes'] = { quickplay: {} };\r\n  Object.keys(topHeroCategories.quickplay).forEach((k) => {\r\n    const topHeroesEls = $(`#quickplay [data-category-id=\"${topHeroCategories.quickplay[k]}\"]`)\r\n      .find('.progress-category-item');\r\n    let topHeroes = [];\r\n    topHeroesEls.each(function(i, el) {\r\n      const stat = {};\r\n      stat.hero = $(this).find('.ProgressBar-title').text();\r\n      stat.img = $(this).find('.ProgressBar-thumb').attr('src');\r\n      stat[k] = $(this).find('.ProgressBar-description').text();\r\n      topHeroes.push(stat);\r\n    });\r\n    stats['top_heroes']['quickplay'][k] = topHeroes;\r\n  });\r\n\r\n  // Competitive.\r\n  stats['top_heroes']['competitive'] = {};\r\n  Object.keys(topHeroCategories.competitive).forEach((k) => {\r\n    const topHeroesEls = $(`#competitive [data-category-id=\"${topHeroCategories.competitive[k]}\"]`)\r\n      .find('.progress-category-item');\r\n    let topHeroes = [];\r\n    topHeroesEls.each(function(i, el) {\r\n      const stat = {};\r\n      stat.hero = $(this).find('.ProgressBar-title').text();\r\n      stat.img = $(this).find('.ProgressBar-thumb').attr('src');\r\n      stat[k] = $(this).find('.ProgressBar-description').text();\r\n      topHeroes.push(stat);\r\n    });\r\n    stats['top_heroes']['competitive'][k] = topHeroes;\r\n  });\r\n\r\n  //\r\n  // Career Stats\r\n  //\r\n  const statCategories = [\r\n    'Combat',\r\n    'Match Awards',\r\n    'Assists',\r\n    'Average',\r\n    'Miscellaneous',\r\n    'Best',\r\n    'Game'\r\n  ];\r\n\r\n  // Quickplay Stats.\r\n  statCategories.forEach(function(item) {\r\n    const els = $(`#quickplay [data-category-id=\"0x02E00000FFFFFFFF\"] h5:contains(\"${item}\")`).closest('table').find('tbody tr');\r\n    let statsArr = [];\r\n    els.each(function(i, el) {\r\n      let stat = {};\r\n      stat.title = $(this).find('td').first().text();\r\n      stat.value = $(this).find('td').next().text();\r\n      statsArr.push(stat);\r\n    });\r\n    item = item.replace(' ', '_').toLowerCase();\r\n    stats[item] = { quickplay: [] };\r\n    stats[item]['quickplay'] = statsArr;\r\n  });\r\n\r\n  // Competitive Stats.\r\n  statCategories.forEach(function(item) {\r\n    const els = $(`#competitive [data-category-id=\"0x02E00000FFFFFFFF\"] h5:contains(\"${item}\")`).closest('table').find('tbody tr');\r\n    let statsArr = [];\r\n    els.each(function(i, el) {\r\n      let stat = {};\r\n      stat.title = $(this).find('td').first().text();\r\n      stat.value = $(this).find('td').next().text();\r\n      statsArr.push(stat);\r\n    });\r\n    item = item.replace(' ', '_').toLowerCase();\r\n    stats[item]['competitive'] = [];\r\n    stats[item]['competitive'] = statsArr;\r\n  });\r\n\r\n  return callback(null, { stats, parsed });\r\n}\r\n\r\n// Transform the data into a json object we can serve.\r\nfunction transform(results, callback) {\r\n  const { parseHTML } = results;\r\n  const { stats, parsed } = parseHTML;\r\n\r\n  const endorsement = {\r\n    sportsmanship: { value: parsed.sportsmanshipValue, rate: parseFloat((parsed.sportsmanshipValue * 100).toFixed(2)) },\r\n    shotcaller: { value: parsed.shotcallerValue, rate: parseFloat((parsed.shotcallerValue * 100).toFixed(2)) },\r\n    teammate: { value: parsed.teammateValue, rate: parseFloat((parsed.teammateValue * 100).toFixed(2)) },\r\n    level: parseInt(parsed.endorsementLevel),\r\n    frame: parsed.endorsementFrame,\r\n  };\r\n  endorsement.icon = createEndorsementSVG(endorsement);\r\n\r\n  // Calculate the prestige level.\r\n  let level = parsed.level;\r\n  if (parsed.star && parsed.rank) {\r\n    const starsMatch = path.basename(parsed.star).split('.').slice(0, -1)[0];\r\n    const rankMatch = path.basename(parsed.rank).split('.').slice(0, -1)[0];\r\n    const stars = starsMatch ? getPrestigeStars(starsMatch) : 0;\r\n    const rank = rankMatch ? getPrestigeLevel(rankMatch) : 0;\r\n    const prestige = parseInt(stars) + parseInt(rank);\r\n    level = parseInt(parsed.level) + (parseInt(prestige) * 100);\r\n  }\r\n\r\n  const json = {\r\n    username: parsed.user,\r\n    level: parseInt(level),\r\n    portrait: parsed.portrait,\r\n    endorsement: endorsement,\r\n    private: parsed.permission === 'Private Profile',\r\n    stats: stats\r\n  }\r\n\r\n  return callback(null, json);\r\n}\r\n\r\nexport default function(platform, region, tag, callback) {\r\n  async.auto({\r\n    getHTML: async.apply(getHTML, platform, region, tag),\r\n    parseHTML: ['getHTML', async.apply(parseHTML)],\r\n    transform: ['getHTML', 'parseHTML', async.apply(transform)],\r\n  }, function(err, results) {\r\n    if (err) {\r\n      return callback(err);\r\n    }\r\n    return callback(null, results.transform);\r\n  });\r\n}"]}