@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.
Files changed (225) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +103 -0
  3. package/dist/__playground.d.ts +7 -0
  4. package/dist/achievement/getAchievementUnlocks.d.ts +45 -0
  5. package/dist/achievement/index.d.ts +2 -0
  6. package/dist/achievement/models/achievement-unlock-entity.model.d.ts +6 -0
  7. package/dist/achievement/models/get-achievement-unlocks-response.model.d.ts +8 -0
  8. package/dist/achievement/models/index.d.ts +2 -0
  9. package/dist/api.cjs.development.js +2363 -0
  10. package/dist/api.cjs.development.js.map +1 -0
  11. package/dist/api.cjs.production.min.js +2 -0
  12. package/dist/api.cjs.production.min.js.map +1 -0
  13. package/dist/api.esm.js +2333 -0
  14. package/dist/api.esm.js.map +1 -0
  15. package/dist/console/getConsoleIds.d.ts +22 -0
  16. package/dist/console/getGameList.d.ts +52 -0
  17. package/dist/console/index.d.ts +3 -0
  18. package/dist/console/models/console-id.model.d.ts +4 -0
  19. package/dist/console/models/game-list.model.d.ts +15 -0
  20. package/dist/console/models/get-console-ids-response.model.d.ts +4 -0
  21. package/dist/console/models/get-game-list-response.model.d.ts +15 -0
  22. package/dist/console/models/index.d.ts +4 -0
  23. package/dist/feed/getAchievementOfTheWeek.d.ts +48 -0
  24. package/dist/feed/getActiveClaims.d.ts +38 -0
  25. package/dist/feed/getTicketData.d.ts +158 -0
  26. package/dist/feed/getTopTenUsers.d.ts +24 -0
  27. package/dist/feed/index.d.ts +5 -0
  28. package/dist/feed/models/achievement-of-the-week.model.d.ts +32 -0
  29. package/dist/feed/models/achievement-ticket-stats-response.model.d.ts +7 -0
  30. package/dist/feed/models/achievement-ticket-stats.model.d.ts +7 -0
  31. package/dist/feed/models/active-claim.model.d.ts +49 -0
  32. package/dist/feed/models/game-ticket-stats.model.d.ts +9 -0
  33. package/dist/feed/models/game-tickets-response.model.d.ts +7 -0
  34. package/dist/feed/models/get-achievement-of-the-week-response.model.d.ts +32 -0
  35. package/dist/feed/models/get-active-claims-response.model.d.ts +19 -0
  36. package/dist/feed/models/get-top-ten-users-response.model.d.ts +10 -0
  37. package/dist/feed/models/index.d.ts +19 -0
  38. package/dist/feed/models/most-ticketed-games-response.model.d.ts +12 -0
  39. package/dist/feed/models/most-ticketed-games.model.d.ts +12 -0
  40. package/dist/feed/models/recent-tickets-response.model.d.ts +6 -0
  41. package/dist/feed/models/recent-tickets.model.d.ts +6 -0
  42. package/dist/feed/models/response-ticket-entity.model.d.ts +24 -0
  43. package/dist/feed/models/ticket-entity.model.d.ts +24 -0
  44. package/dist/feed/models/tickets-by-user-response.model.d.ts +8 -0
  45. package/dist/feed/models/top-ten-users-entity.model.d.ts +5 -0
  46. package/dist/feed/models/top-ten-users.model.d.ts +2 -0
  47. package/dist/feed/models/user-ticket-stats.model.d.ts +8 -0
  48. package/dist/game/getAchievementCount.d.ts +31 -0
  49. package/dist/game/getAchievementDistribution.d.ts +57 -0
  50. package/dist/game/getGame.d.ts +48 -0
  51. package/dist/game/getGameExtended.d.ts +68 -0
  52. package/dist/game/getGameRankAndScore.d.ts +38 -0
  53. package/dist/game/getGameRating.d.ts +38 -0
  54. package/dist/game/index.d.ts +7 -0
  55. package/dist/game/models/achievement-count.model.d.ts +4 -0
  56. package/dist/game/models/achievement-distribution-flags.model.d.ts +4 -0
  57. package/dist/game/models/game-extended-achievement-entity.model.d.ts +15 -0
  58. package/dist/game/models/game-extended-claim-entity.model.d.ts +7 -0
  59. package/dist/game/models/game-extended.model.d.ts +25 -0
  60. package/dist/game/models/game-rank-and-score-entity.model.d.ts +6 -0
  61. package/dist/game/models/game-rating.model.d.ts +9 -0
  62. package/dist/game/models/game.model.d.ts +19 -0
  63. package/dist/game/models/get-achievement-count-response.model.d.ts +4 -0
  64. package/dist/game/models/get-achievement-distribution-response.model.d.ts +1 -0
  65. package/dist/game/models/get-game-extended-response.model.d.ts +50 -0
  66. package/dist/game/models/get-game-rank-and-score-response.model.d.ts +8 -0
  67. package/dist/game/models/get-game-rating-response.model.d.ts +9 -0
  68. package/dist/game/models/get-game-response.model.d.ts +19 -0
  69. package/dist/game/models/index.d.ts +14 -0
  70. package/dist/index.d.ts +6 -0
  71. package/dist/index.js +8 -0
  72. package/dist/user/getAchievementsEarnedBetween.d.ts +59 -0
  73. package/dist/user/getAchievementsEarnedOnDay.d.ts +57 -0
  74. package/dist/user/getGameInfoAndUserProgress.d.ts +80 -0
  75. package/dist/user/getUserGameRankAndScore.d.ts +44 -0
  76. package/dist/user/getUserPoints.d.ts +30 -0
  77. package/dist/user/getUserProgress.d.ts +49 -0
  78. package/dist/user/getUserRecentlyPlayedGames.d.ts +50 -0
  79. package/dist/user/getUserSummary.d.ts +32 -0
  80. package/dist/user/index.d.ts +9 -0
  81. package/dist/user/models/dated-user-achievement.model.d.ts +17 -0
  82. package/dist/user/models/dated-user-achievements-response.model.d.ts +19 -0
  83. package/dist/user/models/game-info-and-user-progress.model.d.ts +12 -0
  84. package/dist/user/models/get-game-info-and-user-progress-response.model.d.ts +14 -0
  85. package/dist/user/models/get-user-game-rank-and-score-response.model.d.ts +8 -0
  86. package/dist/user/models/get-user-points-response.model.d.ts +4 -0
  87. package/dist/user/models/get-user-progress-response.model.d.ts +10 -0
  88. package/dist/user/models/get-user-recently-played-games-response.model.d.ts +16 -0
  89. package/dist/user/models/get-user-summary-response.model.d.ts +82 -0
  90. package/dist/user/models/index.d.ts +14 -0
  91. package/dist/user/models/user-game-rank-and-score.model.d.ts +8 -0
  92. package/dist/user/models/user-points.model.d.ts +4 -0
  93. package/dist/user/models/user-progress.model.d.ts +10 -0
  94. package/dist/user/models/user-recently-played-games.model.d.ts +16 -0
  95. package/dist/user/models/user-summary.model.d.ts +83 -0
  96. package/dist/utils/internal/apiBaseUrl.d.ts +1 -0
  97. package/dist/utils/internal/buildRequestUrl.d.ts +2 -0
  98. package/dist/utils/internal/call.d.ts +20 -0
  99. package/dist/utils/internal/index.d.ts +4 -0
  100. package/dist/utils/internal/serializeProperties.d.ts +4 -0
  101. package/dist/utils/public/buildAuthorization.d.ts +22 -0
  102. package/dist/utils/public/index.d.ts +3 -0
  103. package/dist/utils/public/models/auth-object.model.d.ts +19 -0
  104. package/dist/utils/public/models/index.d.ts +1 -0
  105. package/package.json +117 -0
  106. package/src/__playground.ts +27 -0
  107. package/src/achievement/getAchievementUnlocks.test.ts +71 -0
  108. package/src/achievement/getAchievementUnlocks.ts +80 -0
  109. package/src/achievement/index.ts +2 -0
  110. package/src/achievement/models/achievement-unlock-entity.model.ts +6 -0
  111. package/src/achievement/models/get-achievement-unlocks-response.model.ts +8 -0
  112. package/src/achievement/models/index.ts +2 -0
  113. package/src/console/getConsoleIds.test.ts +53 -0
  114. package/src/console/getConsoleIds.ts +43 -0
  115. package/src/console/getGameList.test.ts +82 -0
  116. package/src/console/getGameList.ts +94 -0
  117. package/src/console/index.ts +3 -0
  118. package/src/console/models/console-id.model.ts +4 -0
  119. package/src/console/models/game-list.model.ts +16 -0
  120. package/src/console/models/get-console-ids-response.model.ts +1 -0
  121. package/src/console/models/get-game-list-response.model.ts +16 -0
  122. package/src/console/models/index.ts +4 -0
  123. package/src/feed/getAchievementOfTheWeek.test.ts +167 -0
  124. package/src/feed/getAchievementOfTheWeek.ts +80 -0
  125. package/src/feed/getActiveClaims.test.ts +81 -0
  126. package/src/feed/getActiveClaims.ts +68 -0
  127. package/src/feed/getTicketData.test.ts +349 -0
  128. package/src/feed/getTicketData.ts +286 -0
  129. package/src/feed/getTopTenUsers.test.ts +101 -0
  130. package/src/feed/getTopTenUsers.ts +51 -0
  131. package/src/feed/index.ts +5 -0
  132. package/src/feed/models/achievement-of-the-week.model.ts +27 -0
  133. package/src/feed/models/achievement-ticket-stats-response.model.ts +7 -0
  134. package/src/feed/models/achievement-ticket-stats.model.ts +7 -0
  135. package/src/feed/models/active-claim.model.ts +66 -0
  136. package/src/feed/models/game-ticket-stats.model.ts +11 -0
  137. package/src/feed/models/game-tickets-response.model.ts +7 -0
  138. package/src/feed/models/get-achievement-of-the-week-response.model.ts +27 -0
  139. package/src/feed/models/get-active-claims-response.model.ts +19 -0
  140. package/src/feed/models/get-top-ten-users-response.model.ts +12 -0
  141. package/src/feed/models/index.ts +19 -0
  142. package/src/feed/models/most-ticketed-games-response.model.ts +12 -0
  143. package/src/feed/models/most-ticketed-games.model.ts +12 -0
  144. package/src/feed/models/recent-tickets-response.model.ts +7 -0
  145. package/src/feed/models/recent-tickets.model.ts +7 -0
  146. package/src/feed/models/response-ticket-entity.model.ts +25 -0
  147. package/src/feed/models/ticket-entity.model.ts +24 -0
  148. package/src/feed/models/tickets-by-user-response.model.ts +8 -0
  149. package/src/feed/models/top-ten-users-entity.model.ts +5 -0
  150. package/src/feed/models/top-ten-users.model.ts +3 -0
  151. package/src/feed/models/user-ticket-stats.model.ts +8 -0
  152. package/src/game/getAchievementCount.test.ts +49 -0
  153. package/src/game/getAchievementCount.ts +52 -0
  154. package/src/game/getAchievementDistribution.test.ts +187 -0
  155. package/src/game/getAchievementDistribution.ts +88 -0
  156. package/src/game/getGame.test.ts +81 -0
  157. package/src/game/getGame.ts +74 -0
  158. package/src/game/getGameExtended.test.ts +121 -0
  159. package/src/game/getGameExtended.ts +103 -0
  160. package/src/game/getGameRankAndScore.test.ts +62 -0
  161. package/src/game/getGameRankAndScore.ts +66 -0
  162. package/src/game/getGameRating.test.ts +59 -0
  163. package/src/game/getGameRating.ts +59 -0
  164. package/src/game/index.ts +7 -0
  165. package/src/game/models/achievement-count.model.ts +4 -0
  166. package/src/game/models/achievement-distribution-flags.model.ts +4 -0
  167. package/src/game/models/game-extended-achievement-entity.model.ts +15 -0
  168. package/src/game/models/game-extended-claim-entity.model.ts +7 -0
  169. package/src/game/models/game-extended.model.ts +26 -0
  170. package/src/game/models/game-rank-and-score-entity.model.ts +6 -0
  171. package/src/game/models/game-rating.model.ts +9 -0
  172. package/src/game/models/game.model.ts +19 -0
  173. package/src/game/models/get-achievement-count-response.model.ts +4 -0
  174. package/src/game/models/get-achievement-distribution-response.model.ts +1 -0
  175. package/src/game/models/get-game-extended-response.model.ts +56 -0
  176. package/src/game/models/get-game-rank-and-score-response.model.ts +8 -0
  177. package/src/game/models/get-game-rating-response.model.ts +9 -0
  178. package/src/game/models/get-game-response.model.ts +19 -0
  179. package/src/game/models/index.ts +14 -0
  180. package/src/index.ts +8 -0
  181. package/src/user/getAchievementsEarnedBetween.test.ts +84 -0
  182. package/src/user/getAchievementsEarnedBetween.ts +88 -0
  183. package/src/user/getAchievementsEarnedOnDay.test.ts +83 -0
  184. package/src/user/getAchievementsEarnedOnDay.ts +87 -0
  185. package/src/user/getGameInfoAndUserProgress.test.ts +135 -0
  186. package/src/user/getGameInfoAndUserProgress.ts +118 -0
  187. package/src/user/getUserGameRankAndScore.test.ts +60 -0
  188. package/src/user/getUserGameRankAndScore.ts +69 -0
  189. package/src/user/getUserPoints.test.ts +49 -0
  190. package/src/user/getUserPoints.ts +51 -0
  191. package/src/user/getUserProgress.test.ts +80 -0
  192. package/src/user/getUserProgress.ts +78 -0
  193. package/src/user/getUserRecentlyPlayedGames.test.ts +76 -0
  194. package/src/user/getUserRecentlyPlayedGames.ts +93 -0
  195. package/src/user/getUserSummary.test.ts +251 -0
  196. package/src/user/getUserSummary.ts +96 -0
  197. package/src/user/index.ts +9 -0
  198. package/src/user/models/dated-user-achievement.model.ts +17 -0
  199. package/src/user/models/dated-user-achievements-response.model.ts +20 -0
  200. package/src/user/models/game-info-and-user-progress.model.ts +19 -0
  201. package/src/user/models/get-game-info-and-user-progress-response.model.ts +28 -0
  202. package/src/user/models/get-user-game-rank-and-score-response.model.ts +9 -0
  203. package/src/user/models/get-user-points-response.model.ts +4 -0
  204. package/src/user/models/get-user-progress-response.model.ts +13 -0
  205. package/src/user/models/get-user-recently-played-games-response.model.ts +17 -0
  206. package/src/user/models/get-user-summary-response.model.ts +92 -0
  207. package/src/user/models/index.ts +14 -0
  208. package/src/user/models/user-game-rank-and-score.model.ts +8 -0
  209. package/src/user/models/user-points.model.ts +4 -0
  210. package/src/user/models/user-progress.model.ts +10 -0
  211. package/src/user/models/user-recently-played-games.model.ts +16 -0
  212. package/src/user/models/user-summary.model.ts +92 -0
  213. package/src/utils/internal/apiBaseUrl.ts +1 -0
  214. package/src/utils/internal/buildRequestUrl.test.ts +51 -0
  215. package/src/utils/internal/buildRequestUrl.ts +32 -0
  216. package/src/utils/internal/call.test.ts +39 -0
  217. package/src/utils/internal/call.ts +29 -0
  218. package/src/utils/internal/index.ts +4 -0
  219. package/src/utils/internal/serializeProperties.test.ts +141 -0
  220. package/src/utils/internal/serializeProperties.ts +75 -0
  221. package/src/utils/public/buildAuthorization.test.ts +36 -0
  222. package/src/utils/public/buildAuthorization.ts +40 -0
  223. package/src/utils/public/index.ts +3 -0
  224. package/src/utils/public/models/auth-object.model.ts +20 -0
  225. package/src/utils/public/models/index.ts +1 -0
@@ -0,0 +1,101 @@
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 { getTopTenUsers } from "./getTopTenUsers";
7
+ import type { GetTopTenUsersResponse } from "./models";
8
+
9
+ const server = setupServer();
10
+
11
+ describe("Function: getTopTenUsers", () => {
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(getTopTenUsers).toBeDefined();
20
+ });
21
+
22
+ it("retrieves metadata about the current top ten users on the site", async () => {
23
+ // ARRANGE
24
+ const authorization = buildAuthorization({
25
+ userName: "mockUserName",
26
+ webApiKey: "mockWebApiKey"
27
+ });
28
+
29
+ const mockResponse: GetTopTenUsersResponse = [
30
+ { "1": "MaxMilyin", "2": "346289", "3": "995092" },
31
+ { "1": "HippopotamusRex", "2": "312118", "3": "1151351" },
32
+ { "1": "Sarconius", "2": "257862", "3": "1181770" },
33
+ { "1": "guineu", "2": "241623", "3": "672597" },
34
+ { "1": "Andrey199650", "2": "240101", "3": "567522" },
35
+ { "1": "Wendigo", "2": "227903", "3": "1099685" },
36
+ { "1": "donutweegee", "2": "204701", "3": "587221" },
37
+ { "1": "AmericanNinja", "2": "202980", "3": "567618" },
38
+ { "1": "Infernum", "2": "202171", "3": "689967" },
39
+ { "1": "FabricioPrie", "2": "196974", "3": "450436" }
40
+ ];
41
+
42
+ server.use(
43
+ rest.get(`${apiBaseUrl}/API_GetTopTenUsers.php`, (_, res, ctx) =>
44
+ res(ctx.json(mockResponse))
45
+ )
46
+ );
47
+
48
+ // ACT
49
+ const response = await getTopTenUsers(authorization);
50
+
51
+ // ASSERT
52
+ expect(response).toEqual([
53
+ {
54
+ userName: "MaxMilyin",
55
+ totalPoints: 346_289,
56
+ totalRatioPoints: 995_092
57
+ },
58
+ {
59
+ userName: "HippopotamusRex",
60
+ totalPoints: 312_118,
61
+ totalRatioPoints: 1_151_351
62
+ },
63
+ {
64
+ userName: "Sarconius",
65
+ totalPoints: 257_862,
66
+ totalRatioPoints: 1_181_770
67
+ },
68
+ { userName: "guineu", totalPoints: 241_623, totalRatioPoints: 672_597 },
69
+ {
70
+ userName: "Andrey199650",
71
+ totalPoints: 240_101,
72
+ totalRatioPoints: 567_522
73
+ },
74
+ {
75
+ userName: "Wendigo",
76
+ totalPoints: 227_903,
77
+ totalRatioPoints: 1_099_685
78
+ },
79
+ {
80
+ userName: "donutweegee",
81
+ totalPoints: 204_701,
82
+ totalRatioPoints: 587_221
83
+ },
84
+ {
85
+ userName: "AmericanNinja",
86
+ totalPoints: 202_980,
87
+ totalRatioPoints: 567_618
88
+ },
89
+ {
90
+ userName: "Infernum",
91
+ totalPoints: 202_171,
92
+ totalRatioPoints: 689_967
93
+ },
94
+ {
95
+ userName: "FabricioPrie",
96
+ totalPoints: 196_974,
97
+ totalRatioPoints: 450_436
98
+ }
99
+ ]);
100
+ });
101
+ });
@@ -0,0 +1,51 @@
1
+ import { apiBaseUrl, buildRequestUrl, call } from "../utils/internal";
2
+ import type { AuthObject } from "../utils/public";
3
+ import type {
4
+ GetTopTenUsersResponse,
5
+ TopTenUsers,
6
+ TopTenUsersEntity
7
+ } from "./models";
8
+
9
+ /**
10
+ * A call to this function will retrieve the current top ten users
11
+ * on the site.
12
+ *
13
+ * @param authorization An object containing your userName and webApiKey.
14
+ * This can be constructed with `buildAuthorization()`.
15
+ *
16
+ * @example
17
+ * ```
18
+ * const topTenUsers = await getTopTenUsers(authorization);
19
+ * ```
20
+ *
21
+ * @returns An array containing the list of top ten users.
22
+ * ```json
23
+ * [
24
+ * { userName: "MockUser", totalPoints: 350000, totalRatioPoints: 995000 },
25
+ * { userName: "MockUser2", totalPoints: 345000, totalRatioPoints: 994000 },
26
+ * ...
27
+ * ]
28
+ * ```
29
+ */
30
+ export const getTopTenUsers = async (
31
+ authorization: AuthObject
32
+ ): Promise<TopTenUsers> => {
33
+ const url = buildRequestUrl(
34
+ apiBaseUrl,
35
+ "/API_GetTopTenUsers.php",
36
+ authorization
37
+ );
38
+
39
+ const rawTopTenUsers = await call<GetTopTenUsersResponse>({ url });
40
+
41
+ const sanitizedTopTenUsers: TopTenUsersEntity[] = [];
42
+ for (const rawUser of rawTopTenUsers) {
43
+ sanitizedTopTenUsers.push({
44
+ userName: rawUser["1"],
45
+ totalPoints: Number(rawUser["2"]),
46
+ totalRatioPoints: Number(rawUser["3"])
47
+ });
48
+ }
49
+
50
+ return sanitizedTopTenUsers;
51
+ };
@@ -0,0 +1,5 @@
1
+ export * from "./getAchievementOfTheWeek";
2
+ export * from "./getActiveClaims";
3
+ export * from "./getTicketData";
4
+ export * from "./getTopTenUsers";
5
+ export * from "./models";
@@ -0,0 +1,27 @@
1
+ export interface AchievementOfTheWeek {
2
+ achievement: {
3
+ id: number;
4
+ title: string;
5
+ description: string;
6
+ points: number;
7
+ trueRatio: number;
8
+ author: string;
9
+ dateCreated: string;
10
+ dateModified: string;
11
+ };
12
+
13
+ console: { id: number; title: string };
14
+ forumTopic: { id: number };
15
+ game: { id: number; title: string };
16
+ startAt: string;
17
+ totalPlayers: number;
18
+
19
+ unlocks: Array<{
20
+ user: string;
21
+ raPoints: number;
22
+ dateAwarded: string;
23
+ hardcoreMode: boolean;
24
+ }>;
25
+
26
+ unlocksCount: number;
27
+ }
@@ -0,0 +1,7 @@
1
+ export interface AchievementTicketStatsResponse {
2
+ AchievementID: number;
3
+ AchievementTitle: string;
4
+ AchievementDescription: string;
5
+ URL: string;
6
+ OpenTickets: number;
7
+ }
@@ -0,0 +1,7 @@
1
+ export interface AchievementTicketStats {
2
+ achievementId: number;
3
+ achievementTitle: string;
4
+ achievementDescription: string;
5
+ url: string;
6
+ openTickets: number;
7
+ }
@@ -0,0 +1,66 @@
1
+ export enum ClaimType {
2
+ Primary = 0,
3
+ Collaboration = 1
4
+ }
5
+
6
+ export enum ClaimSetType {
7
+ NewSet = 0,
8
+ Revision = 1
9
+ }
10
+
11
+ export enum ClaimStatus {
12
+ Active = 0,
13
+ Complete = 1,
14
+ Dropped = 2
15
+ }
16
+
17
+ export interface ActiveClaim {
18
+ /** Unique ID of the claim. */
19
+ id: number;
20
+
21
+ /** User who made the claim. */
22
+ user: string;
23
+
24
+ /** ID of the claimed game. */
25
+ gameId: number;
26
+
27
+ /** Title of the claimed game. */
28
+ gameTitle: string;
29
+
30
+ /** Site-relative path of the game's icon image. */
31
+ gameIcon: string;
32
+
33
+ /** Console name of the claimed game. */
34
+ consoleName: string;
35
+
36
+ /** Whether the claim is primary or a collaboration. */
37
+ claimType: ClaimType;
38
+
39
+ /** Whether the claim is for a new set or a revision. */
40
+ setType: ClaimSetType;
41
+
42
+ /** Whether the claim is active, complete, or dropped. */
43
+ status: ClaimStatus;
44
+
45
+ /** Number of times the claim has been extended. */
46
+ extension: number;
47
+
48
+ /** Flag indicating a special type of claim. */
49
+ special: number;
50
+
51
+ /** Date the claim was made. */
52
+ created: string;
53
+
54
+ /**
55
+ * Date the claim is done. This is an expiration
56
+ * date for active claims, completion date for complete
57
+ * claims, and dropped date for dropped claims.
58
+ */
59
+ doneTime: string;
60
+
61
+ /** Date the claim was updated. */
62
+ updated: string;
63
+
64
+ /** Time in minutes left until the claim expires. */
65
+ minutesLeft: number;
66
+ }
@@ -0,0 +1,11 @@
1
+ import type { TicketEntity } from "./ticket-entity.model";
2
+
3
+ export interface GameTicketStats {
4
+ gameId: number;
5
+ gameTitle: string;
6
+ consoleName: string;
7
+ openTickets: number;
8
+ url: string;
9
+
10
+ tickets?: TicketEntity[];
11
+ }
@@ -0,0 +1,7 @@
1
+ export interface GameTicketsResponse {
2
+ GameID: number;
3
+ GameTitle: string;
4
+ ConsoleName: string;
5
+ OpenTickets: number;
6
+ URL: string;
7
+ }
@@ -0,0 +1,27 @@
1
+ export interface GetAchievementOfTheWeekResponse {
2
+ Achievement: {
3
+ ID: string;
4
+ Title: string;
5
+ Description: string;
6
+ Points: string;
7
+ TrueRatio: string;
8
+ Author: string;
9
+ DateCreated: string;
10
+ DateModified: string;
11
+ };
12
+
13
+ Console: { ID: string; Title: string };
14
+ ForumTopic: { ID: string };
15
+ Game: { ID: string; Title: string };
16
+ StartAt: string;
17
+ TotalPlayers: string;
18
+
19
+ Unlocks: Array<{
20
+ User: string;
21
+ RAPoints: string;
22
+ DateAwarded: string;
23
+ HardcoreMode: string;
24
+ }>;
25
+
26
+ UnlocksCount: string;
27
+ }
@@ -0,0 +1,19 @@
1
+ interface ActiveClaimResponseEntity {
2
+ ID: string;
3
+ User: string;
4
+ GameID: string;
5
+ GameTitle: string;
6
+ GameIcon: string;
7
+ ConsoleName: string;
8
+ ClaimType: string;
9
+ SetType: string;
10
+ Status: string;
11
+ Extension: string;
12
+ Special: string;
13
+ Created: string;
14
+ DoneTime: string;
15
+ Updated: string;
16
+ MinutesLeft: string;
17
+ }
18
+
19
+ export type GetActiveClaimsResponse = ActiveClaimResponseEntity[];
@@ -0,0 +1,12 @@
1
+ interface TopTenUsersResponseEntity {
2
+ /** Username */
3
+ "1": string;
4
+
5
+ /** Total points earned by the user */
6
+ "2": string;
7
+
8
+ /** Total ratio (white) points earned by the user */
9
+ "3": string;
10
+ }
11
+
12
+ export type GetTopTenUsersResponse = TopTenUsersResponseEntity[];
@@ -0,0 +1,19 @@
1
+ export * from "./achievement-of-the-week.model";
2
+ export * from "./achievement-ticket-stats.model";
3
+ export * from "./achievement-ticket-stats-response.model";
4
+ export * from "./active-claim.model";
5
+ export * from "./game-ticket-stats.model";
6
+ export * from "./game-tickets-response.model";
7
+ export * from "./get-achievement-of-the-week-response.model";
8
+ export * from "./get-active-claims-response.model";
9
+ export * from "./get-top-ten-users-response.model";
10
+ export * from "./most-ticketed-games.model";
11
+ export * from "./most-ticketed-games-response.model";
12
+ export * from "./recent-tickets.model";
13
+ export * from "./recent-tickets-response.model";
14
+ export * from "./response-ticket-entity.model";
15
+ export * from "./ticket-entity.model";
16
+ export * from "./tickets-by-user-response.model";
17
+ export * from "./top-ten-users.model";
18
+ export * from "./top-ten-users-entity.model";
19
+ export * from "./user-ticket-stats.model";
@@ -0,0 +1,12 @@
1
+ interface ReportedGameEntity {
2
+ GameID: string;
3
+ GameTitle: string;
4
+ GameIcon: string;
5
+ Console: string;
6
+ OpenTickets: string;
7
+ }
8
+
9
+ export interface MostTicketedGamesResponse {
10
+ MostReportedGames: ReportedGameEntity[];
11
+ URL: string;
12
+ }
@@ -0,0 +1,12 @@
1
+ interface ReportedGameEntity {
2
+ gameId: number;
3
+ gameTitle: string;
4
+ gameIcon: string;
5
+ console: string;
6
+ openTickets: number;
7
+ }
8
+
9
+ export interface MostTicketedGames {
10
+ mostReportedGames: ReportedGameEntity[];
11
+ url: string;
12
+ }
@@ -0,0 +1,7 @@
1
+ import type { ResponseTicketEntity } from "./response-ticket-entity.model";
2
+
3
+ export interface RecentTicketsResponse {
4
+ RecentTickets: ResponseTicketEntity[];
5
+ OpenTickets: number;
6
+ URL: string;
7
+ }
@@ -0,0 +1,7 @@
1
+ import type { TicketEntity } from "./ticket-entity.model";
2
+
3
+ export interface RecentTickets {
4
+ recentTickets: TicketEntity[];
5
+ openTickets: number;
6
+ url: string;
7
+ }
@@ -0,0 +1,25 @@
1
+ export interface ResponseTicketEntity {
2
+ ID: string;
3
+ AchievementID: string;
4
+ AchievementTitle: string;
5
+ AchievementDesc: string;
6
+ Points: string;
7
+ BadgeName: string;
8
+ AchievementAuthor: string;
9
+ GameID: string;
10
+ ConsoleName: string;
11
+ GameTitle: string;
12
+ GameIcon: string;
13
+ ReportedAt: string;
14
+ ReportType: string;
15
+ ReportState: string;
16
+ Hardcore: "0" | "1" | null;
17
+ ReportNotes: string;
18
+ ReportedBy: string;
19
+ ResolvedAt: string | null;
20
+ ResolvedBy: string | null;
21
+ ReportStateDescription: string;
22
+ ReportTypeDescription: string;
23
+
24
+ URL?: string;
25
+ }
@@ -0,0 +1,24 @@
1
+ export interface TicketEntity {
2
+ id: number;
3
+ achievementId: number;
4
+ achievementTitle: string;
5
+ achievementDesc: string;
6
+ points: number;
7
+ badgeName: string;
8
+ achievementAuthor: string;
9
+ gameId: number;
10
+ consoleName: string;
11
+ gameTitle: string;
12
+ gameIcon: string;
13
+ reportedAt: string;
14
+ reportType: number;
15
+ reportState: number;
16
+ hardcore: boolean | null;
17
+ reportNotes: string;
18
+ reportedBy: string;
19
+ resolvedAt: string | null;
20
+ resolvedBy: string | null;
21
+ reportStateDescription: string;
22
+ reportTypeDescription: string;
23
+ url: string;
24
+ }
@@ -0,0 +1,8 @@
1
+ export interface TicketsByUserResponse {
2
+ User: string;
3
+ Open: number;
4
+ Closed: number;
5
+ Resolved: number;
6
+ Total: number;
7
+ URL: string;
8
+ }
@@ -0,0 +1,5 @@
1
+ export interface TopTenUsersEntity {
2
+ userName: string;
3
+ totalPoints: number;
4
+ totalRatioPoints: number;
5
+ }
@@ -0,0 +1,3 @@
1
+ import type { TopTenUsersEntity } from "./top-ten-users-entity.model";
2
+
3
+ export type TopTenUsers = TopTenUsersEntity[];
@@ -0,0 +1,8 @@
1
+ export interface UserTicketStats {
2
+ user: string;
3
+ open: number;
4
+ closed: number;
5
+ resolved: number;
6
+ total: number;
7
+ url: string;
8
+ }
@@ -0,0 +1,49 @@
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 { getAchievementCount } from "./getAchievementCount";
7
+ import type { GetAchievementCountResponse } from "./models";
8
+
9
+ const server = setupServer();
10
+
11
+ describe("Function: getAchievementCount", () => {
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(getAchievementCount).toBeDefined();
20
+ });
21
+
22
+ it("given a game ID, retrieves the list of achievement IDs associated with the game and cleans properties", async () => {
23
+ // ARRANGE
24
+ const authorization = buildAuthorization({
25
+ userName: "mockUserName",
26
+ webApiKey: "mockWebApiKey"
27
+ });
28
+
29
+ const mockResponse: GetAchievementCountResponse = {
30
+ GameID: 8,
31
+ AchievementIDs: [1, 2, 3, 4, 5]
32
+ };
33
+
34
+ server.use(
35
+ rest.get(`${apiBaseUrl}/API_GetAchievementCount.php`, (_, res, ctx) =>
36
+ res(ctx.json(mockResponse))
37
+ )
38
+ );
39
+
40
+ // ACT
41
+ const response = await getAchievementCount(authorization, { gameId: 8 });
42
+
43
+ // ASSERT
44
+ expect(response).toEqual({
45
+ gameId: 8,
46
+ achievementIds: [1, 2, 3, 4, 5]
47
+ });
48
+ });
49
+ });
@@ -0,0 +1,52 @@
1
+ import {
2
+ apiBaseUrl,
3
+ buildRequestUrl,
4
+ call,
5
+ serializeProperties
6
+ } from "../utils/internal";
7
+ import type { AuthObject } from "../utils/public";
8
+ import type { AchievementCount, GetAchievementCountResponse } from "./models";
9
+
10
+ /**
11
+ * A call to this function will retrieve the list of
12
+ * achievement IDs for a game.
13
+ *
14
+ * @param authorization An object containing your userName and webApiKey.
15
+ * This can be constructed with `buildAuthorization()`.
16
+ *
17
+ * @param payload.gameId The unique game ID. If you are unsure, open the
18
+ * game's page on the RetroAchievements.org website. For example, Dragster's
19
+ * URL is https://retroachievements.org/game/14402. We can see from the
20
+ * URL that the game ID is "14402".
21
+ *
22
+ * @example
23
+ * ```
24
+ * const achievementCount = await getAchievementCount(
25
+ * authorization,
26
+ * { gameId: 14402 }
27
+ * );
28
+ * ```
29
+ *
30
+ * @returns An object containing a gameId and a list of
31
+ * achievementIds.
32
+ * ```
33
+ * { gameId: 14402, achievementIds: [1,2,3,4,5] }
34
+ * ```
35
+ */
36
+ export const getAchievementCount = async (
37
+ authorization: AuthObject,
38
+ payload: { gameId: number }
39
+ ): Promise<AchievementCount> => {
40
+ const { gameId } = payload;
41
+
42
+ const url = buildRequestUrl(
43
+ apiBaseUrl,
44
+ "/API_GetAchievementCount.php",
45
+ authorization,
46
+ { i: gameId }
47
+ );
48
+
49
+ const rawResponse = await call<GetAchievementCountResponse>({ url });
50
+
51
+ return serializeProperties(rawResponse);
52
+ };