summaryrefslogtreecommitdiff
path: root/packages/interactions
diff options
context:
space:
mode:
Diffstat (limited to 'packages/interactions')
-rw-r--r--packages/interactions/discord/commands/index.ts13
-rw-r--r--packages/interactions/register.ts2
-rw-r--r--packages/interactions/server.ts123
3 files changed, 137 insertions, 1 deletions
diff --git a/packages/interactions/discord/commands/index.ts b/packages/interactions/discord/commands/index.ts
index 46665a4..b3d0d84 100644
--- a/packages/interactions/discord/commands/index.ts
+++ b/packages/interactions/discord/commands/index.ts
@@ -134,3 +134,16 @@ export const ROLEPLAY_VERIFY_COMMAND: DiscordCommand = {
},
],
};
+
+export const TOGGLE_PRIVILEGED_ACCESS_COMMAND: DiscordCommand = {
+ name: "toggle-privileged-access",
+ description: "Toggle privileged access role (Staff only)",
+ options: [
+ {
+ type: DISCORD_APPLICATION_COMMAND_OPTION_TYPES.USER,
+ name: "user",
+ description: "User to toggle privileged access for",
+ required: true,
+ },
+ ],
+};
diff --git a/packages/interactions/register.ts b/packages/interactions/register.ts
index 9ba9d90..d5b0eb6 100644
--- a/packages/interactions/register.ts
+++ b/packages/interactions/register.ts
@@ -7,6 +7,7 @@ import {
APPEAL_COMMAND,
COLOURS_COMMAND,
ROLEPLAY_VERIFY_COMMAND,
+ TOGGLE_PRIVILEGED_ACCESS_COMMAND,
type DiscordCommand,
} from "./discord/commands";
import dotenv from "dotenv";
@@ -36,6 +37,7 @@ const commands: DiscordCommand[] = [
APPEAL_COMMAND,
COLOURS_COMMAND,
ROLEPLAY_VERIFY_COMMAND,
+ TOGGLE_PRIVILEGED_ACCESS_COMMAND,
];
const response = await fetch(url, {
diff --git a/packages/interactions/server.ts b/packages/interactions/server.ts
index f836286..baaecd3 100644
--- a/packages/interactions/server.ts
+++ b/packages/interactions/server.ts
@@ -11,6 +11,7 @@ import {
APPEAL_COMMAND,
COLOURS_COMMAND,
ROLEPLAY_VERIFY_COMMAND,
+ TOGGLE_PRIVILEGED_ACCESS_COMMAND,
} from "./discord/commands";
import {
getCutePost,
@@ -28,7 +29,12 @@ import {
} from "./discord/embeds.ts";
import { JSONResponse } from "./discord/responses.ts";
import { verifyDiscordRequest } from "./discord/verification.ts";
-import { CENTRAL_GUILD_ID, COLOR_ROLE_IDS } from "../shared";
+import {
+ CENTRAL_GUILD_ID,
+ COLOR_ROLE_IDS,
+ CENTRAL_STAFF_ROLES,
+ CENTRAL_PRIVILEGED_ACCESS_ROLE_ID,
+} from "../shared";
const router = AutoRouter();
const COMPLAINT_CHANNEL_ID = "1415868433714778204";
@@ -701,6 +707,121 @@ router.post("/", async (request: Request, environment: Environment) => {
}
}
+ case TOGGLE_PRIVILEGED_ACCESS_COMMAND.name.toLowerCase(): {
+ try {
+ const member = interaction.member;
+ const hasAdminPermission =
+ member?.permissions && (parseInt(member.permissions) & 0x8) === 0x8;
+ const hasStaffRole = member?.roles?.some((roleId) =>
+ CENTRAL_STAFF_ROLES.includes(roleId as any),
+ );
+
+ if (!hasAdminPermission && !hasStaffRole)
+ return new JSONResponse({
+ type: InteractionResponseType.CHANNEL_MESSAGE_WITH_SOURCE,
+ data: {
+ content:
+ "❌ You don't have permission to use this command. Only staff members or server owner can use this command.",
+ flags: 64,
+ },
+ });
+
+ const targetUserID = interaction.data.options?.[0]?.value as string;
+
+ if (!targetUserID)
+ return new JSONResponse({
+ type: InteractionResponseType.CHANNEL_MESSAGE_WITH_SOURCE,
+ data: {
+ content: "❌ Please provide a target user.",
+ flags: 64,
+ },
+ });
+
+ const guild = await fetch(
+ `https://discord.com/api/v10/guilds/${CENTRAL_GUILD_ID}/members/${targetUserID}`,
+ {
+ headers: {
+ Authorization: `Bot ${environment.DISCORD_TOKEN}`,
+ },
+ },
+ );
+
+ if (!guild.ok)
+ return new JSONResponse({
+ type: InteractionResponseType.CHANNEL_MESSAGE_WITH_SOURCE,
+ data: {
+ content:
+ "❌ Unable to fetch user information. The user may not be in this server.",
+ flags: 64,
+ },
+ });
+
+ const targetMember = await guild.json();
+ const currentRoles = targetMember.roles || [];
+ const hasRole = currentRoles.includes(
+ CENTRAL_PRIVILEGED_ACCESS_ROLE_ID,
+ );
+ let newRoles = [...currentRoles];
+
+ if (hasRole) {
+ newRoles = newRoles.filter(
+ (roleId) => roleId !== CENTRAL_PRIVILEGED_ACCESS_ROLE_ID,
+ );
+ } else {
+ newRoles.push(CENTRAL_PRIVILEGED_ACCESS_ROLE_ID);
+ }
+
+ const updateResponse = await fetch(
+ `https://discord.com/api/v10/guilds/${CENTRAL_GUILD_ID}/members/${targetUserID}`,
+ {
+ method: "PATCH",
+ headers: {
+ Authorization: `Bot ${environment.DISCORD_TOKEN}`,
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify({
+ roles: newRoles,
+ }),
+ },
+ );
+
+ if (!updateResponse.ok) {
+ console.error(
+ "Failed to update user roles:",
+ await updateResponse.text(),
+ );
+
+ return new JSONResponse({
+ type: InteractionResponseType.CHANNEL_MESSAGE_WITH_SOURCE,
+ data: {
+ content:
+ "❌ Failed to update user roles. The bot may not have sufficient permissions.",
+ flags: 64,
+ },
+ });
+ }
+
+ const action = hasRole ? "removed" : "added";
+
+ return new JSONResponse({
+ type: InteractionResponseType.CHANNEL_MESSAGE_WITH_SOURCE,
+ data: {
+ content: `✅ Successfully ${action} privileged access role for <@${targetUserID}>.`,
+ },
+ });
+ } catch (error) {
+ console.error("Error in toggle-privileged-access command:", error);
+
+ return new JSONResponse({
+ type: InteractionResponseType.CHANNEL_MESSAGE_WITH_SOURCE,
+ data: {
+ content: "❌ An error occurred while managing the role.",
+ flags: 64,
+ },
+ });
+ }
+ }
+
default:
return new JSONResponse({ error: "Unknown Type" }, { status: 400 });
}