Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 12 additions & 14 deletions src/controllers/baseHandler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import {
NOTIFY_ONBOARDING,
OOO,
USER,
REMOVE,
GROUP_INVITE,
} from "../constants/commands";
import { updateNickName } from "../utils/updateNickname";
Expand All @@ -41,7 +42,7 @@ import {
RETRY_COMMAND,
} from "../constants/responses";
import { DevFlag } from "../typeDefinitions/filterUsersByRole";
// import { kickEachUser } from "./kickEachUser";
import { kickEachUser } from "./kickEachUser";
import { groupInvite } from "./groupInvite";

export async function baseHandler(
Expand Down Expand Up @@ -78,19 +79,16 @@ export async function baseHandler(
return await mentionEachUser(transformedArgument, env, ctx);
}

/**
* HOT FIX to prevent non superusers from running the /remove commmand.
* More info :- https://discord.com/channels/673083527624916993/729399523268624405/1293604361758441605
* ---
*/
// case getCommandName(REMOVE): {
// const data = message.data?.options as Array<messageRequestDataOptions>;
// const transformedArgument = {
// roleToBeRemovedObj: data[0],
// channelId: message.channel_id,
// };
// return await kickEachUser(transformedArgument, env, ctx);
// }
case getCommandName(REMOVE): {
const data = message.data?.options as Array<messageRequestDataOptions>;
const transformedArgument = {
member: message.member,
roleToBeRemovedObj: data[0],
channelId: message.channel_id,
};

return await kickEachUser(transformedArgument, env, ctx);
}

case getCommandName(LISTENING): {
const data = message.data?.options;
Expand Down
12 changes: 12 additions & 0 deletions src/controllers/kickEachUser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,27 @@ import { getMembersInServer } from "../utils/getMembersInServer";
import { filterUserByRoles } from "../utils/filterUsersByRole";
import { discordTextResponse } from "../utils/discordResponse";
import { removeUsers } from "../utils/removeUsers";
import { SUPER_USER_ONE, SUPER_USER_TWO } from "../constants/variables";
import { messageRequestMember } from "../typeDefinitions/discordMessage.types";

export async function kickEachUser(
transformedArgument: {
member: messageRequestMember;
roleToBeRemovedObj: MentionEachUserOptions;
channelId: number;
},
env: env,
ctx: ExecutionContext
) {
const isUserSuperUser = [SUPER_USER_ONE, SUPER_USER_TWO].includes(
transformedArgument.member.user.id.toString()
);

if (!isUserSuperUser) {
const responseText = `You're not authorized to make this request.`;
return discordTextResponse(responseText);
}

const getMembersInServerResponse = await getMembersInServer(env);
const roleId = transformedArgument.roleToBeRemovedObj.value;

Expand Down
2 changes: 2 additions & 0 deletions src/register.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {
NOTIFY_ONBOARDING,
OOO,
USER,
REMOVE,
GROUP_INVITE,
} from "./constants/commands";
import { config } from "dotenv";
Expand Down Expand Up @@ -38,6 +39,7 @@ async function registerGuildCommands(
USER,
NOTIFY_OVERDUE,
NOTIFY_ONBOARDING,
REMOVE,
GROUP_INVITE,
];

Expand Down
2 changes: 1 addition & 1 deletion src/typeDefinitions/discordMessage.types.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ export interface messageRequestMember {
}

export interface messageMember {
id: number;
id: number | bigint;
username: string;
avatar: string;
discriminator: string;
Expand Down
25 changes: 25 additions & 0 deletions tests/fixtures/fixture.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import { InteractionType } from "discord-interactions";
import { UserBackend } from "../../src/typeDefinitions/userBackend.types";
import { TaskOverdueResponse } from "../../src/typeDefinitions/taskOverdue.types";
import { UserStatus } from "../../src/typeDefinitions/userStatus.type";
import { SUPER_USER_ONE } from "../../src/constants/variables";

export const dummyHelloMessage: discordMessageRequest = {
type: InteractionType.APPLICATION_COMMAND,
Expand Down Expand Up @@ -292,6 +293,30 @@ export const userFutureStatusMock: UserStatus = {
message: "User Status found successfully.",
};

export const messageRequestMemberMockNonSuperUser = {
member: {
user: {
id: 123455,
username: "ankush",
avatar: "https://cdn.discordapp.com/avatars/1/userAvatarHash.jpg",
discriminator: "discriminator",
},
joined_at: "2024-03-07T18:46:20.327000+00:00",
},
};

export const messageRequestMemberMockSuperUser = {
member: {
user: {
id: 154585730465660929n,
username: "ankush",
avatar: "https://cdn.discordapp.com/avatars/1/userAvatarHash.jpg",
discriminator: "discriminator",
},
joined_at: "2024-03-07T18:46:20.327000+00:00",
},
};

export const memberGroupRoleList: memberGroupRole[] = [
{ userid: "XXXX", roleid: "XXXX" },
{ userid: "YYYY", roleid: "YYYY" },
Expand Down
45 changes: 39 additions & 6 deletions tests/unit/handlers/kickEachUser.test.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,53 @@
import { kickEachUser } from "../../../src/controllers/kickEachUser";
import { transformedArgument, ctx } from "../../fixtures/fixture";
import {
transformedArgument,
ctx,
messageRequestMemberMockSuperUser,
messageRequestMemberMockNonSuperUser,
} from "../../fixtures/fixture";

describe("kickEachUser", () => {
it("should run when found no users with Matched Role", async () => {
it("should fail when a non super_user runs ", async () => {
const env = {
BOT_PUBLIC_KEY: "xyz",
DISCORD_GUILD_ID: "123",
DISCORD_TOKEN: "abc",
};

const { roleToBeTaggedObj } = transformedArgument; // Extracting roleToBeTaggedObj
const response = kickEachUser(
{ roleToBeRemovedObj: roleToBeTaggedObj, channelId: 12345 },
env,
ctx
const messageRequestMember = {
roleToBeRemovedObj: roleToBeTaggedObj,
channelId: 12345,
...messageRequestMemberMockNonSuperUser,
};
const response = kickEachUser(messageRequestMember, env, ctx);

const roleID = roleToBeTaggedObj.value;

expect(response).toBeInstanceOf(Promise);

const textMessage: { data: { content: string } } = await response.then(
(res) => res.json()
);
expect(textMessage.data.content).toBe(
`You're not authorized to make this request.`
);
});

it("should run when found no users with Matched Role", async () => {
const env = {
BOT_PUBLIC_KEY: "xyz",
DISCORD_GUILD_ID: "123",
DISCORD_TOKEN: "abc",
};

const { roleToBeTaggedObj } = transformedArgument; // Extracting roleToBeTaggedObj
const messageRequestMember = {
roleToBeRemovedObj: roleToBeTaggedObj,
channelId: 12345,
...messageRequestMemberMockSuperUser,
};
const response = kickEachUser(messageRequestMember, env, ctx);

const roleID = roleToBeTaggedObj.value;

Expand Down
Loading