@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,80 @@
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 { getUserProgress } from "./getUserProgress";
7
+ import type { GetUserProgressResponse } from "./models";
8
+
9
+ const server = setupServer();
10
+
11
+ describe("Function: getUserProgress", () => {
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(getUserProgress).toBeDefined();
20
+ });
21
+
22
+ it(`retrieves a map of a user's progress by game IDs`, async () => {
23
+ // ARRANGE
24
+ const authorization = buildAuthorization({
25
+ userName: "mockUserName",
26
+ webApiKey: "mockWebApiKey"
27
+ });
28
+
29
+ const mockResponse: GetUserProgressResponse = {
30
+ "1": {
31
+ NumPossibleAchievements: "10",
32
+ PossibleScore: "200",
33
+ NumAchieved: "4",
34
+ ScoreAchieved: "80",
35
+ NumAchievedHardcore: "4",
36
+ ScoreAchievedHardcore: "80"
37
+ },
38
+ "14402": {
39
+ NumPossibleAchievements: "10",
40
+ PossibleScore: "200",
41
+ NumAchieved: "4",
42
+ ScoreAchieved: "80",
43
+ NumAchievedHardcore: "4",
44
+ ScoreAchievedHardcore: "80"
45
+ }
46
+ };
47
+
48
+ server.use(
49
+ rest.get(`${apiBaseUrl}/API_GetUserProgress.php`, (_, res, ctx) =>
50
+ res(ctx.json(mockResponse))
51
+ )
52
+ );
53
+
54
+ // ACT
55
+ const response = await getUserProgress(authorization, {
56
+ userName: "xelnia",
57
+ gameIds: [1, 14_402]
58
+ });
59
+
60
+ // ASSERT
61
+ expect(response).toEqual({
62
+ "1": {
63
+ numPossibleAchievements: 10,
64
+ possibleScore: 200,
65
+ numAchieved: 4,
66
+ scoreAchieved: 80,
67
+ numAchievedHardcore: 4,
68
+ scoreAchievedHardcore: 80
69
+ },
70
+ "14402": {
71
+ numPossibleAchievements: 10,
72
+ possibleScore: 200,
73
+ numAchieved: 4,
74
+ scoreAchieved: 80,
75
+ numAchievedHardcore: 4,
76
+ scoreAchievedHardcore: 80
77
+ }
78
+ });
79
+ });
80
+ });
@@ -0,0 +1,78 @@
1
+ import {
2
+ apiBaseUrl,
3
+ buildRequestUrl,
4
+ call,
5
+ serializeProperties
6
+ } from "../utils/internal";
7
+ import type { AuthObject } from "../utils/public";
8
+ import type { GetUserProgressResponse, UserProgress } from "./models";
9
+
10
+ /**
11
+ * A call to this function will retrieve a given user's
12
+ * progress on a given set of games, targeted by game ID.
13
+ *
14
+ * @param authorization An object containing your userName and webApiKey.
15
+ * This can be constructed with `buildAuthorization()`.
16
+ *
17
+ * @param payload.userName The user for which to retrieve the progress for.
18
+ *
19
+ * @param payload.gameIds An array of RetroAchievements Game IDs. If you aren't
20
+ * sure of the game ID, visit the game's page on the website and copy the number
21
+ * at the end of the URL.
22
+ *
23
+ * @example
24
+ * ```
25
+ * const userProgress = await getUserProgress(
26
+ * authorization,
27
+ * { userName: "xelnia", gameIds: [14402, 1] }
28
+ * );
29
+ * ```
30
+ *
31
+ * @returns An object which is a map of summarized progress for games.
32
+ * ```json
33
+ * {
34
+ * "1": {
35
+ * numPossibleAchievements: 24,
36
+ * possibleScore: 255,
37
+ * numAchieved: 0,
38
+ * scoreAchieved: 0,
39
+ * numAchievedHardcore: 0,
40
+ * scoreAchievedHardcore: 0
41
+ * },
42
+ * "14402": {
43
+ * numPossibleAchievements: 24,
44
+ * possibleScore: 255,
45
+ * numAchieved: 0,
46
+ * scoreAchieved: 0,
47
+ * numAchievedHardcore: 0,
48
+ * scoreAchievedHardcore: 0
49
+ * }
50
+ * }
51
+ * ```
52
+ */
53
+ export const getUserProgress = async (
54
+ authorization: AuthObject,
55
+ payload: { userName: string; gameIds: Array<number | string> }
56
+ ): Promise<UserProgress> => {
57
+ const { userName, gameIds } = payload;
58
+
59
+ const url = buildRequestUrl(
60
+ apiBaseUrl,
61
+ "/API_GetUserProgress.php",
62
+ authorization,
63
+ { u: userName, i: gameIds.join(",") }
64
+ );
65
+
66
+ const rawResponse = await call<GetUserProgressResponse>({ url });
67
+
68
+ return serializeProperties(rawResponse, {
69
+ shouldCastToNumbers: [
70
+ "NumPossibleAchievements",
71
+ "PossibleScore",
72
+ "NumAchieved",
73
+ "ScoreAchieved",
74
+ "NumAchievedHardcore",
75
+ "ScoreAchievedHardcore"
76
+ ]
77
+ });
78
+ };
@@ -0,0 +1,76 @@
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 { getUserRecentlyPlayedGames } from "./getUserRecentlyPlayedGames";
7
+ import type { GetUserRecentlyPlayedGamesResponse } from "./models";
8
+
9
+ const server = setupServer();
10
+
11
+ describe("Function: getUserRecentlyPlayedGames", () => {
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(getUserRecentlyPlayedGames).toBeDefined();
20
+ });
21
+
22
+ it(`retrieves a list of a given user's recently played games`, async () => {
23
+ // ARRANGE
24
+ const authorization = buildAuthorization({
25
+ userName: "mockUserName",
26
+ webApiKey: "mockWebApiKey"
27
+ });
28
+
29
+ const mockResponse: GetUserRecentlyPlayedGamesResponse = [
30
+ {
31
+ GameID: "6278",
32
+ ConsoleID: "12",
33
+ ConsoleName: "PlayStation",
34
+ Title: "Duke Nukem: Land of the Babes",
35
+ ImageIcon: "/Images/054546.png",
36
+ LastPlayed: "2022-11-06 16:08:21",
37
+ NumPossibleAchievements: "42",
38
+ PossibleScore: "478",
39
+ NumAchieved: 0,
40
+ ScoreAchieved: 0,
41
+ NumAchievedHardcore: 0,
42
+ ScoreAchievedHardcore: 0
43
+ }
44
+ ];
45
+
46
+ server.use(
47
+ rest.get(
48
+ `${apiBaseUrl}/API_GetUserRecentlyPlayedGames.php`,
49
+ (_, res, ctx) => res(ctx.json(mockResponse))
50
+ )
51
+ );
52
+
53
+ // ACT
54
+ const response = await getUserRecentlyPlayedGames(authorization, {
55
+ userName: "xelnia"
56
+ });
57
+
58
+ // ASSERT
59
+ expect(response).toEqual([
60
+ {
61
+ gameId: 6278,
62
+ consoleId: 12,
63
+ consoleName: "PlayStation",
64
+ title: "Duke Nukem: Land of the Babes",
65
+ imageIcon: "/Images/054546.png",
66
+ lastPlayed: "2022-11-06 16:08:21",
67
+ numPossibleAchievements: 42,
68
+ possibleScore: 478,
69
+ numAchieved: 0,
70
+ scoreAchieved: 0,
71
+ numAchievedHardcore: 0,
72
+ scoreAchievedHardcore: 0
73
+ }
74
+ ]);
75
+ });
76
+ });
@@ -0,0 +1,93 @@
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
+ GetUserRecentlyPlayedGamesResponse,
10
+ UserRecentlyPlayedGames
11
+ } from "./models";
12
+
13
+ /**
14
+ * A call to this function will retrieve a list of a target user's
15
+ * recently played games, targeted by username.
16
+ *
17
+ * @param authorization An object containing your userName and webApiKey.
18
+ * This can be constructed with `buildAuthorization()`.
19
+ *
20
+ * @param payload.userName The user for which to retrieve the summary for.
21
+ *
22
+ * @param payload.count Optional. Defaults to 10. Max is 50. How many
23
+ * recently played games for the user to retrieve.
24
+ *
25
+ * @param payload.offset Optional. Defaults to 0. Number of recently played
26
+ * game entries to skip. This can be used for pagination.
27
+ *
28
+ * @example
29
+ * ```
30
+ * const userRecentlyPlayedGames = await getUserRecentlyPlayedGames(
31
+ * authorization,
32
+ * { userName: "xelnia" }
33
+ * );
34
+ * ```
35
+ *
36
+ * @returns An array containing metadata about a user's recently played games.
37
+ * ```json
38
+ * [
39
+ * {
40
+ * gameId: 19010,
41
+ * consoleId: 21,
42
+ * consoleName: "PlayStation 2",
43
+ * title: "Simpsons, The: Hit & Run",
44
+ * imageIcon: "/Images/066024.png",
45
+ * lastPlayed: "2022-10-24 22:05:12",
46
+ * numPossibleAchievements: 131,
47
+ * possibleScore: 865,
48
+ * numAchieved: 23,
49
+ * scoreAchieved: 84,
50
+ * numAchievedHardcore: 23,
51
+ * scoreAchievedHardcore: 84
52
+ * }
53
+ * ]
54
+ * ```
55
+ */
56
+ export const getUserRecentlyPlayedGames = async (
57
+ authorization: AuthObject,
58
+ payload: { userName: string; offset?: number; count?: number }
59
+ ): Promise<UserRecentlyPlayedGames> => {
60
+ const { userName, offset, count } = payload;
61
+
62
+ const queryParams: Record<string, string | number> = { u: userName };
63
+
64
+ if (offset !== undefined) {
65
+ queryParams["o"] = offset;
66
+ }
67
+
68
+ if (count !== undefined) {
69
+ queryParams["c"] = count;
70
+ }
71
+
72
+ const url = buildRequestUrl(
73
+ apiBaseUrl,
74
+ "/API_GetUserRecentlyPlayedGames.php",
75
+ authorization,
76
+ queryParams
77
+ );
78
+
79
+ const rawResponse = await call<GetUserRecentlyPlayedGamesResponse>({ url });
80
+
81
+ return serializeProperties(rawResponse, {
82
+ shouldCastToNumbers: [
83
+ "GameID",
84
+ "ConsoleID",
85
+ "NumPossibleAchievements",
86
+ "PossibleScore",
87
+ "NumAchieved",
88
+ "ScoreAchieved",
89
+ "NumAchievedHardcore",
90
+ "ScoreAchievedHardcore"
91
+ ]
92
+ });
93
+ };
@@ -0,0 +1,251 @@
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 { getUserSummary } from "./getUserSummary";
9
+ import type { GetUserSummaryResponse, UserSummary } from "./models";
10
+
11
+ const server = setupServer();
12
+
13
+ describe("Function: getUserSummary", () => {
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(getUserSummary).toBeDefined();
22
+ });
23
+
24
+ it("given a username, retrieves user summary information about the user", async () => {
25
+ // ARRANGE
26
+ const authorization = buildAuthorization({
27
+ userName: "mockUserName",
28
+ webApiKey: "mockWebApiKey"
29
+ });
30
+
31
+ const mockResponse = mockGetUserSummaryResponse;
32
+
33
+ server.use(
34
+ rest.get(`${apiBaseUrl}/API_GetUserSummary.php`, (_, res, ctx) =>
35
+ res(ctx.json(mockResponse))
36
+ )
37
+ );
38
+
39
+ // ACT
40
+ const response = await getUserSummary(authorization, {
41
+ userName: "WCopeland"
42
+ });
43
+
44
+ // ASSERT
45
+ expect(response).toEqual(mockExpectedSummaryValue);
46
+ });
47
+ });
48
+
49
+ const mockGetUserSummaryResponse: GetUserSummaryResponse = {
50
+ RecentlyPlayedCount: 2,
51
+ RecentlyPlayed: [
52
+ {
53
+ GameID: "19020",
54
+ ConsoleID: "21",
55
+ ConsoleName: "PlayStation 2",
56
+ Title: "Mortal Kombat: Deadly Alliance",
57
+ ImageIcon: "/Images/064938.png",
58
+ LastPlayed: "2023-01-27 02:05:02"
59
+ },
60
+ {
61
+ GameID: "15922",
62
+ ConsoleID: "7",
63
+ ConsoleName: "NES",
64
+ Title: "~Hack~ Mega Man 3 Revamped",
65
+ ImageIcon: "/Images/061792.png",
66
+ LastPlayed: "2022-11-07 21:49:09"
67
+ }
68
+ ],
69
+ MemberSince: "2020-02-02 20:10:35",
70
+ LastActivity: {
71
+ ID: "59195489",
72
+ timestamp: "2023-01-27 02:13:21",
73
+ lastupdate: "2023-01-27 02:13:21",
74
+ activitytype: "1",
75
+ User: "WCopeland",
76
+ data: "281263",
77
+ data2: "1"
78
+ },
79
+ RichPresenceMsg: "Arcade [Match 2] - Nitara vs Drahmin (Novice difficulty)",
80
+ LastGameID: "19020",
81
+ LastGame: {
82
+ ID: 19_020,
83
+ Title: "Mortal Kombat: Deadly Alliance",
84
+ ConsoleID: 21,
85
+ ForumTopicID: 19_339,
86
+ Flags: 0,
87
+ ImageIcon: "/Images/064938.png",
88
+ ImageTitle: "/Images/057355.png",
89
+ ImageIngame: "/Images/057356.png",
90
+ ImageBoxArt: "/Images/056153.png",
91
+ Publisher: "Midway",
92
+ Developer: "Midway",
93
+ Genre: "3D Fighting",
94
+ Released: "November 16, 2002",
95
+ IsFinal: false,
96
+ ConsoleName: "PlayStation 2",
97
+ RichPresencePatch: "MockRichPresencePatch"
98
+ },
99
+ ContribCount: "0",
100
+ ContribYield: "0",
101
+ TotalPoints: "18817",
102
+ TotalSoftcorePoints: "25",
103
+ TotalTruePoints: "56984",
104
+ Permissions: "1",
105
+ Untracked: "0",
106
+ ID: "117089",
107
+ UserWallActive: "1",
108
+ Motto: "https://i.imgur.com/ov30jeD.jpg",
109
+ Rank: 1372,
110
+ Awarded: {
111
+ "1829": {
112
+ NumPossibleAchievements: "80",
113
+ PossibleScore: "738",
114
+ NumAchieved: "16",
115
+ ScoreAchieved: "95",
116
+ NumAchievedHardcore: "16",
117
+ ScoreAchievedHardcore: "95"
118
+ },
119
+ "6278": {
120
+ NumPossibleAchievements: "42",
121
+ PossibleScore: "478",
122
+ NumAchieved: 0,
123
+ ScoreAchieved: 0,
124
+ NumAchievedHardcore: 0,
125
+ ScoreAchievedHardcore: 0
126
+ }
127
+ },
128
+ RecentAchievements: {
129
+ "19020": {
130
+ "281248": {
131
+ ID: "281248",
132
+ GameID: "19020",
133
+ GameTitle: "Mortal Kombat: Deadly Alliance",
134
+ Title: "Head Stomp",
135
+ Description: "Perform a Fatality as Jax.",
136
+ Points: "3",
137
+ BadgeName: "311063",
138
+ IsAwarded: "1",
139
+ DateAwarded: "2023-01-27 02:04:36",
140
+ HardcoreAchieved: "0"
141
+ }
142
+ }
143
+ },
144
+ Points: "18817",
145
+ SoftcorePoints: "25",
146
+ UserPic: "/UserPic/WCopeland.png",
147
+ TotalRanked: 34_572,
148
+ Status: "Offline"
149
+ };
150
+
151
+ const mockExpectedSummaryValue: UserSummary = {
152
+ recentlyPlayedCount: 2,
153
+ recentlyPlayed: [
154
+ {
155
+ gameId: 19_020,
156
+ consoleId: 21,
157
+ consoleName: "PlayStation 2",
158
+ title: "Mortal Kombat: Deadly Alliance",
159
+ imageIcon: "/Images/064938.png",
160
+ lastPlayed: "2023-01-27 02:05:02"
161
+ },
162
+ {
163
+ gameId: 15_922,
164
+ consoleId: 7,
165
+ consoleName: "NES",
166
+ title: "~Hack~ Mega Man 3 Revamped",
167
+ imageIcon: "/Images/061792.png",
168
+ lastPlayed: "2022-11-07 21:49:09"
169
+ }
170
+ ],
171
+ memberSince: "2020-02-02 20:10:35",
172
+ lastActivity: {
173
+ id: 59_195_489,
174
+ timestamp: "2023-01-27 02:13:21",
175
+ lastupdate: "2023-01-27 02:13:21",
176
+ activitytype: 1,
177
+ user: "WCopeland",
178
+ data: "281263",
179
+ data2: "1"
180
+ },
181
+ richPresenceMsg: "Arcade [Match 2] - Nitara vs Drahmin (Novice difficulty)",
182
+ lastGameId: 19_020,
183
+ lastGame: {
184
+ id: 19_020,
185
+ title: "Mortal Kombat: Deadly Alliance",
186
+ consoleId: 21,
187
+ forumTopicId: 19_339,
188
+ flags: 0,
189
+ imageIcon: "/Images/064938.png",
190
+ imageTitle: "/Images/057355.png",
191
+ imageIngame: "/Images/057356.png",
192
+ imageBoxArt: "/Images/056153.png",
193
+ publisher: "Midway",
194
+ developer: "Midway",
195
+ genre: "3D Fighting",
196
+ released: "November 16, 2002",
197
+ isFinal: false,
198
+ consoleName: "PlayStation 2",
199
+ richPresencePatch: "MockRichPresencePatch"
200
+ },
201
+ contribCount: 0,
202
+ contribYield: 0,
203
+ totalPoints: 18_817,
204
+ totalSoftcorePoints: 25,
205
+ totalTruePoints: 56_984,
206
+ permissions: 1,
207
+ untracked: false,
208
+ id: 117_089,
209
+ userWallActive: true,
210
+ motto: "https://i.imgur.com/ov30jeD.jpg",
211
+ rank: 1372,
212
+ awarded: {
213
+ "1829": {
214
+ numPossibleAchievements: 80,
215
+ possibleScore: 738,
216
+ numAchieved: 16,
217
+ scoreAchieved: 95,
218
+ numAchievedHardcore: 16,
219
+ scoreAchievedHardcore: 95
220
+ },
221
+ "6278": {
222
+ numPossibleAchievements: 42,
223
+ possibleScore: 478,
224
+ numAchieved: 0,
225
+ scoreAchieved: 0,
226
+ numAchievedHardcore: 0,
227
+ scoreAchievedHardcore: 0
228
+ }
229
+ },
230
+ recentAchievements: {
231
+ 19_020: {
232
+ 281_248: {
233
+ id: 281_248,
234
+ gameId: 19_020,
235
+ gameTitle: "Mortal Kombat: Deadly Alliance",
236
+ title: "Head Stomp",
237
+ description: "Perform a Fatality as Jax.",
238
+ points: 3,
239
+ badgeName: "311063",
240
+ isAwarded: true,
241
+ dateAwarded: "2023-01-27 02:04:36",
242
+ hardcoreAchieved: false
243
+ }
244
+ }
245
+ },
246
+ points: 18_817,
247
+ softcorePoints: 25,
248
+ userPic: "/UserPic/WCopeland.png",
249
+ totalRanked: 34_572,
250
+ status: "Offline"
251
+ };
@@ -0,0 +1,96 @@
1
+ import {
2
+ apiBaseUrl,
3
+ buildRequestUrl,
4
+ call,
5
+ serializeProperties
6
+ } from "../utils/internal";
7
+ import type { AuthObject } from "../utils/public";
8
+ import type { GetUserSummaryResponse, UserSummary } from "./models";
9
+
10
+ /**
11
+ * A call to this function will retrieve summary information about
12
+ * a given user, targeted by username.
13
+ *
14
+ * @param authorization An object containing your userName and webApiKey.
15
+ * This can be constructed with `buildAuthorization()`.
16
+ *
17
+ * @param payload.userName The user for which to retrieve the summary for.
18
+ *
19
+ * @param payload.recentGamesCount Optional. The number of recent games to return.
20
+ * This defaults to 5.
21
+ *
22
+ * @param payload.recentAchievementsCount Optional. The number of recent achievements
23
+ * to return. This defaults to 5.
24
+ *
25
+ * @example
26
+ * ```
27
+ * const userSummary = await getUserSummary(
28
+ * authorization,
29
+ * { userName: "xelnia" }
30
+ * );
31
+ * ```
32
+ *
33
+ * @returns An object containing summary metadata about a target user.
34
+ */
35
+ export const getUserSummary = async (
36
+ authorization: AuthObject,
37
+ payload: {
38
+ userName: string;
39
+ recentGamesCount?: number;
40
+ recentAchievementsCount?: number;
41
+ }
42
+ ): Promise<UserSummary> => {
43
+ const { userName, recentGamesCount, recentAchievementsCount } = payload;
44
+
45
+ const queryParams: Record<string, string | number> = { u: userName };
46
+
47
+ if (recentGamesCount !== undefined) {
48
+ queryParams["g"] = recentGamesCount;
49
+ }
50
+
51
+ if (recentAchievementsCount !== undefined) {
52
+ queryParams["a"] = recentAchievementsCount;
53
+ }
54
+
55
+ const url = buildRequestUrl(
56
+ apiBaseUrl,
57
+ "/API_GetUserSummary.php",
58
+ authorization,
59
+ queryParams
60
+ );
61
+
62
+ const rawResponse = await call<GetUserSummaryResponse>({ url });
63
+
64
+ return serializeProperties(rawResponse, {
65
+ shouldCastToNumbers: [
66
+ "GameID",
67
+ "ConsoleID",
68
+ "ID",
69
+ "LastGameID",
70
+ "ForumTopicID",
71
+ "activitytype",
72
+ "ContribCount",
73
+ "ContribYield",
74
+ "TotalPoints",
75
+ "TotalSoftcorePoints",
76
+ "TotalTruePoints",
77
+ "Permissions",
78
+ "NumPossibleAchievements",
79
+ "PossibleScore",
80
+ "NumAchieved",
81
+ "ScoreAchieved",
82
+ "NumAchievedHardcore",
83
+ "ScoreAchievedHardcore",
84
+ "Points",
85
+ "SoftcorePoints"
86
+ ],
87
+ shouldMapToBooleans: [
88
+ "Untracked",
89
+ "UserWallActive",
90
+ "IsAwarded",
91
+ "HardcoreAchieved"
92
+ ]
93
+ });
94
+ };
95
+
96
+ // TODO: add test for this
@@ -0,0 +1,9 @@
1
+ export * from "./getAchievementsEarnedBetween";
2
+ export * from "./getAchievementsEarnedOnDay";
3
+ export * from "./getGameInfoAndUserProgress";
4
+ export * from "./getUserGameRankAndScore";
5
+ export * from "./getUserPoints";
6
+ export * from "./getUserProgress";
7
+ export * from "./getUserRecentlyPlayedGames";
8
+ export * from "./getUserSummary";
9
+ export * from "./models";
@@ -0,0 +1,17 @@
1
+ export type DatedUserAchievement = {
2
+ date: string;
3
+ hardcoreMode: boolean;
4
+ achievementId: number;
5
+ title: string;
6
+ description: string;
7
+ badgeName: string;
8
+ points: number;
9
+ author: string;
10
+ gameTitle: string;
11
+ gameIcon: string;
12
+ gameId: number;
13
+ consoleName: string;
14
+ cumulScore: number;
15
+ badgeUrl: string;
16
+ gameUrl: string;
17
+ }[];