srcom
Version:
cli tool to get and post runs to speedrun.com
68 lines (62 loc) • 4.25 kB
JavaScript
module.exports = {
name: 'runs',
returnTop: async (idObject) => {
const fetch = require('node-fetch');
const variableFilter = idObject.hasOwnProperty('variableId') ? '&var-' + idObject.variableId + '=' + idObject.variableVal : '';
const response = await fetch(`https://www.speedrun.com/api/v1/leaderboards/${idObject.game}/category/${idObject.category}?top=1${variableFilter}&embed=game,category.variables,players,regions,platforms`);
const run = await response.json();
const convert = (time) => {
let hr, min, sec, ms;
let parts = time.toString().split('.');
ms = parts.length > 1 ? parseInt((parts[1] + '00').substr(0,3)) : undefined;
sec = parseInt(parts[0]);
if (sec >= 60) {min = Math.floor(sec / 60); sec = sec < 10 ? '0' + (sec % 60) : sec % 60}
if (min >= 60) {hr = Math.floor(min / 60); min = min < 10 ? '0' + (min % 60) : min % 60}
ms = ms < 10 ? '00' + ms : ms < 100 ? '0' + ms : ms;
if (min === undefined) return ms === undefined ? sec.toString() + 's' : sec.toString() + 's ' + ms.toString() + 'ms';
else if (hr === undefined) return ms === undefined ? min.toString() + 'm ' + sec.toString() + 's' : min.toString() + 'm ' + sec.toString() + 's ' + ms.toString() + 'ms';
else return ms === undefined ? hr.toString() + 'h ' + min.toString() + 'm ' + sec.toString() + 's' : hr.toString() + 'h ' + min.toString() + 'm ' + sec.toString() + 's ' + ms.toString() + 'ms';
}
return {
"game": run.data.game.data.names.international,
"category": variableFilter === '' ? run.data.category.data.name : run.data.category.data.name + ' (' + run.data.category.data.variables.data.find(o => o.id === idObject.variableId).values.choices[idObject.variableVal] + ')',
"runner": run.data.players.data[0].rel === 'user' ? run.data.players.data[0].names.international : run.data.players.data[0].name,
"time": convert(run.data.runs[0].run.times.primary_t),
"rank": run.data.runs[0].place,
"date": run.data.runs[0].run.date,
"platform": run.data.platforms.data.length > 0 ? run.data.platforms.data[0].name : '',
"region": run.data.regions.data.length > 0 ? run.data.regions.data[0].name : '',
"emulated": run.data.runs[0].run.system.emulated,
"url": run.data.runs[0].run.weblink
};
},
returnPb: async (idObject) => {
const fetch = require('node-fetch');
const response = await fetch(`https://www.speedrun.com/api/v1/users/${idObject.runner}/personal-bests?game=${idObject.game}&embed=region,platform`);
const runs = await response.json();
const correctRun = idObject.hasOwnProperty('subCatKey') ?
runs.data.find(r => r.run.category === idObject.category && r.run.values[idObject.subCatKey] === idObject.subCatVal) :
runs.data.find(r => r.run.category === idObject.category);
const convert = (time) => {
let hr, min, sec, ms;
let parts = time.toString().split('.');
ms = parts.length > 1 ? parseInt((parts[1] + '00').substr(0,3)) : undefined;
sec = parseInt(parts[0]);
if (sec >= 60) {min = Math.floor(sec / 60); sec = sec < 10 ? '0' + (sec % 60) : sec % 60}
if (min >= 60) {hr = Math.floor(min / 60); min = min < 10 ? '0' + (min % 60) : min % 60}
ms = ms < 10 ? '00' + ms : ms < 100 ? '0' + ms : ms;
if (min === undefined) return ms === undefined ? sec.toString() + 's' : sec.toString() + 's ' + ms.toString() + 'ms';
else if (hr === undefined) return ms === undefined ? min.toString() + 'm ' + sec.toString() + 's' : min.toString() + 'm ' + sec.toString() + 's ' + ms.toString() + 'ms';
else return ms === undefined ? hr.toString() + 'h ' + min.toString() + 'm ' + sec.toString() + 's' : hr.toString() + 'h ' + min.toString() + 'm ' + sec.toString() + 's ' + ms.toString() + 'ms';
}
return {
"time": convert(correctRun.run.times.primary_t),
"rank": correctRun.place,
"date": correctRun.run.date,
"platform": correctRun.platform.data.length === 0 ? '' : correctRun.platform.data.name,
"region": correctRun.region.data.length === 0 ? '' : correctRun.region.data.name,
"emulated": correctRun.run.system.emulated,
"url": correctRun.run.weblink
};
}
};