@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,6 @@
1
+ export interface AchievementUnlockEntity {
2
+ user: string;
3
+ raPoints: number;
4
+ dateAwarded: string;
5
+ hardcoreMode: boolean;
6
+ }
@@ -0,0 +1,8 @@
1
+ interface AchievementUnlocksResponseEntity {
2
+ User: string;
3
+ RAPoints: string;
4
+ DateAwarded: string;
5
+ HardcoreMode: string;
6
+ }
7
+
8
+ export type GetAchievementUnlocksResponse = AchievementUnlocksResponseEntity[];
@@ -0,0 +1,2 @@
1
+ export * from "./achievement-unlock-entity.model";
2
+ export * from "./get-achievement-unlocks-response.model";
@@ -0,0 +1,53 @@
1
+ /* eslint-disable sonarjs/no-duplicate-string */
2
+
3
+ import { rest } from "msw";
4
+ import { setupServer } from "msw/node";
5
+
6
+ import { apiBaseUrl } from "../utils/internal";
7
+ import { buildAuthorization } from "../utils/public";
8
+ import { getConsoleIds } from "./getConsoleIds";
9
+ import type { GetConsoleIdsResponse } from "./models";
10
+
11
+ const server = setupServer();
12
+
13
+ describe("Function: getConsoleIds", () => {
14
+ // MSW Setup
15
+ beforeAll(() => server.listen());
16
+ afterEach(() => server.resetHandlers());
17
+ afterAll(() => server.close());
18
+
19
+ it("is defined #sanity", () => {
20
+ // ASSERT
21
+ expect(getConsoleIds).toBeDefined();
22
+ });
23
+
24
+ it("retrieves a list of console IDs and their names and cleans properties", async () => {
25
+ // ARRANGE
26
+ const authorization = buildAuthorization({
27
+ userName: "mockUserName",
28
+ webApiKey: "mockWebApiKey"
29
+ });
30
+
31
+ const mockResponse: GetConsoleIdsResponse = [
32
+ { ID: "1", Name: "Mega Drive" },
33
+ { ID: "2", Name: "Nintendo 64" },
34
+ { ID: "3", Name: "SNES" }
35
+ ];
36
+
37
+ server.use(
38
+ rest.get(`${apiBaseUrl}/API_GetConsoleIDs.php`, (_, res, ctx) =>
39
+ res(ctx.json(mockResponse))
40
+ )
41
+ );
42
+
43
+ // ACT
44
+ const response = await getConsoleIds(authorization);
45
+
46
+ // ASSERT
47
+ expect(response).toEqual([
48
+ { id: 1, name: "Mega Drive" },
49
+ { id: 2, name: "Nintendo 64" },
50
+ { id: 3, name: "SNES" }
51
+ ]);
52
+ });
53
+ });
@@ -0,0 +1,43 @@
1
+ import {
2
+ apiBaseUrl,
3
+ buildRequestUrl,
4
+ call,
5
+ serializeProperties
6
+ } from "../utils/internal";
7
+ import type { AuthObject } from "../utils/public";
8
+ import type { ConsoleId, GetConsoleIdsResponse } from "./models";
9
+
10
+ /**
11
+ * A call to this function will retrieve the complete list
12
+ * of console ID and name pairs on the RetroAchievements.org
13
+ * platform.
14
+ *
15
+ * @param authorization An object containing your userName and webApiKey.
16
+ * This can be constructed with `buildAuthorization()`.
17
+ *
18
+ * @example
19
+ * ```
20
+ * const consoleIds = await getConsoleIds(authorization);
21
+ * ```
22
+ *
23
+ * @returns An array containing a complete list of console ID
24
+ * and name pairs for RetroAchievements.org.
25
+ * ```
26
+ * { id: "1", name: "Mega Drive" }
27
+ * ```
28
+ */
29
+ export const getConsoleIds = async (
30
+ authorization: AuthObject
31
+ ): Promise<ConsoleId[]> => {
32
+ const url = buildRequestUrl(
33
+ apiBaseUrl,
34
+ "/API_GetConsoleIDs.php",
35
+ authorization
36
+ );
37
+
38
+ const rawResponse = await call<GetConsoleIdsResponse>({ url });
39
+
40
+ return serializeProperties(rawResponse, {
41
+ shouldCastToNumbers: ["ID"]
42
+ });
43
+ };
@@ -0,0 +1,82 @@
1
+ /* eslint-disable sonarjs/no-duplicate-string */
2
+
3
+ import { rest } from "msw";
4
+ import { setupServer } from "msw/node";
5
+
6
+ import { apiBaseUrl } from "../utils/internal";
7
+ import { buildAuthorization } from "../utils/public";
8
+ import { getGameList } from "./getGameList";
9
+ import type { GetGameListResponse } from "./models";
10
+
11
+ const server = setupServer();
12
+
13
+ describe("Function: getGameList", () => {
14
+ // MSW Setup
15
+ beforeAll(() => server.listen());
16
+ afterEach(() => server.resetHandlers());
17
+ afterAll(() => server.close());
18
+
19
+ it("is defined #sanity", () => {
20
+ // ASSERT
21
+ expect(getGameList).toBeDefined();
22
+ });
23
+
24
+ it("retrieves a list of games and cleans their properties", async () => {
25
+ // ARRANGE
26
+ const authorization = buildAuthorization({
27
+ userName: "mockUserName",
28
+ webApiKey: "mockWebApiKey"
29
+ });
30
+
31
+ const mockResponse: GetGameListResponse = [
32
+ {
33
+ Title: "Elemental Master",
34
+ ID: "4247",
35
+ ConsoleID: "1",
36
+ ConsoleName: "Mega Drive",
37
+ ImageIcon: "/Images/048245.png",
38
+ NumAchievements: 44,
39
+ NumLeaderboards: 0,
40
+ Points: 500,
41
+ DateModified: "2021-12-09 17:05:39",
42
+ ForumTopicID: 1972,
43
+ Hashes: [
44
+ "32e1a15161ef1f070b023738353bde51",
45
+ "9b04970a603ace521c7cca2acaf69804"
46
+ ]
47
+ }
48
+ ];
49
+
50
+ server.use(
51
+ rest.get(`${apiBaseUrl}/API_GetGameList.php`, (_, res, ctx) =>
52
+ res(ctx.json(mockResponse))
53
+ )
54
+ );
55
+
56
+ // ACT
57
+ const response = await getGameList(authorization, {
58
+ consoleId: 1,
59
+ shouldRetrieveGameHashes: true
60
+ });
61
+
62
+ // ASSERT
63
+ expect(response).toEqual([
64
+ {
65
+ title: "Elemental Master",
66
+ id: 4247,
67
+ consoleId: 1,
68
+ consoleName: "Mega Drive",
69
+ imageIcon: "/Images/048245.png",
70
+ numAchievements: 44,
71
+ numLeaderboards: 0,
72
+ points: 500,
73
+ dateModified: "2021-12-09 17:05:39",
74
+ forumTopicId: 1972,
75
+ hashes: [
76
+ "32e1a15161ef1f070b023738353bde51",
77
+ "9b04970a603ace521c7cca2acaf69804"
78
+ ]
79
+ }
80
+ ]);
81
+ });
82
+ });
@@ -0,0 +1,94 @@
1
+ import {
2
+ apiBaseUrl,
3
+ buildRequestUrl,
4
+ call,
5
+ serializeProperties
6
+ } from "../utils/internal";
7
+ import type { AuthObject } from "../utils/public";
8
+ import type { GameList, GetGameListResponse } from "./models";
9
+
10
+ /**
11
+ * A call to this function will retrieve the complete list
12
+ * of games for a specified console on the RetroAchievements.org
13
+ * platform.
14
+ *
15
+ * @param authorization An object containing your userName and webApiKey.
16
+ * This can be constructed with `buildAuthorization()`.
17
+ *
18
+ * @param payload.consoleId The unique console ID to retrieve a list of
19
+ * games from. The list of consoleIds can be retrieved using the `getConsoleIds()`
20
+ * function provided by this library.
21
+ *
22
+ * @param payload.shouldOnlyRetrieveGamesWithAchievements If truthy, will not
23
+ * return games that do not have achievements.
24
+ *
25
+ * @param payload.shouldRetrieveGameHashes If truthy, will return valid
26
+ * hashes for game ROMs in an array attached to each game in the list.
27
+ *
28
+ * @example
29
+ * ```
30
+ * const gameList = await getGameList(
31
+ * authorization,
32
+ * { consoleId: 1, shouldOnlyRetrieveGamesWithAchievements: true }
33
+ * );
34
+ * ```
35
+ *
36
+ * @returns An array containing a list of games for a given consoleId.
37
+ * ```
38
+ * [
39
+ * {
40
+ * title: "Elemental Master",
41
+ * id: 4247,
42
+ * consoleId: 1,
43
+ * consoleName: "Mega Drive",
44
+ * imageIcon: "/Images/048245.png",
45
+ * numAchievements: 44,
46
+ * numLeaderboards: 0,
47
+ * points: 500,
48
+ * dateModified: "2021-12-09 17:05:39",
49
+ * forumTopicId: 1972,
50
+ * hashes: ["32e1a15161ef1f070b023738353bde51"]
51
+ * }
52
+ * ]
53
+ * ```
54
+ */
55
+ export const getGameList = async (
56
+ authorization: AuthObject,
57
+ payload: {
58
+ consoleId: number;
59
+ shouldOnlyRetrieveGamesWithAchievements?: boolean;
60
+ shouldRetrieveGameHashes?: boolean;
61
+ }
62
+ ): Promise<GameList> => {
63
+ const {
64
+ consoleId,
65
+ shouldOnlyRetrieveGamesWithAchievements,
66
+ shouldRetrieveGameHashes
67
+ } = payload;
68
+
69
+ let callPayload: Record<string, any> = { i: consoleId };
70
+
71
+ if (shouldOnlyRetrieveGamesWithAchievements !== undefined) {
72
+ callPayload = {
73
+ ...callPayload,
74
+ f: shouldOnlyRetrieveGamesWithAchievements ? 1 : 0
75
+ };
76
+ }
77
+
78
+ if (shouldRetrieveGameHashes) {
79
+ callPayload = { ...callPayload, h: shouldRetrieveGameHashes ? 1 : 0 };
80
+ }
81
+
82
+ const url = buildRequestUrl(
83
+ apiBaseUrl,
84
+ "/API_GetGameList.php",
85
+ authorization,
86
+ callPayload
87
+ );
88
+
89
+ const rawResponse = await call<GetGameListResponse>({ url });
90
+
91
+ return serializeProperties(rawResponse, {
92
+ shouldCastToNumbers: ["ID", "ConsoleID"]
93
+ });
94
+ };
@@ -0,0 +1,3 @@
1
+ export * from "./getConsoleIds";
2
+ export * from "./getGameList";
3
+ export * from "./models";
@@ -0,0 +1,4 @@
1
+ export interface ConsoleId {
2
+ id: number;
3
+ name: string;
4
+ }
@@ -0,0 +1,16 @@
1
+ interface GameEntity {
2
+ title: string;
3
+ id: number;
4
+ consoleId: number;
5
+ consoleName: string;
6
+ imageIcon: string;
7
+ numAchievements: number;
8
+ numLeaderboards: number;
9
+ points: number;
10
+ dateModified: string;
11
+ forumTopicId: number;
12
+
13
+ hashes?: string[];
14
+ }
15
+
16
+ export type GameList = GameEntity[];
@@ -0,0 +1 @@
1
+ export type GetConsoleIdsResponse = readonly { ID: string; Name: string }[];
@@ -0,0 +1,16 @@
1
+ interface RawGameListEntity {
2
+ Title: string;
3
+ ID: string;
4
+ ConsoleID: string;
5
+ ConsoleName: string;
6
+ ImageIcon: string;
7
+ NumAchievements: number;
8
+ NumLeaderboards: number;
9
+ Points: number;
10
+ DateModified: string;
11
+ ForumTopicID: number;
12
+
13
+ Hashes?: string[];
14
+ }
15
+
16
+ export type GetGameListResponse = RawGameListEntity[];
@@ -0,0 +1,4 @@
1
+ export * from "./console-id.model";
2
+ export * from "./game-list.model";
3
+ export * from "./get-console-ids-response.model";
4
+ export * from "./get-game-list-response.model";
@@ -0,0 +1,167 @@
1
+ /* eslint-disable sonarjs/no-duplicate-string */
2
+
3
+ import { rest } from "msw";
4
+ import { setupServer } from "msw/node";
5
+
6
+ import { apiBaseUrl } from "../utils/internal";
7
+ import { buildAuthorization } from "../utils/public";
8
+ import { getAchievementOfTheWeek } from "./getAchievementOfTheWeek";
9
+ import type { GetAchievementOfTheWeekResponse } from "./models";
10
+
11
+ const server = setupServer();
12
+
13
+ describe("Function: getAchievementOfTheWeek", () => {
14
+ // MSW Setup
15
+ beforeAll(() => server.listen());
16
+ afterEach(() => server.resetHandlers());
17
+ afterAll(() => server.close());
18
+
19
+ it("is defined #sanity", () => {
20
+ // ASSERT
21
+ expect(getAchievementOfTheWeek).toBeDefined();
22
+ });
23
+
24
+ it("retrieves metadata about the current achievement of the week and cleans properties", async () => {
25
+ // ARRANGE
26
+ const authorization = buildAuthorization({
27
+ userName: "mockUserName",
28
+ webApiKey: "mockWebApiKey"
29
+ });
30
+
31
+ const mockResponse: GetAchievementOfTheWeekResponse = {
32
+ Achievement: {
33
+ ID: "165062",
34
+ Title: "The True Hero",
35
+ Description: "Receive any Ending as Han [Normal or Hard]",
36
+ Points: "10",
37
+ TrueRatio: "22",
38
+ Author: "BigWeedSmokerMan",
39
+ DateCreated: "2021-08-08 17:47:46",
40
+ DateModified: "2021-08-09 12:20:05"
41
+ },
42
+ Console: { ID: "39", Title: "Saturn" },
43
+ ForumTopic: { ID: "14767" },
44
+ Game: { ID: "14513", Title: "Guardian Heroes" },
45
+ StartAt: "2022-10-10 00:00:00",
46
+ TotalPlayers: "219",
47
+ Unlocks: [
48
+ {
49
+ User: "Tirbaba2",
50
+ RAPoints: "72",
51
+ DateAwarded: "2022-10-10 01:42:19",
52
+ HardcoreMode: "1"
53
+ }
54
+ ],
55
+ UnlocksCount: "40"
56
+ };
57
+
58
+ server.use(
59
+ rest.get(`${apiBaseUrl}/API_GetAchievementOfTheWeek.php`, (_, res, ctx) =>
60
+ res(ctx.json(mockResponse))
61
+ )
62
+ );
63
+
64
+ // ACT
65
+ const response = await getAchievementOfTheWeek(authorization);
66
+
67
+ // ASSERT
68
+ expect(response).toEqual({
69
+ achievement: {
70
+ id: 165_062,
71
+ title: "The True Hero",
72
+ description: "Receive any Ending as Han [Normal or Hard]",
73
+ points: 10,
74
+ trueRatio: 22,
75
+ author: "BigWeedSmokerMan",
76
+ dateCreated: "2021-08-08 17:47:46",
77
+ dateModified: "2021-08-09 12:20:05"
78
+ },
79
+ console: { id: 39, title: "Saturn" },
80
+ forumTopic: { id: 14_767 },
81
+ game: { id: 14_513, title: "Guardian Heroes" },
82
+ startAt: "2022-10-10 00:00:00",
83
+ totalPlayers: 219,
84
+ unlocks: [
85
+ {
86
+ user: "Tirbaba2",
87
+ raPoints: 72,
88
+ dateAwarded: "2022-10-10 01:42:19",
89
+ hardcoreMode: true
90
+ }
91
+ ],
92
+ unlocksCount: 40
93
+ });
94
+ });
95
+
96
+ it("properly sets the hardcore boolean value when cleaning properties", async () => {
97
+ // ARRANGE
98
+ const authorization = buildAuthorization({
99
+ userName: "mockUserName",
100
+ webApiKey: "mockWebApiKey"
101
+ });
102
+
103
+ const mockResponse: GetAchievementOfTheWeekResponse = {
104
+ Achievement: {
105
+ ID: "165062",
106
+ Title: "The True Hero",
107
+ Description: "Receive any Ending as Han [Normal or Hard]",
108
+ Points: "10",
109
+ TrueRatio: "22",
110
+ Author: "BigWeedSmokerMan",
111
+ DateCreated: "2021-08-08 17:47:46",
112
+ DateModified: "2021-08-09 12:20:05"
113
+ },
114
+ Console: { ID: "39", Title: "Saturn" },
115
+ ForumTopic: { ID: "14767" },
116
+ Game: { ID: "14513", Title: "Guardian Heroes" },
117
+ StartAt: "2022-10-10 00:00:00",
118
+ TotalPlayers: "219",
119
+ Unlocks: [
120
+ {
121
+ User: "Tirbaba2",
122
+ RAPoints: "72",
123
+ DateAwarded: "2022-10-10 01:42:19",
124
+ HardcoreMode: "0"
125
+ }
126
+ ],
127
+ UnlocksCount: "40"
128
+ };
129
+
130
+ server.use(
131
+ rest.get(`${apiBaseUrl}/API_GetAchievementOfTheWeek.php`, (_, res, ctx) =>
132
+ res(ctx.json(mockResponse))
133
+ )
134
+ );
135
+
136
+ // ACT
137
+ const response = await getAchievementOfTheWeek(authorization);
138
+
139
+ // ASSERT
140
+ expect(response).toEqual({
141
+ achievement: {
142
+ id: 165_062,
143
+ title: "The True Hero",
144
+ description: "Receive any Ending as Han [Normal or Hard]",
145
+ points: 10,
146
+ trueRatio: 22,
147
+ author: "BigWeedSmokerMan",
148
+ dateCreated: "2021-08-08 17:47:46",
149
+ dateModified: "2021-08-09 12:20:05"
150
+ },
151
+ console: { id: 39, title: "Saturn" },
152
+ forumTopic: { id: 14_767 },
153
+ game: { id: 14_513, title: "Guardian Heroes" },
154
+ startAt: "2022-10-10 00:00:00",
155
+ totalPlayers: 219,
156
+ unlocks: [
157
+ {
158
+ user: "Tirbaba2",
159
+ raPoints: 72,
160
+ dateAwarded: "2022-10-10 01:42:19",
161
+ hardcoreMode: false
162
+ }
163
+ ],
164
+ unlocksCount: 40
165
+ });
166
+ });
167
+ });
@@ -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
+ AchievementOfTheWeek,
10
+ GetAchievementOfTheWeekResponse
11
+ } from "./models";
12
+
13
+ /**
14
+ * A call to this function will retrieve comprehensive
15
+ * metadata about the current Achievement of the Week.
16
+ *
17
+ * @param authorization An object containing your userName and webApiKey.
18
+ * This can be constructed with `buildAuthorization()`.
19
+ *
20
+ * @example
21
+ * ```
22
+ * const achievementOfTheWeek = await getAchievementOfTheWeek(
23
+ * authorization
24
+ * );
25
+ * ```
26
+ *
27
+ * @returns An object containing comprehensive metadata
28
+ * about the current Achievement of the Week.
29
+ * ```
30
+ * {
31
+ * achievement: {
32
+ * id: "165062",
33
+ * title: "The True Hero",
34
+ * description: "Receive any Ending as Han [Normal or Hard]",
35
+ * points: "10",
36
+ * trueRatio: "22",
37
+ * author: "BigWeedSmokerMan",
38
+ * dateCreated: "2021-08-08 17:47:46",
39
+ * dateModified: "2021-08-09 12:20:05"
40
+ * },
41
+ * console: { id: "39", title: "Saturn" },
42
+ * forumTopic: { id: "14767" },
43
+ * game: { id: "14513", title: "Guardian Heroes" },
44
+ * startAt: "2022-10-10 00:00:00",
45
+ * totalPlayers: "219",
46
+ * unlocks: [
47
+ * {
48
+ * user: "Tirbaba2",
49
+ * rAPoints: "72",
50
+ * dateAwarded: "2022-10-10 01:42:19",
51
+ * hardcoreMode: "1"
52
+ * }
53
+ * ],
54
+ * unlocksCount: "40"
55
+ * }
56
+ * ```
57
+ */
58
+ export const getAchievementOfTheWeek = async (
59
+ authorization: AuthObject
60
+ ): Promise<AchievementOfTheWeek> => {
61
+ const url = buildRequestUrl(
62
+ apiBaseUrl,
63
+ "/API_GetAchievementOfTheWeek.php",
64
+ authorization
65
+ );
66
+
67
+ const rawResponse = await call<GetAchievementOfTheWeekResponse>({ url });
68
+
69
+ return serializeProperties(rawResponse, {
70
+ shouldCastToNumbers: [
71
+ "ID",
72
+ "Points",
73
+ "TrueRatio",
74
+ "TotalPlayers",
75
+ "RAPoints",
76
+ "UnlocksCount"
77
+ ],
78
+ shouldMapToBooleans: ["HardcoreMode"]
79
+ });
80
+ };
@@ -0,0 +1,81 @@
1
+ /* eslint-disable sonarjs/no-duplicate-string */
2
+
3
+ import { rest } from "msw";
4
+ import { setupServer } from "msw/node";
5
+
6
+ import { apiBaseUrl } from "../utils/internal";
7
+ import { buildAuthorization } from "../utils/public";
8
+ import { getActiveClaims } from "./getActiveClaims";
9
+ import type { GetActiveClaimsResponse } from "./models";
10
+
11
+ const server = setupServer();
12
+
13
+ describe("Function: getActiveClaims", () => {
14
+ // MSW Setup
15
+ beforeAll(() => server.listen());
16
+ afterEach(() => server.resetHandlers());
17
+ afterAll(() => server.close());
18
+
19
+ it("is defined #sanity", () => {
20
+ // ASSERT
21
+ expect(getActiveClaims).toBeDefined();
22
+ });
23
+
24
+ it("retrieves metadata about current active claims", async () => {
25
+ // ARRANGE
26
+ const authorization = buildAuthorization({
27
+ userName: "mockUserName",
28
+ webApiKey: "mockWebApiKey"
29
+ });
30
+
31
+ const mockResponse: GetActiveClaimsResponse = [
32
+ {
33
+ ID: "7043",
34
+ User: "siouxerskate",
35
+ GameID: "3726",
36
+ GameTitle: "Tactics Ogre: Let Us Cling Together",
37
+ GameIcon: "/Images/049640.png",
38
+ ConsoleName: "PlayStation Portable",
39
+ ClaimType: "0",
40
+ SetType: "0",
41
+ Status: "0",
42
+ Extension: "0",
43
+ Special: "0",
44
+ Created: "2022-10-03 20:29:45",
45
+ DoneTime: "2023-01-03 20:29:45",
46
+ Updated: "2022-10-03 20:29:45",
47
+ MinutesLeft: "112285"
48
+ }
49
+ ];
50
+
51
+ server.use(
52
+ rest.get(`${apiBaseUrl}/API_GetActiveClaims.php`, (_, res, ctx) =>
53
+ res(ctx.json(mockResponse))
54
+ )
55
+ );
56
+
57
+ // ACT
58
+ const response = await getActiveClaims(authorization);
59
+
60
+ // ASSERT
61
+ expect(response).toEqual([
62
+ {
63
+ id: 7043,
64
+ user: "siouxerskate",
65
+ gameId: 3726,
66
+ gameTitle: "Tactics Ogre: Let Us Cling Together",
67
+ gameIcon: "/Images/049640.png",
68
+ consoleName: "PlayStation Portable",
69
+ claimType: 0,
70
+ setType: 0,
71
+ status: 0,
72
+ extension: 0,
73
+ special: 0,
74
+ created: "2022-10-03 20:29:45",
75
+ doneTime: "2023-01-03 20:29:45",
76
+ updated: "2022-10-03 20:29:45",
77
+ minutesLeft: 112_285
78
+ }
79
+ ]);
80
+ });
81
+ });