fix: fix lint erorr
Node.js CI / CI (pull_request) Failing after 23s
Security Scan and Upload / Security & DefectDojo Upload (pull_request) Successful in 50s

This commit is contained in:
2026-02-17 01:13:41 +09:00
parent 0394d03361
commit 0a3c000add
4 changed files with 172 additions and 152 deletions
+46 -28
View File
@@ -1,3 +1,9 @@
/**
* @copyright NHCarrigan
* @license Naomi's Public License
* @author Teklu Abayneh
*/
import { import {
ContextMenuCommandBuilder, ContextMenuCommandBuilder,
ApplicationCommandType, ApplicationCommandType,
@@ -9,13 +15,14 @@ import {
ButtonStyle, ButtonStyle,
} from "discord.js"; } from "discord.js";
import { ids } from "../config/ids.js"; import { ids } from "../config/ids.js";
import { logger } from "../utils/logger.js";
export const forwardOwnerDM = { export const forwardOwnerDM = {
data: new ContextMenuCommandBuilder() data: new ContextMenuCommandBuilder().setName("Forward to Naomi").
.setName("Forward to Naomi") setType(ApplicationCommandType.Message),
.setType(ApplicationCommandType.Message),
async execute(interaction: MessageContextMenuCommandInteraction) { async execute(interaction: MessageContextMenuCommandInteraction):
Promise<void> {
await interaction.deferReply({ ephemeral: true }); await interaction.deferReply({ ephemeral: true });
if (interaction.user.id !== ids.users.naomi) { if (interaction.user.id !== ids.users.naomi) {
@@ -26,47 +33,58 @@ export const forwardOwnerDM = {
const message = interaction.targetMessage; const message = interaction.targetMessage;
if (message.author.id === ids.users.naomi) { if (message.author.id === ids.users.naomi) {
await interaction.editReply("No need to forward your own message to yourself 😄"); await interaction.editReply(
"No need to forward your own message to yourself 😄",
);
return; return;
} }
try { try {
const naomi = await interaction.client.users.fetch(ids.users.naomi); const naomi = await interaction.client.users.fetch(ids.users.naomi);
const forwardedEmbed = new EmbedBuilder().
setColor(0x58_65_F2).
setTitle(`Message from ${String(message.author.tag)}!`).
setDescription(
`${(message.attachments.size > 0
? `**Attachments:** ${String(message.attachments.size)}
file(s)\n\n`
: "\n")
+ (message.embeds.length > 0
? `**Embeds:** ${String(message.embeds.length)}\n\n`
: "")}
\n${message.content !== "" || message.content !== null
? message.content
: "*[No text content]*"}\n\n`,
);
const forwardedEmbed = new EmbedBuilder() const viewButton = new ButtonBuilder().
.setColor(0x5865F2) setLabel("View Message").
.setTitle(`Message from ${message.author.tag}!`) setURL(message.url).
.setDescription( setStyle(ButtonStyle.Link);
(message.attachments.size > 0 ? `**Attachments:** ${message.attachments.size} file(s)\n\n` : "\n") +
(message.embeds.length > 0 ? `**Embeds:** ${message.embeds.length}\n\n` : "") + "\n" +
(message.content || "*[No text content]*") + "\n\n");
const viewButton = new ButtonBuilder() const row = new ActionRowBuilder<ButtonBuilder>().addComponents(
.setLabel("View Message") viewButton,
.setURL(message.url) );
.setStyle(ButtonStyle.Link);
const row = new ActionRowBuilder<ButtonBuilder>()
.addComponents(viewButton);
await naomi.send({ await naomi.send({
embeds: [forwardedEmbed], components: [ row ],
files: message.attachments.map((att) => att.url), embeds: [ forwardedEmbed ],
components: [row], files: message.attachments.map((att) => {
return att.url;
}),
}); });
await interaction.editReply({ await interaction.editReply({
content: "✅ Forwarded to your DMs!", content: "✅ Forwarded to your DMs!",
}); });
} catch (error) { } catch (error) {
console.error("Failed to forward:", error);
let replyText = "❌ Failed to forward message."; let replyText = "❌ Failed to forward message.";
if (error instanceof DiscordAPIError && error.code === 50_007) {
if (error instanceof DiscordAPIError && error.code === 50007) { replyText = `${replyText} (Naomi's DMs might be closed)`;
replyText += " (Naomi's DMs might be closed)";
} }
await interaction.editReply(replyText); await interaction.editReply(replyText);
if (error instanceof Error) {
await logger.error("operation", error);
}
} }
}, },
}; };
+1 -1
View File
@@ -70,6 +70,6 @@ export const ids = {
amari: "1406431359345496255", amari: "1406431359345496255",
naomi: "465650873650118659", naomi: "465650873650118659",
nhcarrigan: "1382837581649150104", nhcarrigan: "1382837581649150104",
teklu:"1381735115163570198", teklu: "1381735115163570198",
}, },
}; };
+23 -21
View File
@@ -59,7 +59,7 @@ const amari: Amari = {
GatewayIntentBits.GuildMembers, GatewayIntentBits.GuildMembers,
GatewayIntentBits.DirectMessages, GatewayIntentBits.DirectMessages,
], ],
partials: [Partials.Channel], partials: [ Partials.Channel ],
}), }),
github: octokit, github: octokit,
lastRssItems: { lastRssItems: {
@@ -78,23 +78,29 @@ amari.discord.once(Events.ClientReady, () => {
); );
void cacheData(amari); void cacheData(amari);
analytics.startCron(); analytics.startCron();
scheduleJob("post news", "0 * * * *", async () => { scheduleJob("post news", "0 * * * *", async() => {
await postFreeCodeCampNews(amari); await postFreeCodeCampNews(amari);
await postHackerNews(amari); await postHackerNews(amari);
}); });
scheduleJob("check guild tags", "0 0 * * *", async () => { scheduleJob("check guild tags", "0 0 * * *", async() => {
await logger.log("debug", "Auditing guild tags."); await logger.log("debug", "Auditing guild tags.");
await cacheData(amari); await cacheData(amari);
}); });
scheduleJob("post progress reminders", "0 9 * * 1-5", async () => { scheduleJob("post progress reminders", "0 9 * * 1-5", async() => {
await postProgressReminders(amari); await postProgressReminders(amari);
}); });
setInterval(() => { setInterval(
() => {
amari.recentlyActiveChannels = new Set<string>(); amari.recentlyActiveChannels = new Set<string>();
}, 10 * 60 * 1000); },
setInterval(() => { 10 * 60 * 1000,
);
setInterval(
() => {
void checkRetroAchievements(amari); void checkRetroAchievements(amari);
}, 10 * 60 * 1000); },
10 * 60 * 1000,
);
}); });
amari.discord.on(Events.MessageCreate, (message) => { amari.discord.on(Events.MessageCreate, (message) => {
@@ -108,16 +114,19 @@ amari.discord.on(Events.MessageCreate, (message) => {
amari.discord.on(Events.InteractionCreate, (interaction) => { amari.discord.on(Events.InteractionCreate, (interaction) => {
void analytics.logGatewayEvent(Events.InteractionCreate, { ...interaction }); void analytics.logGatewayEvent(Events.InteractionCreate, { ...interaction });
if (interaction.isMessageContextMenuCommand() && interaction.commandName === "Forward to Naomi") { if (
interaction.isMessageContextMenuCommand()
&& interaction.commandName === "Forward to Naomi"
) {
void forwardOwnerDM.execute(interaction); void forwardOwnerDM.execute(interaction);
return return;
} }
if (interaction.isButton() && interaction.customId === "resolve") { if (interaction.isButton() && interaction.customId === "resolve") {
if (interaction.user.id !== ids.users.naomi) { if (interaction.user.id !== ids.users.naomi) {
return void interaction.reply({ return void interaction.reply({
content: "Who are you????", content: "Who are you????",
flags: [MessageFlags.Ephemeral], flags: [ MessageFlags.Ephemeral ],
}); });
} }
@@ -128,7 +137,7 @@ amari.discord.on(Events.InteractionCreate, (interaction) => {
} }
return void interaction.reply({ return void interaction.reply({
content: "What?", content: "What?",
flags: [MessageFlags.Ephemeral], flags: [ MessageFlags.Ephemeral ],
}); });
}); });
@@ -139,10 +148,7 @@ amari.discord.on(Events.ThreadCreate, (thread) => {
const { bugReports, communityFeedback, featureRequests, policyIdeation } const { bugReports, communityFeedback, featureRequests, policyIdeation }
= ids.channels; = ids.channels;
if ( if (
![bugReports, ![ bugReports, communityFeedback, featureRequests, policyIdeation ].includes(
communityFeedback,
featureRequests,
policyIdeation].includes(
thread.parent.id, thread.parent.id,
) )
) { ) {
@@ -152,7 +158,7 @@ amari.discord.on(Events.ThreadCreate, (thread) => {
if (tagId === null) { if (tagId === null) {
return; return;
} }
void thread.setAppliedTags([tagId]); void thread.setAppliedTags([ tagId ]);
}); });
amari.discord.on(Events.UserUpdate, (_oldUser, updatedUser) => { amari.discord.on(Events.UserUpdate, (_oldUser, updatedUser) => {
@@ -172,8 +178,4 @@ amari.discord.on(Events.GuildMemberRemove, (member) => {
}); });
await amari.discord.login(process.env.BOT_TOKEN); await amari.discord.login(process.env.BOT_TOKEN);
amari.discord.on(Events.MessageCreate, (message) => {
const channelType = message.channel.type;
console.log(`📩 [${channelType}] ${message.author.tag}: ${message.content}`);
});
instantiateServer(amari); instantiateServer(amari);
@@ -1,10 +1,14 @@
/**
* @copyright NHCarrigan
* @license Naomi's Public License
* @author Teklu Abayneh
*/
import { REST, Routes } from "discord.js"; import { REST, Routes } from "discord.js";
import { forwardOwnerDM } from "../commands/forwardToOwner.js"; import { forwardOwnerDM } from "../commands/forwardToOwner.js";
import { logger } from "../utils/logger.js";
const commands = [ const commands = [ forwardOwnerDM.data.toJSON() ];
forwardOwnerDM.data.toJSON(),
];
const token = process.env.BOT_TOKEN; const token = process.env.BOT_TOKEN;
const clientId = process.env.GH_CLIENT_ID; const clientId = process.env.GH_CLIENT_ID;
@@ -16,17 +20,13 @@ if (clientId === undefined) {
} }
const rest = new REST({ version: "10" }).setToken(token); const rest = new REST({ version: "10" }).setToken(token);
(async() => { const requestCommand = async(): Promise<void> => {
try { try {
console.log("Registering GLOBAL context menu command... wait till appear everywhere."); await rest.put(Routes.applicationCommands(clientId), { body: commands });
await rest.put(
Routes.applicationCommands(clientId),
{ body: commands },
);
console.log("Global registration sent! then check right-click on a message → Apps.");
} catch (error) { } catch (error) {
console.error("Registration failed:", error); if (error instanceof Error) {
await logger.error("operation", error);
} }
})(); }
};
requestCommand();