feat(tickets): inform user if they cannot be DMd
vi v@vt3e.cat
Wed, 25 Mar 2026 23:48:50 +0000
1 files changed,
36 insertions(+),
1 deletions(-)
M
src/interactions/commands/tickets/actions.ts
→
src/interactions/commands/tickets/actions.ts
@@ -1,4 +1,5 @@
import { type Guild, type Ticket, db, tickets } from "@/database"; +import { text } from "@/utils/components"; import { formatMessage } from "@/utils/formatting"; import { loggers } from "@/utils/logging"; import { hasManagerPermissions } from "@/utils/permissions";@@ -23,11 +24,18 @@ type GuildMember,
type ModalSubmitInteraction, PermissionFlagsBits, TextDisplayBuilder, + type User, } from "discord.js"; import { eq, sql } from "drizzle-orm"; import { getTicketContainer } from "./_shared"; const logger = loggers.interactions.child({ name: "ticket/actions" }); + +const canDmUser = (user: User): Promise<boolean> => + user + .send("Hi! I'm just checking if your DMs are open.") + .then(() => true) + .catch(() => false); export async function handleCreate( client: Client,@@ -116,7 +124,7 @@ .setEmoji("🔒"),
); const container = new ContainerBuilder() - .setAccentColor(0xff5a00) + .setAccentColor(0x40a02b) .addTextDisplayComponents( new TextDisplayBuilder().setContent("# Ticket created!"), new TextDisplayBuilder().setContent(formatted),@@ -127,6 +135,33 @@ await channel.send({
components: [container], flags: ["IsComponentsV2"], }); + + const canDm = await canDmUser(interaction.user); + if (!canDm) { + const formatCommand = (name: string) => + `</ticket ${name}:1477532047785332906>`; + const view = formatCommand("view"); + const list = formatCommand("list"); + + const textComponents = [ + text("## I can't DM you!"), + text( + [ + "You won't receive a notification when your ticket is handled.", + `To check the outcome, use ${view} with the ID ${ticketNumber} or see all your tickets with ${list}.`, + ].join(" "), + ), + ]; + + const container = new ContainerBuilder() + .setAccentColor(0xdf8e1d) + .addTextDisplayComponents(textComponents); + + await channel.send({ + components: [container], + flags: ["IsComponentsV2"], + }); + } await interaction.editReply({ content: `:white_check_mark: Ticket created ${channel.toString()}`,