diff --git a/discord/commands/Whois.ts b/discord/commands/Whois.ts index 33d1148..fdf559e 100644 --- a/discord/commands/Whois.ts +++ b/discord/commands/Whois.ts @@ -1,103 +1,139 @@ -import DiscordInteractionCommand from "../../util/DiscordInteractionCommand"; -import { MemberModel } from "../../database/Member"; -import Partner, { PartnerCommissionType, PartnerDepartment, PartnerModel, PartnerRoleType } from "../../database/Partner"; -import { ChatInputCommandInteraction, EmbedBuilder, GuildMember } from "discord.js"; -import MemberUtil from "../../util/MemberUtil"; -import EmojiConfig from "../../util/EmojiConfig" +import DiscordInteractionCommand from '../../util/DiscordInteractionCommand'; +import { MemberModel } from '../../database/Member'; +import Partner, { + PartnerCommissionType, + PartnerDepartment, + PartnerModel, + PartnerRoleType, +} from '../../database/Partner'; +import { + ChatInputCommandInteraction, + EmbedBuilder, + GuildMember, +} from 'discord.js'; +import MemberUtil from '../../util/MemberUtil'; +import EmojiConfig from '../../util/EmojiConfig'; export default class Whois extends DiscordInteractionCommand { - constructor() { - super("whois", "Retrieves information about a user."); - this.builder.addUserOption(option => option.setName("member").setDescription("The member to get information about.").setRequired(true)); - } + constructor() { + super('whois', 'Retrieves information about a user.'); + this.builder.addUserOption((option) => + option + .setName('member') + .setDescription('The member to get information about.') + .setRequired(true) + ); + } - public async execute(interaction: ChatInputCommandInteraction) { - // defer our reply and perform database/external API operations/lookups - await interaction.deferReply({ ephemeral: false }); - const target = interaction.options.getUser("member", true); - const guild = interaction.guild || interaction.client.guilds.cache.get(this.GUILD_ID); - const guildMember = await guild?.members.fetch(target.id); - const databaseMember = await MemberModel.findOne({ discordID: target.id }); - const partner = await PartnerModel.findOne({ discordID: target.id }); - // return an error if target was not located - if (!guildMember) return interaction.editReply({ content: `Member target ${target.id} was not located.`}); - // build our embed - const embed = new EmbedBuilder(); - // if the role type is managerial, add a [k] to the end of the name - // if the partner exists, set the iconURL to the organizational logo - const formattedName = MemberUtil.formatName(guildMember, partner); - embed.setAuthor({ name: formattedName.text, iconURL: formattedName.iconURL }); - // set the thumbnail to the user's avatar - embed.setThumbnail(guildMember.user.displayAvatarURL()); - // initialize the description string - let embedDescription = ''; - if (partner) { - // set the title to the partner's title if applicable - if (partner.title) embedDescription += `## __${EmojiConfig.LOC} ${partner.title}__\n`; - embedDescription += "### Partner Information\n"; - if (partner.emailAddress) embedDescription += `**Email Address**: ${partner.emailAddress}\n`; - switch (partner.department) { - case PartnerDepartment.ENGINEERING: - embedDescription += "**Department**: Dept. of Engineering\n"; - break; - case PartnerDepartment.OPERATIONS: - embedDescription += "**Department**: Dept. of Operations\n"; - break; - case PartnerDepartment.INDEPENDENT_AGENCY: - embedDescription += "**Department**: Independent Agency/Contractor\n"; - break; - } - switch (partner.commissionType) { - case PartnerCommissionType.TENURE: - embedDescription += "**Commission Type**: Tenure\n"; - break; - case PartnerCommissionType.PROVISIONAL: - embedDescription += "**Commission Type**: Provisional\n"; - break; - case PartnerCommissionType.CONTRACTUAL: - embedDescription += "**Commission Type**: Contractual/Independent/Collaborator\n"; - break; - case PartnerCommissionType.ACTING: - embedDescription += "**Commission Type**: Acting\n"; - break; - case PartnerCommissionType.INTERIM: - embedDescription += "**Commission Type**: Interim\n"; - break; - case PartnerCommissionType.TRIAL: - embedDescription += "**Commission Type**: Trial/Intern\n"; - break; - } - if (partner.directReport) { - if (partner.directReport instanceof Partner) { - embedDescription += `**Direct Report**: ${partner.directReport.title}\n`; - } - } + public async execute(interaction: ChatInputCommandInteraction) { + // defer our reply and perform database/external API operations/lookups + await interaction.deferReply({ ephemeral: false }); + const target = interaction.options.getUser('member', true); + const guild = + interaction.guild || interaction.client.guilds.cache.get(this.GUILD_ID); + const guildMember = await guild?.members.fetch(target.id); + const databaseMember = await MemberModel.findOne({ discordID: target.id }); + const partner = await PartnerModel.findOne({ discordID: target.id }); + // return an error if target was not located + if (!guildMember) + return interaction.editReply({ + content: `Member target ${target.id} was not located.`, + }); + // build our embed + const embed = new EmbedBuilder(); + // if the role type is managerial, add a [k] to the end of the name + // if the partner exists, set the iconURL to the organizational logo + const formattedName = MemberUtil.formatName(guildMember, partner); + embed.setAuthor({ + name: formattedName.text, + iconURL: formattedName.iconURL, + }); + // set the thumbnail to the user's avatar + embed.setThumbnail(guildMember.user.displayAvatarURL()); + // initialize the description string + let embedDescription = ''; + if (partner) { + // set the title to the partner's title if applicable + if (partner.title) + embedDescription += `## __${EmojiConfig.LOC} ${partner.title}__\n`; + embedDescription += '### Partner Information\n'; + if (partner.emailAddress) + embedDescription += `**Email Address**: ${partner.emailAddress}\n`; + switch (partner.department) { + case PartnerDepartment.ENGINEERING: + embedDescription += '**Department**: Dept. of Engineering\n'; + break; + case PartnerDepartment.OPERATIONS: + embedDescription += '**Department**: Dept. of Operations\n'; + break; + case PartnerDepartment.INDEPENDENT_AGENCY: + embedDescription += '**Department**: Independent Agency/Contractor\n'; + break; + } + switch (partner.commissionType) { + case PartnerCommissionType.TENURE: + embedDescription += '**Commission Type**: Tenure\n'; + break; + case PartnerCommissionType.PROVISIONAL: + embedDescription += '**Commission Type**: Provisional\n'; + break; + case PartnerCommissionType.CONTRACTUAL: + embedDescription += + '**Commission Type**: Contractual/Independent/Collaborator\n'; + break; + case PartnerCommissionType.ACTING: + embedDescription += '**Commission Type**: Acting\n'; + break; + case PartnerCommissionType.INTERIM: + embedDescription += '**Commission Type**: Interim\n'; + break; + case PartnerCommissionType.TRIAL: + embedDescription += '**Commission Type**: Trial/Intern\n'; + break; + } + if (partner.directReport) { + if (partner.directReport instanceof Partner) { + embedDescription += `**Direct Report**: ${partner.directReport.title}\n`; } - embed.setColor(guildMember.displayColor); - if (embedDescription?.length > 0) embed.setDescription(embedDescription); - // add status to embed - if (guildMember.presence?.status) { // TODO: this currently doesn't work for some reason - switch (guildMember.presence.status) { - case "online": - embed.addFields({ name: "Status", value: "Online", inline: true }); - break; - case "idle": - embed.addFields({ name: "Status", value: "Idle", inline: true }); - break; - case "dnd": - embed.addFields({ name: "Status", value: "Do Not Disturb", inline: true }); - break; - case "offline" || "invisible": - embed.addFields({ name: "Status", value: "Online", inline: true }); - break; - default: - // TODO: decide what placeholder we should use for values that fall "out of range" - embed.addFields({ name: "Status", value: "", inline: true }); - break; - } - } - embed.setFooter({ text: `Discord ID: ${guildMember.id}${databaseMember ? `Internal ID: ${databaseMember?._id}` : ''}` }); - - return await interaction.editReply({ embeds: [embed] }); + } } + embed.setColor(guildMember.displayColor); + if (embedDescription?.length > 0) embed.setDescription(embedDescription); + // add status to embed + if (guildMember.presence?.status) { + // TODO: this currently doesn't work for some reason + switch (guildMember.presence.status) { + case 'online': + embed.addFields({ name: 'Status', value: 'Online', inline: true }); + break; + case 'idle': + embed.addFields({ name: 'Status', value: 'Idle', inline: true }); + break; + case 'dnd': + embed.addFields({ + name: 'Status', + value: 'Do Not Disturb', + inline: true, + }); + break; + case 'offline': + embed.addFields({ name: 'Status', value: 'offline', inline: true }); + break; + case 'invisible': + embed.addFields({ name: 'Status', value: 'invisible', inline: true }); + break; + default: + // TODO: decide what placeholder we should use for values that fall "out of range" + embed.addFields({ name: 'Status', value: '', inline: true }); + break; + } + } + embed.setFooter({ + text: `Discord ID: ${guildMember.id}${ + databaseMember ? `Internal ID: ${databaseMember?._id}` : '' + }`, + }); + + return await interaction.editReply({ embeds: [embed] }); + } }