import { type ChatInputCommandInteraction, type Client, type GuildMember, SlashCommandBuilder, } from "discord.js"; import { roblox } from "@/roblox/client"; import type { RobloxUserId } from "@/roblox/types"; import { hasManagerPermissions } from "@/utils/permissions"; import { processRobloxUserInteraction } from "@/utils/robloxUser"; const commandData = new SlashCommandBuilder() .setName("user") .setDescription("Get information about a Roblox user") .addSubcommand((subcommand) => subcommand .setName("discord") .setDescription("Use Bloxlink to get Roblox info from a Discord user") .addUserOption((option) => option .setName("user") .setDescription("The Discord user to look up") .setRequired(true), ), ) .addSubcommand((subcommand) => subcommand .setName("roblox") .setDescription("Get Roblox info from a user ID or username") .addStringOption((option) => option .setName("input") .setDescription( "The Roblox username to lookup - prefix with id: for IDs", ) .setRequired(true), ), ); async function execute( _client: Client, interaction: ChatInputCommandInteraction, ) { const subcommand = interaction.options.getSubcommand(); const isModerator = await hasManagerPermissions( interaction.member as GuildMember, ); await interaction.deferReply(); try { let id: RobloxUserId; if (subcommand === "discord") { const target = interaction.options.getUser("user", true); const [linkedRes, linkedErr] = await roblox.getLinkedAccount(target.id); if (linkedErr) { const message = linkedErr.error; if (message === "User not found") { await interaction.editReply( "No linked Roblox account found for that user.", ); return; } await interaction.editReply( `There was an error fetching the linked account: ${linkedErr.error}`, ); return; } id = linkedRes.robloxID; } else { const input = interaction.options.getString("input", true); const isId = input.startsWith("id:"); if (isId) { id = input.slice(3); if (!id) { await interaction.editReply("Invalid ID provided."); return; } } else { const [usersRes] = await roblox.getUsersByUsernames([input]); if (!usersRes || !usersRes.data || usersRes.data.length === 0) { await interaction.editReply("User not found"); return; } id = usersRes.data[0].id; } } await processRobloxUserInteraction(interaction, id, isModerator); } catch (err) { console.error(err); await interaction.editReply( "An unexpected error occurred while fetching the user.", ); } } export default { data: commandData, execute, };