diff options
Diffstat (limited to 'packages')
| -rw-r--r-- | packages/interactions/discord/commands/index.ts | 13 | ||||
| -rw-r--r-- | packages/interactions/register.ts | 2 | ||||
| -rw-r--r-- | packages/interactions/server.ts | 123 | ||||
| -rw-r--r-- | packages/shared/index.ts | 2 |
4 files changed, 139 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 }); } diff --git a/packages/shared/index.ts b/packages/shared/index.ts index 6ba2eec..9f70052 100644 --- a/packages/shared/index.ts +++ b/packages/shared/index.ts @@ -37,6 +37,8 @@ export const CENTRAL_STAFF_ROLES = [ CENTRAL_ADMINISTRATOR_ROLE_ID, CENTRAL_MODERATOR_ROLE_ID, ] as const; + +export const CENTRAL_PRIVILEGED_ACCESS_ROLE_ID = "1425706904478289928"; export const COLOR_ROLE_IDS = [ "1407075059830624406", // Nice Nature Red "1407075160250650664", // Taiki Shuttle Green |