Initial commit, from April 2023
This commit is contained in:
commit
03ee2d93c3
517
dump.jumper.js
Normal file
517
dump.jumper.js
Normal file
@ -0,0 +1,517 @@
|
||||
const { graphql } = require("graphql");
|
||||
const { schema } = require("tempus-api-graphql");
|
||||
const fs = require('fs');
|
||||
|
||||
const sleep = (time) => {
|
||||
return new Promise((resolve) => setTimeout(resolve, time))
|
||||
}
|
||||
|
||||
/*var DumpMapByID = async function(id) {
|
||||
const query = `
|
||||
{
|
||||
map(id: ${id}) {
|
||||
authors {
|
||||
name
|
||||
player {
|
||||
steamId
|
||||
country
|
||||
}
|
||||
}
|
||||
id
|
||||
name
|
||||
videos {
|
||||
soldier
|
||||
demoman
|
||||
}
|
||||
tiers {
|
||||
soldier
|
||||
demoman
|
||||
}
|
||||
zones {
|
||||
bonus {
|
||||
id
|
||||
map {
|
||||
tiers {
|
||||
soldier
|
||||
demoman
|
||||
}
|
||||
}
|
||||
type
|
||||
zoneindex
|
||||
customName
|
||||
}
|
||||
bonusEnd {
|
||||
id
|
||||
map {
|
||||
tiers {
|
||||
soldier
|
||||
demoman
|
||||
}
|
||||
}
|
||||
type
|
||||
zoneindex
|
||||
customName
|
||||
}
|
||||
checkpoint {
|
||||
id
|
||||
map {
|
||||
tiers {
|
||||
soldier
|
||||
demoman
|
||||
}
|
||||
}
|
||||
type
|
||||
zoneindex
|
||||
customName
|
||||
}
|
||||
course {
|
||||
id
|
||||
map {
|
||||
tiers {
|
||||
soldier
|
||||
demoman
|
||||
}
|
||||
}
|
||||
type
|
||||
zoneindex
|
||||
customName
|
||||
}
|
||||
courseEnd {
|
||||
id
|
||||
map {
|
||||
tiers {
|
||||
soldier
|
||||
demoman
|
||||
}
|
||||
}
|
||||
type
|
||||
zoneindex
|
||||
customName
|
||||
}
|
||||
linear {
|
||||
id
|
||||
map {
|
||||
tiers {
|
||||
soldier
|
||||
demoman
|
||||
}
|
||||
}
|
||||
type
|
||||
zoneindex
|
||||
customName
|
||||
}
|
||||
map {
|
||||
id
|
||||
map {
|
||||
tiers {
|
||||
soldier
|
||||
demoman
|
||||
}
|
||||
}
|
||||
type
|
||||
zoneindex
|
||||
customName
|
||||
}
|
||||
mapEnd {
|
||||
id
|
||||
map {
|
||||
tiers {
|
||||
soldier
|
||||
demoman
|
||||
}
|
||||
}
|
||||
type
|
||||
zoneindex
|
||||
customName
|
||||
}
|
||||
misc {
|
||||
id
|
||||
map {
|
||||
tiers {
|
||||
soldier
|
||||
demoman
|
||||
}
|
||||
}
|
||||
type
|
||||
zoneindex
|
||||
customName
|
||||
}
|
||||
trick {
|
||||
id
|
||||
map {
|
||||
tiers {
|
||||
soldier
|
||||
demoman
|
||||
}
|
||||
}
|
||||
type
|
||||
zoneindex
|
||||
customName
|
||||
}
|
||||
}
|
||||
}
|
||||
}`;
|
||||
|
||||
|
||||
|
||||
console.log(`Querying for map id: ${id}`)
|
||||
var result = await graphql(schema, query);
|
||||
await sleep(1000)
|
||||
if (result.errors && result.errors.length > 0) {
|
||||
if (result.errors[0].message && result.errors[0].message.search("404")) {
|
||||
var file_loc = `./data/404-result-${id}.json`;
|
||||
var err = fs.writeFileSync(file_loc, "");
|
||||
if (err)
|
||||
throw err;
|
||||
console.log(`Recieved graceful 404 on id: ${id}`);
|
||||
return
|
||||
}
|
||||
console.log(`Errormap: ${JSON.stringify(result)}`)
|
||||
return
|
||||
}
|
||||
|
||||
var name = `UnknownIDPleaseFix${id}`;
|
||||
if (result.data.map)
|
||||
name = result.data.map.name;
|
||||
|
||||
console.log(`Found map: ${name}`)
|
||||
var file_loc = `./data/${name}.json`;
|
||||
var err = fs.writeFileSync(file_loc, JSON.stringify(result.data.map, null, "\t"));
|
||||
if (err) {
|
||||
console.log(err)
|
||||
throw err;
|
||||
}
|
||||
console.log(`Saved map \"${name}\" into \"${file_loc}\"`)
|
||||
}*/
|
||||
|
||||
const DumpAllMapIds = async function() {
|
||||
const query = `
|
||||
{
|
||||
maps {
|
||||
id
|
||||
}
|
||||
}`;
|
||||
|
||||
console.log("Querying for list of maps")
|
||||
var result = await graphql(schema, query);
|
||||
await sleep(1000)
|
||||
|
||||
var sorted_maplist = [];
|
||||
for (var mapobj in result.data.maps)
|
||||
sorted_maplist.push(mapobj)
|
||||
sorted_maplist.sort();
|
||||
return sorted_maplist;
|
||||
}
|
||||
|
||||
const GetRecordByPlayerMapID = async function(mapid, playerid, splits, soldier = true) {
|
||||
var tfclass = soldier ? "SOLDIER" : "DEMOMAN";
|
||||
var splitreq = !splits ? "" : `splits {
|
||||
customName
|
||||
duration
|
||||
comparedDuration
|
||||
}`;
|
||||
|
||||
const query = `{
|
||||
player(id: ${playerid}) {
|
||||
record (mapId: ${mapid}, class: ${tfclass}){
|
||||
id
|
||||
duration
|
||||
rank
|
||||
date
|
||||
demo {
|
||||
filename
|
||||
url
|
||||
recording
|
||||
requested
|
||||
uploader {
|
||||
id
|
||||
}
|
||||
}
|
||||
class
|
||||
demoStartTick
|
||||
demoEndTick
|
||||
server {
|
||||
id
|
||||
shortname
|
||||
name
|
||||
hostName
|
||||
}
|
||||
${splitreq}
|
||||
}
|
||||
}
|
||||
map(id: ${mapid}) {
|
||||
name
|
||||
}
|
||||
}`;
|
||||
|
||||
console.log(`Querying for map records id: ${mapid}`)
|
||||
var result = await graphql(schema, query);
|
||||
await sleep(1000)
|
||||
if (result.errors && result.errors.length > 0) {
|
||||
var after_fourohfour = null;
|
||||
for (var i = 0; i < result.errors.length; i++) {
|
||||
var err = result.errors[i];
|
||||
if (err.message && err.message === "Request failed with status code 404") {
|
||||
var file_loc = `./data-records/404-result-${mapid}.json`;
|
||||
var fserr = fs.writeFileSync(file_loc, "");
|
||||
if (fserr)
|
||||
throw fserr;
|
||||
console.log(`Recieved graceful 404 on id: ${mapid}`);
|
||||
throw err.message;
|
||||
} else
|
||||
after_fourohfour = err;
|
||||
//console.log(`Errormap: ${JSON.stringify(result)}`)
|
||||
}
|
||||
if (after_fourohfour)
|
||||
throw after_fourohfour;
|
||||
return
|
||||
}
|
||||
|
||||
return result;
|
||||
/*var file_loc = `./data-records/${name}.json`;
|
||||
var err = fs.writeFileSync(file_loc, JSON.stringify(result.data.map, null, "\t"));
|
||||
if (err) {
|
||||
console.log(err)
|
||||
throw err;
|
||||
}
|
||||
console.log(`Saved map \"${name}\" into \"${file_loc}\"`)*/
|
||||
}
|
||||
|
||||
const FindPlayerIdFromSteamId = async function(mapids, steamid) {
|
||||
for (var map_id in mapids) {
|
||||
try {
|
||||
var last_length = 25;
|
||||
for (var i = 1; last_length >= 25; i += 25) {
|
||||
last_length = 0;
|
||||
const query = `{
|
||||
map(id: ${map_id}) {
|
||||
records(start: ${i}, class: SOLDIER) {
|
||||
player{
|
||||
id
|
||||
steamId
|
||||
name
|
||||
}
|
||||
}
|
||||
}
|
||||
}`;
|
||||
console.log(`Querying for map records: ${map_id} at ${i}`)
|
||||
var result = await graphql(schema, query);
|
||||
await sleep(1000)
|
||||
if (result.errors && result.errors.length > 0)
|
||||
throw result.errors[0];
|
||||
|
||||
if (result.data.map.records) {
|
||||
last_length = result.data.map.records.length;
|
||||
for (var ii = 0; ii < result.data.map.records.length; ii++) {
|
||||
var record = result.data.map.records[ii];
|
||||
if (record && record.player && record.player.steamId && record.player.steamId === steamid) {
|
||||
console.log(`Found ID! ${record.player.id}`);
|
||||
return record.player.id;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
console.log(`Maprecords by id failed: ${map_id} with ${err}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const DumpAllRecordsFor = async function(mapids, playerid, soldier = true) {
|
||||
for (var map_id in mapids) {
|
||||
var result = {};
|
||||
try {
|
||||
result = await GetRecordByPlayerMapID(map_id, playerid, true, soldier);
|
||||
} catch (err) {
|
||||
if (err.message && err.message === "Request failed with status code 404")
|
||||
continue;
|
||||
if (err.message == "this.attrs.map_info is undefined" || err.message == "Cannot read properties of undefined (reading 'name')") {
|
||||
console.log(`Requerying without splits`);
|
||||
try {
|
||||
result = await GetRecordByPlayerMapID(map_id, playerid, false, soldier)
|
||||
} catch (err) {
|
||||
console.log(`Error getting query ${map_id}: ${err}`);
|
||||
continue;
|
||||
}
|
||||
} else
|
||||
continue;
|
||||
}
|
||||
|
||||
var name = `UnknownNamePleaseFixId${map_id}`;
|
||||
if (result.data.map) {
|
||||
name = result.data.map.name;
|
||||
console.log(`Found map name: ${name}`)
|
||||
} else
|
||||
console.log(`Falling back to mapid for name: ${id}`)
|
||||
|
||||
if (result.data.player.record === null) {
|
||||
console.log(`No record found for map: ${name}`);
|
||||
var file_loc = `./data-non-records/${name}.json`;
|
||||
var fserr = fs.writeFileSync(file_loc, "");
|
||||
if (fserr)
|
||||
throw fserr;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!result.data.player.record.name)
|
||||
result.data.player.record.name = name;
|
||||
|
||||
/*var file_loc = `./data-records/${name}.json`;
|
||||
var err = fs.writeFileSync(file_loc, JSON.stringify(result.data.player.record, null, "\t"));
|
||||
if (err) {
|
||||
console.log(err)
|
||||
throw err;
|
||||
}
|
||||
console.log(`Saved map record\"${name}\" into \"${file_loc}\"`)*/
|
||||
}
|
||||
}
|
||||
|
||||
var verboze = false;
|
||||
const DumpWorldRecord = async function(mapid, splits, soldier = true) {
|
||||
var tfclass = soldier ? "SOLDIER" : "DEMOMAN";
|
||||
var splitreq = !splits ? "" : `splits {
|
||||
customName
|
||||
duration
|
||||
comparedDuration
|
||||
}`;
|
||||
|
||||
const query = `{
|
||||
map(id: ${mapid}) {
|
||||
name
|
||||
wr(class: ${tfclass}){
|
||||
player {
|
||||
name
|
||||
steamId
|
||||
}
|
||||
duration
|
||||
date
|
||||
demo {
|
||||
filename
|
||||
date
|
||||
url
|
||||
recording
|
||||
requested
|
||||
expired
|
||||
deleted
|
||||
uploader {
|
||||
steamId
|
||||
name
|
||||
}
|
||||
server {
|
||||
id
|
||||
hostName
|
||||
name
|
||||
}
|
||||
}
|
||||
demoStartTick
|
||||
demoEndTick
|
||||
server {
|
||||
id
|
||||
hostName
|
||||
name
|
||||
}
|
||||
${splitreq}
|
||||
}
|
||||
}
|
||||
}`;
|
||||
if (verboze) {
|
||||
console.log("Dumping before query")
|
||||
console.log(query) }
|
||||
console.log(`Querying for map wrs: ${mapid}`)
|
||||
var result = await graphql(schema, query);
|
||||
await sleep(1000)
|
||||
if (result.errors && result.errors.length > 0) {
|
||||
var after_fourohfour = null;
|
||||
for (var i = 0; i < result.errors.length; i++) {
|
||||
var err = result.errors[i];
|
||||
if (verboze) {
|
||||
console.log("Dumping errors")
|
||||
console.log(err) }
|
||||
if (err.message && err.message === "Request failed with status code 404") {
|
||||
var file_loc = `./data-wr/404-result-${mapid}.json`;
|
||||
var fserr = fs.writeFileSync(file_loc, "");
|
||||
if (fserr)
|
||||
throw fserr;
|
||||
console.log(`Recieved graceful 404 on id: ${mapid}`);
|
||||
throw err.message;
|
||||
} else
|
||||
after_fourohfour = err;
|
||||
//console.log(`Errormap: ${JSON.stringify(result)}`)
|
||||
}
|
||||
if (after_fourohfour)
|
||||
throw after_fourohfour;
|
||||
return
|
||||
}
|
||||
|
||||
return result;
|
||||
/*var file_loc = `./data-records/${name}.json`;
|
||||
var err = fs.writeFileSync(file_loc, JSON.stringify(result.data.map, null, "\t"));
|
||||
if (err) {
|
||||
console.log(err)
|
||||
throw err;
|
||||
}
|
||||
console.log(`Saved map \"${name}\" into \"${file_loc}\"`)*/
|
||||
}
|
||||
|
||||
const DumpAllWrs = async function(mapids, soldier = true) {
|
||||
for (var map_id in mapids) {
|
||||
var result = {};
|
||||
try {
|
||||
result = await DumpWorldRecord(map_id, true, soldier);
|
||||
} catch (err) {
|
||||
if (verboze) {
|
||||
console.log("Dumping before retry")
|
||||
console.log(err) }
|
||||
if (err.message && err.message === "Request failed with status code 404")
|
||||
continue;
|
||||
if (err.message == "this.attrs.map_info is undefined" || err.message == "Cannot read properties of undefined (reading 'name')") {
|
||||
console.log(`Requerying without splits`);
|
||||
try {
|
||||
result = await DumpWorldRecord(map_id, false, soldier)
|
||||
} catch (err) {
|
||||
console.log(`Error getting query ${map_id}: ${err}`);
|
||||
continue;
|
||||
}
|
||||
} else
|
||||
continue;
|
||||
}
|
||||
|
||||
var name = `UnknownNamePleaseFixId${map_id}`;
|
||||
if (result.data.map) {
|
||||
name = result.data.map.name;
|
||||
console.log(`Found map name: ${name}`)
|
||||
} else
|
||||
console.log(`Falling back to mapid for name: ${id}`)
|
||||
|
||||
if (result.data.map.wr === null) {
|
||||
console.log(`No record found for map: ${name}`);
|
||||
var file_loc = `./data-non-wr/${name}.json`;
|
||||
var fserr = fs.writeFileSync(file_loc, "");
|
||||
if (fserr)
|
||||
throw fserr;
|
||||
continue;
|
||||
}
|
||||
|
||||
var file_loc = `./data-wr/${name}.json`;
|
||||
var err = fs.writeFileSync(file_loc, JSON.stringify(result.data.map.wr, null, "\t"));
|
||||
if (err) {
|
||||
console.log(err)
|
||||
throw err;
|
||||
}
|
||||
console.log(`Saved map record\"${name}\" into \"${file_loc}\"`)
|
||||
}
|
||||
}
|
||||
|
||||
async function main() {
|
||||
var mapids = await DumpAllMapIds()
|
||||
const playerid = 112000; // await FindPlayerIdFromSteamId(mapids, "STEAM_0:0:43167835");
|
||||
console.log(`Player Id: \"${playerid}\"`);
|
||||
await DumpAllWrs(mapids, false)
|
||||
//DumpAllRecordsFor(mapids, playerid)
|
||||
/* for (var map_id in mapids) {
|
||||
console.log(map_id)
|
||||
await DumpMapByID(map_id)
|
||||
}*/
|
||||
//DumpMapByID(97)
|
||||
}
|
||||
main();
|
47
userdata.request.graphql
Normal file
47
userdata.request.graphql
Normal file
@ -0,0 +1,47 @@
|
||||
{
|
||||
|
||||
player(id: 112000) {
|
||||
|
||||
name
|
||||
ranks {
|
||||
overall{
|
||||
points
|
||||
rank
|
||||
totalRanked
|
||||
title
|
||||
}
|
||||
soldier {
|
||||
points
|
||||
rank
|
||||
totalRanked
|
||||
title
|
||||
}
|
||||
demoman {
|
||||
points
|
||||
rank
|
||||
totalRanked
|
||||
title
|
||||
}
|
||||
}
|
||||
firstSeen
|
||||
lastSeen
|
||||
|
||||
stats {
|
||||
|
||||
pr {
|
||||
bonus {
|
||||
count
|
||||
points
|
||||
}
|
||||
course {
|
||||
count
|
||||
points
|
||||
}
|
||||
map {
|
||||
count
|
||||
points
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user