From 03ee2d93c36078a831f9967a3adffef433447580 Mon Sep 17 00:00:00 2001 From: Rebekah Rowe Date: Tue, 18 Jun 2024 15:20:32 -0400 Subject: [PATCH] Initial commit, from April 2023 --- dump.jumper.js | 517 +++++++++++++++++++++++++++++++++++++++ userdata.request.graphql | 47 ++++ 2 files changed, 564 insertions(+) create mode 100644 dump.jumper.js create mode 100644 userdata.request.graphql diff --git a/dump.jumper.js b/dump.jumper.js new file mode 100644 index 0000000..033b0ed --- /dev/null +++ b/dump.jumper.js @@ -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(); diff --git a/userdata.request.graphql b/userdata.request.graphql new file mode 100644 index 0000000..9c8b8b0 --- /dev/null +++ b/userdata.request.graphql @@ -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 + } + } + } + } +} \ No newline at end of file