tbarequest
Version:
A wrapper to fetch data from The Blue Alliance API
541 lines (540 loc) • 18.7 kB
JavaScript
import { type } from "arktype";
const reef = type({
botRow: {
nodeA: "boolean",
nodeB: "boolean",
nodeC: "boolean",
nodeD: "boolean",
nodeE: "boolean",
nodeF: "boolean",
nodeG: "boolean",
nodeH: "boolean",
nodeI: "boolean",
nodeJ: "boolean",
nodeK: "boolean",
nodeL: "boolean",
},
midRow: {
nodeA: "boolean",
nodeB: "boolean",
nodeC: "boolean",
nodeD: "boolean",
nodeE: "boolean",
nodeF: "boolean",
nodeG: "boolean",
nodeH: "boolean",
nodeI: "boolean",
nodeJ: "boolean",
nodeK: "boolean",
nodeL: "boolean",
},
topRow: {
nodeA: "boolean",
nodeB: "boolean",
nodeC: "boolean",
nodeD: "boolean",
nodeE: "boolean",
nodeF: "boolean",
nodeG: "boolean",
nodeH: "boolean",
nodeI: "boolean",
nodeJ: "boolean",
nodeK: "boolean",
nodeL: "boolean",
},
trough: "number",
tba_botRowCount: "number",
tba_midRowCount: "number",
tba_topRowCount: "number",
});
export const matchScoreBreakdownYearsAlliances = {
"2015": type({
adjust_points: "number",
auto_points: "number",
container_count_level1: "number",
container_count_level2: "number",
container_count_level3: "number",
container_count_level4: "number",
container_count_level5: "number",
container_count_level6: "number",
container_points: "number",
container_set: "boolean",
foul_count: "number",
foul_points: "number",
litter_count_container: "number",
litter_count_landfill: "number",
litter_count_unprocessed: "number",
litter_points: "number",
robot_set: "boolean",
teleop_points: "number",
total_points: "number",
tote_count_far: "number",
tote_count_near: "number",
tote_points: "number",
tote_set: "boolean",
tote_stack: "boolean",
}).partial(),
"2016": type({
adjustPoints: "number",
autoBoulderPoints: "number",
autoBouldersHigh: "number",
autoBouldersLow: "number",
autoCrossingPoints: "number",
autoPoints: "number",
autoReachPoints: "number",
breachPoints: "number",
capturePoints: "number",
foulCount: "number",
foulPoints: "number",
position1crossings: "number",
position2: "string",
position2crossings: "number",
position3: "string",
position3crossings: "number",
position4: "string",
position4crossings: "number",
position5: "string",
position5crossings: "number",
robot1Auto: "'Crossed' | 'Reached' | 'None'",
robot2Auto: "string",
robot3Auto: "string",
tba_rpEarned: "number",
techFoulCount: "number",
teleopBoulderPoints: "number",
teleopBouldersHigh: "number",
teleopBouldersLow: "number",
teleopChallengePoints: "number",
teleopCrossingPoints: "number",
teleopDefensesBreached: "boolean",
teleopPoints: "number",
teleopScalePoints: "number",
teleopTowerCaptured: "boolean",
totalPoints: "number",
towerEndStrength: "number",
towerFaceA: "string",
towerFaceB: "string",
towerFaceC: "string",
}).partial(),
"2017": type({
adjustPoints: "number",
autoFuelHigh: "number",
autoFuelLow: "number",
autoFuelPoints: "number",
autoMobilityPoints: "number",
autoPoints: "number",
autoRotorPoints: "number",
foulCount: "number",
foulPoints: "number",
kPaBonusPoints: "number",
kPaRankingPointAchieved: "boolean",
robot1Auto: "'Unknown' | 'Mobility' | 'None'",
robot2Auto: "'Unknown' | 'Mobility' | 'None'",
robot3Auto: "'Unknown' | 'Mobility' | 'None'",
rotor1Auto: "boolean",
rotor1Engaged: "boolean",
rotor2Auto: "boolean",
rotor2Engaged: "boolean",
rotor3Engaged: "boolean",
rotor4Engaged: "boolean",
rotorBonusPoints: "number",
rotorRankingPointAchieved: "boolean",
tba_rpEarned: "number",
techFoulCount: "number",
teleopFuelHigh: "number",
teleopFuelLow: "number",
teleopFuelPoints: "number",
teleopPoints: "number",
teleopRotorPoints: "number",
teleopTakeoffPoints: "number",
totalPoints: "number",
touchpadFar: "string",
touchpadMiddle: "string",
touchpadNear: "string",
}).partial(),
"2018": type({
adjustPoints: "number",
autoOwnershipPoints: "number",
autoPoints: "number",
autoQuestRankingPoint: "boolean",
autoRobot1: "string",
autoRobot2: "string",
autoRobot3: "string",
autoRunPoints: "number",
autoScaleOwnershipSec: "number",
autoSwitchAtZero: "boolean",
autoSwitchOwnershipSec: "number",
endgamePoints: "number",
endgameRobot1: "string",
endgameRobot2: "string",
endgameRobot3: "string",
faceTheBossRankingPoint: "boolean",
foulCount: "number",
foulPoints: "number",
rp: "number",
tba_gameData: "string",
techFoulCount: "number",
teleopOwnershipPoints: "number",
teleopPoints: "number",
teleopScaleBoostSec: "number",
teleopScaleForceSec: "number",
teleopScaleOwnershipSec: "number",
teleopSwitchBoostSec: "number",
teleopSwitchForceSec: "number",
teleopSwitchOwnershipSec: "number",
totalPoints: "number",
vaultBoostPlayed: "number",
vaultBoostTotal: "number",
vaultForcePlayed: "number",
vaultForceTotal: "number",
vaultLevitatePlayed: "number",
vaultLevitateTotal: "number",
vaultPoints: "number",
}).partial(),
"2019": type({
adjustPoints: "number",
autoPoints: "number",
bay1: "string",
bay2: "string",
bay3: "string",
bay4: "string",
bay5: "string",
bay6: "string",
bay7: "string",
bay8: "string",
cargoPoints: "number",
completeRocketRankingPoint: "boolean",
completedRocketFar: "boolean",
completedRocketNear: "boolean",
endgameRobot1: "string",
endgameRobot2: "string",
endgameRobot3: "string",
foulCount: "number",
foulPoints: "number",
habClimbPoints: "number",
habDockingRankingPoint: "boolean",
habLineRobot1: "string",
habLineRobot2: "string",
habLineRobot3: "string",
hatchPanelPoints: "number",
lowLeftRocketFar: "string",
lowLeftRocketNear: "string",
lowRightRocketFar: "string",
lowRightRocketNear: "string",
midLeftRocketFar: "string",
midLeftRocketNear: "string",
midRightRocketFar: "string",
midRightRocketNear: "string",
preMatchBay1: "string",
preMatchBay2: "string",
preMatchBay3: "string",
preMatchBay6: "string",
preMatchBay7: "string",
preMatchBay8: "string",
preMatchLevelRobot1: "string",
preMatchLevelRobot2: "string",
preMatchLevelRobot3: "string",
rp: "number",
sandStormBonusPoints: "number",
techFoulCount: "number",
teleopPoints: "number",
topLeftRocketFar: "string",
topLeftRocketNear: "string",
topRightRocketFar: "string",
topRightRocketNear: "string",
totalPoints: "number",
}).partial(),
"2020": type({
adjustPoints: "number",
autoCellPoints: "number",
autoCellsBottom: "number",
autoCellsInner: "number",
autoCellsOuter: "number",
autoInitLinePoints: "number",
autoPoints: "number",
controlPanelPoints: "number",
endgamePoints: "number",
endgameRobot1: "string",
endgameRobot2: "string",
endgameRobot3: "string",
endgameRungIsLevel: "string",
foulCount: "number",
foulPoints: "number",
initLineRobot1: "string",
initLineRobot2: "string",
initLineRobot3: "string",
rp: "number",
shieldEnergizedRankingPoint: "boolean",
shieldOperationalRankingPoint: "boolean",
stage1Activated: "boolean",
stage2Activated: "boolean",
stage3Activated: "boolean",
stage3TargetColor: "string",
tba_numRobotsHanging: "number",
tba_shieldEnergizedRankingPointFromFoul: "boolean",
techFoulCount: "number",
teleopCellPoints: "number",
teleopCellsBottom: "number",
teleopCellsInner: "number",
teleopCellsOuter: "number",
teleopPoints: "number",
totalPoints: "number",
}).partial(),
"2022": type({
adjustPoints: "number",
autoCargoLowerBlue: "number",
autoCargoLowerFar: "number",
autoCargoLowerNear: "number",
autoCargoLowerRed: "number",
autoCargoPoints: "number",
autoCargoTotal: "number",
autoCargoUpperBlue: "number",
autoCargoUpperFar: "number",
autoCargoUpperNear: "number",
autoCargoUpperRed: "number",
autoPoints: "number",
autoTaxiPoints: "number",
cargoBonusRankingPoint: "boolean",
endgamePoints: "number",
endgameRobot1: "'Transversal' | 'High' | 'Mid' | 'Low' | 'None'",
endgameRobot2: "'Transversal' | 'High' | 'Mid' | 'Low' | 'None'",
endgameRobot3: "'Transversal' | 'High' | 'Mid' | 'Low' | 'None'",
foulCount: "number",
foulPoints: "number",
hangarBonusRankingPoint: "boolean",
matchCargoTotal: "number",
quintetAchieved: "boolean",
rp: "number",
taxiRobot1: "'Yes' | 'No'",
taxiRobot2: "'Yes' | 'No'",
taxiRobot3: "'Yes' | 'No'",
techFoulCount: "number",
teleopCargoLowerBlue: "number",
teleopCargoLowerFar: "number",
teleopCargoLowerNear: "number",
teleopCargoLowerRed: "number",
teleopCargoPoints: "number",
teleopCargoTotal: "number",
teleopCargoUpperBlue: "number",
teleopCargoUpperFar: "number",
teleopCargoUpperNear: "number",
teleopCargoUpperRed: "number",
teleopPoints: "number",
totalPoints: "number",
}).partial(),
"2023": type({
activationBonusAchieved: "boolean",
adjustPoints: "number",
autoBridgeState: "'NotLevel' | 'Level'",
autoChargeStationPoints: "number",
autoChargeStationRobot1: "'None' | 'Docked'",
autoChargeStationRobot2: "'None' | 'Docked'",
autoChargeStationRobot3: "'None' | 'Docked'",
autoCommunity: {
B: "('None' | 'Cube' | 'Cone')[]",
M: "('None' | 'Cube' | 'Cone')[]",
T: "('None' | 'Cube' | 'Cone')[]",
},
autoDocked: "boolean",
autoGamePieceCount: "number",
autoGamePiecePoints: "number",
autoMobilityPoints: "number",
autoPoints: "number",
coopGamePieceCount: "number",
coopertitionCriteriaMet: "boolean",
endGameBridgeState: "'NotLevel' | 'Level'",
endGameChargeStationPoints: "number",
endGameChargeStationRobot1: "'None' | 'Docked' | 'Parked'",
endGameChargeStationRobot2: "'None' | 'Docked' | 'Parked'",
endGameChargeStationRobot3: "'None' | 'Docked' | 'Parked'",
endGameParkPoints: "number",
foulCount: "number",
foulPoints: "number",
linkPoints: "number",
links: type({
nodes: "number[]",
row: "'Bottom' | 'Mid' | 'Top'",
}).array(),
mobilityRobot1: "'Yes' | 'No'",
mobilityRobot2: "'Yes' | 'No'",
mobilityRobot3: "'Yes' | 'No'",
rp: "number",
sustainabilityBonusAchieved: "boolean",
techFoulCount: "number",
teleopCommunity: {
B: "('None' | 'Cube' | 'Cone')[]",
M: "('None' | 'Cube' | 'Cone')[]",
T: "('None' | 'Cube' | 'Cone')[]",
},
teleopGamePieceCount: "number",
teleopGamePiecePoints: "number",
teleopPoints: "number",
totalChargeStationPoints: "number",
totalPoints: "number",
}).partial(),
"2024": type({
adjustPoints: "number",
autoAmpNoteCount: "number",
autoAmpNotePoints: "number",
autoLeavePoints: "number",
autoLineRobot1: "string",
autoLineRobot2: "string",
autoLineRobot3: "string",
autoPoints: "number",
autoSpeakerNoteCount: "number",
autoSpeakerNotePoints: "number",
autoTotalNotePoints: "number",
coopNotePlayed: "boolean",
coopertitionBonusAchieved: "boolean",
coopertitionCriteriaMet: "boolean",
endGameHarmonyPoints: "number",
endGameNoteInTrapPoints: "number",
endGameOnStagePoints: "number",
endGameParkPoints: "number",
endGameRobot1: "string",
endGameRobot2: "string",
endGameRobot3: "string",
endGameSpotLightBonusPoints: "number",
endGameTotalStagePoints: "number",
ensembleBonusAchieved: "boolean",
ensembleBonusOnStageRobotsThreshold: "number",
ensembleBonusStagePointsThreshold: "number",
foulCount: "number",
foulPoints: "number",
g206Penalty: "boolean",
g408Penalty: "boolean",
g424Penalty: "boolean",
melodyBonusAchieved: "boolean",
melodyBonusThreshold: "number",
melodyBonusThresholdCoop: "number",
melodyBonusThresholdNonCoop: "number",
micCenterStage: "boolean",
micStageLeft: "boolean",
micStageRight: "boolean",
rp: "number",
techFoulCount: "number",
teleopAmpNoteCount: "number",
teleopAmpNotePoints: "number",
teleopPoints: "number",
teleopSpeakerNoteAmplifiedCount: "number",
teleopSpeakerNoteAmplifiedPoints: "number",
teleopSpeakerNoteCount: "number",
teleopSpeakerNotePoints: "number",
teleopTotalNotePoints: "number",
totalPoints: "number",
trapCenterStage: "boolean",
trapStageLeft: "boolean",
trapStageRight: "boolean",
}).partial(),
"2025": type({
adjustPoints: "number",
algaePoints: "number",
autoBonusAchieved: "boolean",
autoCoralCount: "number",
autoCoralPoints: "number",
autoLineRobot1: "'Yes' | 'No'",
autoLineRobot2: "'Yes' | 'No'",
autoLineRobot3: "'Yes' | 'No'",
autoMobilityPoints: "number",
autoPoints: "number",
autoReef: reef,
bargeBonusAchieved: "boolean",
coopertitionCriteriaMet: "boolean",
coralBonusAchieved: "boolean",
endGameBargePoints: "number",
endGameRobot1: "'None' | 'Parked' | 'ShallowCage' | 'DeepCage'",
endGameRobot2: "'None' | 'Parked' | 'ShallowCage' | 'DeepCage'",
endGameRobot3: "'None' | 'Parked' | 'ShallowCage' | 'DeepCage'",
foulCount: "number",
foulPoints: "number",
g206Penalty: "boolean",
g410Penalty: "boolean",
g418Penalty: "boolean",
g428Penalty: "boolean",
netAlgaeCount: "number",
rp: "number",
techFoulCount: "number",
teleopCoralCount: "number",
teleopCoralPoints: "number",
teleopPoints: "number",
teleopReef: reef,
totalPoints: "number",
wallAlgaeCount: "number",
}).partial(),
};
export const matchScoreBreakdownYearsMatches = {
"2015": type({
red: matchScoreBreakdownYearsAlliances["2015"],
blue: matchScoreBreakdownYearsAlliances["2015"],
coopertition: "'None' | 'Unknown' | 'Stack'",
coopertition_points: "number",
yearOfCompetition: "2015",
}),
"2016": type({
red: matchScoreBreakdownYearsAlliances["2016"],
blue: matchScoreBreakdownYearsAlliances["2016"],
yearOfCompetition: "2016",
}),
"2017": type({
red: matchScoreBreakdownYearsAlliances["2017"],
blue: matchScoreBreakdownYearsAlliances["2017"],
yearOfCompetition: "2017",
}),
"2018": type({
red: matchScoreBreakdownYearsAlliances["2018"],
blue: matchScoreBreakdownYearsAlliances["2018"],
yearOfCompetition: "2018",
}),
"2019": type({
red: matchScoreBreakdownYearsAlliances["2019"],
blue: matchScoreBreakdownYearsAlliances["2019"],
yearOfCompetition: "2019",
}),
"2020": type({
red: matchScoreBreakdownYearsAlliances["2020"],
blue: matchScoreBreakdownYearsAlliances["2020"],
yearOfCompetition: "2020",
}),
"2022": type({
red: matchScoreBreakdownYearsAlliances["2022"],
blue: matchScoreBreakdownYearsAlliances["2022"],
yearOfCompetition: "2022",
}),
"2023": type({
red: matchScoreBreakdownYearsAlliances["2023"],
blue: matchScoreBreakdownYearsAlliances["2023"],
yearOfCompetition: "2023",
}),
"2024": type({
red: matchScoreBreakdownYearsAlliances["2024"],
blue: matchScoreBreakdownYearsAlliances["2024"],
yearOfCompetition: "2024",
}),
"2025": type({
red: matchScoreBreakdownYearsAlliances["2025"],
blue: matchScoreBreakdownYearsAlliances["2025"],
yearOfCompetition: "2025",
}),
};
const msb = matchScoreBreakdownYearsMatches;
export const Match_alliance = type({
score: "number | null",
team_keys: "string[]",
surrogate_team_keys: "string[]",
dq_team_keys: "string[]",
});
export const Match_Simple = type({
key: "string",
comp_level: "'qm' | 'ef' | 'qf' | 'sf' |'f'",
set_number: "number",
match_number: "number",
alliances: type({ red: Match_alliance, blue: Match_alliance }),
winning_alliance: "'red' | 'blue' | ''",
event_key: "string",
time: "number | null",
actual_time: "number | null",
predicted_time: "number | null",
});
export const Match = Match_Simple.and({
videos: type({ type: "string", key: "string" }).array(),
score_breakdown: msb["2015"].or(msb["2016"]).or(msb["2017"]).or(msb["2018"]).or(msb["2019"]).or(msb["2020"]).or(msb["2022"]).or(msb["2023"]).or(msb["2024"]).or(msb["2025"]),
});