@retroachievements/api 0.0.0-development
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +21 -0
- package/README.md +103 -0
- package/dist/__playground.d.ts +7 -0
- package/dist/achievement/getAchievementUnlocks.d.ts +45 -0
- package/dist/achievement/index.d.ts +2 -0
- package/dist/achievement/models/achievement-unlock-entity.model.d.ts +6 -0
- package/dist/achievement/models/get-achievement-unlocks-response.model.d.ts +8 -0
- package/dist/achievement/models/index.d.ts +2 -0
- package/dist/api.cjs.development.js +2363 -0
- package/dist/api.cjs.development.js.map +1 -0
- package/dist/api.cjs.production.min.js +2 -0
- package/dist/api.cjs.production.min.js.map +1 -0
- package/dist/api.esm.js +2333 -0
- package/dist/api.esm.js.map +1 -0
- package/dist/console/getConsoleIds.d.ts +22 -0
- package/dist/console/getGameList.d.ts +52 -0
- package/dist/console/index.d.ts +3 -0
- package/dist/console/models/console-id.model.d.ts +4 -0
- package/dist/console/models/game-list.model.d.ts +15 -0
- package/dist/console/models/get-console-ids-response.model.d.ts +4 -0
- package/dist/console/models/get-game-list-response.model.d.ts +15 -0
- package/dist/console/models/index.d.ts +4 -0
- package/dist/feed/getAchievementOfTheWeek.d.ts +48 -0
- package/dist/feed/getActiveClaims.d.ts +38 -0
- package/dist/feed/getTicketData.d.ts +158 -0
- package/dist/feed/getTopTenUsers.d.ts +24 -0
- package/dist/feed/index.d.ts +5 -0
- package/dist/feed/models/achievement-of-the-week.model.d.ts +32 -0
- package/dist/feed/models/achievement-ticket-stats-response.model.d.ts +7 -0
- package/dist/feed/models/achievement-ticket-stats.model.d.ts +7 -0
- package/dist/feed/models/active-claim.model.d.ts +49 -0
- package/dist/feed/models/game-ticket-stats.model.d.ts +9 -0
- package/dist/feed/models/game-tickets-response.model.d.ts +7 -0
- package/dist/feed/models/get-achievement-of-the-week-response.model.d.ts +32 -0
- package/dist/feed/models/get-active-claims-response.model.d.ts +19 -0
- package/dist/feed/models/get-top-ten-users-response.model.d.ts +10 -0
- package/dist/feed/models/index.d.ts +19 -0
- package/dist/feed/models/most-ticketed-games-response.model.d.ts +12 -0
- package/dist/feed/models/most-ticketed-games.model.d.ts +12 -0
- package/dist/feed/models/recent-tickets-response.model.d.ts +6 -0
- package/dist/feed/models/recent-tickets.model.d.ts +6 -0
- package/dist/feed/models/response-ticket-entity.model.d.ts +24 -0
- package/dist/feed/models/ticket-entity.model.d.ts +24 -0
- package/dist/feed/models/tickets-by-user-response.model.d.ts +8 -0
- package/dist/feed/models/top-ten-users-entity.model.d.ts +5 -0
- package/dist/feed/models/top-ten-users.model.d.ts +2 -0
- package/dist/feed/models/user-ticket-stats.model.d.ts +8 -0
- package/dist/game/getAchievementCount.d.ts +31 -0
- package/dist/game/getAchievementDistribution.d.ts +57 -0
- package/dist/game/getGame.d.ts +48 -0
- package/dist/game/getGameExtended.d.ts +68 -0
- package/dist/game/getGameRankAndScore.d.ts +38 -0
- package/dist/game/getGameRating.d.ts +38 -0
- package/dist/game/index.d.ts +7 -0
- package/dist/game/models/achievement-count.model.d.ts +4 -0
- package/dist/game/models/achievement-distribution-flags.model.d.ts +4 -0
- package/dist/game/models/game-extended-achievement-entity.model.d.ts +15 -0
- package/dist/game/models/game-extended-claim-entity.model.d.ts +7 -0
- package/dist/game/models/game-extended.model.d.ts +25 -0
- package/dist/game/models/game-rank-and-score-entity.model.d.ts +6 -0
- package/dist/game/models/game-rating.model.d.ts +9 -0
- package/dist/game/models/game.model.d.ts +19 -0
- package/dist/game/models/get-achievement-count-response.model.d.ts +4 -0
- package/dist/game/models/get-achievement-distribution-response.model.d.ts +1 -0
- package/dist/game/models/get-game-extended-response.model.d.ts +50 -0
- package/dist/game/models/get-game-rank-and-score-response.model.d.ts +8 -0
- package/dist/game/models/get-game-rating-response.model.d.ts +9 -0
- package/dist/game/models/get-game-response.model.d.ts +19 -0
- package/dist/game/models/index.d.ts +14 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +8 -0
- package/dist/user/getAchievementsEarnedBetween.d.ts +59 -0
- package/dist/user/getAchievementsEarnedOnDay.d.ts +57 -0
- package/dist/user/getGameInfoAndUserProgress.d.ts +80 -0
- package/dist/user/getUserGameRankAndScore.d.ts +44 -0
- package/dist/user/getUserPoints.d.ts +30 -0
- package/dist/user/getUserProgress.d.ts +49 -0
- package/dist/user/getUserRecentlyPlayedGames.d.ts +50 -0
- package/dist/user/getUserSummary.d.ts +32 -0
- package/dist/user/index.d.ts +9 -0
- package/dist/user/models/dated-user-achievement.model.d.ts +17 -0
- package/dist/user/models/dated-user-achievements-response.model.d.ts +19 -0
- package/dist/user/models/game-info-and-user-progress.model.d.ts +12 -0
- package/dist/user/models/get-game-info-and-user-progress-response.model.d.ts +14 -0
- package/dist/user/models/get-user-game-rank-and-score-response.model.d.ts +8 -0
- package/dist/user/models/get-user-points-response.model.d.ts +4 -0
- package/dist/user/models/get-user-progress-response.model.d.ts +10 -0
- package/dist/user/models/get-user-recently-played-games-response.model.d.ts +16 -0
- package/dist/user/models/get-user-summary-response.model.d.ts +82 -0
- package/dist/user/models/index.d.ts +14 -0
- package/dist/user/models/user-game-rank-and-score.model.d.ts +8 -0
- package/dist/user/models/user-points.model.d.ts +4 -0
- package/dist/user/models/user-progress.model.d.ts +10 -0
- package/dist/user/models/user-recently-played-games.model.d.ts +16 -0
- package/dist/user/models/user-summary.model.d.ts +83 -0
- package/dist/utils/internal/apiBaseUrl.d.ts +1 -0
- package/dist/utils/internal/buildRequestUrl.d.ts +2 -0
- package/dist/utils/internal/call.d.ts +20 -0
- package/dist/utils/internal/index.d.ts +4 -0
- package/dist/utils/internal/serializeProperties.d.ts +4 -0
- package/dist/utils/public/buildAuthorization.d.ts +22 -0
- package/dist/utils/public/index.d.ts +3 -0
- package/dist/utils/public/models/auth-object.model.d.ts +19 -0
- package/dist/utils/public/models/index.d.ts +1 -0
- package/package.json +117 -0
- package/src/__playground.ts +27 -0
- package/src/achievement/getAchievementUnlocks.test.ts +71 -0
- package/src/achievement/getAchievementUnlocks.ts +80 -0
- package/src/achievement/index.ts +2 -0
- package/src/achievement/models/achievement-unlock-entity.model.ts +6 -0
- package/src/achievement/models/get-achievement-unlocks-response.model.ts +8 -0
- package/src/achievement/models/index.ts +2 -0
- package/src/console/getConsoleIds.test.ts +53 -0
- package/src/console/getConsoleIds.ts +43 -0
- package/src/console/getGameList.test.ts +82 -0
- package/src/console/getGameList.ts +94 -0
- package/src/console/index.ts +3 -0
- package/src/console/models/console-id.model.ts +4 -0
- package/src/console/models/game-list.model.ts +16 -0
- package/src/console/models/get-console-ids-response.model.ts +1 -0
- package/src/console/models/get-game-list-response.model.ts +16 -0
- package/src/console/models/index.ts +4 -0
- package/src/feed/getAchievementOfTheWeek.test.ts +167 -0
- package/src/feed/getAchievementOfTheWeek.ts +80 -0
- package/src/feed/getActiveClaims.test.ts +81 -0
- package/src/feed/getActiveClaims.ts +68 -0
- package/src/feed/getTicketData.test.ts +349 -0
- package/src/feed/getTicketData.ts +286 -0
- package/src/feed/getTopTenUsers.test.ts +101 -0
- package/src/feed/getTopTenUsers.ts +51 -0
- package/src/feed/index.ts +5 -0
- package/src/feed/models/achievement-of-the-week.model.ts +27 -0
- package/src/feed/models/achievement-ticket-stats-response.model.ts +7 -0
- package/src/feed/models/achievement-ticket-stats.model.ts +7 -0
- package/src/feed/models/active-claim.model.ts +66 -0
- package/src/feed/models/game-ticket-stats.model.ts +11 -0
- package/src/feed/models/game-tickets-response.model.ts +7 -0
- package/src/feed/models/get-achievement-of-the-week-response.model.ts +27 -0
- package/src/feed/models/get-active-claims-response.model.ts +19 -0
- package/src/feed/models/get-top-ten-users-response.model.ts +12 -0
- package/src/feed/models/index.ts +19 -0
- package/src/feed/models/most-ticketed-games-response.model.ts +12 -0
- package/src/feed/models/most-ticketed-games.model.ts +12 -0
- package/src/feed/models/recent-tickets-response.model.ts +7 -0
- package/src/feed/models/recent-tickets.model.ts +7 -0
- package/src/feed/models/response-ticket-entity.model.ts +25 -0
- package/src/feed/models/ticket-entity.model.ts +24 -0
- package/src/feed/models/tickets-by-user-response.model.ts +8 -0
- package/src/feed/models/top-ten-users-entity.model.ts +5 -0
- package/src/feed/models/top-ten-users.model.ts +3 -0
- package/src/feed/models/user-ticket-stats.model.ts +8 -0
- package/src/game/getAchievementCount.test.ts +49 -0
- package/src/game/getAchievementCount.ts +52 -0
- package/src/game/getAchievementDistribution.test.ts +187 -0
- package/src/game/getAchievementDistribution.ts +88 -0
- package/src/game/getGame.test.ts +81 -0
- package/src/game/getGame.ts +74 -0
- package/src/game/getGameExtended.test.ts +121 -0
- package/src/game/getGameExtended.ts +103 -0
- package/src/game/getGameRankAndScore.test.ts +62 -0
- package/src/game/getGameRankAndScore.ts +66 -0
- package/src/game/getGameRating.test.ts +59 -0
- package/src/game/getGameRating.ts +59 -0
- package/src/game/index.ts +7 -0
- package/src/game/models/achievement-count.model.ts +4 -0
- package/src/game/models/achievement-distribution-flags.model.ts +4 -0
- package/src/game/models/game-extended-achievement-entity.model.ts +15 -0
- package/src/game/models/game-extended-claim-entity.model.ts +7 -0
- package/src/game/models/game-extended.model.ts +26 -0
- package/src/game/models/game-rank-and-score-entity.model.ts +6 -0
- package/src/game/models/game-rating.model.ts +9 -0
- package/src/game/models/game.model.ts +19 -0
- package/src/game/models/get-achievement-count-response.model.ts +4 -0
- package/src/game/models/get-achievement-distribution-response.model.ts +1 -0
- package/src/game/models/get-game-extended-response.model.ts +56 -0
- package/src/game/models/get-game-rank-and-score-response.model.ts +8 -0
- package/src/game/models/get-game-rating-response.model.ts +9 -0
- package/src/game/models/get-game-response.model.ts +19 -0
- package/src/game/models/index.ts +14 -0
- package/src/index.ts +8 -0
- package/src/user/getAchievementsEarnedBetween.test.ts +84 -0
- package/src/user/getAchievementsEarnedBetween.ts +88 -0
- package/src/user/getAchievementsEarnedOnDay.test.ts +83 -0
- package/src/user/getAchievementsEarnedOnDay.ts +87 -0
- package/src/user/getGameInfoAndUserProgress.test.ts +135 -0
- package/src/user/getGameInfoAndUserProgress.ts +118 -0
- package/src/user/getUserGameRankAndScore.test.ts +60 -0
- package/src/user/getUserGameRankAndScore.ts +69 -0
- package/src/user/getUserPoints.test.ts +49 -0
- package/src/user/getUserPoints.ts +51 -0
- package/src/user/getUserProgress.test.ts +80 -0
- package/src/user/getUserProgress.ts +78 -0
- package/src/user/getUserRecentlyPlayedGames.test.ts +76 -0
- package/src/user/getUserRecentlyPlayedGames.ts +93 -0
- package/src/user/getUserSummary.test.ts +251 -0
- package/src/user/getUserSummary.ts +96 -0
- package/src/user/index.ts +9 -0
- package/src/user/models/dated-user-achievement.model.ts +17 -0
- package/src/user/models/dated-user-achievements-response.model.ts +20 -0
- package/src/user/models/game-info-and-user-progress.model.ts +19 -0
- package/src/user/models/get-game-info-and-user-progress-response.model.ts +28 -0
- package/src/user/models/get-user-game-rank-and-score-response.model.ts +9 -0
- package/src/user/models/get-user-points-response.model.ts +4 -0
- package/src/user/models/get-user-progress-response.model.ts +13 -0
- package/src/user/models/get-user-recently-played-games-response.model.ts +17 -0
- package/src/user/models/get-user-summary-response.model.ts +92 -0
- package/src/user/models/index.ts +14 -0
- package/src/user/models/user-game-rank-and-score.model.ts +8 -0
- package/src/user/models/user-points.model.ts +4 -0
- package/src/user/models/user-progress.model.ts +10 -0
- package/src/user/models/user-recently-played-games.model.ts +16 -0
- package/src/user/models/user-summary.model.ts +92 -0
- package/src/utils/internal/apiBaseUrl.ts +1 -0
- package/src/utils/internal/buildRequestUrl.test.ts +51 -0
- package/src/utils/internal/buildRequestUrl.ts +32 -0
- package/src/utils/internal/call.test.ts +39 -0
- package/src/utils/internal/call.ts +29 -0
- package/src/utils/internal/index.ts +4 -0
- package/src/utils/internal/serializeProperties.test.ts +141 -0
- package/src/utils/internal/serializeProperties.ts +75 -0
- package/src/utils/public/buildAuthorization.test.ts +36 -0
- package/src/utils/public/buildAuthorization.ts +40 -0
- package/src/utils/public/index.ts +3 -0
- package/src/utils/public/models/auth-object.model.ts +20 -0
- package/src/utils/public/models/index.ts +1 -0
|
@@ -0,0 +1,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,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,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
|
+
});
|