mirror of
https://github.com/maxswa/osrs-json-hiscores.git
synced 2025-10-15 10:19:04 +00:00
added error handling and default param values for getHiscores
This commit is contained in:
96
hiscores.js
96
hiscores.js
@@ -1,14 +1,10 @@
|
||||
const statsURL = {
|
||||
main: 'http://services.runescape.com/m=hiscore_oldschool/index_lite.ws?player=',
|
||||
iron: 'http://services.runescape.com/m=hiscore_oldschool_ironman/index_lite.ws?player=',
|
||||
ult: 'http://services.runescape.com/m=hiscore_oldschool_ultimate/index_lite.ws?player=',
|
||||
hc: 'http://services.runescape.com/m=hiscore_oldschool_hardcore_ironman/index_lite.ws?player='
|
||||
},
|
||||
scoresURL = {
|
||||
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?'
|
||||
const URLs = {
|
||||
main: 'http://services.runescape.com/m=hiscore_oldschool/',
|
||||
iron: 'http://services.runescape.com/m=hiscore_oldschool_ironman/',
|
||||
ult: 'http://services.runescape.com/m=hiscore_oldschool_ultimate/',
|
||||
hc: 'http://services.runescape.com/m=hiscore_oldschool_hardcore_ironman/',
|
||||
stats: 'index_lite.ws?player=',
|
||||
scores: 'overall.ws?'
|
||||
},
|
||||
hiscores = {
|
||||
skills: [
|
||||
@@ -83,16 +79,16 @@ async function getPlayerStats (rsn, mode) {
|
||||
const responses = []
|
||||
let csv
|
||||
|
||||
responses[0] = await fetch(statsURL.main + encodeURIComponent(rsn))
|
||||
responses[0] = await fetch(URLs.main + URLs.stats + encodeURIComponent(rsn))
|
||||
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) {
|
||||
responses[2] = await fetch(statsURL.hc + encodeURIComponent(rsn))
|
||||
responses[2] = await fetch(URLs.hc + URLs.stats + encodeURIComponent(rsn))
|
||||
if (responses[2].ok) {
|
||||
player.mode = 'hc'
|
||||
}
|
||||
else {
|
||||
responses[3] = await fetch(statsURL.ult + encodeURIComponent(rsn))
|
||||
responses[3] = await fetch(URLs.ult + URLs.stats + encodeURIComponent(rsn))
|
||||
if (responses[3].ok) {
|
||||
player.mode = 'ult'
|
||||
}
|
||||
@@ -109,7 +105,6 @@ async function getPlayerStats (rsn, mode) {
|
||||
throw Error('Player not found')
|
||||
}
|
||||
|
||||
//TODO make a function to handle the csv
|
||||
switch (player.mode) {
|
||||
case 'main':
|
||||
csv = await responses[0].text()
|
||||
@@ -158,7 +153,7 @@ async function getPlayerStats (rsn, mode) {
|
||||
return player
|
||||
}
|
||||
else {
|
||||
const response = await fetch(statsURL[mode] + encodeURIComponent(rsn))
|
||||
const response = await fetch(URLs[mode] + URLs.stats + encodeURIComponent(rsn))
|
||||
if(!response.ok) {
|
||||
throw Error('Player not found')
|
||||
}
|
||||
@@ -168,41 +163,49 @@ async function getPlayerStats (rsn, mode) {
|
||||
}
|
||||
}
|
||||
|
||||
async function getHiscores (mode, category, page) {
|
||||
let url = scoresURL[mode.toLowerCase()]
|
||||
|
||||
if(hiscores.skills.includes(category.toLowerCase())) {
|
||||
url += 'table=' + hiscores.skills.indexOf(category.toLowerCase()) + '&page=' + page
|
||||
async function getHiscores (mode, category = 'overall', page = 1) {
|
||||
if(!validModes.includes(mode.toLowerCase()) || mode.toLowerCase() === 'full') {
|
||||
throw Error('Invalid game mode')
|
||||
}
|
||||
else if(hiscores.other.includes(category.toLowerCase())) {
|
||||
url += 'category_type=1' + '&table=' + hiscores.other.indexOf(category.toLowerCase()) + '&page=' + page
|
||||
else if(!Number.isInteger(page) || page < 1) {
|
||||
throw Error('Page must be an integer greater than 0')
|
||||
}
|
||||
const response = await fetch(url)
|
||||
let playersHTML, players = [], element = document.createElement('html')
|
||||
element.innerHTML = await response.text()
|
||||
playersHTML = element.querySelectorAll('.personal-hiscores__row')
|
||||
|
||||
for(let player of playersHTML) {
|
||||
let attributes = player.querySelectorAll('td')
|
||||
if(hiscores.skills.includes(category.toLowerCase())) {
|
||||
players.push({
|
||||
category: category,
|
||||
rank: attributes[0].innerHTML.slice(1, -1),
|
||||
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 if(!hiscores.skills.includes(category.toLowerCase()) && !hiscores.other.includes(category.toLowerCase())) {
|
||||
throw Error('Invalid category')
|
||||
}
|
||||
else {
|
||||
players.push({
|
||||
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
|
||||
|
||||
const response = await fetch(url)
|
||||
let players = [], element = document.createElement('html')
|
||||
element.innerHTML = await response.text()
|
||||
const playersHTML = element.querySelectorAll('.personal-hiscores__row')
|
||||
|
||||
for(let player of playersHTML) {
|
||||
const attributes = player.querySelectorAll('td')
|
||||
let playerInfo = {
|
||||
mode: mode,
|
||||
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
|
||||
})
|
||||
rsn: attributes[1].childNodes[1].innerHTML.replace(/\uFFFD/g, ' ')
|
||||
}
|
||||
|
||||
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
|
||||
@@ -291,7 +294,4 @@ let parseStats = (csv) => {
|
||||
return stats
|
||||
}
|
||||
|
||||
getHiscores('main', 'overall', 1)
|
||||
.then(res => console.log(res))
|
||||
|
||||
module.exports = {getStats, getHiscores}
|
Reference in New Issue
Block a user