Skip to content

Commit bf79d4c

Browse files
Merge branch 'develop' into main
2 parents 7419b46 + c4c9f8e commit bf79d4c

File tree

6 files changed

+91
-21
lines changed

6 files changed

+91
-21
lines changed

src/controllers/baseHandler.ts

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import {
2727
NOTIFY_ONBOARDING,
2828
OOO,
2929
USER,
30+
REMOVE,
3031
GROUP_INVITE,
3132
} from "../constants/commands";
3233
import { updateNickName } from "../utils/updateNickname";
@@ -41,7 +42,7 @@ import {
4142
RETRY_COMMAND,
4243
} from "../constants/responses";
4344
import { DevFlag } from "../typeDefinitions/filterUsersByRole";
44-
// import { kickEachUser } from "./kickEachUser";
45+
import { kickEachUser } from "./kickEachUser";
4546
import { groupInvite } from "./groupInvite";
4647

4748
export async function baseHandler(
@@ -78,19 +79,16 @@ export async function baseHandler(
7879
return await mentionEachUser(transformedArgument, env, ctx);
7980
}
8081

81-
/**
82-
* HOT FIX to prevent non superusers from running the /remove commmand.
83-
* More info :- https://discord.com/channels/673083527624916993/729399523268624405/1293604361758441605
84-
* ---
85-
*/
86-
// case getCommandName(REMOVE): {
87-
// const data = message.data?.options as Array<messageRequestDataOptions>;
88-
// const transformedArgument = {
89-
// roleToBeRemovedObj: data[0],
90-
// channelId: message.channel_id,
91-
// };
92-
// return await kickEachUser(transformedArgument, env, ctx);
93-
// }
82+
case getCommandName(REMOVE): {
83+
const data = message.data?.options as Array<messageRequestDataOptions>;
84+
const transformedArgument = {
85+
member: message.member,
86+
roleToBeRemovedObj: data[0],
87+
channelId: message.channel_id,
88+
};
89+
90+
return await kickEachUser(transformedArgument, env, ctx);
91+
}
9492

9593
case getCommandName(LISTENING): {
9694
const data = message.data?.options;

src/controllers/kickEachUser.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,27 @@ import { getMembersInServer } from "../utils/getMembersInServer";
77
import { filterUserByRoles } from "../utils/filterUsersByRole";
88
import { discordTextResponse } from "../utils/discordResponse";
99
import { removeUsers } from "../utils/removeUsers";
10+
import { SUPER_USER_ONE, SUPER_USER_TWO } from "../constants/variables";
11+
import { messageRequestMember } from "../typeDefinitions/discordMessage.types";
1012

1113
export async function kickEachUser(
1214
transformedArgument: {
15+
member: messageRequestMember;
1316
roleToBeRemovedObj: MentionEachUserOptions;
1417
channelId: number;
1518
},
1619
env: env,
1720
ctx: ExecutionContext
1821
) {
22+
const isUserSuperUser = [SUPER_USER_ONE, SUPER_USER_TWO].includes(
23+
transformedArgument.member.user.id.toString()
24+
);
25+
26+
if (!isUserSuperUser) {
27+
const responseText = `You're not authorized to make this request.`;
28+
return discordTextResponse(responseText);
29+
}
30+
1931
const getMembersInServerResponse = await getMembersInServer(env);
2032
const roleId = transformedArgument.roleToBeRemovedObj.value;
2133

src/register.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
NOTIFY_ONBOARDING,
99
OOO,
1010
USER,
11+
REMOVE,
1112
GROUP_INVITE,
1213
} from "./constants/commands";
1314
import { config } from "dotenv";
@@ -38,6 +39,7 @@ async function registerGuildCommands(
3839
USER,
3940
NOTIFY_OVERDUE,
4041
NOTIFY_ONBOARDING,
42+
REMOVE,
4143
GROUP_INVITE,
4244
];
4345

src/typeDefinitions/discordMessage.types.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ export interface messageRequestMember {
7777
}
7878

7979
export interface messageMember {
80-
id: number;
80+
id: number | bigint;
8181
username: string;
8282
avatar: string;
8383
discriminator: string;

tests/fixtures/fixture.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { InteractionType } from "discord-interactions";
88
import { UserBackend } from "../../src/typeDefinitions/userBackend.types";
99
import { TaskOverdueResponse } from "../../src/typeDefinitions/taskOverdue.types";
1010
import { UserStatus } from "../../src/typeDefinitions/userStatus.type";
11+
import { SUPER_USER_ONE } from "../../src/constants/variables";
1112

1213
export const dummyHelloMessage: discordMessageRequest = {
1314
type: InteractionType.APPLICATION_COMMAND,
@@ -292,6 +293,30 @@ export const userFutureStatusMock: UserStatus = {
292293
message: "User Status found successfully.",
293294
};
294295

296+
export const messageRequestMemberMockNonSuperUser = {
297+
member: {
298+
user: {
299+
id: 123455,
300+
username: "ankush",
301+
avatar: "https://cdn.discordapp.com/avatars/1/userAvatarHash.jpg",
302+
discriminator: "discriminator",
303+
},
304+
joined_at: "2024-03-07T18:46:20.327000+00:00",
305+
},
306+
};
307+
308+
export const messageRequestMemberMockSuperUser = {
309+
member: {
310+
user: {
311+
id: 154585730465660929n,
312+
username: "ankush",
313+
avatar: "https://cdn.discordapp.com/avatars/1/userAvatarHash.jpg",
314+
discriminator: "discriminator",
315+
},
316+
joined_at: "2024-03-07T18:46:20.327000+00:00",
317+
},
318+
};
319+
295320
export const memberGroupRoleList: memberGroupRole[] = [
296321
{ userid: "XXXX", roleid: "XXXX" },
297322
{ userid: "YYYY", roleid: "YYYY" },

tests/unit/handlers/kickEachUser.test.ts

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,53 @@
11
import { kickEachUser } from "../../../src/controllers/kickEachUser";
2-
import { transformedArgument, ctx } from "../../fixtures/fixture";
2+
import {
3+
transformedArgument,
4+
ctx,
5+
messageRequestMemberMockSuperUser,
6+
messageRequestMemberMockNonSuperUser,
7+
} from "../../fixtures/fixture";
38

49
describe("kickEachUser", () => {
5-
it("should run when found no users with Matched Role", async () => {
10+
it("should fail when a non super_user runs ", async () => {
611
const env = {
712
BOT_PUBLIC_KEY: "xyz",
813
DISCORD_GUILD_ID: "123",
914
DISCORD_TOKEN: "abc",
1015
};
1116

1217
const { roleToBeTaggedObj } = transformedArgument; // Extracting roleToBeTaggedObj
13-
const response = kickEachUser(
14-
{ roleToBeRemovedObj: roleToBeTaggedObj, channelId: 12345 },
15-
env,
16-
ctx
18+
const messageRequestMember = {
19+
roleToBeRemovedObj: roleToBeTaggedObj,
20+
channelId: 12345,
21+
...messageRequestMemberMockNonSuperUser,
22+
};
23+
const response = kickEachUser(messageRequestMember, env, ctx);
24+
25+
const roleID = roleToBeTaggedObj.value;
26+
27+
expect(response).toBeInstanceOf(Promise);
28+
29+
const textMessage: { data: { content: string } } = await response.then(
30+
(res) => res.json()
31+
);
32+
expect(textMessage.data.content).toBe(
33+
`You're not authorized to make this request.`
1734
);
35+
});
36+
37+
it("should run when found no users with Matched Role", async () => {
38+
const env = {
39+
BOT_PUBLIC_KEY: "xyz",
40+
DISCORD_GUILD_ID: "123",
41+
DISCORD_TOKEN: "abc",
42+
};
43+
44+
const { roleToBeTaggedObj } = transformedArgument; // Extracting roleToBeTaggedObj
45+
const messageRequestMember = {
46+
roleToBeRemovedObj: roleToBeTaggedObj,
47+
channelId: 12345,
48+
...messageRequestMemberMockSuperUser,
49+
};
50+
const response = kickEachUser(messageRequestMember, env, ctx);
1851

1952
const roleID = roleToBeTaggedObj.value;
2053

0 commit comments

Comments
 (0)