added error handling and default param values for getHiscores

This commit is contained in:
maxswa
2018-05-17 23:32:49 -04:00
parent dda170ac38
commit 356db3943a

View File

@@ -1,14 +1,10 @@
const statsURL = { const URLs = {
main: 'http://services.runescape.com/m=hiscore_oldschool/index_lite.ws?player=', main: 'http://services.runescape.com/m=hiscore_oldschool/',
iron: 'http://services.runescape.com/m=hiscore_oldschool_ironman/index_lite.ws?player=', iron: 'http://services.runescape.com/m=hiscore_oldschool_ironman/',
ult: 'http://services.runescape.com/m=hiscore_oldschool_ultimate/index_lite.ws?player=', ult: 'http://services.runescape.com/m=hiscore_oldschool_ultimate/',
hc: 'http://services.runescape.com/m=hiscore_oldschool_hardcore_ironman/index_lite.ws?player=' hc: 'http://services.runescape.com/m=hiscore_oldschool_hardcore_ironman/',
}, stats: 'index_lite.ws?player=',
scoresURL = { scores: 'overall.ws?'
main: 'http://services.runescape.com/m=hiscore_oldschool/overall.ws?',
iron: 'http://services.runescape.com/m=hiscore_oldschool_ironman/overall.ws?',
ult: 'http://services.runescape.com/m=hiscore_oldschool_ultimate/overall.ws?',
hc: 'http://services.runescape.com/m=hiscore_oldschool_hardcore_ironman/overall.ws?'
}, },
hiscores = { hiscores = {
skills: [ skills: [
@@ -83,16 +79,16 @@ async function getPlayerStats (rsn, mode) {
const responses = [] const responses = []
let csv let csv
responses[0] = await fetch(statsURL.main + encodeURIComponent(rsn)) responses[0] = await fetch(URLs.main + URLs.stats + encodeURIComponent(rsn))
if (responses[0].ok) { if (responses[0].ok) {
responses[1] = await fetch(statsURL.iron + encodeURIComponent(rsn)) responses[1] = await fetch(URLs.iron + URLs.stats + encodeURIComponent(rsn))
if (responses[1].ok) { if (responses[1].ok) {
responses[2] = await fetch(statsURL.hc + encodeURIComponent(rsn)) responses[2] = await fetch(URLs.hc + URLs.stats + encodeURIComponent(rsn))
if (responses[2].ok) { if (responses[2].ok) {
player.mode = 'hc' player.mode = 'hc'
} }
else { else {
responses[3] = await fetch(statsURL.ult + encodeURIComponent(rsn)) responses[3] = await fetch(URLs.ult + URLs.stats + encodeURIComponent(rsn))
if (responses[3].ok) { if (responses[3].ok) {
player.mode = 'ult' player.mode = 'ult'
} }
@@ -109,7 +105,6 @@ async function getPlayerStats (rsn, mode) {
throw Error('Player not found') throw Error('Player not found')
} }
//TODO make a function to handle the csv
switch (player.mode) { switch (player.mode) {
case 'main': case 'main':
csv = await responses[0].text() csv = await responses[0].text()
@@ -158,7 +153,7 @@ async function getPlayerStats (rsn, mode) {
return player return player
} }
else { else {
const response = await fetch(statsURL[mode] + encodeURIComponent(rsn)) const response = await fetch(URLs[mode] + URLs.stats + encodeURIComponent(rsn))
if(!response.ok) { if(!response.ok) {
throw Error('Player not found') throw Error('Player not found')
} }
@@ -168,41 +163,49 @@ async function getPlayerStats (rsn, mode) {
} }
} }
async function getHiscores (mode, category, page) { async function getHiscores (mode, category = 'overall', page = 1) {
let url = scoresURL[mode.toLowerCase()] if(!validModes.includes(mode.toLowerCase()) || mode.toLowerCase() === 'full') {
throw Error('Invalid game mode')
}
else if(!Number.isInteger(page) || page < 1) {
throw Error('Page must be an integer greater than 0')
}
else if(!hiscores.skills.includes(category.toLowerCase()) && !hiscores.other.includes(category.toLowerCase())) {
throw Error('Invalid category')
}
else {
return await getHiscoresPage(mode.toLowerCase(), category.toLowerCase(), page)
}
}
async function getHiscoresPage(mode, category, page) {
const url = URLs[mode] + URLs.scores +
(hiscores.skills.includes(category) ?
'table=' + hiscores.skills.indexOf(category) :
'category_type=1' + '&table=' + hiscores.other.indexOf(category)) +
'&page=' + page
if(hiscores.skills.includes(category.toLowerCase())) {
url += 'table=' + hiscores.skills.indexOf(category.toLowerCase()) + '&page=' + page
}
else if(hiscores.other.includes(category.toLowerCase())) {
url += 'category_type=1' + '&table=' + hiscores.other.indexOf(category.toLowerCase()) + '&page=' + page
}
const response = await fetch(url) const response = await fetch(url)
let playersHTML, players = [], element = document.createElement('html') let players = [], element = document.createElement('html')
element.innerHTML = await response.text() element.innerHTML = await response.text()
playersHTML = element.querySelectorAll('.personal-hiscores__row') const playersHTML = element.querySelectorAll('.personal-hiscores__row')
for(let player of playersHTML) { for(let player of playersHTML) {
let attributes = player.querySelectorAll('td') const attributes = player.querySelectorAll('td')
if(hiscores.skills.includes(category.toLowerCase())) { let playerInfo = {
players.push({ mode: mode,
category: category, category: category,
rank: attributes[0].innerHTML.slice(1, -1), rank: attributes[0].innerHTML.slice(1, -1),
rsn: attributes[1].childNodes[1].innerHTML.replace(/\uFFFD/g, ' '), rsn: attributes[1].childNodes[1].innerHTML.replace(/\uFFFD/g, ' ')
level: attributes[2].innerHTML.slice(1, -1),
xp: attributes[3].innerHTML.slice(1, -1),
mode: mode
})
}
else {
players.push({
category: category,
rank: attributes[0].innerHTML.slice(1, -1),
rsn: attributes[1].childNodes[1].innerHTML.replace(/\uFFFD/g, ' '),
score: attributes[2].innerHTML.slice(1, -1),
mode: mode
})
} }
hiscores.skills.includes(category.toLowerCase()) ?
playerInfo = Object.assign(
{level: attributes[2].innerHTML.slice(1, -1),
xp: attributes[3].innerHTML.slice(1, -1)}, playerInfo) :
playerInfo.score = attributes[2].innerHTML.slice(1, -1)
players.push(playerInfo)
} }
return players return players
@@ -291,7 +294,4 @@ let parseStats = (csv) => {
return stats return stats
} }
getHiscores('main', 'overall', 1)
.then(res => console.log(res))
module.exports = {getStats, getHiscores} module.exports = {getStats, getHiscores}