diff --git a/discord/commands/Whois.ts b/discord/commands/Whois.ts index 21077e4..6ff1582 100644 --- a/discord/commands/Whois.ts +++ b/discord/commands/Whois.ts @@ -1,26 +1,22 @@ -import DiscordInteractionCommand from '../../util/DiscordInteractionCommand'; -import { MemberModel } from '../../database/Member'; +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'; +} 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.'); + super("whois", "Retrieves information about a user."); this.builder.addUserOption((option) => option - .setName('member') - .setDescription('The member to get information about.') + .setName("member") + .setDescription("The member to get information about.") .setRequired(true) ); } @@ -28,67 +24,58 @@ export default class Whois extends DiscordInteractionCommand { 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 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.`, - }); + 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, - }); + 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 = ''; + 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`; + 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'; + embedDescription += "**Department**: Dept. of Engineering\n"; break; case PartnerDepartment.OPERATIONS: - embedDescription += '**Department**: Dept. of Operations\n'; + embedDescription += "**Department**: Dept. of Operations\n"; break; case PartnerDepartment.INDEPENDENT_AGENCY: - embedDescription += '**Department**: Independent Agency/Contractor\n'; + embedDescription += "**Department**: Independent Agency/Contractor\n"; break; } switch (partner.commissionType) { case PartnerCommissionType.TENURE: - embedDescription += '**Commission Type**: Tenure\n'; + embedDescription += "**Commission Type**: Tenure\n"; break; case PartnerCommissionType.PROVISIONAL: - embedDescription += '**Commission Type**: Provisional\n'; + embedDescription += "**Commission Type**: Provisional\n"; break; case PartnerCommissionType.CONTRACTUAL: - embedDescription += - '**Commission Type**: Contractual/Independent/Collaborator\n'; + embedDescription += "**Commission Type**: Contractual/Independent/Collaborator\n"; break; case PartnerCommissionType.ACTING: - embedDescription += '**Commission Type**: Acting\n'; + embedDescription += "**Commission Type**: Acting\n"; break; case PartnerCommissionType.INTERIM: - embedDescription += '**Commission Type**: Interim\n'; + embedDescription += "**Commission Type**: Interim\n"; break; case PartnerCommissionType.TRIAL: - embedDescription += '**Commission Type**: Trial/Intern\n'; + embedDescription += "**Commission Type**: Trial/Intern\n"; break; } if (partner.directReport) { @@ -103,35 +90,26 @@ export default class Whois extends DiscordInteractionCommand { 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 }); + case "online": + embed.addFields({ name: "Status", value: "Online", inline: true }); break; - case 'idle': - embed.addFields({ name: 'Status', value: 'Idle', inline: true }); + case "idle": + embed.addFields({ name: "Status", value: "Idle", inline: true }); break; - case 'dnd': - embed.addFields({ - name: 'Status', - value: 'Do Not Disturb', - inline: true, - }); + 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 }); + 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 }); + embed.addFields({ name: "Status", value: "", inline: true }); break; } } embed.setFooter({ - text: `Discord ID: ${guildMember.id}${ - databaseMember ? `Internal ID: ${databaseMember?._id}` : '' - }`, + text: `Discord ID: ${guildMember.id}${databaseMember ? `Internal ID: ${databaseMember?._id}` : ""}`, }); return await interaction.editReply({ embeds: [embed] }); diff --git a/package.json b/package.json index 82c930b..6b17fce 100644 --- a/package.json +++ b/package.json @@ -1,11 +1,20 @@ { - "scripts": { - "start": "npx tsc && node dist/index.js" - }, + "license": "AGPL-3.0-or-later", "devDependencies": { + "@eslint/js": "^9.13.0", "@types/uuid": "^9.0.8", + "@typescript-eslint/eslint-plugin": "^8.11.0", + "@typescript-eslint/parser": "^8.11.0", + "eslint": "^9.13.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-prettier": "^5.2.1", + "globals": "^15.11.0", + "husky": "^9.1.6", + "lint-staged": "^15.2.10", + "prettier": "^3.3.3", "ts-node": "^10.9.2", - "typescript": "^5.4.2" + "typescript": "^5.4.2", + "typescript-eslint": "^8.11.0" }, "dependencies": { "@typegoose/typegoose": "^12.2.0", @@ -14,5 +23,21 @@ "stripe": "^14.21.0", "typeorm": "^0.3.20", "uuid": "^9.0.1" + }, + "scripts": { + "prepare": "husky", + "lint": "eslint . --ext .js,.jsx,.ts,.tsx", + "lint:fix": "eslint . --ext .js,.jsx,.ts,.tsx --fix", + "format": "prettier --write .", + "test": "" + }, + "lint-staged": { + "*.{js,jsx,ts,tsx}": [ + "eslint --fix", + "prettier --write" + ], + "*.{json,css,scss,md}": [ + "prettier --write" + ] } } \ No newline at end of file