UNPKG

tbarequest

Version:

A wrapper to fetch data from The Blue Alliance API

541 lines (540 loc) 18.7 kB
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"]), });