halo-infinite-api 6.1.1 → 7.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/README.md +6 -4
- package/dist/core/halo-infinite-client.d.ts +8 -3
- package/dist/core/halo-infinite-client.js +6 -7
- package/dist/core/halo-infinite-client.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/models/halo-infinite/asset.d.ts +10 -1
- package/dist/models/halo-infinite/progression-file.d.ts +51 -0
- package/dist/models/halo-infinite/progression-file.js +7 -0
- package/dist/models/halo-infinite/progression-file.js.map +1 -0
- package/dist/models/halo-infinite/service-record.d.ts +1 -1
- package/package.json +1 -1
- package/src/core/halo-infinite-client.ts +28 -20
- package/src/index.ts +9 -1
- package/src/models/halo-infinite/asset.ts +7 -1
- package/src/models/halo-infinite/progression-file.ts +54 -0
- package/src/models/halo-infinite/service-record.ts +1 -1
package/README.md
CHANGED
|
@@ -9,10 +9,12 @@ The package is currently limited to the endpoints I've needed to use in other pr
|
|
|
9
9
|
- GET https://profile.svc.halowaypoint.com/users/{gamerTag}
|
|
10
10
|
- GET https://profile.svc.halowaypoint.com/users?xuids={xuids}
|
|
11
11
|
- GET https://skill.svc.halowaypoint.com/hi/playlist/{playlistId}/csrs?players={playerIds}
|
|
12
|
+
- GET https://skill.svc.halowaypoint.com/hi/matches/{matchId}/skill
|
|
12
13
|
- GET https://gamecms-hacs.svc.halowaypoint.com/hi/multiplayer/file/playlists/assets/{playlistId}.json
|
|
14
|
+
- GET https://gamecms-hacs.svc.halowaypoint.com/hi/Progression/file/{filename}.json
|
|
13
15
|
- GET https://halostats.svc.halowaypoint.com/hi/playlist/{playlistId}/csrs?players={playerIds}
|
|
14
16
|
- GET https://halostats.svc.halowaypoint.com/hi/players/xuid({playerId})/matches
|
|
15
|
-
- GET https://
|
|
17
|
+
- GET https://halostats.svc.halowaypoint.com/hi/players/{gamerTagOrWrappedXuid}/Matchmade/servicerecord
|
|
16
18
|
- GET https://halostats.svc.halowaypoint.com/hi/matches/{matchId}/stats
|
|
17
19
|
- GET https://discovery-infiniteugc.svc.halowaypoint.com/hi/{assetType}/{assetId}
|
|
18
20
|
- GET https://discovery-infiniteugc.svc.halowaypoint.com/hi/{assetType}/{assetId}/versions/{versionId}
|
|
@@ -38,7 +40,7 @@ import { HaloInfiniteClient, AutoXstsSpartanTokenProvider } from "halo-infinite-
|
|
|
38
40
|
|
|
39
41
|
const oauthApplication = new msal.PublicClientApplication({
|
|
40
42
|
auth: {
|
|
41
|
-
clientId: "
|
|
43
|
+
clientId: "00000000-0000-0000-0000-000000000000",
|
|
42
44
|
authority: "https://login.live.com", // Override the default authority with the xbox one
|
|
43
45
|
knownAuthorities: ["login.live.com"],
|
|
44
46
|
protocolMode: "OIDC", // Shit, I actually have no idea what this does, but Microsoft says I need it
|
|
@@ -46,9 +48,9 @@ const oauthApplication = new msal.PublicClientApplication({
|
|
|
46
48
|
});
|
|
47
49
|
|
|
48
50
|
const client = new HaloInfiniteClient(
|
|
49
|
-
//
|
|
51
|
+
// Another choice for token providers is the StaticXstsTicketTokenSpartanTokenProvider,
|
|
50
52
|
// which uses a preset spartan token
|
|
51
|
-
new
|
|
53
|
+
new AutoTokenProvider(async () => {
|
|
52
54
|
const token = await oauthApplication.acquireTokenInteractive({
|
|
53
55
|
// offline_access gives us a refresh token which we can use to continually
|
|
54
56
|
// get new credentials from Microsoft as the old ones expire.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { FetchFunction } from "../util/fetch-function";
|
|
2
|
-
import { MapAsset, PlaylistAsset, UgcGameVariantAsset } from "../models/halo-infinite/asset";
|
|
2
|
+
import { MapAsset, MapModePairAsset, PlaylistAsset, UgcGameVariantAsset } from "../models/halo-infinite/asset";
|
|
3
3
|
import { AssetKind } from "../models/halo-infinite/asset-kind";
|
|
4
4
|
import { MatchSkill } from "../models/halo-infinite/match-skill";
|
|
5
5
|
import { MatchStats } from "../models/halo-infinite/match-stats";
|
|
@@ -11,6 +11,7 @@ import { ServiceRecord } from "../models/halo-infinite/service-record";
|
|
|
11
11
|
import { UserInfo } from "../models/halo-infinite/user-info";
|
|
12
12
|
import { SpartanTokenProvider } from "./token-providers/spartan-token-providers";
|
|
13
13
|
import { MatchesPrivacy } from "src/models/halo-infinite/matches-privacy";
|
|
14
|
+
import { ProgressionFileType, ProgressionFileTypeMap } from "src/models/halo-infinite/progression-file";
|
|
14
15
|
export interface ResultContainer<TValue> {
|
|
15
16
|
Id: string;
|
|
16
17
|
ResultCode: 0 | 1;
|
|
@@ -23,6 +24,7 @@ export type AssetKindTypeMap = {
|
|
|
23
24
|
[AssetKind.Map]: MapAsset;
|
|
24
25
|
[AssetKind.UgcGameVariant]: UgcGameVariantAsset;
|
|
25
26
|
[AssetKind.Playlist]: PlaylistAsset;
|
|
27
|
+
[AssetKind.MapModePair]: MapModePairAsset;
|
|
26
28
|
};
|
|
27
29
|
export declare class HaloInfiniteClient {
|
|
28
30
|
private readonly spartanTokenProvider;
|
|
@@ -47,13 +49,15 @@ export declare class HaloInfiniteClient {
|
|
|
47
49
|
/** Get service record for a player.
|
|
48
50
|
* @param gamerTag - Gamertag to lookup.
|
|
49
51
|
*/
|
|
50
|
-
getUserServiceRecord: (
|
|
52
|
+
getUserServiceRecord: (gamerTagOrWrappedXuid: string, queryParameters?: {
|
|
53
|
+
seasonId?: string;
|
|
54
|
+
playlistAssetId?: string;
|
|
55
|
+
}, init?: Omit<RequestInit, "body" | "method">) => Promise<ServiceRecord>;
|
|
51
56
|
/** Get playlist information
|
|
52
57
|
* @param playlistId - Unique ID for the playlist.
|
|
53
58
|
*/
|
|
54
59
|
getPlaylist: (playlistId: string, init?: Omit<RequestInit, "body" | "method">) => Promise<Playlist>;
|
|
55
60
|
getPlayerMatches: (playerXuid: string, type?: MatchType, count?: number, start?: number, init?: Omit<RequestInit, "body" | "method">) => Promise<PlayerMatchHistory[]>;
|
|
56
|
-
getPlayerServiceRecord(playerXuid: string, init?: Omit<RequestInit, "body" | "method">): Promise<ServiceRecord>;
|
|
57
61
|
getMatchStats: (matchId: string, init?: Omit<RequestInit, "body" | "method">) => Promise<MatchStats<import("..").GameVariantCategory>>;
|
|
58
62
|
getMatchSkill: (matchId: string, playerIds: string[], init?: Omit<RequestInit, "body" | "method">) => Promise<ResultContainer<MatchSkill<0>>[]>;
|
|
59
63
|
/** Gets authoring metadata about a specific asset. */
|
|
@@ -66,4 +70,5 @@ export declare class HaloInfiniteClient {
|
|
|
66
70
|
}>;
|
|
67
71
|
getMatchesPrivacy: (playerXuid: string, init?: Omit<RequestInit, "body" | "method">) => Promise<MatchesPrivacy>;
|
|
68
72
|
updateMatchesPrivacy: (playerXuid: string, matchesPrivacy: MatchesPrivacy, init?: Omit<RequestInit, "body" | "method">) => Promise<MatchesPrivacy>;
|
|
73
|
+
getProgressionFile: <TFileType extends ProgressionFileType>(filename: `${TFileType}/${string}.json`, init?: Omit<RequestInit, "body" | "method">) => Promise<ProgressionFileTypeMap[TFileType]>;
|
|
69
74
|
}
|
|
@@ -8,6 +8,7 @@ const assetKindUrlMap = {
|
|
|
8
8
|
[AssetKind.Map]: "Maps",
|
|
9
9
|
[AssetKind.UgcGameVariant]: "UgcGameVariants",
|
|
10
10
|
[AssetKind.Playlist]: "Playlists",
|
|
11
|
+
[AssetKind.MapModePair]: "MapModePairs",
|
|
11
12
|
};
|
|
12
13
|
function wrapPlayerId(playerId) {
|
|
13
14
|
if (/^\w+\(\d+\)/.test(playerId)) {
|
|
@@ -114,7 +115,7 @@ export class HaloInfiniteClient {
|
|
|
114
115
|
/** Get service record for a player.
|
|
115
116
|
* @param gamerTag - Gamertag to lookup.
|
|
116
117
|
*/
|
|
117
|
-
getUserServiceRecord = (
|
|
118
|
+
getUserServiceRecord = (gamerTagOrWrappedXuid, queryParameters, init) => this.executeRequest(`https://${HaloCoreEndpoints.StatsOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/players/${gamerTagOrWrappedXuid}/Matchmade/servicerecord?${new URLSearchParams(queryParameters).toString()}`, {
|
|
118
119
|
...init,
|
|
119
120
|
method: "get",
|
|
120
121
|
});
|
|
@@ -135,12 +136,6 @@ export class HaloInfiniteClient {
|
|
|
135
136
|
method: "get",
|
|
136
137
|
});
|
|
137
138
|
};
|
|
138
|
-
getPlayerServiceRecord(playerXuid, init) {
|
|
139
|
-
return this.executeRequest(`https://${HaloCoreEndpoints.StatsOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/players/${wrapPlayerId(playerXuid)}/Matchmade/servicerecord`, {
|
|
140
|
-
...init,
|
|
141
|
-
method: "get",
|
|
142
|
-
});
|
|
143
|
-
}
|
|
144
139
|
getMatchStats = (matchId, init) => this.executeRequest(`https://${HaloCoreEndpoints.StatsOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/matches/${matchId}/stats`, {
|
|
145
140
|
...init,
|
|
146
141
|
method: "get",
|
|
@@ -179,5 +174,9 @@ export class HaloInfiniteClient {
|
|
|
179
174
|
body: JSON.stringify({ matchesPrivacy }),
|
|
180
175
|
});
|
|
181
176
|
};
|
|
177
|
+
getProgressionFile = (filename, init) => this.executeRequest(`https://${HaloCoreEndpoints.GameCmsOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/Progression/file/${filename}`, {
|
|
178
|
+
...init,
|
|
179
|
+
method: "get",
|
|
180
|
+
});
|
|
182
181
|
}
|
|
183
182
|
//# sourceMappingURL=halo-infinite-client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"halo-infinite-client.js","sourceRoot":"","sources":["../../src/core/halo-infinite-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"halo-infinite-client.js","sourceRoot":"","sources":["../../src/core/halo-infinite-client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ export { AutoTokenProvider, AutoTokenProvider as AutoXstsSpartanTokenProvider, }
|
|
|
6
6
|
export { SpartanTokenProvider } from "./core/token-providers/spartan-token-providers";
|
|
7
7
|
export { StaticXstsTicketTokenSpartanTokenProvider } from "./core/token-providers/spartan-token-providers/static-xsts-ticket-token-spartan-token-provider";
|
|
8
8
|
export { XboxClient } from "./core/xbox-client";
|
|
9
|
-
export { Asset, MapAsset, PlaylistAsset, UgcGameVariantAsset, } from "./models/halo-infinite/asset";
|
|
9
|
+
export { Asset, MapAsset, MapModePairAsset, PlaylistAsset, UgcGameVariantAsset, } from "./models/halo-infinite/asset";
|
|
10
10
|
export { AssetKind } from "./models/halo-infinite/asset-kind";
|
|
11
11
|
export { AssetVersionLink } from "./models/halo-infinite/asset-version-link";
|
|
12
12
|
export { GameVariantCategory } from "./models/halo-infinite/game-variant-category";
|
|
@@ -21,9 +21,10 @@ export { Playlist } from "./models/halo-infinite/playlist";
|
|
|
21
21
|
export { PlaylistCsr } from "./models/halo-infinite/playlist-csr";
|
|
22
22
|
export { PlaylistCsrContainer } from "./models/halo-infinite/playlist-csr-container";
|
|
23
23
|
export { PlaylistExperience } from "./models/halo-infinite/playlist-experience";
|
|
24
|
+
export { SeasonCalendarProgressionFile, CsrSeasonCalendarProgressionFile, ProgressionFileType, ProgressionFileTypeMap, SeasonProgressionFile, } from "./models/halo-infinite/progression-file";
|
|
24
25
|
export { ServiceRecord } from "./models/halo-infinite/service-record";
|
|
25
26
|
export { Stats } from "./models/halo-infinite/stats";
|
|
26
27
|
export { UserInfo } from "./models/halo-infinite/user-info";
|
|
28
|
+
export { XboxTicket } from "./models/xbox-ticket";
|
|
27
29
|
export { FetchFunction } from "./util/fetch-function";
|
|
28
30
|
export { RequestError } from "./util/request-error";
|
|
29
|
-
export { XboxTicket } from "./models/xbox-ticket";
|
package/dist/index.js
CHANGED
|
@@ -10,5 +10,6 @@ export { MatchOutcome } from "./models/halo-infinite/match-outcome";
|
|
|
10
10
|
export { MatchType } from "./models/halo-infinite/match-type";
|
|
11
11
|
export { Privacy, } from "./models/halo-infinite/matches-privacy";
|
|
12
12
|
export { PlaylistExperience } from "./models/halo-infinite/playlist-experience";
|
|
13
|
+
export { ProgressionFileType, } from "./models/halo-infinite/progression-file";
|
|
13
14
|
export { RequestError } from "./util/request-error";
|
|
14
15
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,6CAA6C,CAAC;AACvF,OAAO,EACL,YAAY,EACZ,wBAAwB,GAEzB,MAAM,6CAA6C,CAAC;AACrD,OAAO,EAEL,kBAAkB,GAEnB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,iBAAiB,EACjB,iBAAiB,IAAI,4BAA4B,GAClD,MAAM,4CAA4C,CAAC;AAEpD,OAAO,EAAE,yCAAyC,EAAE,MAAM,gGAAgG,CAAC;AAC3J,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,6CAA6C,CAAC;AACvF,OAAO,EACL,YAAY,EACZ,wBAAwB,GAEzB,MAAM,6CAA6C,CAAC;AACrD,OAAO,EAEL,kBAAkB,GAEnB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,iBAAiB,EACjB,iBAAiB,IAAI,4BAA4B,GAClD,MAAM,4CAA4C,CAAC;AAEpD,OAAO,EAAE,yCAAyC,EAAE,MAAM,gGAAgG,CAAC;AAC3J,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAQhD,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAE9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,8CAA8C,CAAC;AAEnF,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AAGpE,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAC9D,OAAO,EAEL,OAAO,GACR,MAAM,wCAAwC,CAAC;AAKhD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAChF,OAAO,EAGL,mBAAmB,GAGpB,MAAM,yCAAyC,CAAC;AAMjD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -80,5 +80,14 @@ export interface PlaylistAsset extends Asset {
|
|
|
80
80
|
MinFireteamSize: number;
|
|
81
81
|
MaxFireteamSize: number;
|
|
82
82
|
};
|
|
83
|
-
RotationEntries: Asset
|
|
83
|
+
RotationEntries: (Asset & {
|
|
84
|
+
Metadata: {
|
|
85
|
+
Weight: number;
|
|
86
|
+
};
|
|
87
|
+
})[];
|
|
88
|
+
}
|
|
89
|
+
export interface MapModePairAsset extends Asset {
|
|
90
|
+
CustomData: {};
|
|
91
|
+
MapLink: Asset;
|
|
92
|
+
UgcGameVariantLink: Asset;
|
|
84
93
|
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { ApiFormattedDate } from "./api-formatted-date";
|
|
2
|
+
export declare enum ProgressionFileType {
|
|
3
|
+
Seasons = "Seasons",
|
|
4
|
+
Calendars = "Calendars",
|
|
5
|
+
"Csr/Seasons" = "Csr/Seasons"
|
|
6
|
+
}
|
|
7
|
+
export type ProgressionFileTypeMap = {
|
|
8
|
+
Calendars: SeasonCalendarProgressionFile;
|
|
9
|
+
Seasons: SeasonProgressionFile;
|
|
10
|
+
["Csr/Seasons"]: CsrSeasonCalendarProgressionFile;
|
|
11
|
+
};
|
|
12
|
+
export interface SeasonCalendarProgressionFile {
|
|
13
|
+
Seasons: {
|
|
14
|
+
CsrSeasonFilePath: `Csr/Seasons/${string}.json`;
|
|
15
|
+
OperationTrackPath: `RewardTracks/Operations/${string}.json`;
|
|
16
|
+
SeasonMetadata: `Seasons/${string}.json`;
|
|
17
|
+
StartDate: ApiFormattedDate;
|
|
18
|
+
EndDate: ApiFormattedDate;
|
|
19
|
+
}[];
|
|
20
|
+
Events: {
|
|
21
|
+
RewardTrackPath: `RewardTracks/Events/Rituals/${string}.json`;
|
|
22
|
+
StartDate: ApiFormattedDate;
|
|
23
|
+
EndDate: ApiFormattedDate;
|
|
24
|
+
}[];
|
|
25
|
+
CareerRank: {
|
|
26
|
+
RewardTrackPath: `RewardTracks/CareerRanks/${string}.json`;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export interface CsrSeasonCalendarProgressionFile {
|
|
30
|
+
Seasons: {
|
|
31
|
+
CsrSeasonFilePath: `Csr/Seasons/${string}.json`;
|
|
32
|
+
StartDate: ApiFormattedDate;
|
|
33
|
+
EndDate: ApiFormattedDate;
|
|
34
|
+
}[];
|
|
35
|
+
}
|
|
36
|
+
export interface SeasonProgressionFile {
|
|
37
|
+
DateRange: string;
|
|
38
|
+
Name: string;
|
|
39
|
+
Logo: string;
|
|
40
|
+
Number: number;
|
|
41
|
+
Description: string;
|
|
42
|
+
SummaryBackgroundPath: string;
|
|
43
|
+
BattlePassSeasonUpsellBackgroundImage: string;
|
|
44
|
+
ChallengesBackgroundPath: string;
|
|
45
|
+
BattlePassLogoImage: string;
|
|
46
|
+
SeasonLogoImage: string;
|
|
47
|
+
RitualLogoImage: string;
|
|
48
|
+
StorefrontBackgroundImage: string;
|
|
49
|
+
CardBackgroundImage: string;
|
|
50
|
+
ProgressionBackgroundImage: string;
|
|
51
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export var ProgressionFileType;
|
|
2
|
+
(function (ProgressionFileType) {
|
|
3
|
+
ProgressionFileType["Seasons"] = "Seasons";
|
|
4
|
+
ProgressionFileType["Calendars"] = "Calendars";
|
|
5
|
+
ProgressionFileType["Csr/Seasons"] = "Csr/Seasons";
|
|
6
|
+
})(ProgressionFileType || (ProgressionFileType = {}));
|
|
7
|
+
//# sourceMappingURL=progression-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progression-file.js","sourceRoot":"","sources":["../../../src/models/halo-infinite/progression-file.ts"],"names":[],"mappings":"AAEA,MAAM,CAAN,IAAY,mBAIX;AAJD,WAAY,mBAAmB;IAC7B,0CAAmB,CAAA;IACnB,8CAAuB,CAAA;IACvB,kDAA6B,CAAA;AAC/B,CAAC,EAJW,mBAAmB,KAAnB,mBAAmB,QAI9B"}
|
|
@@ -16,7 +16,7 @@ export interface ServiceRecord {
|
|
|
16
16
|
StockpileStats: StockpileStats;
|
|
17
17
|
}
|
|
18
18
|
interface Subqueries {
|
|
19
|
-
SeasonIds: string[];
|
|
19
|
+
SeasonIds: (`Csr/Seasons/${string}.json` | `Seasons/${string}.json`)[];
|
|
20
20
|
GameVariantCategories: number[];
|
|
21
21
|
IsRanked: boolean[];
|
|
22
22
|
PlaylistAssetIds: string[];
|
package/package.json
CHANGED
|
@@ -2,6 +2,7 @@ import { FetchFunction, defaultFetch } from "../util/fetch-function";
|
|
|
2
2
|
import { HaloCoreEndpoints } from "../endpoints/halo-core-endpoints";
|
|
3
3
|
import {
|
|
4
4
|
MapAsset,
|
|
5
|
+
MapModePairAsset,
|
|
5
6
|
PlaylistAsset,
|
|
6
7
|
UgcGameVariantAsset,
|
|
7
8
|
} from "../models/halo-infinite/asset";
|
|
@@ -18,6 +19,10 @@ import { GlobalConstants } from "../util/global-contants";
|
|
|
18
19
|
import { SpartanTokenProvider } from "./token-providers/spartan-token-providers";
|
|
19
20
|
import { RequestError } from "../util/request-error";
|
|
20
21
|
import { MatchesPrivacy } from "src/models/halo-infinite/matches-privacy";
|
|
22
|
+
import {
|
|
23
|
+
ProgressionFileType,
|
|
24
|
+
ProgressionFileTypeMap,
|
|
25
|
+
} from "src/models/halo-infinite/progression-file";
|
|
21
26
|
|
|
22
27
|
export interface ResultContainer<TValue> {
|
|
23
28
|
Id: string;
|
|
@@ -40,12 +45,14 @@ export type AssetKindTypeMap = {
|
|
|
40
45
|
[AssetKind.Map]: MapAsset;
|
|
41
46
|
[AssetKind.UgcGameVariant]: UgcGameVariantAsset;
|
|
42
47
|
[AssetKind.Playlist]: PlaylistAsset;
|
|
48
|
+
[AssetKind.MapModePair]: MapModePairAsset;
|
|
43
49
|
};
|
|
44
50
|
|
|
45
51
|
const assetKindUrlMap = {
|
|
46
|
-
[AssetKind.Map]: "Maps",
|
|
47
|
-
[AssetKind.UgcGameVariant]: "UgcGameVariants",
|
|
48
|
-
[AssetKind.Playlist]: "Playlists",
|
|
52
|
+
[AssetKind.Map]: "Maps" as const,
|
|
53
|
+
[AssetKind.UgcGameVariant]: "UgcGameVariants" as const,
|
|
54
|
+
[AssetKind.Playlist]: "Playlists" as const,
|
|
55
|
+
[AssetKind.MapModePair]: "MapModePairs" as const,
|
|
49
56
|
} satisfies {
|
|
50
57
|
[key in keyof AssetKindTypeMap]: string;
|
|
51
58
|
};
|
|
@@ -200,11 +207,16 @@ export class HaloInfiniteClient {
|
|
|
200
207
|
* @param gamerTag - Gamertag to lookup.
|
|
201
208
|
*/
|
|
202
209
|
public getUserServiceRecord = (
|
|
203
|
-
|
|
210
|
+
gamerTagOrWrappedXuid: string,
|
|
211
|
+
queryParameters?: { seasonId?: string; playlistAssetId?: string },
|
|
204
212
|
init?: Omit<RequestInit, "body" | "method">
|
|
205
213
|
) =>
|
|
206
214
|
this.executeRequest<ServiceRecord>(
|
|
207
|
-
`https://${HaloCoreEndpoints.StatsOrigin}.${
|
|
215
|
+
`https://${HaloCoreEndpoints.StatsOrigin}.${
|
|
216
|
+
HaloCoreEndpoints.ServiceDomain
|
|
217
|
+
}/hi/players/${gamerTagOrWrappedXuid}/Matchmade/servicerecord?${new URLSearchParams(
|
|
218
|
+
queryParameters
|
|
219
|
+
).toString()}`,
|
|
208
220
|
{
|
|
209
221
|
...init,
|
|
210
222
|
method: "get",
|
|
@@ -251,21 +263,6 @@ export class HaloInfiniteClient {
|
|
|
251
263
|
);
|
|
252
264
|
};
|
|
253
265
|
|
|
254
|
-
public getPlayerServiceRecord(
|
|
255
|
-
playerXuid: string,
|
|
256
|
-
init?: Omit<RequestInit, "body" | "method">
|
|
257
|
-
) {
|
|
258
|
-
return this.executeRequest<ServiceRecord>(
|
|
259
|
-
`https://${HaloCoreEndpoints.StatsOrigin}.${
|
|
260
|
-
HaloCoreEndpoints.ServiceDomain
|
|
261
|
-
}/hi/players/${wrapPlayerId(playerXuid)}/Matchmade/servicerecord`,
|
|
262
|
-
{
|
|
263
|
-
...init,
|
|
264
|
-
method: "get",
|
|
265
|
-
}
|
|
266
|
-
);
|
|
267
|
-
}
|
|
268
|
-
|
|
269
266
|
public getMatchStats = (
|
|
270
267
|
matchId: string,
|
|
271
268
|
init?: Omit<RequestInit, "body" | "method">
|
|
@@ -368,4 +365,15 @@ export class HaloInfiniteClient {
|
|
|
368
365
|
}
|
|
369
366
|
);
|
|
370
367
|
};
|
|
368
|
+
public getProgressionFile = <TFileType extends ProgressionFileType>(
|
|
369
|
+
filename: `${TFileType}/${string}.json`,
|
|
370
|
+
init?: Omit<RequestInit, "body" | "method">
|
|
371
|
+
): Promise<ProgressionFileTypeMap[TFileType]> =>
|
|
372
|
+
this.executeRequest(
|
|
373
|
+
`https://${HaloCoreEndpoints.GameCmsOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/Progression/file/${filename}`,
|
|
374
|
+
{
|
|
375
|
+
...init,
|
|
376
|
+
method: "get",
|
|
377
|
+
}
|
|
378
|
+
);
|
|
371
379
|
}
|
package/src/index.ts
CHANGED
|
@@ -20,6 +20,7 @@ export { XboxClient } from "./core/xbox-client";
|
|
|
20
20
|
export {
|
|
21
21
|
Asset,
|
|
22
22
|
MapAsset,
|
|
23
|
+
MapModePairAsset,
|
|
23
24
|
PlaylistAsset,
|
|
24
25
|
UgcGameVariantAsset,
|
|
25
26
|
} from "./models/halo-infinite/asset";
|
|
@@ -40,9 +41,16 @@ export { Playlist } from "./models/halo-infinite/playlist";
|
|
|
40
41
|
export { PlaylistCsr } from "./models/halo-infinite/playlist-csr";
|
|
41
42
|
export { PlaylistCsrContainer } from "./models/halo-infinite/playlist-csr-container";
|
|
42
43
|
export { PlaylistExperience } from "./models/halo-infinite/playlist-experience";
|
|
44
|
+
export {
|
|
45
|
+
SeasonCalendarProgressionFile,
|
|
46
|
+
CsrSeasonCalendarProgressionFile,
|
|
47
|
+
ProgressionFileType,
|
|
48
|
+
ProgressionFileTypeMap,
|
|
49
|
+
SeasonProgressionFile,
|
|
50
|
+
} from "./models/halo-infinite/progression-file";
|
|
43
51
|
export { ServiceRecord } from "./models/halo-infinite/service-record";
|
|
44
52
|
export { Stats } from "./models/halo-infinite/stats";
|
|
45
53
|
export { UserInfo } from "./models/halo-infinite/user-info";
|
|
54
|
+
export { XboxTicket } from "./models/xbox-ticket";
|
|
46
55
|
export { FetchFunction } from "./util/fetch-function";
|
|
47
56
|
export { RequestError } from "./util/request-error";
|
|
48
|
-
export { XboxTicket } from "./models/xbox-ticket";
|
|
@@ -84,5 +84,11 @@ export interface PlaylistAsset extends Asset {
|
|
|
84
84
|
MinFireteamSize: number;
|
|
85
85
|
MaxFireteamSize: number;
|
|
86
86
|
};
|
|
87
|
-
RotationEntries: Asset
|
|
87
|
+
RotationEntries: (Asset & { Metadata: { Weight: number } })[];
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export interface MapModePairAsset extends Asset {
|
|
91
|
+
CustomData: {};
|
|
92
|
+
MapLink: Asset;
|
|
93
|
+
UgcGameVariantLink: Asset;
|
|
88
94
|
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { ApiFormattedDate } from "./api-formatted-date";
|
|
2
|
+
|
|
3
|
+
export enum ProgressionFileType {
|
|
4
|
+
Seasons = "Seasons",
|
|
5
|
+
Calendars = "Calendars",
|
|
6
|
+
"Csr/Seasons" = "Csr/Seasons",
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export type ProgressionFileTypeMap = {
|
|
10
|
+
Calendars: SeasonCalendarProgressionFile;
|
|
11
|
+
Seasons: SeasonProgressionFile;
|
|
12
|
+
["Csr/Seasons"]: CsrSeasonCalendarProgressionFile;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export interface SeasonCalendarProgressionFile {
|
|
16
|
+
Seasons: {
|
|
17
|
+
CsrSeasonFilePath: `Csr/Seasons/${string}.json`;
|
|
18
|
+
OperationTrackPath: `RewardTracks/Operations/${string}.json`;
|
|
19
|
+
SeasonMetadata: `Seasons/${string}.json`;
|
|
20
|
+
StartDate: ApiFormattedDate;
|
|
21
|
+
EndDate: ApiFormattedDate;
|
|
22
|
+
}[];
|
|
23
|
+
Events: {
|
|
24
|
+
RewardTrackPath: `RewardTracks/Events/Rituals/${string}.json`;
|
|
25
|
+
StartDate: ApiFormattedDate;
|
|
26
|
+
EndDate: ApiFormattedDate;
|
|
27
|
+
}[];
|
|
28
|
+
CareerRank: { RewardTrackPath: `RewardTracks/CareerRanks/${string}.json` };
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface CsrSeasonCalendarProgressionFile {
|
|
32
|
+
Seasons: {
|
|
33
|
+
CsrSeasonFilePath: `Csr/Seasons/${string}.json`;
|
|
34
|
+
StartDate: ApiFormattedDate;
|
|
35
|
+
EndDate: ApiFormattedDate;
|
|
36
|
+
}[];
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface SeasonProgressionFile {
|
|
40
|
+
DateRange: string;
|
|
41
|
+
Name: string;
|
|
42
|
+
Logo: string;
|
|
43
|
+
Number: number;
|
|
44
|
+
Description: string;
|
|
45
|
+
SummaryBackgroundPath: string;
|
|
46
|
+
BattlePassSeasonUpsellBackgroundImage: string;
|
|
47
|
+
ChallengesBackgroundPath: string;
|
|
48
|
+
BattlePassLogoImage: string;
|
|
49
|
+
SeasonLogoImage: string;
|
|
50
|
+
RitualLogoImage: string;
|
|
51
|
+
StorefrontBackgroundImage: string;
|
|
52
|
+
CardBackgroundImage: string;
|
|
53
|
+
ProgressionBackgroundImage: string;
|
|
54
|
+
}
|