summaryrefslogtreecommitdiff
path: root/packages
diff options
context:
space:
mode:
authorFuwn <[email protected]>2025-10-01 21:11:16 -0700
committerFuwn <[email protected]>2025-10-01 21:11:16 -0700
commiteba0d406f1fc414784528fb25805d9a6e3593690 (patch)
tree5ecc548b0cccf0c4c86881b01924b51fedbec5bf /packages
parentfeat(interactions): Support GIFs in audit logs (diff)
downloadumabotdiscord-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.ts7
-rw-r--r--packages/interactions/discord/embeds.ts38
-rw-r--r--packages/interactions/server.ts61
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,