diff options
| author | Fuwn <[email protected]> | 2025-10-01 21:11:16 -0700 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2025-10-01 21:11:16 -0700 |
| commit | eba0d406f1fc414784528fb25805d9a6e3593690 (patch) | |
| tree | 5ecc548b0cccf0c4c86881b01924b51fedbec5bf /packages | |
| parent | feat(interactions): Support GIFs in audit logs (diff) | |
| download | umabotdiscord-eba0d406f1fc414784528fb25805d9a6e3593690.tar.xz umabotdiscord-eba0d406f1fc414784528fb25805d9a6e3593690.zip | |
feat(interactions): Add age-verify audit log
Diffstat (limited to 'packages')
| -rw-r--r-- | packages/interactions/discord/commands/index.ts | 7 | ||||
| -rw-r--r-- | packages/interactions/discord/embeds.ts | 38 | ||||
| -rw-r--r-- | packages/interactions/server.ts | 61 |
3 files changed, 104 insertions, 2 deletions
diff --git a/packages/interactions/discord/commands/index.ts b/packages/interactions/discord/commands/index.ts index c916d85..0825d66 100644 --- a/packages/interactions/discord/commands/index.ts +++ b/packages/interactions/discord/commands/index.ts @@ -185,5 +185,12 @@ export const AGE_VERIFY_COMMAND: DiscordCommand = { }, ], }, + { + type: 3, + name: "reason", + description: + "Reason for verification (how and why you verified the user)", + required: true, + }, ], }; diff --git a/packages/interactions/discord/embeds.ts b/packages/interactions/discord/embeds.ts index 2d2dfe9..38dfc00 100644 --- a/packages/interactions/discord/embeds.ts +++ b/packages/interactions/discord/embeds.ts @@ -214,3 +214,41 @@ export const createNSFWApplicationEmbed = ( }, }; }; + +export const createAgeVerificationLogEmbed = ( + action: string, + targetUser: { username: string; id: string; avatar?: string }, + accessType: string, + reason: string, + moderator: { username: string; id: string; avatar?: string }, + timestamp: number, +): DiscordEmbed => { + return { + title: "🔞 Age Verification Log", + description: `**Action:** ${action}\n**Access Type:** ${accessType}\n**Reason:** ${reason}`, + color: 0x00ff00, + timestamp: new Date(timestamp).toISOString(), + fields: [ + { + name: "Target User", + value: `<@${targetUser.id}>`, + inline: true, + }, + { + name: "Moderator", + value: `<@${moderator.id}>`, + inline: true, + }, + { + name: "Timestamp", + value: `<t:${Math.floor(timestamp / 1000)}:F>`, + inline: true, + }, + ], + thumbnail: targetUser.avatar + ? { + url: `https://cdn.discordapp.com/avatars/${targetUser.id}/${targetUser.avatar}${targetUser.avatar.startsWith("a_") ? ".gif" : ".png"}?size=256`, + } + : undefined, + }; +}; diff --git a/packages/interactions/server.ts b/packages/interactions/server.ts index d120f1a..cc276c9 100644 --- a/packages/interactions/server.ts +++ b/packages/interactions/server.ts @@ -25,6 +25,7 @@ import { createComplaintEmbed, createAppealEmbed, createNSFWApplicationEmbed, + createAgeVerificationLogEmbed, createRoleDistributionEmbed, } from "./discord/embeds.ts"; import { JSONResponse } from "./discord/responses.ts"; @@ -35,6 +36,7 @@ const router = AutoRouter(); const COMPLAINT_CHANNEL_ID = "1415868433714778204"; const APPEAL_CHANNEL_ID = "1420340807931531385"; const NSFW_APPLY_CHANNEL_ID = "1423148301221625926"; +const AGE_VERIFY_LOG_CHANNEL_ID = "1406422619934167106"; const VERIFIED_ROLEPLAY_ROLE_ID = "1418311833303122021"; const ROLE_MANAGER_ROLE_ID = "1410993207608873070"; const ART_MEDIA_ROLE_ID = "1410333831281643630"; @@ -96,6 +98,32 @@ const sendNSFWApplicationToChannel = async ( } }; +const sendAgeVerificationLogToChannel = async ( + environment: Environment, + embed: DiscordEmbed, +): Promise<boolean> => { + const url = `https://discord.com/api/v10/channels/${AGE_VERIFY_LOG_CHANNEL_ID}/messages`; + + try { + const response = await fetch(url, { + method: "POST", + headers: { + "Content-Type": "application/json", + Authorization: `Bot ${environment.DISCORD_TOKEN}`, + }, + body: JSON.stringify({ + embeds: [embed], + }), + }); + + return response.ok; + } catch (error) { + console.error("Error sending age verification log to channel:", error); + + return false; + } +}; + const sendAppealToChannel = async ( environment: Environment, embed: DiscordEmbed, @@ -831,13 +859,14 @@ router.post("/", async (request: Request, environment: Environment) => { const action = interaction.data.options?.[0]?.value as string; const targetUserID = interaction.data.options?.[1]?.value as string; const access = interaction.data.options?.[2]?.value as string; + const reason = interaction.data.options?.[3]?.value as string; - if (!action || !targetUserID || !access) + if (!action || !targetUserID || !access || !reason) return new JSONResponse({ type: InteractionResponseType.CHANNEL_MESSAGE_WITH_SOURCE, data: { content: - "❌ Missing required parameters. Please provide action, user, and access type.", + "❌ Missing required parameters. Please provide action, user, access type, and reason.", flags: 64, }, }); @@ -937,6 +966,34 @@ router.post("/", async (request: Request, environment: Environment) => { const accessTypeName = access === "art_media" ? "Art & Media" : "Roleplay NSFW"; + const moderator = { + username: + interaction.member?.user?.username || + interaction.user?.username || + "Unknown", + id: + interaction.member?.user?.id || interaction.user?.id || "Unknown", + avatar: + interaction.member?.user?.avatar || interaction.user?.avatar, + }; + const logEmbed = createAgeVerificationLogEmbed( + action, + { + username: targetMember.user?.username || "Unknown", + id: targetUserID, + avatar: targetMember.user?.avatar, + }, + accessTypeName, + reason, + moderator, + Date.now(), + ); + + try { + await sendAgeVerificationLogToChannel(environment, logEmbed); + } catch (logError) { + console.error("Failed to log age verification:", logError); + } return new JSONResponse({ type: InteractionResponseType.CHANNEL_MESSAGE_WITH_SOURCE, |