fix: replace deprecated ephemeral flag and add error handling across modules

- Replace `ephemeral: true` with `flags: [ MessageFlags.Ephemeral ]` in all command files
- Add try/catch with logger.error to logMenteeJoin, checkAchievements, processMentorshipRole
- Extract handleIssueOpened and handlePrOpened helpers in processGitHubEvent to reduce complexity
- Add logger.error calls in all newly introduced catch blocks
This commit is contained in:
2026-03-03 12:04:20 -08:00
parent 5beebeff44
commit 3f89b7eb4f
8 changed files with 149 additions and 95 deletions
+1 -1
View File
@@ -95,7 +95,7 @@ export const createIssue = async(
const title = interaction.options.getString("title", true);
const description = interaction.options.getString("description") ?? "";
await interaction.deferReply({ ephemeral: true });
await interaction.deferReply({ flags: [ MessageFlags.Ephemeral ] });
try {
const augmentedBody = await generateIssueBody(description, title);
+1 -1
View File
@@ -98,7 +98,7 @@ export const createTask = async(
const description = interaction.options.getString("description") ?? "";
const priority = interaction.options.getInteger("priority") ?? 3;
await interaction.deferReply({ ephemeral: true });
await interaction.deferReply({ flags: [ MessageFlags.Ephemeral ] });
try {
const augmentedDesc = await generateTaskDescription(description, title);
+1 -1
View File
@@ -20,7 +20,7 @@ import { logger } from "../utils/logger.js";
const forwardToOwner = async(
interaction: MessageContextMenuCommandInteraction,
): Promise<void> => {
await interaction.deferReply({ ephemeral: true });
await interaction.deferReply({ flags: [ MessageFlags.Ephemeral ] });
if (interaction.user.id !== ids.users.naomi) {
await interaction.editReply("❌ Only Naomi can use this command.");
+1 -1
View File
@@ -67,7 +67,7 @@ export const onboardMentee = async(
const githubUsername = interaction.options.getString("github_username", true);
const menteeUser = interaction.options.getUser("mentee", true);
await interaction.deferReply({ ephemeral: true });
await interaction.deferReply({ flags: [ MessageFlags.Ephemeral ] });
try {
const repoUrl = await setupMenteeRepository(amari, githubUsername);
+7
View File
@@ -23,6 +23,7 @@ import {
type MessageActionRowComponentBuilder,
} from "discord.js";
import { ids } from "../config/ids.js";
import { logger } from "../utils/logger.js";
import type { Amari } from "../interfaces/amari.js";
const username = "naomilgbt";
@@ -91,6 +92,7 @@ export const checkRetroAchievements = async(
return;
}
try {
const auth = buildAuthorization({ username, webApiKey });
const recentAchievements = await getUserRecentAchievements(auth, {
@@ -115,4 +117,9 @@ export const checkRetroAchievements = async(
flags: [ MessageFlags.IsComponentsV2 ],
});
}));
} catch (error) {
if (error instanceof Error) {
await logger.error("checkRetroAchievements module", error);
}
}
};
+6
View File
@@ -20,6 +20,7 @@ export const logMenteeJoin = async(
amari: Amari,
member: GuildMember,
): Promise<void> => {
try {
const request = await fetch(`https://forms.nhcarrigan.com/api/database/rows/table/756/?user_field_names=true&search=${member.id}`, { headers: {
authorization: `Token ${process.env.BASEROW_TOKEN ?? "huh"}`,
} });
@@ -41,4 +42,9 @@ export const logMenteeJoin = async(
return;
}
await logger.metric("processed_mentee_join", 1, { user: member.id });
} catch (error) {
if (error instanceof Error) {
await logger.error("logMenteeJoin module", error);
}
}
};
+68 -33
View File
@@ -21,13 +21,78 @@ const isPull = (body: GithubPayload): body is PullRequestCreated => {
return "pull_request" in body;
};
/**
* Handles a newly opened GitHub issue by auto-assigning Naomi.
* @param amari - Amari's instance.
* @param body - The parsed issue webhook payload.
*/
const handleIssueOpened = async(
amari: Amari,
body: IssueCreated,
): Promise<void> => {
await logger.log("info", "Processing new issue");
const { issue, repository } = body;
const { number, user } = issue;
const { owner, name } = repository;
try {
await amari.github.rest.issues.addAssignees({
assignees: [ "naomi-lgbt" ],
// eslint-disable-next-line @typescript-eslint/naming-convention -- Github SDK requirement.
issue_number: number,
owner: owner.login,
repo: name,
});
await logger.metric("processed_github_event", 1, {
action: "opened",
event: "issue",
user: user.login,
});
} catch (error) {
if (error instanceof Error) {
await logger.error("processGitHubEvent module", error);
}
}
};
/**
* Handles a newly opened GitHub pull request by requesting Naomi's review.
* @param amari - Amari's instance.
* @param body - The parsed pull request webhook payload.
*/
const handlePrOpened = async(
amari: Amari,
body: PullRequestCreated,
): Promise<void> => {
const { pull_request: pr, repository } = body;
const { number, user } = pr;
await logger.log("info", "Processing new PR");
const { owner, name } = repository;
try {
await amari.github.rest.pulls.requestReviewers({
owner: owner.login,
// eslint-disable-next-line @typescript-eslint/naming-convention -- Github SDK requirement.
pull_number: number,
repo: name,
reviewers: [ "naomi-lgbt" ],
});
await logger.metric("processed_github_event", 1, {
action: "opened",
event: "pull_request",
user: user.login,
});
} catch (error) {
if (error instanceof Error) {
await logger.error("processGitHubEvent module", error);
}
}
};
/**
* Handles a payload from a GitHub webhook.
* @param amari - Amari's instance.
* @param request - The Fastify request payload.
* @param response - The Fastify reply class.
*/
// eslint-disable-next-line max-statements, max-lines-per-function -- STFU.
export const processGithubEvent = async(
amari: Amari,
request: FastifyRequest<{
@@ -58,40 +123,10 @@ export const processGithubEvent = async(
const { action } = request.body;
await response.status(200).send({ message: "Payload received!" });
if (action === "opened" && event === "issues" && isIssue(request.body)) {
await logger.log("info", "Processing new issue");
const { issue, repository } = request.body;
const { number, user } = issue;
const { owner, name } = repository;
await amari.github.rest.issues.addAssignees({
assignees: [ "naomi-lgbt" ],
// eslint-disable-next-line @typescript-eslint/naming-convention -- Github SDK requirement.
issue_number: number,
owner: owner.login,
repo: name,
});
await logger.metric("processed_github_event", 1, {
action: "opened",
event: "issue",
user: user.login,
});
await handleIssueOpened(amari, request.body);
return;
}
if (action === "opened" && event === "pull_request" && isPull(request.body)) {
const { pull_request: pr, repository } = request.body;
const { number, user } = pr;
await logger.log("info", "Processing new PR");
await logger.metric("processed_github_event", 1, {
action: "opened",
event: "pull_request",
user: user.login,
});
const { owner, name } = repository;
await amari.github.rest.pulls.requestReviewers({
owner: owner.login,
// eslint-disable-next-line @typescript-eslint/naming-convention -- Github SDK requirement.
pull_number: number,
repo: name,
reviewers: [ "naomi-lgbt" ],
});
await handlePrOpened(amari, request.body);
}
};
+6
View File
@@ -34,6 +34,7 @@ export const processMentorshipRole = async(
return;
}
try {
const channel
= amari.discord.channels.cache.get(ids.channels.menteeChat)
?? await amari.discord.channels.fetch(ids.channels.menteeChat);
@@ -61,4 +62,9 @@ Then read our [mentorship wiki](<https://docs.nhcarrigan.com/mentorship/00-faq/>
await logger.metric("processed_mentorship_role", 1, {
user: updatedMember.id,
});
} catch (error) {
if (error instanceof Error) {
await logger.error("processMentorshipRole module", error);
}
}
};