all repos — stealth-developers @ 262dd1c52f57211af79ea84b750286b62994ab0a

bot: wire up select menu command
vi did:web:vt3e.cat
Fri, 03 Jul 2026 18:46:34 +0100
commit

262dd1c52f57211af79ea84b750286b62994ab0a

parent

bcf274d3451c1a8d98a6f41022875485cf8040b7

M apps/bot/src/feats/roblox/user.tsapps/bot/src/feats/roblox/user.ts

@@ -17,6 +17,7 @@ import { errorMessage, logger } from "@/lib";

import { useGetData } from "@/middleware"; import { Projects } from "../bugs/shared"; +import { viewTicketMenu } from "../tickets/misc"; import { RobloxUserClient, type UserRestrictionLog } from "./client"; type BannedBy = { displayName: string; username: string; id: string };

@@ -199,7 +200,7 @@ });

if (ticketNumbers.length > 0) { const ticketSelectMenu = new StringSelectMenuBuilder() - .setCustomId("ticket-select:view") + .setCustomId(viewTicketMenu.id()) .setPlaceholder("View relevant ticket") .addOptions( ticketNumbers.map((number) =>
M apps/bot/src/feats/tickets/index.tsapps/bot/src/feats/tickets/index.ts

@@ -1,8 +1,9 @@

import { TicketButtons } from "./buttons"; import ticketCommand from "./commands"; +import { MiscTicketComponents } from "./misc"; import { TicketModals } from "./modals"; import "./timers"; export const ticketCommands = [ticketCommand]; -export const ticketComponents = [...TicketModals, ...TicketButtons]; +export const ticketComponents = [...TicketModals, ...TicketButtons, ...MiscTicketComponents]; export * from "./listeners";
A apps/bot/src/feats/tickets/misc.ts

@@ -0,0 +1,34 @@

+import { getTicketByGuild } from "@stealth-developers/db"; + +import { errorMessage } from "@/lib"; +import { useGetData } from "@/middleware"; + +import { getTicketContainer } from "./actions"; +import { hasAccessToTicket } from "./lib"; + +export const viewTicketMenu = useGetData.selectMenu("s-get-ticket", { + async run(interaction, _, ctx) { + if (!interaction.isStringSelectMenu()) { + return errorMessage(interaction, "This is not a string select menu interaction."); + } else if (!ctx.guild) { + return errorMessage(interaction, "Failed to retrieve guild data."); + } else if (!ctx.actor) { + return errorMessage(interaction, "Failed to fetch your data."); + } + + const ticketId = Number(interaction.values[0]); + const ticket = await getTicketByGuild(ctx.guild.id, ticketId); + if (!ticket) return errorMessage(interaction, "Ticket not found."); + + if (!hasAccessToTicket(ctx.actor, ctx.guild, ticket)) + return errorMessage(interaction, "You do not have access to this ticket."); + + const container = getTicketContainer(ticket, !ctx.actor.moderator); + interaction.reply({ + components: [container], + flags: ["Ephemeral", "IsComponentsV2"], + }); + }, +}); + +export const MiscTicketComponents = [viewTicketMenu];