generated from nhcarrigan/template
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 85a982c03e |
+1
-1
@@ -26,7 +26,7 @@
|
||||
"@nhcarrigan/discord-analytics": "0.0.6",
|
||||
"@nhcarrigan/logger": "1.1.1",
|
||||
"@retroachievements/api": "2.6.0",
|
||||
"discord.js": "14.22.0",
|
||||
"discord.js": "14.25.1",
|
||||
"fastify": "5.5.0",
|
||||
"node-schedule": "2.1.1",
|
||||
"octokit": "5.0.3",
|
||||
|
||||
Generated
+34
-32
@@ -10,7 +10,7 @@ importers:
|
||||
dependencies:
|
||||
'@nhcarrigan/discord-analytics':
|
||||
specifier: 0.0.6
|
||||
version: 0.0.6(@nhcarrigan/logger@1.1.1)(discord.js@14.22.0)
|
||||
version: 0.0.6(@nhcarrigan/logger@1.1.1)(discord.js@14.25.1)
|
||||
'@nhcarrigan/logger':
|
||||
specifier: 1.1.1
|
||||
version: 1.1.1
|
||||
@@ -18,8 +18,8 @@ importers:
|
||||
specifier: 2.6.0
|
||||
version: 2.6.0
|
||||
discord.js:
|
||||
specifier: 14.22.0
|
||||
version: 14.22.0
|
||||
specifier: 14.25.1
|
||||
version: 14.25.1
|
||||
fastify:
|
||||
specifier: 5.5.0
|
||||
version: 5.5.0
|
||||
@@ -62,8 +62,8 @@ packages:
|
||||
resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==}
|
||||
engines: {node: '>=6.9.0'}
|
||||
|
||||
'@discordjs/builders@1.11.3':
|
||||
resolution: {integrity: sha512-p3kf5eV49CJiRTfhtutUCeivSyQ/l2JlKodW1ZquRwwvlOWmG9+6jFShX6x8rUiYhnP6wKI96rgN/SXMy5e5aw==}
|
||||
'@discordjs/builders@1.13.1':
|
||||
resolution: {integrity: sha512-cOU0UDHc3lp/5nKByDxkmRiNZBpdp0kx55aarbiAfakfKJHlxv/yFW1zmIqCAmwH5CRlrH9iMFKJMpvW4DPB+w==}
|
||||
engines: {node: '>=16.11.0'}
|
||||
|
||||
'@discordjs/collection@1.5.3':
|
||||
@@ -74,16 +74,16 @@ packages:
|
||||
resolution: {integrity: sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
'@discordjs/formatters@0.6.1':
|
||||
resolution: {integrity: sha512-5cnX+tASiPCqCWtFcFslxBVUaCetB0thvM/JyavhbXInP1HJIEU+Qv/zMrnuwSsX3yWH2lVXNJZeDK3EiP4HHg==}
|
||||
'@discordjs/formatters@0.6.2':
|
||||
resolution: {integrity: sha512-y4UPwWhH6vChKRkGdMB4odasUbHOUwy7KL+OVwF86PvT6QVOwElx+TiI1/6kcmcEe+g5YRXJFiXSXUdabqZOvQ==}
|
||||
engines: {node: '>=16.11.0'}
|
||||
|
||||
'@discordjs/rest@2.6.0':
|
||||
resolution: {integrity: sha512-RDYrhmpB7mTvmCKcpj+pc5k7POKszS4E2O9TYc+U+Y4iaCP+r910QdO43qmpOja8LRr1RJ0b3U+CqVsnPqzf4w==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
'@discordjs/util@1.1.1':
|
||||
resolution: {integrity: sha512-eddz6UnOBEB1oITPinyrB2Pttej49M9FZQY8NxgEvc3tq6ZICZ19m70RsmzRdDHk80O9NoYN/25AqJl8vPVf/g==}
|
||||
'@discordjs/util@1.2.0':
|
||||
resolution: {integrity: sha512-3LKP7F2+atl9vJFhaBjn4nOaSWahZ/yWjOvA4e5pnXkt2qyXRCHLxoBQy81GFtLGCq7K9lPm9R517M1U+/90Qg==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
'@discordjs/ws@1.2.3':
|
||||
@@ -1062,11 +1062,11 @@ packages:
|
||||
resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
discord-api-types@0.38.20:
|
||||
resolution: {integrity: sha512-wJSmFFi8eoFL/jIosUQLoXeCv7YK+l7joKmFCsnkx7HWSFt5xScNQdhvILLxC0oU6J5bK0ppR7GZ1d4NJScSNQ==}
|
||||
discord-api-types@0.38.38:
|
||||
resolution: {integrity: sha512-7qcM5IeZrfb+LXW07HvoI5L+j4PQeMZXEkSm1htHAHh4Y9JSMXBWjy/r7zmUCOj4F7zNjMcm7IMWr131MT2h0Q==}
|
||||
|
||||
discord.js@14.22.0:
|
||||
resolution: {integrity: sha512-IDSeDdWSEA4DoOyspekbetcFKkEonJO09cxR+kqQQlTWd5CTm/3Z48I4Te+EL8uxn52s718FZ0rI2dLxRkTpwg==}
|
||||
discord.js@14.25.1:
|
||||
resolution: {integrity: sha512-2l0gsPOLPs5t6GFZfQZKnL1OJNYFcuC/ETWsW4VtKVD/tg4ICa9x+jb9bkPffkMdRpRpuUaO/fKkHCBeiCKh8g==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
doctrine@2.1.0:
|
||||
@@ -2400,12 +2400,12 @@ snapshots:
|
||||
|
||||
'@babel/helper-validator-identifier@7.27.1': {}
|
||||
|
||||
'@discordjs/builders@1.11.3':
|
||||
'@discordjs/builders@1.13.1':
|
||||
dependencies:
|
||||
'@discordjs/formatters': 0.6.1
|
||||
'@discordjs/util': 1.1.1
|
||||
'@discordjs/formatters': 0.6.2
|
||||
'@discordjs/util': 1.2.0
|
||||
'@sapphire/shapeshift': 4.0.0
|
||||
discord-api-types: 0.38.20
|
||||
discord-api-types: 0.38.38
|
||||
fast-deep-equal: 3.1.3
|
||||
ts-mixer: 6.0.4
|
||||
tslib: 2.8.1
|
||||
@@ -2414,33 +2414,35 @@ snapshots:
|
||||
|
||||
'@discordjs/collection@2.1.1': {}
|
||||
|
||||
'@discordjs/formatters@0.6.1':
|
||||
'@discordjs/formatters@0.6.2':
|
||||
dependencies:
|
||||
discord-api-types: 0.38.20
|
||||
discord-api-types: 0.38.38
|
||||
|
||||
'@discordjs/rest@2.6.0':
|
||||
dependencies:
|
||||
'@discordjs/collection': 2.1.1
|
||||
'@discordjs/util': 1.1.1
|
||||
'@discordjs/util': 1.2.0
|
||||
'@sapphire/async-queue': 1.5.5
|
||||
'@sapphire/snowflake': 3.5.3
|
||||
'@vladfrangu/async_event_emitter': 2.4.6
|
||||
discord-api-types: 0.38.20
|
||||
discord-api-types: 0.38.38
|
||||
magic-bytes.js: 1.12.1
|
||||
tslib: 2.8.1
|
||||
undici: 6.21.3
|
||||
|
||||
'@discordjs/util@1.1.1': {}
|
||||
'@discordjs/util@1.2.0':
|
||||
dependencies:
|
||||
discord-api-types: 0.38.38
|
||||
|
||||
'@discordjs/ws@1.2.3':
|
||||
dependencies:
|
||||
'@discordjs/collection': 2.1.1
|
||||
'@discordjs/rest': 2.6.0
|
||||
'@discordjs/util': 1.1.1
|
||||
'@discordjs/util': 1.2.0
|
||||
'@sapphire/async-queue': 1.5.5
|
||||
'@types/ws': 8.18.1
|
||||
'@vladfrangu/async_event_emitter': 2.4.6
|
||||
discord-api-types: 0.38.20
|
||||
discord-api-types: 0.38.38
|
||||
tslib: 2.8.1
|
||||
ws: 8.18.3
|
||||
transitivePeerDependencies:
|
||||
@@ -2639,10 +2641,10 @@ snapshots:
|
||||
|
||||
'@jridgewell/sourcemap-codec@1.5.5': {}
|
||||
|
||||
'@nhcarrigan/discord-analytics@0.0.6(@nhcarrigan/logger@1.1.1)(discord.js@14.22.0)':
|
||||
'@nhcarrigan/discord-analytics@0.0.6(@nhcarrigan/logger@1.1.1)(discord.js@14.25.1)':
|
||||
dependencies:
|
||||
'@nhcarrigan/logger': 1.1.1
|
||||
discord.js: 14.22.0
|
||||
discord.js: 14.25.1
|
||||
node-schedule: 2.1.1
|
||||
|
||||
'@nhcarrigan/eslint-config@5.2.0(@typescript-eslint/utils@8.40.0(eslint@9.33.0)(typescript@5.9.2))(eslint@9.33.0)(playwright@1.54.2)(react@19.1.1)(typescript@5.9.2)(vitest@3.2.4(@types/node@24.3.0))':
|
||||
@@ -3443,18 +3445,18 @@ snapshots:
|
||||
dependencies:
|
||||
path-type: 4.0.0
|
||||
|
||||
discord-api-types@0.38.20: {}
|
||||
discord-api-types@0.38.38: {}
|
||||
|
||||
discord.js@14.22.0:
|
||||
discord.js@14.25.1:
|
||||
dependencies:
|
||||
'@discordjs/builders': 1.11.3
|
||||
'@discordjs/builders': 1.13.1
|
||||
'@discordjs/collection': 1.5.3
|
||||
'@discordjs/formatters': 0.6.1
|
||||
'@discordjs/formatters': 0.6.2
|
||||
'@discordjs/rest': 2.6.0
|
||||
'@discordjs/util': 1.1.1
|
||||
'@discordjs/util': 1.2.0
|
||||
'@discordjs/ws': 1.2.3
|
||||
'@sapphire/snowflake': 3.5.3
|
||||
discord-api-types: 0.38.20
|
||||
discord-api-types: 0.38.38
|
||||
fast-deep-equal: 3.1.3
|
||||
lodash.snakecase: 4.1.1
|
||||
magic-bytes.js: 1.12.1
|
||||
|
||||
@@ -1,95 +0,0 @@
|
||||
/**
|
||||
* @copyright NHCarrigan
|
||||
* @license Naomi's Public License
|
||||
* @author Teklu Abayneh
|
||||
*/
|
||||
|
||||
import {
|
||||
ContextMenuCommandBuilder,
|
||||
ApplicationCommandType,
|
||||
type MessageContextMenuCommandInteraction,
|
||||
DiscordAPIError,
|
||||
ButtonBuilder,
|
||||
EmbedBuilder,
|
||||
ActionRowBuilder,
|
||||
ButtonStyle,
|
||||
type Message,
|
||||
} from "discord.js";
|
||||
import { ids } from "../config/ids.js";
|
||||
|
||||
const buildForwardedEmbed = (message: Message): EmbedBuilder => {
|
||||
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}\n\n`,
|
||||
);
|
||||
return forwardedEmbed;
|
||||
};
|
||||
const buildViewButtonFunction = (message: Message): ButtonBuilder => {
|
||||
const viewButton = new ButtonBuilder().
|
||||
setLabel("View Message").
|
||||
setURL(message.url).
|
||||
setStyle(ButtonStyle.Link);
|
||||
return viewButton;
|
||||
};
|
||||
|
||||
const data = new ContextMenuCommandBuilder().setName("Forward to Naomi").
|
||||
setType(ApplicationCommandType.Message);
|
||||
|
||||
const execute = async(interaction: MessageContextMenuCommandInteraction):
|
||||
Promise<void> => {
|
||||
await interaction.deferReply({ ephemeral: true });
|
||||
|
||||
if (interaction.user.id !== ids.users.naomi) {
|
||||
await interaction.editReply("❌ Only Naomi can use this command.");
|
||||
return;
|
||||
}
|
||||
|
||||
const message = interaction.targetMessage;
|
||||
if (message.author.id === ids.users.naomi) {
|
||||
await interaction.editReply(
|
||||
"No need to forward your own message to yourself 😄",
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
const naomi = await interaction.client.users.fetch(ids.users.naomi);
|
||||
const forwardedEmbed = buildForwardedEmbed(message);
|
||||
const viewButton = buildViewButtonFunction(message);
|
||||
|
||||
const row = new ActionRowBuilder<ButtonBuilder>().addComponents(
|
||||
viewButton,
|
||||
);
|
||||
await naomi.send({
|
||||
components: [ row ],
|
||||
embeds: [ forwardedEmbed ],
|
||||
files: message.attachments.map((att) => {
|
||||
return att.url;
|
||||
}),
|
||||
});
|
||||
|
||||
await interaction.editReply({
|
||||
content: "✅ Forwarded to your DMs!",
|
||||
});
|
||||
} catch (error) {
|
||||
let replyText = "❌ Failed to forward message.";
|
||||
if (error instanceof DiscordAPIError && error.code === 50_007) {
|
||||
replyText = `${replyText} (Naomi's DMs might be closed)`;
|
||||
}
|
||||
await interaction.editReply(replyText);
|
||||
}
|
||||
};
|
||||
|
||||
export const forwardOwnerDM = {
|
||||
data,
|
||||
execute,
|
||||
};
|
||||
@@ -70,6 +70,5 @@ export const ids = {
|
||||
amari: "1406431359345496255",
|
||||
naomi: "465650873650118659",
|
||||
nhcarrigan: "1382837581649150104",
|
||||
teklu: "1381735115163570198",
|
||||
},
|
||||
};
|
||||
|
||||
+10
-31
@@ -14,7 +14,6 @@ import {
|
||||
} from "discord.js";
|
||||
import { scheduleJob } from "node-schedule";
|
||||
import { App } from "octokit";
|
||||
import { forwardOwnerDM } from "./commands/forwardToOwner.js";
|
||||
import { ids } from "./config/ids.js";
|
||||
import { handleMessageCreate } from "./events/handleMessageCreate.js";
|
||||
import { cacheData } from "./modules/cacheData.js";
|
||||
@@ -42,7 +41,6 @@ const githubApp = new App({
|
||||
appId: process.env.GH_CLIENT_ID,
|
||||
privateKey: process.env.GH_PRIVATE_KEY.replaceAll("\\n", "\n"),
|
||||
});
|
||||
|
||||
const octokit = await githubApp.getInstallationOctokit(83_119_105);
|
||||
const { data } = await octokit.rest.apps.getAuthenticated();
|
||||
await logger.log(
|
||||
@@ -89,18 +87,12 @@ amari.discord.once(Events.ClientReady, () => {
|
||||
scheduleJob("post progress reminders", "0 9 * * 1-5", async() => {
|
||||
await postProgressReminders(amari);
|
||||
});
|
||||
setInterval(
|
||||
() => {
|
||||
amari.recentlyActiveChannels = new Set<string>();
|
||||
},
|
||||
10 * 60 * 1000,
|
||||
);
|
||||
setInterval(
|
||||
() => {
|
||||
void checkRetroAchievements(amari);
|
||||
},
|
||||
10 * 60 * 1000,
|
||||
);
|
||||
setInterval(() => {
|
||||
amari.recentlyActiveChannels = new Set<string>();
|
||||
}, 10 * 60 * 1000);
|
||||
setInterval(() => {
|
||||
void checkRetroAchievements(amari);
|
||||
}, 10 * 60 * 1000);
|
||||
});
|
||||
|
||||
amari.discord.on(Events.MessageCreate, (message) => {
|
||||
@@ -113,32 +105,19 @@ amari.discord.on(Events.MessageCreate, (message) => {
|
||||
|
||||
amari.discord.on(Events.InteractionCreate, (interaction) => {
|
||||
void analytics.logGatewayEvent(Events.InteractionCreate, { ...interaction });
|
||||
|
||||
if (
|
||||
interaction.isMessageContextMenuCommand()
|
||||
&& interaction.commandName === "Forward to Naomi"
|
||||
) {
|
||||
void forwardOwnerDM.execute(interaction);
|
||||
return;
|
||||
}
|
||||
|
||||
if (interaction.isButton() && interaction.customId === "resolve") {
|
||||
if (interaction.user.id !== ids.users.naomi) {
|
||||
void interaction.reply({
|
||||
return void interaction.reply({
|
||||
content: "Who are you????",
|
||||
flags: [ MessageFlags.Ephemeral ],
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
void interaction.message.delete();
|
||||
return;
|
||||
return void interaction.message.delete();
|
||||
}
|
||||
if (interaction.isAutocomplete()) {
|
||||
void interaction;
|
||||
return;
|
||||
return void interaction;
|
||||
}
|
||||
void interaction.reply({
|
||||
return void interaction.reply({
|
||||
content: "What?",
|
||||
flags: [ MessageFlags.Ephemeral ],
|
||||
});
|
||||
|
||||
@@ -1,32 +0,0 @@
|
||||
/**
|
||||
* @copyright NHCarrigan
|
||||
* @license Naomi's Public License
|
||||
* @author Teklu Abayneh
|
||||
*/
|
||||
|
||||
import { REST, Routes } from "discord.js";
|
||||
import { forwardOwnerDM } from "../commands/forwardToOwner.js";
|
||||
import { logger } from "../utils/logger.js";
|
||||
|
||||
const commands = [ forwardOwnerDM.data.toJSON() ];
|
||||
const token = process.env.BOT_TOKEN;
|
||||
const clientId = process.env.GH_CLIENT_ID;
|
||||
|
||||
if (token === undefined) {
|
||||
throw new Error("BOT_TOKEN is missing from environment variables!");
|
||||
}
|
||||
if (clientId === undefined) {
|
||||
throw new Error("CLIENT_ID is missing from environment variables!");
|
||||
}
|
||||
|
||||
const rest = new REST({ version: "10" }).setToken(token);
|
||||
const requestCommand = async(): Promise<void> => {
|
||||
try {
|
||||
await rest.put(Routes.applicationCommands(clientId), { body: commands });
|
||||
} catch (error) {
|
||||
if (error instanceof Error) {
|
||||
await logger.error("operation", error);
|
||||
}
|
||||
}
|
||||
};
|
||||
void requestCommand();
|
||||
Reference in New Issue
Block a user