@retroachievements/api 0.0.0-development
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/LICENSE.md +21 -0
- package/README.md +103 -0
- package/dist/__playground.d.ts +7 -0
- package/dist/achievement/getAchievementUnlocks.d.ts +45 -0
- package/dist/achievement/index.d.ts +2 -0
- package/dist/achievement/models/achievement-unlock-entity.model.d.ts +6 -0
- package/dist/achievement/models/get-achievement-unlocks-response.model.d.ts +8 -0
- package/dist/achievement/models/index.d.ts +2 -0
- package/dist/api.cjs.development.js +2363 -0
- package/dist/api.cjs.development.js.map +1 -0
- package/dist/api.cjs.production.min.js +2 -0
- package/dist/api.cjs.production.min.js.map +1 -0
- package/dist/api.esm.js +2333 -0
- package/dist/api.esm.js.map +1 -0
- package/dist/console/getConsoleIds.d.ts +22 -0
- package/dist/console/getGameList.d.ts +52 -0
- package/dist/console/index.d.ts +3 -0
- package/dist/console/models/console-id.model.d.ts +4 -0
- package/dist/console/models/game-list.model.d.ts +15 -0
- package/dist/console/models/get-console-ids-response.model.d.ts +4 -0
- package/dist/console/models/get-game-list-response.model.d.ts +15 -0
- package/dist/console/models/index.d.ts +4 -0
- package/dist/feed/getAchievementOfTheWeek.d.ts +48 -0
- package/dist/feed/getActiveClaims.d.ts +38 -0
- package/dist/feed/getTicketData.d.ts +158 -0
- package/dist/feed/getTopTenUsers.d.ts +24 -0
- package/dist/feed/index.d.ts +5 -0
- package/dist/feed/models/achievement-of-the-week.model.d.ts +32 -0
- package/dist/feed/models/achievement-ticket-stats-response.model.d.ts +7 -0
- package/dist/feed/models/achievement-ticket-stats.model.d.ts +7 -0
- package/dist/feed/models/active-claim.model.d.ts +49 -0
- package/dist/feed/models/game-ticket-stats.model.d.ts +9 -0
- package/dist/feed/models/game-tickets-response.model.d.ts +7 -0
- package/dist/feed/models/get-achievement-of-the-week-response.model.d.ts +32 -0
- package/dist/feed/models/get-active-claims-response.model.d.ts +19 -0
- package/dist/feed/models/get-top-ten-users-response.model.d.ts +10 -0
- package/dist/feed/models/index.d.ts +19 -0
- package/dist/feed/models/most-ticketed-games-response.model.d.ts +12 -0
- package/dist/feed/models/most-ticketed-games.model.d.ts +12 -0
- package/dist/feed/models/recent-tickets-response.model.d.ts +6 -0
- package/dist/feed/models/recent-tickets.model.d.ts +6 -0
- package/dist/feed/models/response-ticket-entity.model.d.ts +24 -0
- package/dist/feed/models/ticket-entity.model.d.ts +24 -0
- package/dist/feed/models/tickets-by-user-response.model.d.ts +8 -0
- package/dist/feed/models/top-ten-users-entity.model.d.ts +5 -0
- package/dist/feed/models/top-ten-users.model.d.ts +2 -0
- package/dist/feed/models/user-ticket-stats.model.d.ts +8 -0
- package/dist/game/getAchievementCount.d.ts +31 -0
- package/dist/game/getAchievementDistribution.d.ts +57 -0
- package/dist/game/getGame.d.ts +48 -0
- package/dist/game/getGameExtended.d.ts +68 -0
- package/dist/game/getGameRankAndScore.d.ts +38 -0
- package/dist/game/getGameRating.d.ts +38 -0
- package/dist/game/index.d.ts +7 -0
- package/dist/game/models/achievement-count.model.d.ts +4 -0
- package/dist/game/models/achievement-distribution-flags.model.d.ts +4 -0
- package/dist/game/models/game-extended-achievement-entity.model.d.ts +15 -0
- package/dist/game/models/game-extended-claim-entity.model.d.ts +7 -0
- package/dist/game/models/game-extended.model.d.ts +25 -0
- package/dist/game/models/game-rank-and-score-entity.model.d.ts +6 -0
- package/dist/game/models/game-rating.model.d.ts +9 -0
- package/dist/game/models/game.model.d.ts +19 -0
- package/dist/game/models/get-achievement-count-response.model.d.ts +4 -0
- package/dist/game/models/get-achievement-distribution-response.model.d.ts +1 -0
- package/dist/game/models/get-game-extended-response.model.d.ts +50 -0
- package/dist/game/models/get-game-rank-and-score-response.model.d.ts +8 -0
- package/dist/game/models/get-game-rating-response.model.d.ts +9 -0
- package/dist/game/models/get-game-response.model.d.ts +19 -0
- package/dist/game/models/index.d.ts +14 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +8 -0
- package/dist/user/getAchievementsEarnedBetween.d.ts +59 -0
- package/dist/user/getAchievementsEarnedOnDay.d.ts +57 -0
- package/dist/user/getGameInfoAndUserProgress.d.ts +80 -0
- package/dist/user/getUserGameRankAndScore.d.ts +44 -0
- package/dist/user/getUserPoints.d.ts +30 -0
- package/dist/user/getUserProgress.d.ts +49 -0
- package/dist/user/getUserRecentlyPlayedGames.d.ts +50 -0
- package/dist/user/getUserSummary.d.ts +32 -0
- package/dist/user/index.d.ts +9 -0
- package/dist/user/models/dated-user-achievement.model.d.ts +17 -0
- package/dist/user/models/dated-user-achievements-response.model.d.ts +19 -0
- package/dist/user/models/game-info-and-user-progress.model.d.ts +12 -0
- package/dist/user/models/get-game-info-and-user-progress-response.model.d.ts +14 -0
- package/dist/user/models/get-user-game-rank-and-score-response.model.d.ts +8 -0
- package/dist/user/models/get-user-points-response.model.d.ts +4 -0
- package/dist/user/models/get-user-progress-response.model.d.ts +10 -0
- package/dist/user/models/get-user-recently-played-games-response.model.d.ts +16 -0
- package/dist/user/models/get-user-summary-response.model.d.ts +82 -0
- package/dist/user/models/index.d.ts +14 -0
- package/dist/user/models/user-game-rank-and-score.model.d.ts +8 -0
- package/dist/user/models/user-points.model.d.ts +4 -0
- package/dist/user/models/user-progress.model.d.ts +10 -0
- package/dist/user/models/user-recently-played-games.model.d.ts +16 -0
- package/dist/user/models/user-summary.model.d.ts +83 -0
- package/dist/utils/internal/apiBaseUrl.d.ts +1 -0
- package/dist/utils/internal/buildRequestUrl.d.ts +2 -0
- package/dist/utils/internal/call.d.ts +20 -0
- package/dist/utils/internal/index.d.ts +4 -0
- package/dist/utils/internal/serializeProperties.d.ts +4 -0
- package/dist/utils/public/buildAuthorization.d.ts +22 -0
- package/dist/utils/public/index.d.ts +3 -0
- package/dist/utils/public/models/auth-object.model.d.ts +19 -0
- package/dist/utils/public/models/index.d.ts +1 -0
- package/package.json +117 -0
- package/src/__playground.ts +27 -0
- package/src/achievement/getAchievementUnlocks.test.ts +71 -0
- package/src/achievement/getAchievementUnlocks.ts +80 -0
- package/src/achievement/index.ts +2 -0
- package/src/achievement/models/achievement-unlock-entity.model.ts +6 -0
- package/src/achievement/models/get-achievement-unlocks-response.model.ts +8 -0
- package/src/achievement/models/index.ts +2 -0
- package/src/console/getConsoleIds.test.ts +53 -0
- package/src/console/getConsoleIds.ts +43 -0
- package/src/console/getGameList.test.ts +82 -0
- package/src/console/getGameList.ts +94 -0
- package/src/console/index.ts +3 -0
- package/src/console/models/console-id.model.ts +4 -0
- package/src/console/models/game-list.model.ts +16 -0
- package/src/console/models/get-console-ids-response.model.ts +1 -0
- package/src/console/models/get-game-list-response.model.ts +16 -0
- package/src/console/models/index.ts +4 -0
- package/src/feed/getAchievementOfTheWeek.test.ts +167 -0
- package/src/feed/getAchievementOfTheWeek.ts +80 -0
- package/src/feed/getActiveClaims.test.ts +81 -0
- package/src/feed/getActiveClaims.ts +68 -0
- package/src/feed/getTicketData.test.ts +349 -0
- package/src/feed/getTicketData.ts +286 -0
- package/src/feed/getTopTenUsers.test.ts +101 -0
- package/src/feed/getTopTenUsers.ts +51 -0
- package/src/feed/index.ts +5 -0
- package/src/feed/models/achievement-of-the-week.model.ts +27 -0
- package/src/feed/models/achievement-ticket-stats-response.model.ts +7 -0
- package/src/feed/models/achievement-ticket-stats.model.ts +7 -0
- package/src/feed/models/active-claim.model.ts +66 -0
- package/src/feed/models/game-ticket-stats.model.ts +11 -0
- package/src/feed/models/game-tickets-response.model.ts +7 -0
- package/src/feed/models/get-achievement-of-the-week-response.model.ts +27 -0
- package/src/feed/models/get-active-claims-response.model.ts +19 -0
- package/src/feed/models/get-top-ten-users-response.model.ts +12 -0
- package/src/feed/models/index.ts +19 -0
- package/src/feed/models/most-ticketed-games-response.model.ts +12 -0
- package/src/feed/models/most-ticketed-games.model.ts +12 -0
- package/src/feed/models/recent-tickets-response.model.ts +7 -0
- package/src/feed/models/recent-tickets.model.ts +7 -0
- package/src/feed/models/response-ticket-entity.model.ts +25 -0
- package/src/feed/models/ticket-entity.model.ts +24 -0
- package/src/feed/models/tickets-by-user-response.model.ts +8 -0
- package/src/feed/models/top-ten-users-entity.model.ts +5 -0
- package/src/feed/models/top-ten-users.model.ts +3 -0
- package/src/feed/models/user-ticket-stats.model.ts +8 -0
- package/src/game/getAchievementCount.test.ts +49 -0
- package/src/game/getAchievementCount.ts +52 -0
- package/src/game/getAchievementDistribution.test.ts +187 -0
- package/src/game/getAchievementDistribution.ts +88 -0
- package/src/game/getGame.test.ts +81 -0
- package/src/game/getGame.ts +74 -0
- package/src/game/getGameExtended.test.ts +121 -0
- package/src/game/getGameExtended.ts +103 -0
- package/src/game/getGameRankAndScore.test.ts +62 -0
- package/src/game/getGameRankAndScore.ts +66 -0
- package/src/game/getGameRating.test.ts +59 -0
- package/src/game/getGameRating.ts +59 -0
- package/src/game/index.ts +7 -0
- package/src/game/models/achievement-count.model.ts +4 -0
- package/src/game/models/achievement-distribution-flags.model.ts +4 -0
- package/src/game/models/game-extended-achievement-entity.model.ts +15 -0
- package/src/game/models/game-extended-claim-entity.model.ts +7 -0
- package/src/game/models/game-extended.model.ts +26 -0
- package/src/game/models/game-rank-and-score-entity.model.ts +6 -0
- package/src/game/models/game-rating.model.ts +9 -0
- package/src/game/models/game.model.ts +19 -0
- package/src/game/models/get-achievement-count-response.model.ts +4 -0
- package/src/game/models/get-achievement-distribution-response.model.ts +1 -0
- package/src/game/models/get-game-extended-response.model.ts +56 -0
- package/src/game/models/get-game-rank-and-score-response.model.ts +8 -0
- package/src/game/models/get-game-rating-response.model.ts +9 -0
- package/src/game/models/get-game-response.model.ts +19 -0
- package/src/game/models/index.ts +14 -0
- package/src/index.ts +8 -0
- package/src/user/getAchievementsEarnedBetween.test.ts +84 -0
- package/src/user/getAchievementsEarnedBetween.ts +88 -0
- package/src/user/getAchievementsEarnedOnDay.test.ts +83 -0
- package/src/user/getAchievementsEarnedOnDay.ts +87 -0
- package/src/user/getGameInfoAndUserProgress.test.ts +135 -0
- package/src/user/getGameInfoAndUserProgress.ts +118 -0
- package/src/user/getUserGameRankAndScore.test.ts +60 -0
- package/src/user/getUserGameRankAndScore.ts +69 -0
- package/src/user/getUserPoints.test.ts +49 -0
- package/src/user/getUserPoints.ts +51 -0
- package/src/user/getUserProgress.test.ts +80 -0
- package/src/user/getUserProgress.ts +78 -0
- package/src/user/getUserRecentlyPlayedGames.test.ts +76 -0
- package/src/user/getUserRecentlyPlayedGames.ts +93 -0
- package/src/user/getUserSummary.test.ts +251 -0
- package/src/user/getUserSummary.ts +96 -0
- package/src/user/index.ts +9 -0
- package/src/user/models/dated-user-achievement.model.ts +17 -0
- package/src/user/models/dated-user-achievements-response.model.ts +20 -0
- package/src/user/models/game-info-and-user-progress.model.ts +19 -0
- package/src/user/models/get-game-info-and-user-progress-response.model.ts +28 -0
- package/src/user/models/get-user-game-rank-and-score-response.model.ts +9 -0
- package/src/user/models/get-user-points-response.model.ts +4 -0
- package/src/user/models/get-user-progress-response.model.ts +13 -0
- package/src/user/models/get-user-recently-played-games-response.model.ts +17 -0
- package/src/user/models/get-user-summary-response.model.ts +92 -0
- package/src/user/models/index.ts +14 -0
- package/src/user/models/user-game-rank-and-score.model.ts +8 -0
- package/src/user/models/user-points.model.ts +4 -0
- package/src/user/models/user-progress.model.ts +10 -0
- package/src/user/models/user-recently-played-games.model.ts +16 -0
- package/src/user/models/user-summary.model.ts +92 -0
- package/src/utils/internal/apiBaseUrl.ts +1 -0
- package/src/utils/internal/buildRequestUrl.test.ts +51 -0
- package/src/utils/internal/buildRequestUrl.ts +32 -0
- package/src/utils/internal/call.test.ts +39 -0
- package/src/utils/internal/call.ts +29 -0
- package/src/utils/internal/index.ts +4 -0
- package/src/utils/internal/serializeProperties.test.ts +141 -0
- package/src/utils/internal/serializeProperties.ts +75 -0
- package/src/utils/public/buildAuthorization.test.ts +36 -0
- package/src/utils/public/buildAuthorization.ts +40 -0
- package/src/utils/public/index.ts +3 -0
- package/src/utils/public/models/auth-object.model.ts +20 -0
- package/src/utils/public/models/index.ts +1 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { GameExtendedRawAchievementEntity, GetGameExtendedResponse } from "../../game/models";
|
|
2
|
+
declare type GetGameExtendedResponseWithoutClaims = Omit<GetGameExtendedResponse, "Claims">;
|
|
3
|
+
declare type GameExtendedRawAchievementEntityWithUserProgress = GameExtendedRawAchievementEntity & {
|
|
4
|
+
DateEarned: string;
|
|
5
|
+
DateEarnedHardcore: string;
|
|
6
|
+
};
|
|
7
|
+
export interface GetGameInfoAndUserProgressResponse extends GetGameExtendedResponseWithoutClaims {
|
|
8
|
+
Achievements: Record<number, GameExtendedRawAchievementEntityWithUserProgress>;
|
|
9
|
+
NumAwardedToUser: number;
|
|
10
|
+
NumAwardedToUserHardcore: number;
|
|
11
|
+
UserCompletion: string;
|
|
12
|
+
UserCompletionHardcore: string;
|
|
13
|
+
}
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
interface UserProgressResponseEntity {
|
|
2
|
+
NumPossibleAchievements: string;
|
|
3
|
+
PossibleScore: string;
|
|
4
|
+
NumAchieved: number | string;
|
|
5
|
+
ScoreAchieved: number | string;
|
|
6
|
+
NumAchievedHardcore: number | string;
|
|
7
|
+
ScoreAchievedHardcore: number | string;
|
|
8
|
+
}
|
|
9
|
+
export declare type GetUserProgressResponse = Record<`${number}`, UserProgressResponseEntity>;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
interface UserRecentlyPlayedGameResponseEntity {
|
|
2
|
+
GameID: string;
|
|
3
|
+
ConsoleID: string;
|
|
4
|
+
ConsoleName: string;
|
|
5
|
+
Title: string;
|
|
6
|
+
ImageIcon: string;
|
|
7
|
+
LastPlayed: string;
|
|
8
|
+
NumPossibleAchievements: string;
|
|
9
|
+
PossibleScore: string;
|
|
10
|
+
NumAchieved: string | number;
|
|
11
|
+
ScoreAchieved: string | number;
|
|
12
|
+
NumAchievedHardcore: string | number;
|
|
13
|
+
ScoreAchievedHardcore: string | number;
|
|
14
|
+
}
|
|
15
|
+
export declare type GetUserRecentlyPlayedGamesResponse = UserRecentlyPlayedGameResponseEntity[];
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
interface RecentlyPlayedGameEntity {
|
|
2
|
+
GameID: string;
|
|
3
|
+
ConsoleID: string;
|
|
4
|
+
ConsoleName: string;
|
|
5
|
+
Title: string;
|
|
6
|
+
ImageIcon: string;
|
|
7
|
+
LastPlayed: string;
|
|
8
|
+
}
|
|
9
|
+
interface RecentlyAwardedAchievementEntity {
|
|
10
|
+
NumPossibleAchievements: string;
|
|
11
|
+
PossibleScore: string;
|
|
12
|
+
NumAchieved: number | string;
|
|
13
|
+
ScoreAchieved: number | string;
|
|
14
|
+
NumAchievedHardcore: number | string;
|
|
15
|
+
ScoreAchievedHardcore: number | string;
|
|
16
|
+
}
|
|
17
|
+
interface ExtendedRecentAchievementEntity {
|
|
18
|
+
ID: string;
|
|
19
|
+
GameID: string;
|
|
20
|
+
GameTitle: string;
|
|
21
|
+
Title: string;
|
|
22
|
+
Description: string;
|
|
23
|
+
Points: string;
|
|
24
|
+
BadgeName: string;
|
|
25
|
+
IsAwarded: "1";
|
|
26
|
+
DateAwarded: string;
|
|
27
|
+
HardcoreAchieved: "0";
|
|
28
|
+
}
|
|
29
|
+
interface LastGameEntity {
|
|
30
|
+
ID: number;
|
|
31
|
+
Title: string;
|
|
32
|
+
ConsoleID: number;
|
|
33
|
+
ForumTopicID: number;
|
|
34
|
+
Flags: number;
|
|
35
|
+
ImageIcon: string;
|
|
36
|
+
ImageTitle: string;
|
|
37
|
+
ImageIngame: string;
|
|
38
|
+
ImageBoxArt: string;
|
|
39
|
+
Publisher: string;
|
|
40
|
+
Developer: string;
|
|
41
|
+
Genre: string;
|
|
42
|
+
Released: string;
|
|
43
|
+
IsFinal: boolean;
|
|
44
|
+
ConsoleName: string;
|
|
45
|
+
RichPresencePatch: string;
|
|
46
|
+
}
|
|
47
|
+
export interface GetUserSummaryResponse {
|
|
48
|
+
RecentlyPlayedCount: number;
|
|
49
|
+
RecentlyPlayed: RecentlyPlayedGameEntity[];
|
|
50
|
+
MemberSince: string;
|
|
51
|
+
LastActivity: {
|
|
52
|
+
ID: string;
|
|
53
|
+
timestamp: string;
|
|
54
|
+
lastupdate: string;
|
|
55
|
+
activitytype: string;
|
|
56
|
+
User: string;
|
|
57
|
+
data: string;
|
|
58
|
+
data2: string;
|
|
59
|
+
};
|
|
60
|
+
RichPresenceMsg: string;
|
|
61
|
+
LastGameID: string;
|
|
62
|
+
LastGame: LastGameEntity;
|
|
63
|
+
ContribCount: string;
|
|
64
|
+
ContribYield: string;
|
|
65
|
+
TotalPoints: string;
|
|
66
|
+
TotalSoftcorePoints: string;
|
|
67
|
+
TotalTruePoints: string;
|
|
68
|
+
Permissions: string;
|
|
69
|
+
Untracked: "0" | "1";
|
|
70
|
+
ID: string;
|
|
71
|
+
UserWallActive: "0" | "1";
|
|
72
|
+
Motto: string;
|
|
73
|
+
Rank: number;
|
|
74
|
+
Awarded: Record<`${number}`, RecentlyAwardedAchievementEntity>;
|
|
75
|
+
RecentAchievements: Record<`${number}`, Record<`${number}`, ExtendedRecentAchievementEntity>>;
|
|
76
|
+
Points: string;
|
|
77
|
+
SoftcorePoints: string;
|
|
78
|
+
UserPic: string;
|
|
79
|
+
TotalRanked: number;
|
|
80
|
+
Status: string;
|
|
81
|
+
}
|
|
82
|
+
export {};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export * from "./dated-user-achievement.model";
|
|
2
|
+
export * from "./dated-user-achievements-response.model";
|
|
3
|
+
export * from "./game-info-and-user-progress.model";
|
|
4
|
+
export * from "./get-game-info-and-user-progress-response.model";
|
|
5
|
+
export * from "./get-user-game-rank-and-score-response.model";
|
|
6
|
+
export * from "./get-user-points-response.model";
|
|
7
|
+
export * from "./get-user-progress-response.model";
|
|
8
|
+
export * from "./get-user-recently-played-games-response.model";
|
|
9
|
+
export * from "./get-user-summary-response.model";
|
|
10
|
+
export * from "./user-game-rank-and-score.model";
|
|
11
|
+
export * from "./user-points.model";
|
|
12
|
+
export * from "./user-progress.model";
|
|
13
|
+
export * from "./user-recently-played-games.model";
|
|
14
|
+
export * from "./user-summary.model";
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
interface UserProgressEntity {
|
|
2
|
+
numPossibleAchievements: number;
|
|
3
|
+
possibleScore: number;
|
|
4
|
+
numAchieved: number;
|
|
5
|
+
scoreAchieved: number;
|
|
6
|
+
numAchievedHardcore: number;
|
|
7
|
+
scoreAchievedHardcore: number;
|
|
8
|
+
}
|
|
9
|
+
export declare type UserProgress = Record<`${number}`, UserProgressEntity>;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
interface UserRecentlyPlayedGameEntity {
|
|
2
|
+
gameId: number;
|
|
3
|
+
consoleId: number;
|
|
4
|
+
consoleName: string;
|
|
5
|
+
title: string;
|
|
6
|
+
imageIcon: string;
|
|
7
|
+
lastPlayed: string;
|
|
8
|
+
numPossibleAchievements: number;
|
|
9
|
+
possibleScore: number;
|
|
10
|
+
numAchieved: number;
|
|
11
|
+
scoreAchieved: number;
|
|
12
|
+
numAchievedHardcore: number;
|
|
13
|
+
scoreAchievedHardcore: number;
|
|
14
|
+
}
|
|
15
|
+
export declare type UserRecentlyPlayedGames = UserRecentlyPlayedGameEntity[];
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
interface RecentlyPlayedGameEntity {
|
|
2
|
+
gameId: number;
|
|
3
|
+
consoleId: number;
|
|
4
|
+
consoleName: string;
|
|
5
|
+
title: string;
|
|
6
|
+
imageIcon: string;
|
|
7
|
+
lastPlayed: string;
|
|
8
|
+
}
|
|
9
|
+
interface LastActivityEntity {
|
|
10
|
+
id: number;
|
|
11
|
+
timestamp: string;
|
|
12
|
+
lastupdate: string;
|
|
13
|
+
activitytype: number;
|
|
14
|
+
user: string;
|
|
15
|
+
data: string;
|
|
16
|
+
data2: string;
|
|
17
|
+
}
|
|
18
|
+
interface LastGameEntity {
|
|
19
|
+
id: number;
|
|
20
|
+
title: string;
|
|
21
|
+
consoleId: number;
|
|
22
|
+
forumTopicId: number;
|
|
23
|
+
flags: number;
|
|
24
|
+
imageIcon: string;
|
|
25
|
+
imageTitle: string;
|
|
26
|
+
imageIngame: string;
|
|
27
|
+
imageBoxArt: string;
|
|
28
|
+
publisher: string;
|
|
29
|
+
developer: string;
|
|
30
|
+
genre: string;
|
|
31
|
+
released: string;
|
|
32
|
+
isFinal: boolean;
|
|
33
|
+
consoleName: string;
|
|
34
|
+
richPresencePatch: string;
|
|
35
|
+
}
|
|
36
|
+
interface AwardedGameEntity {
|
|
37
|
+
numPossibleAchievements: number;
|
|
38
|
+
possibleScore: number;
|
|
39
|
+
numAchieved: number;
|
|
40
|
+
scoreAchieved: number;
|
|
41
|
+
numAchievedHardcore: number;
|
|
42
|
+
scoreAchievedHardcore: number;
|
|
43
|
+
}
|
|
44
|
+
interface ExtendedRecentAchievementEntity {
|
|
45
|
+
id: number;
|
|
46
|
+
gameId: number;
|
|
47
|
+
gameTitle: string;
|
|
48
|
+
title: string;
|
|
49
|
+
description: string;
|
|
50
|
+
points: number;
|
|
51
|
+
badgeName: string;
|
|
52
|
+
isAwarded: true;
|
|
53
|
+
dateAwarded: string;
|
|
54
|
+
hardcoreAchieved: false;
|
|
55
|
+
}
|
|
56
|
+
export interface UserSummary {
|
|
57
|
+
recentlyPlayedCount: number;
|
|
58
|
+
recentlyPlayed: RecentlyPlayedGameEntity[];
|
|
59
|
+
memberSince: string;
|
|
60
|
+
lastActivity: LastActivityEntity;
|
|
61
|
+
richPresenceMsg: string;
|
|
62
|
+
lastGameId: number;
|
|
63
|
+
lastGame: LastGameEntity;
|
|
64
|
+
contribCount: number;
|
|
65
|
+
contribYield: number;
|
|
66
|
+
totalPoints: number;
|
|
67
|
+
totalSoftcorePoints: number;
|
|
68
|
+
totalTruePoints: number;
|
|
69
|
+
permissions: number;
|
|
70
|
+
untracked: boolean;
|
|
71
|
+
id: number;
|
|
72
|
+
userWallActive: boolean;
|
|
73
|
+
motto: string;
|
|
74
|
+
rank: number;
|
|
75
|
+
awarded: Record<`${number}`, AwardedGameEntity>;
|
|
76
|
+
recentAchievements: Record<`${number}`, Record<`${number}`, ExtendedRecentAchievementEntity>>;
|
|
77
|
+
points: number;
|
|
78
|
+
softcorePoints: number;
|
|
79
|
+
userPic: string;
|
|
80
|
+
totalRanked: number;
|
|
81
|
+
status: string;
|
|
82
|
+
}
|
|
83
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const apiBaseUrl = "https://retroachievements.org/API";
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fetch an HTTP resource. This is publicly exposed in the
|
|
3
|
+
* event you would like to access an endpoint that this
|
|
4
|
+
* library does not currently support.
|
|
5
|
+
*
|
|
6
|
+
* UNLESS YOU'RE SURE OF WHAT YOU'RE DOING, YOU PROBABLY
|
|
7
|
+
* SHOULDN'T USE THIS FUNCTION.
|
|
8
|
+
*
|
|
9
|
+
* 2022-10-09: At the time of writing, Node.js LTS (16.x)
|
|
10
|
+
* does not yet support fetch. As a result, we pull in
|
|
11
|
+
* isomorphic-unfetch for Node.js compatibility. Our support
|
|
12
|
+
* matrix includes 14.x and 16.x.
|
|
13
|
+
*
|
|
14
|
+
* @FIXME - When Node.js 20.x is released, remove the
|
|
15
|
+
* isomorphic-unfetch dependency. At that point we will have
|
|
16
|
+
* two major LTS versions that include a native fetch API.
|
|
17
|
+
*/
|
|
18
|
+
export declare const call: <T extends readonly any[] | Record<string, any>>(config: {
|
|
19
|
+
url: string;
|
|
20
|
+
}) => Promise<T>;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { AuthObject } from "./models";
|
|
2
|
+
/**
|
|
3
|
+
* Accepts your RetroAchievements.org userName and web API key. After
|
|
4
|
+
* receiving these inputs, the function returns you a value that can be
|
|
5
|
+
* used for the authentication parameter by any of the async calls in this
|
|
6
|
+
* library.
|
|
7
|
+
*
|
|
8
|
+
* Your account's personal Web API Key can be found on the Settings page
|
|
9
|
+
* of RetroAchievements.org. Do not use a Web API Key that is not associated
|
|
10
|
+
* with your account.
|
|
11
|
+
*
|
|
12
|
+
* @returns An `AuthObject` that you can pass to any of the API call functions.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```
|
|
16
|
+
* const authorization = buildAuthorization({
|
|
17
|
+
* userName: "Scott",
|
|
18
|
+
* webApiKey: "LtjCwW16nJI7cqOyPIQtXk8v1cfF0tmO"
|
|
19
|
+
* });
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export declare const buildAuthorization: (options: AuthObject) => AuthObject;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Each RetroAchievements API call is uniquely authenticated
|
|
3
|
+
* using a userName + API key combination. Your account's personal
|
|
4
|
+
* Web API Key can be found on the Settings page.
|
|
5
|
+
*/
|
|
6
|
+
export interface AuthObject {
|
|
7
|
+
/**
|
|
8
|
+
* You or your app's exact username on the RetroAchievements.org website.
|
|
9
|
+
* For example, https://retroachievements.org/user/Scott would have a value
|
|
10
|
+
* of "Scott".
|
|
11
|
+
*/
|
|
12
|
+
userName: string;
|
|
13
|
+
/**
|
|
14
|
+
* This can be found in the "Keys" section of your Settings page on the
|
|
15
|
+
* RetroAchievements.org website. This is a 32-digit alphanumeric key
|
|
16
|
+
* that is case-sensitive.
|
|
17
|
+
*/
|
|
18
|
+
webApiKey: string;
|
|
19
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./auth-object.model";
|
package/package.json
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@retroachievements/api",
|
|
3
|
+
"description": "A well-tested library that lets you get achievement, user, and game data from RetroAchievements.",
|
|
4
|
+
"keywords": [
|
|
5
|
+
"retroachievements",
|
|
6
|
+
"achievements",
|
|
7
|
+
"trophies",
|
|
8
|
+
"raweb",
|
|
9
|
+
"retro gaming"
|
|
10
|
+
],
|
|
11
|
+
"version": "0.0.0-development",
|
|
12
|
+
"main": "dist/index.js",
|
|
13
|
+
"module": "dist/api.esm.js",
|
|
14
|
+
"typings": "dist/index.d.ts",
|
|
15
|
+
"exports": {
|
|
16
|
+
".": {
|
|
17
|
+
"require": "./dist/index.js",
|
|
18
|
+
"import": "./dist/api.esm.js"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"license": "MIT",
|
|
22
|
+
"files": [
|
|
23
|
+
"dist",
|
|
24
|
+
"src"
|
|
25
|
+
],
|
|
26
|
+
"scripts": {
|
|
27
|
+
"dev": "esrun --watch src/__playground.ts",
|
|
28
|
+
"build": "dts build",
|
|
29
|
+
"prepare": "dts build",
|
|
30
|
+
"format": "prettier --write . '**/*.{json,md,js,ts,tsx}'",
|
|
31
|
+
"format:write": "prettier --write . '**/*.{json,md,js,ts,tsx}'",
|
|
32
|
+
"format:check": "prettier --check . '**/*.{json,md,js,ts,tsx}'",
|
|
33
|
+
"lint": "eslint --ignore-path .gitignore --ext .js,.ts,.tsx .",
|
|
34
|
+
"lint:fix": "eslint --ignore-path .gitignore --ext .js,.ts,.tsx . --fix",
|
|
35
|
+
"test": "jest --selectProjects UNIT",
|
|
36
|
+
"test:coverage": "jest --selectProjects UNIT --coverage",
|
|
37
|
+
"verify": "yarn format:check && yarn lint && yarn test:coverage && yarn build && yarn size",
|
|
38
|
+
"size": "size-limit",
|
|
39
|
+
"start": "dts watch"
|
|
40
|
+
},
|
|
41
|
+
"dependencies": {
|
|
42
|
+
"isomorphic-unfetch": "^3.1.0"
|
|
43
|
+
},
|
|
44
|
+
"peerDependencies": {},
|
|
45
|
+
"devDependencies": {
|
|
46
|
+
"@commitlint/cli": "^17.1.2",
|
|
47
|
+
"@commitlint/config-conventional": "^17.1.0",
|
|
48
|
+
"@digitak/esrun": "^3.2.13",
|
|
49
|
+
"@size-limit/preset-small-lib": "^8.1.0",
|
|
50
|
+
"@swc/core": "^1.3.10",
|
|
51
|
+
"@swc/jest": "^0.2.23",
|
|
52
|
+
"@tsconfig/recommended": "^1.0.1",
|
|
53
|
+
"@types/jest": "^29.2.0",
|
|
54
|
+
"@typescript-eslint/eslint-plugin": "^5.41.0",
|
|
55
|
+
"@typescript-eslint/parser": "^5.41.0",
|
|
56
|
+
"cz-conventional-changelog": "^3.3.0",
|
|
57
|
+
"dotenv-flow-cli": "^1.0.0",
|
|
58
|
+
"dts-cli": "^1.6.0",
|
|
59
|
+
"eslint": "^8.26.0",
|
|
60
|
+
"eslint-config-prettier": "^8.5.0",
|
|
61
|
+
"eslint-import-resolver-typescript": "^3.5.2",
|
|
62
|
+
"eslint-plugin-import": "^2.26.0",
|
|
63
|
+
"eslint-plugin-simple-import-sort": "^8.0.0",
|
|
64
|
+
"eslint-plugin-sonarjs": "^0.16.0",
|
|
65
|
+
"eslint-plugin-unicorn": "^44.0.2",
|
|
66
|
+
"husky": "^4.3.8",
|
|
67
|
+
"jest": "^29.2.1",
|
|
68
|
+
"msw": "^0.47.4",
|
|
69
|
+
"prettier": "2.7.1",
|
|
70
|
+
"pretty-quick": "3.1.3",
|
|
71
|
+
"size-limit": "^8.1.0",
|
|
72
|
+
"tslib": "^2.4.0",
|
|
73
|
+
"type-fest": "^3.1.0",
|
|
74
|
+
"typescript": "^4.8.4"
|
|
75
|
+
},
|
|
76
|
+
"size-limit": [
|
|
77
|
+
{
|
|
78
|
+
"path": "dist/api.cjs.production.min.js",
|
|
79
|
+
"limit": "10 KB"
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"path": "dist/api.esm.js",
|
|
83
|
+
"limit": "10 KB"
|
|
84
|
+
}
|
|
85
|
+
],
|
|
86
|
+
"husky": {
|
|
87
|
+
"hooks": {
|
|
88
|
+
"pre-commit": "pretty-quick --staged && yarn lint",
|
|
89
|
+
"commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
"config": {
|
|
93
|
+
"commitizen": {
|
|
94
|
+
"path": "./node_modules/cz-conventional-changelog"
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
"engines": {
|
|
98
|
+
"node": ">=14",
|
|
99
|
+
"npm": "please-use-yarn",
|
|
100
|
+
"yarn": ">= 1.19.1"
|
|
101
|
+
},
|
|
102
|
+
"release": {
|
|
103
|
+
"branches": [
|
|
104
|
+
"main",
|
|
105
|
+
"next"
|
|
106
|
+
]
|
|
107
|
+
},
|
|
108
|
+
"repository": {
|
|
109
|
+
"type": "git",
|
|
110
|
+
"url": "git+https://github.com/RetroAchievements/retroachievements-api-js.git"
|
|
111
|
+
},
|
|
112
|
+
"bugs": {
|
|
113
|
+
"url": "https://github.com/RetroAchievements/retroachievements-api-js/issues"
|
|
114
|
+
},
|
|
115
|
+
"homepage": "https://github.com/RetroAchievements/retroachievements-api-js#readme",
|
|
116
|
+
"author": "RAWeb Team"
|
|
117
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PLEASE ONLY COMMIT CHANGES TO THIS FILE IF YOU WANT THEM
|
|
3
|
+
* TO DIRECTLY IMPACT EVERY DEV WORKING ON THE PROJECT.
|
|
4
|
+
*
|
|
5
|
+
* Use this file to test and experiment with changes to the project.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
// If you can't import what you want from "./index", users won't
|
|
9
|
+
// be able to import it either.
|
|
10
|
+
import { buildAuthorization, getTicketData } from "./index";
|
|
11
|
+
|
|
12
|
+
const main = async () => {
|
|
13
|
+
console.log("retroachievements-api-js playground is running.");
|
|
14
|
+
console.log(""); // newline
|
|
15
|
+
|
|
16
|
+
// -- Start testing stuff here --
|
|
17
|
+
|
|
18
|
+
const authorization = buildAuthorization({
|
|
19
|
+
userName: "WCopeland",
|
|
20
|
+
webApiKey: "gYPwmMOAIiGkOmk1qpNDrTfqBiGIeh7X"
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
const ticketData = await getTicketData(authorization, {});
|
|
24
|
+
console.log(ticketData);
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
main();
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { rest } from "msw";
|
|
2
|
+
import { setupServer } from "msw/node";
|
|
3
|
+
|
|
4
|
+
import { apiBaseUrl } from "../utils/internal";
|
|
5
|
+
import { buildAuthorization } from "../utils/public";
|
|
6
|
+
import { getAchievementUnlocks } from "./getAchievementUnlocks";
|
|
7
|
+
import type { GetAchievementUnlocksResponse } from "./models";
|
|
8
|
+
|
|
9
|
+
const server = setupServer();
|
|
10
|
+
|
|
11
|
+
describe("Function: getAchievementUnlocks", () => {
|
|
12
|
+
// MSW Setup
|
|
13
|
+
beforeAll(() => server.listen());
|
|
14
|
+
afterEach(() => server.resetHandlers());
|
|
15
|
+
afterAll(() => server.close());
|
|
16
|
+
|
|
17
|
+
it("is defined #sanity", () => {
|
|
18
|
+
// ASSERT
|
|
19
|
+
expect(getAchievementUnlocks).toBeDefined();
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it("retrieves metadata about unlocks for a target achievement", async () => {
|
|
23
|
+
// ARRANGE
|
|
24
|
+
const authorization = buildAuthorization({
|
|
25
|
+
userName: "mockUserName",
|
|
26
|
+
webApiKey: "mockWebApiKey"
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
const mockResponse: GetAchievementUnlocksResponse = [
|
|
30
|
+
{
|
|
31
|
+
User: "Podgicus0305",
|
|
32
|
+
RAPoints: "15544",
|
|
33
|
+
DateAwarded: "2022-07-12 19:06:34",
|
|
34
|
+
HardcoreMode: "1"
|
|
35
|
+
}
|
|
36
|
+
];
|
|
37
|
+
|
|
38
|
+
let searchParams = "";
|
|
39
|
+
|
|
40
|
+
server.use(
|
|
41
|
+
rest.get(
|
|
42
|
+
`${apiBaseUrl}/API_GetAchievementUnlocks.php`,
|
|
43
|
+
(req, res, ctx) => {
|
|
44
|
+
searchParams = req.url.search;
|
|
45
|
+
return res(ctx.json(mockResponse));
|
|
46
|
+
}
|
|
47
|
+
)
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
// ACT
|
|
51
|
+
const response = await getAchievementUnlocks(authorization, {
|
|
52
|
+
achievementId: 18_000,
|
|
53
|
+
count: 1,
|
|
54
|
+
offset: 1
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
// ASSERT
|
|
58
|
+
expect(searchParams).toContain("a=18000");
|
|
59
|
+
expect(searchParams).toContain("o=1");
|
|
60
|
+
expect(searchParams).toContain("c=1");
|
|
61
|
+
|
|
62
|
+
expect(response).toEqual([
|
|
63
|
+
{
|
|
64
|
+
user: "Podgicus0305",
|
|
65
|
+
raPoints: 15_544,
|
|
66
|
+
dateAwarded: "2022-07-12 19:06:34",
|
|
67
|
+
hardcoreMode: true
|
|
68
|
+
}
|
|
69
|
+
]);
|
|
70
|
+
});
|
|
71
|
+
});
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import {
|
|
2
|
+
apiBaseUrl,
|
|
3
|
+
buildRequestUrl,
|
|
4
|
+
call,
|
|
5
|
+
serializeProperties
|
|
6
|
+
} from "../utils/internal";
|
|
7
|
+
import type { AuthObject } from "../utils/public";
|
|
8
|
+
import type {
|
|
9
|
+
AchievementUnlockEntity,
|
|
10
|
+
GetAchievementUnlocksResponse
|
|
11
|
+
} from "./models";
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* A call to this function will retrieve a list of users who
|
|
15
|
+
* have earned the given achievementId.
|
|
16
|
+
*
|
|
17
|
+
* @param authorization An object containing your userName and webApiKey.
|
|
18
|
+
* This can be constructed with `buildAuthorization()`.
|
|
19
|
+
*
|
|
20
|
+
* @param payload.achievementId The target achievement we want to
|
|
21
|
+
* retrieve the unlocks list for. If unknown, this can be found
|
|
22
|
+
* by navigating to the achievement's page on the RetroAchievements.org
|
|
23
|
+
* website. eg: https://retroachievements.org/achievement/13876 has an
|
|
24
|
+
* ID of 13876.
|
|
25
|
+
*
|
|
26
|
+
* @param payload.offset Defaults to 0. The number of entries to skip.
|
|
27
|
+
*
|
|
28
|
+
* @param payload.count Defaults to 50, has a max of 500.
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```
|
|
32
|
+
* const achievementUnlocks = await getAchievementUnlocks(
|
|
33
|
+
* authorization,
|
|
34
|
+
* { achievementId: 13876 }
|
|
35
|
+
* );
|
|
36
|
+
* ```
|
|
37
|
+
*
|
|
38
|
+
* @returns An array containing metadata about unlocks for
|
|
39
|
+
* the target achievement.
|
|
40
|
+
* ```
|
|
41
|
+
* [
|
|
42
|
+
* {
|
|
43
|
+
* user: 'Podgicus0305',
|
|
44
|
+
* raPoints: 15544,
|
|
45
|
+
* dateAwarded: '2022-07-12 19:06:34',
|
|
46
|
+
* hardcoreMode: true
|
|
47
|
+
* }
|
|
48
|
+
* ]
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
export const getAchievementUnlocks = async (
|
|
52
|
+
authorization: AuthObject,
|
|
53
|
+
payload: { achievementId: number; offset?: number; count?: number }
|
|
54
|
+
): Promise<AchievementUnlockEntity[]> => {
|
|
55
|
+
const { achievementId, offset, count } = payload;
|
|
56
|
+
|
|
57
|
+
const queryParams: Record<string, number> = { a: achievementId };
|
|
58
|
+
|
|
59
|
+
if (offset) {
|
|
60
|
+
queryParams.o = offset;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (count) {
|
|
64
|
+
queryParams.c = count;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const url = buildRequestUrl(
|
|
68
|
+
apiBaseUrl,
|
|
69
|
+
"/API_GetAchievementUnlocks.php",
|
|
70
|
+
authorization,
|
|
71
|
+
queryParams
|
|
72
|
+
);
|
|
73
|
+
|
|
74
|
+
const rawResponse = await call<GetAchievementUnlocksResponse>({ url });
|
|
75
|
+
|
|
76
|
+
return serializeProperties(rawResponse, {
|
|
77
|
+
shouldCastToNumbers: ["RAPoints"],
|
|
78
|
+
shouldMapToBooleans: ["HardcoreMode"]
|
|
79
|
+
});
|
|
80
|
+
};
|