Skip to content

Commit 53ca54e

Browse files
Merge branch 'monkeytypegame:master' into master
2 parents 9bf883a + 91bd24b commit 53ca54e

40 files changed

Lines changed: 1686 additions & 1696 deletions

.github/workflows/fix-formatting.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name: Fix formatting
22

33
env:
4-
PNPM_VERSION: "10.28.1"
4+
PNPM_VERSION: "11.21.0"
55
NODE_VERSION: "24.11.0"
66

77
permissions:

.github/workflows/monkey-ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name: Monkey CI
22

33
env:
4-
PNPM_VERSION: "10.28.1"
4+
PNPM_VERSION: "11.21.0"
55
NODE_VERSION: "24.11.0"
66
RECAPTCHA_SITE_KEY: "6Lc-V8McAAAAAJ7s6LGNe7MBZnRiwbsbiWts87aj"
77

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,3 +133,4 @@ frontend/static/webfonts-preview
133133
frontend/.env.sentry-build-plugin
134134
.claude/worktrees
135135
1024MiB
136+
.pnpm-store

.npmrc

Lines changed: 0 additions & 3 deletions
This file was deleted.

backend/__tests__/api/controllers/admin.spec.ts

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import * as ReportDal from "../../../src/dal/report";
88
import * as LogsDal from "../../../src/dal/logs";
99
import GeorgeQueue from "../../../src/queues/george-queue";
1010
import * as AuthUtil from "../../../src/utils/auth";
11+
import * as DailyLeaderboards from "../../../src/utils/daily-leaderboards";
12+
import * as WeeklyXpLeaderboard from "../../../src/services/weekly-xp-leaderboard";
1113

1214
import { enableRateLimitExpects } from "../../__testData__/rate-limit";
1315
import Test from "supertest/lib/test";
@@ -66,12 +68,26 @@ describe("AdminController", () => {
6668
const userBannedMock = vi.spyOn(UserDal, "setBanned");
6769
const georgeBannedMock = vi.spyOn(GeorgeQueue, "userBanned");
6870
const getUserMock = vi.spyOn(UserDal, "getPartialUser");
71+
const purgeUserFromDailyLeaderboardsMock = vi.spyOn(
72+
DailyLeaderboards,
73+
"purgeUserFromDailyLeaderboards",
74+
);
75+
const purgeUserFromXpLeaderboardsMock = vi.spyOn(
76+
WeeklyXpLeaderboard,
77+
"purgeUserFromXpLeaderboards",
78+
);
6979

7080
beforeEach(() => {
71-
[userBannedMock, georgeBannedMock, getUserMock].forEach((it) =>
72-
it.mockClear(),
73-
);
81+
[
82+
userBannedMock,
83+
georgeBannedMock,
84+
getUserMock,
85+
purgeUserFromDailyLeaderboardsMock,
86+
purgeUserFromXpLeaderboardsMock,
87+
].forEach((it) => it.mockClear());
7488
userBannedMock.mockResolvedValue();
89+
purgeUserFromDailyLeaderboardsMock.mockResolvedValue();
90+
purgeUserFromXpLeaderboardsMock.mockResolvedValue();
7591
});
7692

7793
it("should ban user with discordId", async () => {
@@ -101,6 +117,14 @@ describe("AdminController", () => {
101117
]);
102118
expect(userBannedMock).toHaveBeenCalledWith(victimUid, true);
103119
expect(georgeBannedMock).toHaveBeenCalledWith("discordId", true);
120+
expect(purgeUserFromDailyLeaderboardsMock).toHaveBeenCalledWith(
121+
victimUid,
122+
(await configuration).dailyLeaderboards,
123+
);
124+
expect(purgeUserFromXpLeaderboardsMock).toHaveBeenCalledWith(
125+
victimUid,
126+
(await configuration).leaderboards.weeklyXp,
127+
);
104128
});
105129
it("should unban user without discordId", async () => {
106130
//GIVEN
@@ -128,6 +152,8 @@ describe("AdminController", () => {
128152
]);
129153
expect(userBannedMock).toHaveBeenCalledWith(victimUid, false);
130154
expect(georgeBannedMock).not.toHaveBeenCalled();
155+
expect(purgeUserFromDailyLeaderboardsMock).not.toHaveBeenCalled();
156+
expect(purgeUserFromXpLeaderboardsMock).not.toHaveBeenCalled();
131157
});
132158
it("should fail without mandatory properties", async () => {
133159
//GIVEN

backend/docker/compose.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ services:
2424
build:
2525
dockerfile_inline: |
2626
FROM node:24.11.0
27-
RUN npm i -g pnpm@10.28.1
27+
RUN npm i -g pnpm@11.21.0
2828
RUN mkdir /pnpm-store && chown -R 1000:1000 /pnpm-store
2929
user: "node" ##this works as long as your local user has uid=1000
3030
restart: on-failure

backend/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@
5454
"string-similarity": "4.0.4",
5555
"swagger-stats": "0.99.7",
5656
"ua-parser-js": "0.7.33",
57-
"uuid": "14.0.0",
57+
"uuid": "14.0.1",
5858
"winston": "3.6.0",
5959
"zod": "3.23.8"
6060
},

backend/src/api/controllers/admin.ts

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ import MonkeyError, { getErrorMessage } from "../../utils/error";
1616
import { Configuration } from "@monkeytype/schemas/configuration";
1717
import { addImportantLog } from "../../dal/logs";
1818
import { MonkeyRequest } from "../types";
19+
import { purgeUserFromDailyLeaderboards } from "../../utils/daily-leaderboards";
20+
import { purgeUserFromXpLeaderboards } from "../../services/weekly-xp-leaderboard";
1921

2022
export async function test(_req: MonkeyRequest): Promise<MonkeyResponse> {
2123
return new MonkeyResponse("OK", null);
@@ -33,13 +35,28 @@ export async function toggleBan(
3335
const discordId = user.discordId;
3436
const discordIdIsValid = discordId !== undefined && discordId !== "";
3537

36-
await UserDAL.setBanned(uid, !user.banned);
37-
if (discordIdIsValid) await GeorgeQueue.userBanned(discordId, !user.banned);
38+
const banning = !user.banned;
39+
40+
await UserDAL.setBanned(uid, banning);
41+
if (discordIdIsValid) await GeorgeQueue.userBanned(discordId, banning);
42+
43+
if (banning) {
44+
await Promise.all([
45+
purgeUserFromDailyLeaderboards(
46+
uid,
47+
req.ctx.configuration.dailyLeaderboards,
48+
),
49+
purgeUserFromXpLeaderboards(
50+
uid,
51+
req.ctx.configuration.leaderboards.weeklyXp,
52+
),
53+
]);
54+
}
3855

39-
void addImportantLog("user_ban_toggled", { banned: !user.banned }, uid);
56+
void addImportantLog("user_ban_toggled", { banned: banning }, uid);
4057

4158
return new MonkeyResponse(`Ban toggled`, {
42-
banned: !user.banned,
59+
banned: banning,
4360
});
4461
}
4562

backend/src/api/controllers/result.ts

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,10 @@ import {
2323
incrementDailyLeaderboard,
2424
} from "../../utils/prometheus";
2525
import GeorgeQueue from "../../queues/george-queue";
26-
import { getDailyLeaderboard } from "../../utils/daily-leaderboards";
26+
import {
27+
getDailyLeaderboard,
28+
purgeUserFromDailyLeaderboards,
29+
} from "../../utils/daily-leaderboards";
2730
import * as UserDAL from "../../dal/user";
2831
import { buildMonkeyMail } from "../../utils/monkey-mail";
2932
import * as WeeklyXpLeaderboard from "../../services/weekly-xp-leaderboard";
@@ -386,11 +389,21 @@ export async function addResult(
386389
subject: "Banned",
387390
body: "Your account has been automatically banned for triggering the anticheat system. If you believe this is a mistake, please contact support.",
388391
});
389-
await UserDAL.addToInbox(
390-
uid,
391-
[mail],
392-
req.ctx.configuration.users.inbox,
393-
);
392+
await Promise.all([
393+
UserDAL.addToInbox(
394+
uid,
395+
[mail],
396+
req.ctx.configuration.users.inbox,
397+
),
398+
purgeUserFromDailyLeaderboards(
399+
uid,
400+
req.ctx.configuration.dailyLeaderboards,
401+
),
402+
WeeklyXpLeaderboard.purgeUserFromXpLeaderboards(
403+
uid,
404+
req.ctx.configuration.leaderboards.weeklyXp,
405+
),
406+
]);
394407
user.banned = true;
395408
}
396409
}

backend/src/dal/new-quotes.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,10 +159,12 @@ export async function approve(
159159
);
160160
}
161161
const language = targetQuote.language;
162+
163+
const approvedText = editQuote ?? targetQuote.text;
162164
const quote: ApproveQuote = {
163-
text: editQuote ?? targetQuote.text,
165+
text: approvedText,
164166
source: editSource ?? targetQuote.source,
165-
length: targetQuote.text.length,
167+
length: approvedText.length,
166168
approvedBy: name,
167169
id: -1,
168170
};

0 commit comments

Comments
 (0)