fantasy-basketball-sdk 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +101 -0
- package/LICENSE +13 -0
- package/README.md +195 -0
- package/dist/core/index.d.ts +3 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +2 -0
- package/dist/core/providers.d.ts +2 -0
- package/dist/core/providers.d.ts.map +1 -0
- package/dist/core/providers.js +10 -0
- package/dist/core/providers.js.map +1 -0
- package/dist/core/types.d.ts +2 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/espn/client.d.ts +37 -0
- package/dist/espn/client.d.ts.map +1 -0
- package/dist/espn/client.js +145 -0
- package/dist/espn/client.js.map +1 -0
- package/dist/espn/constants.d.ts +34 -0
- package/dist/espn/constants.d.ts.map +1 -0
- package/dist/espn/constants.js +189 -0
- package/dist/espn/constants.js.map +1 -0
- package/dist/espn/errors.d.ts +19 -0
- package/dist/espn/errors.d.ts.map +1 -0
- package/dist/espn/errors.js +34 -0
- package/dist/espn/errors.js.map +1 -0
- package/dist/espn/index.d.ts +18 -0
- package/dist/espn/index.d.ts.map +1 -0
- package/dist/espn/index.js +19 -0
- package/dist/espn/index.js.map +1 -0
- package/dist/espn/league.d.ts +76 -0
- package/dist/espn/league.d.ts.map +1 -0
- package/dist/espn/league.js +285 -0
- package/dist/espn/league.js.map +1 -0
- package/dist/espn/models/activity.d.ts +14 -0
- package/dist/espn/models/activity.d.ts.map +1 -0
- package/dist/espn/models/activity.js +36 -0
- package/dist/espn/models/activity.js.map +1 -0
- package/dist/espn/models/box-player.d.ts +11 -0
- package/dist/espn/models/box-player.d.ts.map +1 -0
- package/dist/espn/models/box-player.js +37 -0
- package/dist/espn/models/box-player.js.map +1 -0
- package/dist/espn/models/box-score.d.ts +45 -0
- package/dist/espn/models/box-score.d.ts.map +1 -0
- package/dist/espn/models/box-score.js +111 -0
- package/dist/espn/models/box-score.js.map +1 -0
- package/dist/espn/models/matchup.d.ts +22 -0
- package/dist/espn/models/matchup.d.ts.map +1 -0
- package/dist/espn/models/matchup.js +51 -0
- package/dist/espn/models/matchup.js.map +1 -0
- package/dist/espn/models/pick.d.ts +13 -0
- package/dist/espn/models/pick.d.ts.map +1 -0
- package/dist/espn/models/pick.js +25 -0
- package/dist/espn/models/pick.js.map +1 -0
- package/dist/espn/models/player.d.ts +47 -0
- package/dist/espn/models/player.d.ts.map +1 -0
- package/dist/espn/models/player.js +120 -0
- package/dist/espn/models/player.js.map +1 -0
- package/dist/espn/models/settings.d.ts +29 -0
- package/dist/espn/models/settings.d.ts.map +1 -0
- package/dist/espn/models/settings.js +64 -0
- package/dist/espn/models/settings.js.map +1 -0
- package/dist/espn/models/team.d.ts +33 -0
- package/dist/espn/models/team.d.ts.map +1 -0
- package/dist/espn/models/team.js +81 -0
- package/dist/espn/models/team.js.map +1 -0
- package/dist/espn/models/transaction.d.ts +18 -0
- package/dist/espn/models/transaction.d.ts.map +1 -0
- package/dist/espn/models/transaction.js +32 -0
- package/dist/espn/models/transaction.js.map +1 -0
- package/dist/espn/types/raw.d.ts +26 -0
- package/dist/espn/types/raw.d.ts.map +1 -0
- package/dist/espn/utils.d.ts +5 -0
- package/dist/espn/utils.d.ts.map +1 -0
- package/dist/espn/utils.js +35 -0
- package/dist/espn/utils.js.map +1 -0
- package/dist/fantrax/index.d.ts +2 -0
- package/dist/fantrax/index.d.ts.map +1 -0
- package/dist/fantrax/index.js +6 -0
- package/dist/fantrax/index.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/runtime/fetch.d.ts +5 -0
- package/dist/runtime/fetch.d.ts.map +1 -0
- package/dist/runtime/fetch.js +8 -0
- package/dist/runtime/fetch.js.map +1 -0
- package/dist/runtime/index.d.ts +3 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +2 -0
- package/dist/yahoo/client.d.ts +22 -0
- package/dist/yahoo/client.d.ts.map +1 -0
- package/dist/yahoo/client.js +89 -0
- package/dist/yahoo/client.js.map +1 -0
- package/dist/yahoo/constants.d.ts +41 -0
- package/dist/yahoo/constants.d.ts.map +1 -0
- package/dist/yahoo/constants.js +42 -0
- package/dist/yahoo/constants.js.map +1 -0
- package/dist/yahoo/errors.d.ts +24 -0
- package/dist/yahoo/errors.d.ts.map +1 -0
- package/dist/yahoo/errors.js +51 -0
- package/dist/yahoo/errors.js.map +1 -0
- package/dist/yahoo/index.d.ts +30 -0
- package/dist/yahoo/index.d.ts.map +1 -0
- package/dist/yahoo/index.js +23 -0
- package/dist/yahoo/index.js.map +1 -0
- package/dist/yahoo/keys.d.ts +29 -0
- package/dist/yahoo/keys.d.ts.map +1 -0
- package/dist/yahoo/keys.js +63 -0
- package/dist/yahoo/keys.js.map +1 -0
- package/dist/yahoo/models/game.d.ts +31 -0
- package/dist/yahoo/models/game.d.ts.map +1 -0
- package/dist/yahoo/models/game.js +68 -0
- package/dist/yahoo/models/game.js.map +1 -0
- package/dist/yahoo/models/league.d.ts +62 -0
- package/dist/yahoo/models/league.d.ts.map +1 -0
- package/dist/yahoo/models/league.js +129 -0
- package/dist/yahoo/models/league.js.map +1 -0
- package/dist/yahoo/models/matchup.d.ts +12 -0
- package/dist/yahoo/models/matchup.d.ts.map +1 -0
- package/dist/yahoo/models/matchup.js +46 -0
- package/dist/yahoo/models/matchup.js.map +1 -0
- package/dist/yahoo/models/player.d.ts +34 -0
- package/dist/yahoo/models/player.d.ts.map +1 -0
- package/dist/yahoo/models/player.js +44 -0
- package/dist/yahoo/models/player.js.map +1 -0
- package/dist/yahoo/models/roster.d.ts +16 -0
- package/dist/yahoo/models/roster.d.ts.map +1 -0
- package/dist/yahoo/models/roster.js +46 -0
- package/dist/yahoo/models/roster.js.map +1 -0
- package/dist/yahoo/models/settings.d.ts +21 -0
- package/dist/yahoo/models/settings.d.ts.map +1 -0
- package/dist/yahoo/models/settings.js +79 -0
- package/dist/yahoo/models/settings.js.map +1 -0
- package/dist/yahoo/models/team.d.ts +40 -0
- package/dist/yahoo/models/team.d.ts.map +1 -0
- package/dist/yahoo/models/team.js +46 -0
- package/dist/yahoo/models/team.js.map +1 -0
- package/dist/yahoo/models/transaction.d.ts +10 -0
- package/dist/yahoo/models/transaction.d.ts.map +1 -0
- package/dist/yahoo/models/transaction.js +20 -0
- package/dist/yahoo/models/transaction.js.map +1 -0
- package/dist/yahoo/models/user.d.ts +19 -0
- package/dist/yahoo/models/user.d.ts.map +1 -0
- package/dist/yahoo/models/user.js +36 -0
- package/dist/yahoo/models/user.js.map +1 -0
- package/dist/yahoo/parse.d.ts +26 -0
- package/dist/yahoo/parse.d.ts.map +1 -0
- package/dist/yahoo/parse.js +116 -0
- package/dist/yahoo/parse.js.map +1 -0
- package/dist/yahoo/types/raw.d.ts +10 -0
- package/dist/yahoo/types/raw.d.ts.map +1 -0
- package/dist/yahoo/write/roster.d.ts +7 -0
- package/dist/yahoo/write/roster.d.ts.map +1 -0
- package/dist/yahoo/write/roster.js +13 -0
- package/dist/yahoo/write/roster.js.map +1 -0
- package/dist/yahoo/write/transactions.d.ts +42 -0
- package/dist/yahoo/write/transactions.d.ts.map +1 -0
- package/dist/yahoo/write/transactions.js +51 -0
- package/dist/yahoo/write/transactions.js.map +1 -0
- package/dist/yahoo/xml.d.ts +42 -0
- package/dist/yahoo/xml.d.ts.map +1 -0
- package/dist/yahoo/xml.js +118 -0
- package/dist/yahoo/xml.js.map +1 -0
- package/package.json +79 -0
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
import { ACTIVITY_MAP, POSITION_MAP, TRANSACTION_TYPES, View } from "./constants.js";
|
|
2
|
+
import { EspnClient } from "./client.js";
|
|
3
|
+
import { Activity } from "./models/activity.js";
|
|
4
|
+
import { Player } from "./models/player.js";
|
|
5
|
+
import { H2HPointsBoxScore, getBoxScoringTypeClass } from "./models/box-score.js";
|
|
6
|
+
import { Matchup } from "./models/matchup.js";
|
|
7
|
+
import { Pick } from "./models/pick.js";
|
|
8
|
+
import { Settings } from "./models/settings.js";
|
|
9
|
+
import { Team } from "./models/team.js";
|
|
10
|
+
import { Transaction } from "./models/transaction.js";
|
|
11
|
+
//#region src/espn/league.ts
|
|
12
|
+
var League = class League {
|
|
13
|
+
teams = [];
|
|
14
|
+
members = [];
|
|
15
|
+
draft = [];
|
|
16
|
+
playerMap = {};
|
|
17
|
+
settings;
|
|
18
|
+
currentMatchupPeriod = 0;
|
|
19
|
+
scoringPeriodId = 0;
|
|
20
|
+
firstScoringPeriod = 0;
|
|
21
|
+
finalScoringPeriod = 0;
|
|
22
|
+
previousSeasons = [];
|
|
23
|
+
currentWeek = 0;
|
|
24
|
+
year;
|
|
25
|
+
leagueId;
|
|
26
|
+
proSchedule = {};
|
|
27
|
+
matchupIds = {};
|
|
28
|
+
client;
|
|
29
|
+
BoxScoreClass = null;
|
|
30
|
+
constructor(options) {
|
|
31
|
+
this.leagueId = options.leagueId;
|
|
32
|
+
this.year = options.seasonId;
|
|
33
|
+
this.client = new EspnClient({
|
|
34
|
+
leagueId: options.leagueId,
|
|
35
|
+
seasonId: options.seasonId,
|
|
36
|
+
espnS2: options.espnS2,
|
|
37
|
+
swid: options.swid,
|
|
38
|
+
fetch: options.fetch
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
/** Create a league and optionally fetch data (mirrors Python fetch_league=True). */
|
|
42
|
+
static async create(options) {
|
|
43
|
+
const league = new League(options);
|
|
44
|
+
if (options.fetchLeague !== false) await league.fetchLeague();
|
|
45
|
+
return league;
|
|
46
|
+
}
|
|
47
|
+
async fetchLeague() {
|
|
48
|
+
const data = await this.fetchLeagueData();
|
|
49
|
+
await this.fetchTeams(data);
|
|
50
|
+
await this.fetchDraft();
|
|
51
|
+
this.BoxScoreClass = getBoxScoringTypeClass(this.settings.scoringType);
|
|
52
|
+
}
|
|
53
|
+
async fetchLeagueData() {
|
|
54
|
+
const data = await this.client.getLeague();
|
|
55
|
+
this.currentMatchupPeriod = data.status.currentMatchupPeriod;
|
|
56
|
+
this.scoringPeriodId = data.scoringPeriodId;
|
|
57
|
+
this.firstScoringPeriod = data.status.firstScoringPeriod;
|
|
58
|
+
this.finalScoringPeriod = data.status.finalScoringPeriod;
|
|
59
|
+
this.previousSeasons = data.status.previousSeasons?.filter((year) => year < this.year) ?? [];
|
|
60
|
+
if (this.year < 2018) this.currentWeek = data.scoringPeriodId;
|
|
61
|
+
else {
|
|
62
|
+
const finalPeriod = data.status.finalScoringPeriod;
|
|
63
|
+
this.currentWeek = this.scoringPeriodId <= finalPeriod ? this.scoringPeriodId : finalPeriod;
|
|
64
|
+
}
|
|
65
|
+
this.settings = new Settings(data.settings);
|
|
66
|
+
this.members = data.members ?? [];
|
|
67
|
+
await this.fetchPlayers();
|
|
68
|
+
this.mapMatchupIds(data.schedule ?? []);
|
|
69
|
+
return data;
|
|
70
|
+
}
|
|
71
|
+
mapMatchupIds(schedule) {
|
|
72
|
+
this.matchupIds = {};
|
|
73
|
+
for (const match of schedule) {
|
|
74
|
+
const matchupPeriod = match.matchupPeriodId;
|
|
75
|
+
const scoringPeriods = Object.keys(match.home.pointsByScoringPeriod ?? {});
|
|
76
|
+
if (scoringPeriods.length > 0) {
|
|
77
|
+
const periods = scoringPeriods.map(Number).sort((a, b) => a - b);
|
|
78
|
+
if (!(matchupPeriod in this.matchupIds)) this.matchupIds[matchupPeriod] = periods;
|
|
79
|
+
else this.matchupIds[matchupPeriod] = [...new Set([...this.matchupIds[matchupPeriod], ...periods])].sort((a, b) => a - b);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
async fetchPlayers() {
|
|
84
|
+
const data = await this.client.getProPlayers();
|
|
85
|
+
for (const player of data) {
|
|
86
|
+
this.playerMap[player.id] = player.fullName;
|
|
87
|
+
if (!(player.fullName in this.playerMap)) this.playerMap[player.fullName] = player.id;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
async fetchTeams(data) {
|
|
91
|
+
this.proSchedule = await this.getAllProSchedule();
|
|
92
|
+
this.teams = [];
|
|
93
|
+
const teams = data.teams ?? [];
|
|
94
|
+
const schedule = data.schedule ?? [];
|
|
95
|
+
const seasonId = data.seasonId;
|
|
96
|
+
const members = data.members ?? [];
|
|
97
|
+
const teamRoster = {};
|
|
98
|
+
for (const team of teams) teamRoster[team.id] = team.roster ?? {};
|
|
99
|
+
for (const team of teams) {
|
|
100
|
+
const roster = teamRoster[team.id];
|
|
101
|
+
const owners = members.filter((member) => (team.owners ?? []).includes(member.id));
|
|
102
|
+
this.teams.push(new Team(team, roster, schedule, seasonId, {
|
|
103
|
+
proSchedule: this.proSchedule,
|
|
104
|
+
owners
|
|
105
|
+
}));
|
|
106
|
+
}
|
|
107
|
+
this.teams.sort((a, b) => a.teamId - b.teamId);
|
|
108
|
+
for (const team of this.teams) {
|
|
109
|
+
team.divisionName = this.settings.divisionMap[team.divisionId] ?? "";
|
|
110
|
+
for (const matchup of team.schedule) for (const opponent of this.teams) {
|
|
111
|
+
if (matchup.awayTeam === opponent.teamId) matchup.awayTeam = opponent;
|
|
112
|
+
if (matchup.homeTeam === opponent.teamId) matchup.homeTeam = opponent;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
async getAllProSchedule() {
|
|
117
|
+
const proTeams = (await this.client.getProSchedule()).settings?.proTeams ?? [];
|
|
118
|
+
const proTeamSchedule = {};
|
|
119
|
+
for (const team of proTeams) {
|
|
120
|
+
const proGame = team.proGamesByScoringPeriod ?? {};
|
|
121
|
+
proTeamSchedule[team.id] = proGame;
|
|
122
|
+
}
|
|
123
|
+
return proTeamSchedule;
|
|
124
|
+
}
|
|
125
|
+
async fetchDraft() {
|
|
126
|
+
const draftDetail = (await this.client.getLeagueDraft()).draftDetail ?? {};
|
|
127
|
+
if (!draftDetail.drafted) return;
|
|
128
|
+
const picks = draftDetail.picks ?? [];
|
|
129
|
+
this.draft = [];
|
|
130
|
+
for (const pick of picks) {
|
|
131
|
+
const team = this.getTeamData(pick.teamId);
|
|
132
|
+
const playerId = pick.playerId;
|
|
133
|
+
let playerName = "";
|
|
134
|
+
if (playerId in this.playerMap) playerName = String(this.playerMap[playerId]);
|
|
135
|
+
this.draft.push(new Pick(team, playerId, playerName, pick.roundId, pick.roundPickNumber, pick.bidAmount, pick.keeper, this.getTeamData(pick.nominatingTeamId)));
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
getTeamData(teamId) {
|
|
139
|
+
return this.teams.find((team) => team.teamId === teamId);
|
|
140
|
+
}
|
|
141
|
+
standings() {
|
|
142
|
+
return [...this.teams].sort((a, b) => {
|
|
143
|
+
return (a.finalStanding && a.finalStanding !== 0 ? a.finalStanding : a.standing) - (b.finalStanding && b.finalStanding !== 0 ? b.finalStanding : b.standing);
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
async scoreboard(matchupPeriod) {
|
|
147
|
+
const period = matchupPeriod ?? this.currentMatchupPeriod;
|
|
148
|
+
const matchups = ((await this.client.leagueGet({ params: { view: View.MMatchup } })).schedule ?? []).filter((matchup) => matchup.matchupPeriodId === period).map((matchup) => new Matchup(matchup));
|
|
149
|
+
for (const team of this.teams) for (const matchup of matchups) if (matchup.homeTeam === team.teamId) matchup.homeTeam = team;
|
|
150
|
+
else if (matchup.awayTeam === team.teamId) matchup.awayTeam = team;
|
|
151
|
+
return matchups;
|
|
152
|
+
}
|
|
153
|
+
async recentActivity(options = {}) {
|
|
154
|
+
if (this.year < 2019) throw new Error("Cant use recent activity before 2019");
|
|
155
|
+
const { size = 25, msgType, offset = 0, includeMoved = false } = options;
|
|
156
|
+
let msgTypes = [
|
|
157
|
+
178,
|
|
158
|
+
180,
|
|
159
|
+
179,
|
|
160
|
+
239,
|
|
161
|
+
181,
|
|
162
|
+
244,
|
|
163
|
+
188
|
|
164
|
+
];
|
|
165
|
+
if (msgType && msgType in ACTIVITY_MAP) msgTypes = [ACTIVITY_MAP[msgType]];
|
|
166
|
+
const filters = { topics: {
|
|
167
|
+
filterType: { value: ["ACTIVITY_TRANSACTIONS"] },
|
|
168
|
+
limit: size,
|
|
169
|
+
limitPerMessageSet: { value: 25 },
|
|
170
|
+
offset,
|
|
171
|
+
sortMessageDate: {
|
|
172
|
+
sortPriority: 1,
|
|
173
|
+
sortAsc: false
|
|
174
|
+
},
|
|
175
|
+
sortFor: {
|
|
176
|
+
sortPriority: 2,
|
|
177
|
+
sortAsc: false
|
|
178
|
+
},
|
|
179
|
+
filterIncludeMessageTypeIds: { value: msgTypes }
|
|
180
|
+
} };
|
|
181
|
+
return ((await this.client.leagueGet({
|
|
182
|
+
extend: "/communication/",
|
|
183
|
+
params: { view: View.KonaLeagueCommunication },
|
|
184
|
+
headers: { "x-fantasy-filter": JSON.stringify(filters) }
|
|
185
|
+
})).topics ?? []).map((topic) => new Activity(topic, this.playerMap, (id) => this.getTeamData(id), includeMoved));
|
|
186
|
+
}
|
|
187
|
+
async transactions(options = {}) {
|
|
188
|
+
const scoringPeriod = options.scoringPeriod ?? this.scoringPeriodId;
|
|
189
|
+
const types = options.types ?? new Set([
|
|
190
|
+
"FREEAGENT",
|
|
191
|
+
"WAIVER",
|
|
192
|
+
"WAIVER_ERROR"
|
|
193
|
+
]);
|
|
194
|
+
for (const type of types) if (!TRANSACTION_TYPES.has(type)) throw new Error("Invalid transaction type");
|
|
195
|
+
const filters = { transactions: { filterType: { value: [...types] } } };
|
|
196
|
+
return ((await this.client.leagueGet({
|
|
197
|
+
params: {
|
|
198
|
+
view: View.MTransactions2,
|
|
199
|
+
scoringPeriodId: scoringPeriod
|
|
200
|
+
},
|
|
201
|
+
headers: { "x-fantasy-filter": JSON.stringify(filters) }
|
|
202
|
+
})).transactions ?? []).map((transaction) => new Transaction(transaction, this.playerMap, (id) => this.getTeamData(id)));
|
|
203
|
+
}
|
|
204
|
+
async freeAgents(options = {}) {
|
|
205
|
+
if (this.year < 2019) throw new Error("Cant use free agents before 2019");
|
|
206
|
+
const week = options.week ?? this.currentWeek;
|
|
207
|
+
const size = options.size ?? 50;
|
|
208
|
+
const slotFilter = [];
|
|
209
|
+
if (options.position && options.position in POSITION_MAP) slotFilter.push(POSITION_MAP[options.position]);
|
|
210
|
+
if (options.positionId !== void 0) slotFilter.push(options.positionId);
|
|
211
|
+
const filters = { players: {
|
|
212
|
+
filterStatus: { value: ["FREEAGENT", "WAIVERS"] },
|
|
213
|
+
filterSlotIds: { value: slotFilter },
|
|
214
|
+
limit: size,
|
|
215
|
+
sortPercOwned: {
|
|
216
|
+
sortPriority: 1,
|
|
217
|
+
sortAsc: false
|
|
218
|
+
},
|
|
219
|
+
sortDraftRanks: {
|
|
220
|
+
sortPriority: 100,
|
|
221
|
+
sortAsc: true,
|
|
222
|
+
value: "STANDARD"
|
|
223
|
+
}
|
|
224
|
+
} };
|
|
225
|
+
return ((await this.client.leagueGet({
|
|
226
|
+
params: {
|
|
227
|
+
view: View.KonaPlayerInfo,
|
|
228
|
+
scoringPeriodId: week
|
|
229
|
+
},
|
|
230
|
+
headers: { "x-fantasy-filter": JSON.stringify(filters) }
|
|
231
|
+
})).players ?? []).map((player) => new Player(player, this.year));
|
|
232
|
+
}
|
|
233
|
+
async boxScores(options = {}) {
|
|
234
|
+
if (this.year < 2019) throw new Error("Cant use box score before 2019");
|
|
235
|
+
const matchupTotal = options.matchupTotal ?? true;
|
|
236
|
+
let matchupId = this.currentMatchupPeriod;
|
|
237
|
+
let scoringId = this.currentWeek;
|
|
238
|
+
if (options.matchupPeriod !== void 0 && options.scoringPeriod !== void 0) {
|
|
239
|
+
matchupId = options.matchupPeriod;
|
|
240
|
+
scoringId = options.scoringPeriod;
|
|
241
|
+
} else if (options.matchupPeriod !== void 0 && options.matchupPeriod < matchupId) {
|
|
242
|
+
matchupId = options.matchupPeriod;
|
|
243
|
+
scoringId = this.matchupIds[options.matchupPeriod]?.at(-1) ?? 1;
|
|
244
|
+
} else if (options.scoringPeriod !== void 0 && options.scoringPeriod <= scoringId) {
|
|
245
|
+
scoringId = options.scoringPeriod;
|
|
246
|
+
for (const matchup of Object.keys(this.matchupIds).map(Number)) if (this.matchupIds[matchup].map(String).includes(String(scoringId))) {
|
|
247
|
+
matchupId = matchup;
|
|
248
|
+
break;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
const filters = { schedule: { filterMatchupPeriodIds: { value: [matchupId] } } };
|
|
252
|
+
const schedule = (await this.client.leagueGet({
|
|
253
|
+
params: {
|
|
254
|
+
view: [View.MMatchupScore, View.MScoreboard],
|
|
255
|
+
scoringPeriodId: scoringId
|
|
256
|
+
},
|
|
257
|
+
headers: { "x-fantasy-filter": JSON.stringify(filters) }
|
|
258
|
+
})).schedule ?? [];
|
|
259
|
+
const BoxScoreCtor = this.BoxScoreClass ?? H2HPointsBoxScore;
|
|
260
|
+
const boxData = schedule.map((matchup) => new BoxScoreCtor(matchup, this.proSchedule, matchupTotal, this.year, scoringId));
|
|
261
|
+
for (const team of this.teams) for (const matchup of boxData) if (matchup.homeTeam === team.teamId) matchup.homeTeam = team;
|
|
262
|
+
else if (matchup.awayTeam === team.teamId) matchup.awayTeam = team;
|
|
263
|
+
return boxData;
|
|
264
|
+
}
|
|
265
|
+
async playerInfo(options) {
|
|
266
|
+
let playerIds = options.playerId;
|
|
267
|
+
if (options.name) playerIds = this.playerMap[options.name];
|
|
268
|
+
if (playerIds === void 0 || playerIds === null || typeof playerIds === "string") return null;
|
|
269
|
+
const ids = Array.isArray(playerIds) ? playerIds : [playerIds];
|
|
270
|
+
const data = await this.client.getPlayerCard(ids, this.finalScoringPeriod);
|
|
271
|
+
const newsMap = {};
|
|
272
|
+
if (options.includeNews) for (const id of ids) newsMap[id] = await this.client.getPlayerNews(id);
|
|
273
|
+
const players = data.players ?? [];
|
|
274
|
+
if (players.length === 1) return new Player(players[0], this.year, this.proSchedule, options.includeNews ? newsMap[ids[0]] ?? null : null);
|
|
275
|
+
if (players.length > 1) return players.map((player) => {
|
|
276
|
+
const id = player.id;
|
|
277
|
+
return new Player(player, this.year, this.proSchedule, options.includeNews ? newsMap[id] ?? null : null);
|
|
278
|
+
});
|
|
279
|
+
return null;
|
|
280
|
+
}
|
|
281
|
+
};
|
|
282
|
+
//#endregion
|
|
283
|
+
export { League };
|
|
284
|
+
|
|
285
|
+
//# sourceMappingURL=league.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"league.js","names":[],"sources":["../../src/espn/league.ts"],"sourcesContent":["import { EspnClient } from './client.js';\nimport {\n ACTIVITY_MAP,\n POSITION_MAP,\n TRANSACTION_TYPES,\n View,\n} from './constants.js';\nimport { Activity } from './models/activity.js';\nimport {\n getBoxScoringTypeClass,\n H2HPointsBoxScore,\n type BoxScoreInstance,\n} from './models/box-score.js';\nimport { Matchup } from './models/matchup.js';\nimport { Pick } from './models/pick.js';\nimport { Player, type ProTeamSchedule } from './models/player.js';\nimport { Settings } from './models/settings.js';\nimport { Team } from './models/team.js';\nimport { Transaction } from './models/transaction.js';\nimport type { EspnLeagueResponse, JsonObject } from './types/raw.js';\n\nexport interface LeagueOptions {\n leagueId: number;\n seasonId: number;\n espnS2?: string;\n swid?: string;\n fetchLeague?: boolean;\n fetch?: typeof globalThis.fetch;\n}\n\nexport class League {\n teams: Team[] = [];\n members: JsonObject[] = [];\n draft: Pick[] = [];\n playerMap: Record<number | string, number | string> = {};\n settings!: Settings;\n currentMatchupPeriod = 0;\n scoringPeriodId = 0;\n firstScoringPeriod = 0;\n finalScoringPeriod = 0;\n previousSeasons: number[] = [];\n currentWeek = 0;\n year: number;\n leagueId: number;\n proSchedule: ProTeamSchedule = {};\n matchupIds: Record<number, number[]> = {};\n\n private readonly client: EspnClient;\n private BoxScoreClass:\n | ReturnType<typeof getBoxScoringTypeClass>\n | null = null;\n\n constructor(options: LeagueOptions) {\n this.leagueId = options.leagueId;\n this.year = options.seasonId;\n this.client = new EspnClient({\n leagueId: options.leagueId,\n seasonId: options.seasonId,\n espnS2: options.espnS2,\n swid: options.swid,\n fetch: options.fetch,\n });\n }\n\n /** Create a league and optionally fetch data (mirrors Python fetch_league=True). */\n static async create(options: LeagueOptions): Promise<League> {\n const league = new League(options);\n if (options.fetchLeague !== false) {\n await league.fetchLeague();\n }\n return league;\n }\n\n async fetchLeague(): Promise<void> {\n const data = await this.fetchLeagueData();\n await this.fetchTeams(data);\n await this.fetchDraft();\n this.BoxScoreClass = getBoxScoringTypeClass(this.settings.scoringType);\n }\n\n private async fetchLeagueData(): Promise<EspnLeagueResponse> {\n const data = await this.client.getLeague();\n this.currentMatchupPeriod = (data.status as JsonObject).currentMatchupPeriod as number;\n this.scoringPeriodId = data.scoringPeriodId as number;\n this.firstScoringPeriod = (data.status as JsonObject).firstScoringPeriod as number;\n this.finalScoringPeriod = (data.status as JsonObject).finalScoringPeriod as number;\n this.previousSeasons = (\n (data.status as JsonObject).previousSeasons as number[] | undefined\n )?.filter((year) => year < this.year) ?? [];\n\n if (this.year < 2018) {\n this.currentWeek = data.scoringPeriodId as number;\n } else {\n const finalPeriod = (data.status as JsonObject).finalScoringPeriod as number;\n this.currentWeek =\n this.scoringPeriodId <= finalPeriod ? this.scoringPeriodId : finalPeriod;\n }\n\n this.settings = new Settings(data.settings as JsonObject);\n this.members = (data.members as JsonObject[] | undefined) ?? [];\n\n await this.fetchPlayers();\n this.mapMatchupIds((data.schedule as JsonObject[] | undefined) ?? []);\n return data;\n }\n\n private mapMatchupIds(schedule: JsonObject[]): void {\n this.matchupIds = {};\n for (const match of schedule) {\n const matchupPeriod = match.matchupPeriodId as number;\n const scoringPeriods = Object.keys(\n ((match.home as JsonObject).pointsByScoringPeriod as JsonObject | undefined) ?? {},\n );\n if (scoringPeriods.length > 0) {\n const periods = scoringPeriods.map(Number).sort((a, b) => a - b);\n if (!(matchupPeriod in this.matchupIds)) {\n this.matchupIds[matchupPeriod] = periods;\n } else {\n this.matchupIds[matchupPeriod] = [\n ...new Set([...this.matchupIds[matchupPeriod]!, ...periods]),\n ].sort((a, b) => a - b);\n }\n }\n }\n }\n\n private async fetchPlayers(): Promise<void> {\n const data = await this.client.getProPlayers();\n for (const player of data) {\n this.playerMap[player.id] = player.fullName;\n if (!(player.fullName in this.playerMap)) {\n this.playerMap[player.fullName] = player.id;\n }\n }\n }\n\n private async fetchTeams(data: EspnLeagueResponse): Promise<void> {\n this.proSchedule = await this.getAllProSchedule();\n this.teams = [];\n const teams = (data.teams as JsonObject[] | undefined) ?? [];\n const schedule = (data.schedule as JsonObject[] | undefined) ?? [];\n const seasonId = data.seasonId as number;\n const members = (data.members as JsonObject[] | undefined) ?? [];\n\n const teamRoster: Record<number, JsonObject> = {};\n for (const team of teams) {\n teamRoster[team.id as number] = (team.roster as JsonObject | undefined) ?? {};\n }\n\n for (const team of teams) {\n const roster = teamRoster[team.id as number]!;\n const owners = members.filter((member) =>\n ((team.owners as string[] | undefined) ?? []).includes(member.id as string),\n );\n this.teams.push(\n new Team(team, roster, schedule, seasonId, {\n proSchedule: this.proSchedule,\n owners,\n }),\n );\n }\n\n this.teams.sort((a, b) => a.teamId - b.teamId);\n\n for (const team of this.teams) {\n team.divisionName = this.settings.divisionMap[team.divisionId] ?? '';\n for (const matchup of team.schedule) {\n for (const opponent of this.teams) {\n if (matchup.awayTeam === opponent.teamId) {\n matchup.awayTeam = opponent;\n }\n if (matchup.homeTeam === opponent.teamId) {\n matchup.homeTeam = opponent;\n }\n }\n }\n }\n }\n\n private async getAllProSchedule(): Promise<ProTeamSchedule> {\n const data = await this.client.getProSchedule();\n const proTeams = data.settings?.proTeams ?? [];\n const proTeamSchedule: ProTeamSchedule = {};\n\n for (const team of proTeams) {\n const proGame =\n (team.proGamesByScoringPeriod as ProTeamSchedule[number] | undefined) ?? {};\n proTeamSchedule[team.id as number] = proGame;\n }\n\n return proTeamSchedule;\n }\n\n private async fetchDraft(): Promise<void> {\n const data = await this.client.getLeagueDraft();\n const draftDetail = (data.draftDetail as JsonObject | undefined) ?? {};\n if (!draftDetail.drafted) {\n return;\n }\n\n const picks = (draftDetail.picks as JsonObject[] | undefined) ?? [];\n this.draft = [];\n for (const pick of picks) {\n const team = this.getTeamData(pick.teamId as number);\n const playerId = pick.playerId as number;\n let playerName = '';\n if (playerId in this.playerMap) {\n playerName = String(this.playerMap[playerId]);\n }\n this.draft.push(\n new Pick(\n team,\n playerId,\n playerName,\n pick.roundId as number,\n pick.roundPickNumber as number,\n pick.bidAmount,\n pick.keeper,\n this.getTeamData(pick.nominatingTeamId as number),\n ),\n );\n }\n }\n\n getTeamData(teamId: number): Team | undefined {\n return this.teams.find((team) => team.teamId === teamId);\n }\n\n standings(): Team[] {\n return [...this.teams].sort((a, b) => {\n const aRank = a.finalStanding && a.finalStanding !== 0 ? a.finalStanding : a.standing;\n const bRank = b.finalStanding && b.finalStanding !== 0 ? b.finalStanding : b.standing;\n return aRank - bRank;\n });\n }\n\n async scoreboard(matchupPeriod?: number): Promise<Matchup[]> {\n const period = matchupPeriod ?? this.currentMatchupPeriod;\n const data = await this.client.leagueGet({\n params: { view: View.MMatchup },\n });\n const schedule = (data.schedule as JsonObject[] | undefined) ?? [];\n const matchups = schedule\n .filter((matchup) => matchup.matchupPeriodId === period)\n .map((matchup) => new Matchup(matchup));\n\n for (const team of this.teams) {\n for (const matchup of matchups) {\n if (matchup.homeTeam === team.teamId) {\n matchup.homeTeam = team;\n } else if (matchup.awayTeam === team.teamId) {\n matchup.awayTeam = team;\n }\n }\n }\n\n return matchups;\n }\n\n async recentActivity(options: {\n size?: number;\n msgType?: string;\n offset?: number;\n includeMoved?: boolean;\n } = {}): Promise<Activity[]> {\n if (this.year < 2019) {\n throw new Error('Cant use recent activity before 2019');\n }\n\n const { size = 25, msgType, offset = 0, includeMoved = false } = options;\n let msgTypes = [178, 180, 179, 239, 181, 244, 188];\n if (msgType && msgType in ACTIVITY_MAP) {\n msgTypes = [ACTIVITY_MAP[msgType] as number];\n }\n\n const filters = {\n topics: {\n filterType: { value: ['ACTIVITY_TRANSACTIONS'] },\n limit: size,\n limitPerMessageSet: { value: 25 },\n offset,\n sortMessageDate: { sortPriority: 1, sortAsc: false },\n sortFor: { sortPriority: 2, sortAsc: false },\n filterIncludeMessageTypeIds: { value: msgTypes },\n },\n };\n\n const data = await this.client.leagueGet({\n extend: '/communication/',\n params: { view: View.KonaLeagueCommunication },\n headers: { 'x-fantasy-filter': JSON.stringify(filters) },\n });\n\n const topics = (data.topics as JsonObject[] | undefined) ?? [];\n return topics.map(\n (topic) =>\n new Activity(topic, this.playerMap, (id) => this.getTeamData(id), includeMoved),\n );\n }\n\n async transactions(options: {\n scoringPeriod?: number;\n types?: Set<string>;\n } = {}): Promise<Transaction[]> {\n const scoringPeriod = options.scoringPeriod ?? this.scoringPeriodId;\n const types = options.types ?? new Set(['FREEAGENT', 'WAIVER', 'WAIVER_ERROR']);\n\n for (const type of types) {\n if (!TRANSACTION_TYPES.has(type)) {\n throw new Error('Invalid transaction type');\n }\n }\n\n const filters = {\n transactions: { filterType: { value: [...types] } },\n };\n\n const data = await this.client.leagueGet({\n params: {\n view: View.MTransactions2,\n scoringPeriodId: scoringPeriod,\n },\n headers: { 'x-fantasy-filter': JSON.stringify(filters) },\n });\n\n const transactions = (data.transactions as JsonObject[] | undefined) ?? [];\n return transactions.map(\n (transaction) =>\n new Transaction(transaction, this.playerMap, (id) => this.getTeamData(id)),\n );\n }\n\n async freeAgents(options: {\n week?: number;\n size?: number;\n position?: string;\n positionId?: number;\n } = {}): Promise<Player[]> {\n if (this.year < 2019) {\n throw new Error('Cant use free agents before 2019');\n }\n\n const week = options.week ?? this.currentWeek;\n const size = options.size ?? 50;\n const slotFilter: number[] = [];\n\n if (options.position && options.position in POSITION_MAP) {\n slotFilter.push(POSITION_MAP[options.position] as number);\n }\n if (options.positionId !== undefined) {\n slotFilter.push(options.positionId);\n }\n\n const filters = {\n players: {\n filterStatus: { value: ['FREEAGENT', 'WAIVERS'] },\n filterSlotIds: { value: slotFilter },\n limit: size,\n sortPercOwned: { sortPriority: 1, sortAsc: false },\n sortDraftRanks: { sortPriority: 100, sortAsc: true, value: 'STANDARD' },\n },\n };\n\n const data = await this.client.leagueGet({\n params: {\n view: View.KonaPlayerInfo,\n scoringPeriodId: week,\n },\n headers: { 'x-fantasy-filter': JSON.stringify(filters) },\n });\n\n const players = (data.players as JsonObject[] | undefined) ?? [];\n return players.map((player) => new Player(player, this.year));\n }\n\n async boxScores(options: {\n matchupPeriod?: number;\n scoringPeriod?: number;\n matchupTotal?: boolean;\n } = {}): Promise<BoxScoreInstance[]> {\n if (this.year < 2019) {\n throw new Error('Cant use box score before 2019');\n }\n\n const matchupTotal = options.matchupTotal ?? true;\n let matchupId = this.currentMatchupPeriod;\n let scoringId = this.currentWeek;\n\n if (options.matchupPeriod !== undefined && options.scoringPeriod !== undefined) {\n matchupId = options.matchupPeriod;\n scoringId = options.scoringPeriod;\n } else if (options.matchupPeriod !== undefined && options.matchupPeriod < matchupId) {\n matchupId = options.matchupPeriod;\n scoringId = this.matchupIds[options.matchupPeriod]?.at(-1) ?? 1;\n } else if (\n options.scoringPeriod !== undefined &&\n options.scoringPeriod <= scoringId\n ) {\n scoringId = options.scoringPeriod;\n for (const matchup of Object.keys(this.matchupIds).map(Number)) {\n if (this.matchupIds[matchup]!.map(String).includes(String(scoringId))) {\n matchupId = matchup;\n break;\n }\n }\n }\n\n const filters = {\n schedule: { filterMatchupPeriodIds: { value: [matchupId] } },\n };\n\n const data = await this.client.leagueGet({\n params: {\n view: [View.MMatchupScore, View.MScoreboard],\n scoringPeriodId: scoringId,\n },\n headers: { 'x-fantasy-filter': JSON.stringify(filters) },\n });\n\n const schedule = (data.schedule as JsonObject[] | undefined) ?? [];\n const BoxScoreCtor = this.BoxScoreClass ?? H2HPointsBoxScore;\n const boxData = schedule.map(\n (matchup) =>\n new BoxScoreCtor(matchup, this.proSchedule, matchupTotal, this.year, scoringId) as BoxScoreInstance,\n );\n\n for (const team of this.teams) {\n for (const matchup of boxData) {\n if (matchup.homeTeam === team.teamId) {\n matchup.homeTeam = team;\n } else if (matchup.awayTeam === team.teamId) {\n matchup.awayTeam = team;\n }\n }\n }\n\n return boxData;\n }\n\n async playerInfo(options: {\n name?: string;\n playerId?: number | number[];\n includeNews?: boolean;\n }): Promise<Player | Player[] | null> {\n let playerIds = options.playerId;\n if (options.name) {\n playerIds = this.playerMap[options.name] as number | undefined;\n }\n if (playerIds === undefined || playerIds === null || typeof playerIds === 'string') {\n return null;\n }\n\n const ids = Array.isArray(playerIds) ? playerIds : [playerIds];\n const data = await this.client.getPlayerCard(ids, this.finalScoringPeriod);\n\n const newsMap: Record<number, JsonObject> = {};\n if (options.includeNews) {\n for (const id of ids) {\n newsMap[id] = (await this.client.getPlayerNews(id)) as JsonObject;\n }\n }\n\n const players = (data.players as JsonObject[] | undefined) ?? [];\n if (players.length === 1) {\n return new Player(\n players[0]!,\n this.year,\n this.proSchedule,\n options.includeNews ? newsMap[ids[0]!] ?? null : null,\n );\n }\n if (players.length > 1) {\n return players.map((player) => {\n const id = player.id as number;\n return new Player(\n player,\n this.year,\n this.proSchedule,\n options.includeNews ? newsMap[id] ?? null : null,\n );\n });\n }\n return null;\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { JsonObject } from '../types/raw.js';
|
|
2
|
+
import type { Team } from './team.js';
|
|
3
|
+
export interface ActivityAction {
|
|
4
|
+
team: Team | string;
|
|
5
|
+
action: string;
|
|
6
|
+
player: string;
|
|
7
|
+
position: string;
|
|
8
|
+
}
|
|
9
|
+
export declare class Activity {
|
|
10
|
+
actions: ActivityAction[];
|
|
11
|
+
date: unknown;
|
|
12
|
+
constructor(data: JsonObject, playerMap: Record<number | string, number | string>, getTeamData: (teamId: number) => Team | undefined, includeMoved?: boolean);
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=activity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activity.d.ts","sourceRoot":"","sources":["../../../src/espn/models/activity.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,IAAI,GAAG,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,QAAQ;IACnB,OAAO,EAAE,cAAc,EAAE,CAAM;IAC/B,IAAI,EAAE,OAAO,CAAC;gBAGZ,IAAI,EAAE,UAAU,EAChB,SAAS,EAAE,MAAM,CAAC,MAAM,GAAG,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,EACnD,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,SAAS,EACjD,YAAY,UAAQ;CAuCvB"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { ACTIVITY_MAP, POSITION_MAP } from "../constants.js";
|
|
2
|
+
//#region src/espn/models/activity.ts
|
|
3
|
+
var Activity = class {
|
|
4
|
+
actions = [];
|
|
5
|
+
date;
|
|
6
|
+
constructor(data, playerMap, getTeamData, includeMoved = false) {
|
|
7
|
+
this.date = data.date;
|
|
8
|
+
const messages = data.messages ?? [];
|
|
9
|
+
for (const msg of messages) {
|
|
10
|
+
let team = "";
|
|
11
|
+
let action = "UNKNOWN";
|
|
12
|
+
let player = "";
|
|
13
|
+
let position = "";
|
|
14
|
+
const msgId = msg.messageTypeId;
|
|
15
|
+
if (msgId === 244) team = getTeamData(msg.from) ?? "";
|
|
16
|
+
else if (msgId === 239) team = getTeamData(msg.for) ?? "";
|
|
17
|
+
else if (msgId === 188 && includeMoved && msg.to in POSITION_MAP) position = POSITION_MAP[msg.to];
|
|
18
|
+
else team = getTeamData(msg.to) ?? "";
|
|
19
|
+
if (msgId in ACTIVITY_MAP) {
|
|
20
|
+
if (includeMoved) action = ACTIVITY_MAP[msgId];
|
|
21
|
+
else if (msgId !== 188) action = ACTIVITY_MAP[msgId];
|
|
22
|
+
}
|
|
23
|
+
if (msg.targetId in playerMap) player = String(playerMap[msg.targetId]);
|
|
24
|
+
if (action !== "UNKNOWN") this.actions.push({
|
|
25
|
+
team,
|
|
26
|
+
action,
|
|
27
|
+
player,
|
|
28
|
+
position
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
//#endregion
|
|
34
|
+
export { Activity };
|
|
35
|
+
|
|
36
|
+
//# sourceMappingURL=activity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activity.js","names":[],"sources":["../../../src/espn/models/activity.ts"],"sourcesContent":["import { ACTIVITY_MAP, POSITION_MAP } from '../constants.js';\nimport type { JsonObject } from '../types/raw.js';\nimport type { Team } from './team.js';\n\nexport interface ActivityAction {\n team: Team | string;\n action: string;\n player: string;\n position: string;\n}\n\nexport class Activity {\n actions: ActivityAction[] = [];\n date: unknown;\n\n constructor(\n data: JsonObject,\n playerMap: Record<number | string, number | string>,\n getTeamData: (teamId: number) => Team | undefined,\n includeMoved = false,\n ) {\n this.date = data.date;\n const messages = (data.messages as JsonObject[] | undefined) ?? [];\n\n for (const msg of messages) {\n let team: Team | string = '';\n let action = 'UNKNOWN';\n let player = '';\n let position = '';\n const msgId = msg.messageTypeId as number;\n\n if (msgId === 244) {\n team = getTeamData(msg.from as number) ?? '';\n } else if (msgId === 239) {\n team = getTeamData(msg.for as number) ?? '';\n } else if (msgId === 188 && includeMoved && (msg.to as number) in POSITION_MAP) {\n position = POSITION_MAP[msg.to as number] as string;\n } else {\n team = getTeamData(msg.to as number) ?? '';\n }\n\n if (msgId in ACTIVITY_MAP) {\n if (includeMoved) {\n action = ACTIVITY_MAP[msgId] as string;\n } else if (msgId !== 188) {\n action = ACTIVITY_MAP[msgId] as string;\n }\n }\n\n if ((msg.targetId as number) in playerMap) {\n player = String(playerMap[msg.targetId as number]!);\n }\n\n if (action !== 'UNKNOWN') {\n this.actions.push({ team, action, player, position });\n }\n }\n }\n}\n"],"mappings":";;AAWA,IAAa,WAAb,MAAsB;CACpB,UAA4B,CAAC;CAC7B;CAEA,YACE,MACA,WACA,aACA,eAAe,OACf;EACA,KAAK,OAAO,KAAK;EACjB,MAAM,WAAY,KAAK,YAAyC,CAAC;EAEjE,KAAK,MAAM,OAAO,UAAU;GAC1B,IAAI,OAAsB;GAC1B,IAAI,SAAS;GACb,IAAI,SAAS;GACb,IAAI,WAAW;GACf,MAAM,QAAQ,IAAI;GAElB,IAAI,UAAU,KACZ,OAAO,YAAY,IAAI,IAAc,KAAK;QACrC,IAAI,UAAU,KACnB,OAAO,YAAY,IAAI,GAAa,KAAK;QACpC,IAAI,UAAU,OAAO,gBAAiB,IAAI,MAAiB,cAChE,WAAW,aAAa,IAAI;QAE5B,OAAO,YAAY,IAAI,EAAY,KAAK;GAG1C,IAAI,SAAS;QACP,cACF,SAAS,aAAa;SACjB,IAAI,UAAU,KACnB,SAAS,aAAa;GAAA;GAI1B,IAAK,IAAI,YAAuB,WAC9B,SAAS,OAAO,UAAU,IAAI,SAAoB;GAGpD,IAAI,WAAW,WACb,KAAK,QAAQ,KAAK;IAAE;IAAM;IAAQ;IAAQ;GAAS,CAAC;EAExD;CACF;AACF"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { JsonObject } from '../types/raw.js';
|
|
2
|
+
import { Player, type ProTeamSchedule } from './player.js';
|
|
3
|
+
export declare class BoxPlayer extends Player {
|
|
4
|
+
slotPosition: string;
|
|
5
|
+
proOpponent: string;
|
|
6
|
+
gamePlayed: number;
|
|
7
|
+
points: number;
|
|
8
|
+
pointsBreakdown: Record<string, number>;
|
|
9
|
+
constructor(data: JsonObject, proSchedule: ProTeamSchedule, year: number, scoringPeriod: number);
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=box-player.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"box-player.d.ts","sourceRoot":"","sources":["../../../src/espn/models/box-player.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAE3D,qBAAa,SAAU,SAAQ,MAAM;IACnC,YAAY,SAAQ;IACpB,WAAW,SAAU;IACrB,UAAU,SAAO;IACjB,MAAM,SAAK;IACX,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAM;gBAG3C,IAAI,EAAE,UAAU,EAChB,WAAW,EAAE,eAAe,EAC5B,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,MAAM;CAyCxB"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { POSITION_MAP, PRO_TEAM_MAP, STATS_MAP } from "../constants.js";
|
|
2
|
+
import { Player } from "./player.js";
|
|
3
|
+
//#region src/espn/models/box-player.ts
|
|
4
|
+
var BoxPlayer = class extends Player {
|
|
5
|
+
slotPosition = "FA";
|
|
6
|
+
proOpponent = "None";
|
|
7
|
+
gamePlayed = 100;
|
|
8
|
+
points = 0;
|
|
9
|
+
pointsBreakdown = {};
|
|
10
|
+
constructor(data, proSchedule, year, scoringPeriod) {
|
|
11
|
+
super(data, year, proSchedule);
|
|
12
|
+
if ("lineupSlotId" in data) this.slotPosition = POSITION_MAP[data.lineupSlotId];
|
|
13
|
+
const player = "playerPoolEntry" in data ? data.playerPoolEntry.player : data.player;
|
|
14
|
+
const proId = player.proTeamId;
|
|
15
|
+
const periodKey = String(scoringPeriod);
|
|
16
|
+
if (proId in proSchedule && periodKey in proSchedule[proId]) {
|
|
17
|
+
const game = proSchedule[proId][periodKey][0];
|
|
18
|
+
const oppId = game.awayProTeamId !== player.proTeamId ? game.awayProTeamId : game.homeProTeamId;
|
|
19
|
+
const gameDate = /* @__PURE__ */ new Date(game.date / 1e3);
|
|
20
|
+
const gameEnd = new Date(gameDate.getTime() + 10800 * 1e3);
|
|
21
|
+
this.gamePlayed = Date.now() > gameEnd.getTime() ? 100 : 0;
|
|
22
|
+
this.proOpponent = PRO_TEAM_MAP[oppId] ?? "None";
|
|
23
|
+
}
|
|
24
|
+
const playerStats = player.stats ?? [];
|
|
25
|
+
for (const stats of playerStats) {
|
|
26
|
+
const statsBreakdown = stats.appliedStats ?? stats.stats ?? {};
|
|
27
|
+
const breakdown = {};
|
|
28
|
+
for (const [key, value] of Object.entries(statsBreakdown)) breakdown[STATS_MAP[key] ?? key] = value;
|
|
29
|
+
this.points = Math.round((stats.appliedTotal ?? 0) * 100) / 100;
|
|
30
|
+
this.pointsBreakdown = breakdown;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
//#endregion
|
|
35
|
+
export { BoxPlayer };
|
|
36
|
+
|
|
37
|
+
//# sourceMappingURL=box-player.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"box-player.js","names":[],"sources":["../../../src/espn/models/box-player.ts"],"sourcesContent":["import { POSITION_MAP, PRO_TEAM_MAP, STATS_MAP } from '../constants.js';\nimport type { JsonObject } from '../types/raw.js';\nimport { Player, type ProTeamSchedule } from './player.js';\n\nexport class BoxPlayer extends Player {\n slotPosition = 'FA';\n proOpponent = 'None';\n gamePlayed = 100;\n points = 0;\n pointsBreakdown: Record<string, number> = {};\n\n constructor(\n data: JsonObject,\n proSchedule: ProTeamSchedule,\n year: number,\n scoringPeriod: number,\n ) {\n super(data, year, proSchedule);\n\n if ('lineupSlotId' in data) {\n this.slotPosition = POSITION_MAP[data.lineupSlotId as number] as string;\n }\n\n const player =\n 'playerPoolEntry' in data\n ? ((data.playerPoolEntry as JsonObject).player as JsonObject)\n : (data.player as JsonObject);\n\n const proId = player.proTeamId as number;\n const periodKey = String(scoringPeriod);\n if (proId in proSchedule && periodKey in proSchedule[proId]!) {\n const game = proSchedule[proId]![periodKey]![0]!;\n const oppId =\n game.awayProTeamId !== player.proTeamId\n ? game.awayProTeamId\n : game.homeProTeamId;\n const gameDate = new Date(game.date / 1000);\n const gameEnd = new Date(gameDate.getTime() + 3 * 60 * 60 * 1000);\n this.gamePlayed = Date.now() > gameEnd.getTime() ? 100 : 0;\n this.proOpponent = PRO_TEAM_MAP[oppId] ?? 'None';\n }\n\n const playerStats = (player.stats as JsonObject[] | undefined) ?? [];\n for (const stats of playerStats) {\n const statsBreakdown =\n (stats.appliedStats as Record<string, number> | undefined) ??\n (stats.stats as Record<string, number> | undefined) ??\n {};\n const breakdown: Record<string, number> = {};\n for (const [key, value] of Object.entries(statsBreakdown)) {\n breakdown[STATS_MAP[key] ?? key] = value;\n }\n this.points = Math.round(((stats.appliedTotal as number | undefined) ?? 0) * 100) / 100;\n this.pointsBreakdown = breakdown;\n }\n }\n}\n"],"mappings":";;;AAIA,IAAa,YAAb,cAA+B,OAAO;CACpC,eAAe;CACf,cAAc;CACd,aAAa;CACb,SAAS;CACT,kBAA0C,CAAC;CAE3C,YACE,MACA,aACA,MACA,eACA;EACA,MAAM,MAAM,MAAM,WAAW;EAE7B,IAAI,kBAAkB,MACpB,KAAK,eAAe,aAAa,KAAK;EAGxC,MAAM,SACJ,qBAAqB,OACf,KAAK,gBAA+B,SACrC,KAAK;EAEZ,MAAM,QAAQ,OAAO;EACrB,MAAM,YAAY,OAAO,aAAa;EACtC,IAAI,SAAS,eAAe,aAAa,YAAY,QAAS;GAC5D,MAAM,OAAO,YAAY,OAAQ,WAAY;GAC7C,MAAM,QACJ,KAAK,kBAAkB,OAAO,YAC1B,KAAK,gBACL,KAAK;GACX,MAAM,2BAAW,IAAI,KAAK,KAAK,OAAO,GAAI;GAC1C,MAAM,UAAU,IAAI,KAAK,SAAS,QAAQ,IAAI,QAAc,GAAI;GAChE,KAAK,aAAa,KAAK,IAAI,IAAI,QAAQ,QAAQ,IAAI,MAAM;GACzD,KAAK,cAAc,aAAa,UAAU;EAC5C;EAEA,MAAM,cAAe,OAAO,SAAsC,CAAC;EACnE,KAAK,MAAM,SAAS,aAAa;GAC/B,MAAM,iBACH,MAAM,gBACN,MAAM,SACP,CAAC;GACH,MAAM,YAAoC,CAAC;GAC3C,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,cAAc,GACtD,UAAU,UAAU,QAAQ,OAAO;GAErC,KAAK,SAAS,KAAK,OAAQ,MAAM,gBAAuC,KAAK,GAAG,IAAI;GACpF,KAAK,kBAAkB;EACzB;CACF;AACF"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { JsonObject } from '../types/raw.js';
|
|
2
|
+
import { BoxPlayer } from './box-player.js';
|
|
3
|
+
import type { ProTeamSchedule } from './player.js';
|
|
4
|
+
import type { Team } from './team.js';
|
|
5
|
+
export declare abstract class BoxScore {
|
|
6
|
+
winner: unknown;
|
|
7
|
+
homeTeam: number | Team;
|
|
8
|
+
awayTeam: number | Team;
|
|
9
|
+
scoringPeriod: number;
|
|
10
|
+
constructor(data: JsonObject, scoringPeriod: number);
|
|
11
|
+
protected getPlayerLineup(team: 'home' | 'away', data: JsonObject, proSchedule: ProTeamSchedule, byMatchup: boolean, year: number): BoxPlayer[];
|
|
12
|
+
}
|
|
13
|
+
export declare class H2HPointsBoxScore extends BoxScore {
|
|
14
|
+
homeScore: number;
|
|
15
|
+
homeProjected: number;
|
|
16
|
+
homeLineup: BoxPlayer[];
|
|
17
|
+
awayScore: number;
|
|
18
|
+
awayProjected: number;
|
|
19
|
+
awayLineup: BoxPlayer[];
|
|
20
|
+
constructor(data: JsonObject, proSchedule: ProTeamSchedule, byMatchup: boolean, year: number, scoringPeriod?: number);
|
|
21
|
+
private getTeamData;
|
|
22
|
+
}
|
|
23
|
+
export declare class H2HCategoryBoxScore extends BoxScore {
|
|
24
|
+
homeWins: number;
|
|
25
|
+
homeTies: number;
|
|
26
|
+
homeLosses: number;
|
|
27
|
+
homeStats: Record<string, {
|
|
28
|
+
value: number;
|
|
29
|
+
result: unknown;
|
|
30
|
+
}>;
|
|
31
|
+
homeLineup: BoxPlayer[];
|
|
32
|
+
awayWins: number;
|
|
33
|
+
awayTies: number;
|
|
34
|
+
awayLosses: number;
|
|
35
|
+
awayStats: Record<string, {
|
|
36
|
+
value: number;
|
|
37
|
+
result: unknown;
|
|
38
|
+
}>;
|
|
39
|
+
awayLineup: BoxPlayer[];
|
|
40
|
+
constructor(data: JsonObject, proSchedule: ProTeamSchedule, byMatchup: boolean, year: number, scoringPeriod?: number);
|
|
41
|
+
private getTeamData;
|
|
42
|
+
}
|
|
43
|
+
export declare function getBoxScoringTypeClass(scoringType: string | undefined): typeof H2HPointsBoxScore | typeof H2HCategoryBoxScore;
|
|
44
|
+
export type BoxScoreInstance = H2HPointsBoxScore | H2HCategoryBoxScore;
|
|
45
|
+
//# sourceMappingURL=box-score.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"box-score.d.ts","sourceRoot":"","sources":["../../../src/espn/models/box-score.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEtC,8BAAsB,QAAQ;IAC5B,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAK;IAC5B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAK;IAC5B,aAAa,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM;IAOnD,SAAS,CAAC,eAAe,CACvB,IAAI,EAAE,MAAM,GAAG,MAAM,EACrB,IAAI,EAAE,UAAU,EAChB,WAAW,EAAE,eAAe,EAC5B,SAAS,EAAE,OAAO,EAClB,IAAI,EAAE,MAAM,GACX,SAAS,EAAE;CAaf;AAED,qBAAa,iBAAkB,SAAQ,QAAQ;IAC7C,SAAS,SAAK;IACd,aAAa,SAAM;IACnB,UAAU,EAAE,SAAS,EAAE,CAAM;IAC7B,SAAS,SAAK;IACd,aAAa,SAAM;IACnB,UAAU,EAAE,SAAS,EAAE,CAAM;gBAG3B,IAAI,EAAE,UAAU,EAChB,WAAW,EAAE,eAAe,EAC5B,SAAS,EAAE,OAAO,EAClB,IAAI,EAAE,MAAM,EACZ,aAAa,SAAI;IAmBnB,OAAO,CAAC,WAAW;CA4BpB;AAED,qBAAa,mBAAoB,SAAQ,QAAQ;IAC/C,QAAQ,SAAK;IACb,QAAQ,SAAK;IACb,UAAU,SAAK;IACf,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC,CAAM;IACnE,UAAU,EAAE,SAAS,EAAE,CAAM;IAC7B,QAAQ,SAAK;IACb,QAAQ,SAAK;IACb,UAAU,SAAK;IACf,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC,CAAM;IACnE,UAAU,EAAE,SAAS,EAAE,CAAM;gBAG3B,IAAI,EAAE,UAAU,EAChB,WAAW,EAAE,eAAe,EAC5B,SAAS,EAAE,OAAO,EAClB,IAAI,EAAE,MAAM,EACZ,aAAa,SAAI;IASnB,OAAO,CAAC,WAAW;CAoCpB;AAWD,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,MAAM,GAAG,SAAS,GAC9B,OAAO,iBAAiB,GAAG,OAAO,mBAAmB,CAKvD;AAED,MAAM,MAAM,gBAAgB,GAAG,iBAAiB,GAAG,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { STATS_MAP } from "../constants.js";
|
|
2
|
+
import { BoxPlayer } from "./box-player.js";
|
|
3
|
+
//#region src/espn/models/box-score.ts
|
|
4
|
+
var BoxScore = class {
|
|
5
|
+
winner;
|
|
6
|
+
homeTeam = 0;
|
|
7
|
+
awayTeam = 0;
|
|
8
|
+
scoringPeriod;
|
|
9
|
+
constructor(data, scoringPeriod) {
|
|
10
|
+
this.winner = data.winner;
|
|
11
|
+
this.homeTeam = data.home?.teamId ?? 0;
|
|
12
|
+
this.awayTeam = data.away?.teamId ?? 0;
|
|
13
|
+
this.scoringPeriod = scoringPeriod;
|
|
14
|
+
}
|
|
15
|
+
getPlayerLineup(team, data, proSchedule, byMatchup, year) {
|
|
16
|
+
const side = data[team];
|
|
17
|
+
if (!side) return [];
|
|
18
|
+
return ((side[byMatchup ? "rosterForMatchupPeriod" : "rosterForCurrentScoringPeriod"] ?? {}).entries ?? []).map((player) => new BoxPlayer(player, proSchedule, year, this.scoringPeriod));
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
var H2HPointsBoxScore = class extends BoxScore {
|
|
22
|
+
homeScore = 0;
|
|
23
|
+
homeProjected = -1;
|
|
24
|
+
homeLineup = [];
|
|
25
|
+
awayScore = 0;
|
|
26
|
+
awayProjected = -1;
|
|
27
|
+
awayLineup = [];
|
|
28
|
+
constructor(data, proSchedule, byMatchup, year, scoringPeriod = 0) {
|
|
29
|
+
super(data, scoringPeriod);
|
|
30
|
+
[this.homeScore, this.homeProjected, this.homeLineup] = this.getTeamData("home", data, proSchedule, byMatchup, year);
|
|
31
|
+
[this.awayScore, this.awayProjected, this.awayLineup] = this.getTeamData("away", data, proSchedule, byMatchup, year);
|
|
32
|
+
}
|
|
33
|
+
getTeamData(team, data, proSchedule, byMatchup, year) {
|
|
34
|
+
const side = data[team];
|
|
35
|
+
if (!side) return [
|
|
36
|
+
0,
|
|
37
|
+
-1,
|
|
38
|
+
[]
|
|
39
|
+
];
|
|
40
|
+
const teamRoster = side[byMatchup ? "rosterForMatchupPeriod" : "rosterForCurrentScoringPeriod"] ?? {};
|
|
41
|
+
let teamScore;
|
|
42
|
+
let teamProjected = -1;
|
|
43
|
+
if ("totalPointsLive" in side && byMatchup) {
|
|
44
|
+
teamScore = Math.round(side.totalPointsLive * 100) / 100;
|
|
45
|
+
teamProjected = Math.round((side.totalProjectedPointsLive ?? -1) * 100) / 100;
|
|
46
|
+
} else teamScore = Math.round((teamRoster.appliedStatTotal ?? 0) * 100) / 100;
|
|
47
|
+
const lineup = this.getPlayerLineup(team, data, proSchedule, byMatchup, year);
|
|
48
|
+
return [
|
|
49
|
+
teamScore,
|
|
50
|
+
teamProjected,
|
|
51
|
+
lineup
|
|
52
|
+
];
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
var H2HCategoryBoxScore = class extends BoxScore {
|
|
56
|
+
homeWins = 0;
|
|
57
|
+
homeTies = 0;
|
|
58
|
+
homeLosses = 0;
|
|
59
|
+
homeStats = {};
|
|
60
|
+
homeLineup = [];
|
|
61
|
+
awayWins = 0;
|
|
62
|
+
awayTies = 0;
|
|
63
|
+
awayLosses = 0;
|
|
64
|
+
awayStats = {};
|
|
65
|
+
awayLineup = [];
|
|
66
|
+
constructor(data, proSchedule, byMatchup, year, scoringPeriod = 0) {
|
|
67
|
+
super(data, scoringPeriod);
|
|
68
|
+
[this.homeWins, this.homeTies, this.homeLosses, this.homeStats, this.homeLineup] = this.getTeamData("home", data, proSchedule, byMatchup, year);
|
|
69
|
+
[this.awayWins, this.awayTies, this.awayLosses, this.awayStats, this.awayLineup] = this.getTeamData("away", data, proSchedule, byMatchup, year);
|
|
70
|
+
}
|
|
71
|
+
getTeamData(team, data, proSchedule, byMatchup, year) {
|
|
72
|
+
const side = data[team];
|
|
73
|
+
if (!side) return [
|
|
74
|
+
0,
|
|
75
|
+
0,
|
|
76
|
+
0,
|
|
77
|
+
{},
|
|
78
|
+
[]
|
|
79
|
+
];
|
|
80
|
+
const cumulativeScore = side.cumulativeScore ?? {};
|
|
81
|
+
const teamWins = cumulativeScore.wins ?? 0;
|
|
82
|
+
const teamTies = cumulativeScore.ties ?? 0;
|
|
83
|
+
const teamLosses = cumulativeScore.losses ?? 0;
|
|
84
|
+
const teamStats = {};
|
|
85
|
+
const scoreByStat = cumulativeScore.scoreByStat ?? {};
|
|
86
|
+
for (const [statKey, statDict] of Object.entries(scoreByStat)) teamStats[STATS_MAP[statKey] ?? statKey] = {
|
|
87
|
+
value: statDict.score,
|
|
88
|
+
result: statDict.result
|
|
89
|
+
};
|
|
90
|
+
return [
|
|
91
|
+
teamWins,
|
|
92
|
+
teamTies,
|
|
93
|
+
teamLosses,
|
|
94
|
+
teamStats,
|
|
95
|
+
this.getPlayerLineup(team, data, proSchedule, byMatchup, year)
|
|
96
|
+
];
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
var SCORING_TYPE_MAP = {
|
|
100
|
+
H2H_POINTS: H2HPointsBoxScore,
|
|
101
|
+
H2H_CATEGORY: H2HCategoryBoxScore,
|
|
102
|
+
H2H_MOST_CATEGORIES: H2HCategoryBoxScore
|
|
103
|
+
};
|
|
104
|
+
function getBoxScoringTypeClass(scoringType) {
|
|
105
|
+
if (scoringType && scoringType in SCORING_TYPE_MAP) return SCORING_TYPE_MAP[scoringType];
|
|
106
|
+
return H2HPointsBoxScore;
|
|
107
|
+
}
|
|
108
|
+
//#endregion
|
|
109
|
+
export { BoxScore, H2HCategoryBoxScore, H2HPointsBoxScore, getBoxScoringTypeClass };
|
|
110
|
+
|
|
111
|
+
//# sourceMappingURL=box-score.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"box-score.js","names":[],"sources":["../../../src/espn/models/box-score.ts"],"sourcesContent":["import { STATS_MAP } from '../constants.js';\nimport type { JsonObject } from '../types/raw.js';\nimport { BoxPlayer } from './box-player.js';\nimport type { ProTeamSchedule } from './player.js';\nimport type { Team } from './team.js';\n\nexport abstract class BoxScore {\n winner: unknown;\n homeTeam: number | Team = 0;\n awayTeam: number | Team = 0;\n scoringPeriod: number;\n\n constructor(data: JsonObject, scoringPeriod: number) {\n this.winner = data.winner;\n this.homeTeam = ((data.home as JsonObject | undefined)?.teamId as number | undefined) ?? 0;\n this.awayTeam = ((data.away as JsonObject | undefined)?.teamId as number | undefined) ?? 0;\n this.scoringPeriod = scoringPeriod;\n }\n\n protected getPlayerLineup(\n team: 'home' | 'away',\n data: JsonObject,\n proSchedule: ProTeamSchedule,\n byMatchup: boolean,\n year: number,\n ): BoxPlayer[] {\n const side = data[team] as JsonObject | undefined;\n if (!side) {\n return [];\n }\n\n const rosterKey = byMatchup ? 'rosterForMatchupPeriod' : 'rosterForCurrentScoringPeriod';\n const roster = (side[rosterKey] as JsonObject | undefined) ?? {};\n const entries = (roster.entries as JsonObject[] | undefined) ?? [];\n return entries.map(\n (player) => new BoxPlayer(player, proSchedule, year, this.scoringPeriod),\n );\n }\n}\n\nexport class H2HPointsBoxScore extends BoxScore {\n homeScore = 0;\n homeProjected = -1;\n homeLineup: BoxPlayer[] = [];\n awayScore = 0;\n awayProjected = -1;\n awayLineup: BoxPlayer[] = [];\n\n constructor(\n data: JsonObject,\n proSchedule: ProTeamSchedule,\n byMatchup: boolean,\n year: number,\n scoringPeriod = 0,\n ) {\n super(data, scoringPeriod);\n [this.homeScore, this.homeProjected, this.homeLineup] = this.getTeamData(\n 'home',\n data,\n proSchedule,\n byMatchup,\n year,\n );\n [this.awayScore, this.awayProjected, this.awayLineup] = this.getTeamData(\n 'away',\n data,\n proSchedule,\n byMatchup,\n year,\n );\n }\n\n private getTeamData(\n team: 'home' | 'away',\n data: JsonObject,\n proSchedule: ProTeamSchedule,\n byMatchup: boolean,\n year: number,\n ): [number, number, BoxPlayer[]] {\n const side = data[team] as JsonObject | undefined;\n if (!side) {\n return [0, -1, []];\n }\n\n const rosterKey = byMatchup ? 'rosterForMatchupPeriod' : 'rosterForCurrentScoringPeriod';\n const teamRoster = (side[rosterKey] as JsonObject | undefined) ?? {};\n let teamScore: number;\n let teamProjected = -1;\n\n if ('totalPointsLive' in side && byMatchup) {\n teamScore = Math.round((side.totalPointsLive as number) * 100) / 100;\n teamProjected =\n Math.round(((side.totalProjectedPointsLive as number | undefined) ?? -1) * 100) / 100;\n } else {\n teamScore = Math.round(((teamRoster.appliedStatTotal as number | undefined) ?? 0) * 100) / 100;\n }\n\n const lineup = this.getPlayerLineup(team, data, proSchedule, byMatchup, year);\n return [teamScore, teamProjected, lineup];\n }\n}\n\nexport class H2HCategoryBoxScore extends BoxScore {\n homeWins = 0;\n homeTies = 0;\n homeLosses = 0;\n homeStats: Record<string, { value: number; result: unknown }> = {};\n homeLineup: BoxPlayer[] = [];\n awayWins = 0;\n awayTies = 0;\n awayLosses = 0;\n awayStats: Record<string, { value: number; result: unknown }> = {};\n awayLineup: BoxPlayer[] = [];\n\n constructor(\n data: JsonObject,\n proSchedule: ProTeamSchedule,\n byMatchup: boolean,\n year: number,\n scoringPeriod = 0,\n ) {\n super(data, scoringPeriod);\n [this.homeWins, this.homeTies, this.homeLosses, this.homeStats, this.homeLineup] =\n this.getTeamData('home', data, proSchedule, byMatchup, year);\n [this.awayWins, this.awayTies, this.awayLosses, this.awayStats, this.awayLineup] =\n this.getTeamData('away', data, proSchedule, byMatchup, year);\n }\n\n private getTeamData(\n team: 'home' | 'away',\n data: JsonObject,\n proSchedule: ProTeamSchedule,\n byMatchup: boolean,\n year: number,\n ): [\n number,\n number,\n number,\n Record<string, { value: number; result: unknown }>,\n BoxPlayer[],\n ] {\n const side = data[team] as JsonObject | undefined;\n if (!side) {\n return [0, 0, 0, {}, []];\n }\n\n const cumulativeScore = (side.cumulativeScore as JsonObject | undefined) ?? {};\n const teamWins = (cumulativeScore.wins as number | undefined) ?? 0;\n const teamTies = (cumulativeScore.ties as number | undefined) ?? 0;\n const teamLosses = (cumulativeScore.losses as number | undefined) ?? 0;\n\n const teamStats: Record<string, { value: number; result: unknown }> = {};\n const scoreByStat =\n (cumulativeScore.scoreByStat as Record<string, { score: number; result: unknown }>) ?? {};\n for (const [statKey, statDict] of Object.entries(scoreByStat)) {\n teamStats[STATS_MAP[statKey] ?? statKey] = {\n value: statDict.score,\n result: statDict.result,\n };\n }\n\n const lineup = this.getPlayerLineup(team, data, proSchedule, byMatchup, year);\n return [teamWins, teamTies, teamLosses, teamStats, lineup];\n }\n}\n\nconst SCORING_TYPE_MAP: Record<\n string,\n typeof H2HPointsBoxScore | typeof H2HCategoryBoxScore\n> = {\n H2H_POINTS: H2HPointsBoxScore,\n H2H_CATEGORY: H2HCategoryBoxScore,\n H2H_MOST_CATEGORIES: H2HCategoryBoxScore,\n};\n\nexport function getBoxScoringTypeClass(\n scoringType: string | undefined,\n): typeof H2HPointsBoxScore | typeof H2HCategoryBoxScore {\n if (scoringType && scoringType in SCORING_TYPE_MAP) {\n return SCORING_TYPE_MAP[scoringType]!;\n }\n return H2HPointsBoxScore;\n}\n\nexport type BoxScoreInstance = H2HPointsBoxScore | H2HCategoryBoxScore;\n"],"mappings":"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"}
|