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) ); } 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': 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] }); } }