From d7db534b65af7cea2f77b6c2744dc9058ea8d1a4 Mon Sep 17 00:00:00 2001 From: Harsh Patel Date: Tue, 9 Apr 2024 18:18:22 +0530 Subject: [PATCH 1/7] refactor: split events to their respective files --- src/events/handleButton.ts | 168 --------- src/events/handleDeleteButton.ts | 64 ++++ src/events/handleEditButton.ts | 63 ++++ src/events/handleModal.ts | 327 ++++++++---------- src/events/handleTemplates.ts | 39 --- src/events/handleTemplates/handleTAnnounce.ts | 93 +++++ src/events/handleTemplates/handleTCreate.ts | 53 +++ src/events/handleTemplates/handleTDelete.ts | 21 ++ src/events/handleTemplates/handleTEcho.ts | 53 +++ src/events/handleTemplates/handleTList.ts | 26 ++ src/events/interactionCreate.ts | 4 +- src/utils/misc.ts | 17 + 12 files changed, 529 insertions(+), 399 deletions(-) delete mode 100644 src/events/handleButton.ts create mode 100644 src/events/handleDeleteButton.ts create mode 100644 src/events/handleEditButton.ts delete mode 100644 src/events/handleTemplates.ts create mode 100644 src/events/handleTemplates/handleTAnnounce.ts create mode 100644 src/events/handleTemplates/handleTCreate.ts create mode 100644 src/events/handleTemplates/handleTDelete.ts create mode 100644 src/events/handleTemplates/handleTEcho.ts create mode 100644 src/events/handleTemplates/handleTList.ts create mode 100644 src/utils/misc.ts diff --git a/src/events/handleButton.ts b/src/events/handleButton.ts deleted file mode 100644 index 8bdd4b6..0000000 --- a/src/events/handleButton.ts +++ /dev/null @@ -1,168 +0,0 @@ -import { - Events, - Interaction, - EmbedBuilder, - ColorResolvable, - ChannelType, - TextInputBuilder, - TextInputStyle, - ActionRowBuilder, - ModalBuilder, - PermissionFlagsBits, - Collection, - Colors, -} from "discord.js"; -import db from "../utils/database"; -import { ObjectId } from "mongodb"; -import { COLOR, FOOTER_VALUE } from "../config/constant"; - -export const msgCollection: Collection = new Collection(); - -export default { - name: Events.InteractionCreate, - once: false, - - async execute(interaction: Interaction) { - if (interaction.isButton()) { - if (!interaction.guild) return; - if (!interaction.memberPermissions?.has(PermissionFlagsBits.ManageMessages)) { - await interaction.reply({ content: "You don't have permission to run this command", ephemeral: true }); - return; - } - const [button, templateId, channelId, messageId, action] = interaction.customId.split("-"); - if (button === "announce" || button === "echo") { - if (!templateId || !channelId) { - await interaction.reply({ content: "Invalid ChannelId", ephemeral: true }); - return; - } - const channel = interaction.guild.channels.cache.get(channelId); - if (!channel) { - await interaction.reply({ content: "Target Channel Not Found", ephemeral: true }); - return; - } - - if (channel.type !== ChannelType.GuildText && channel.type !== ChannelType.GuildAnnouncement) { - await interaction.reply({ content: "Invalid Channel Provided. Please Provide a text channel" }); - return; - } - const template = await (await db()) - .collection("templates") - .findOne({ _id: new ObjectId(templateId), isDeleted: false }); - if (!template) { - return; - } - const title = template.title; - const description = template.description; - const images = template.images; - - if (button === "announce") { - const embeds: EmbedBuilder[] = []; - const embed = new EmbedBuilder() - .setTitle(title) - .setDescription(description) - .setColor(COLOR.WHITE as ColorResolvable) - .setTimestamp() - .setFooter({ text: FOOTER_VALUE }); - if (!images) { - await channel.send({ content: "📢 Announcement - <@&1221428016266219714>", embeds: [embed] }); - await interaction.reply({ content: `Embeds sent to <#${channel.id}>` }); - return; - } - if (images.length > 0) { - const firstImage = images.shift(); - - if (firstImage) { - embed.setImage(firstImage); - } - - embeds.push(embed); - - images.forEach((url: string) => { - const newEmbed = new EmbedBuilder().setImage(url).setColor(Colors.White); - embeds.push(newEmbed); - }); - } else { - await channel.send({ content: "📢 Announcement - <@&1221428016266219714>", embeds: [embed] }); - await interaction.reply({ content: `Embeds sent to <#${channel.id}>` }); - return; - } - await channel.send({ content: "📢 Announcement - <@&1221428016266219714>", embeds: embeds }); - await interaction.reply({ content: `Embeds sent to <#${channel.id}>` }); - } else if (button === "echo") { - await channel.send({ content: `📢 Announcement - <@&1221428016266219714>\n# ${title}\n${description}` }); - await interaction.reply({ content: `Message sent to <#${channel.id}>` }); - } - } else if (button === "edit") { - const Title = new TextInputBuilder() - .setCustomId("title") - .setLabel("Provide us with the Title") - .setStyle(TextInputStyle.Short) - .setMaxLength(50) - .setRequired(false); - - const Description = new TextInputBuilder() - .setCustomId("description") - .setLabel("Provide us with some Description") - .setStyle(TextInputStyle.Paragraph) - .setMaxLength(1900) - .setRequired(false); - - const Image = new TextInputBuilder() - .setCustomId("image") - .setLabel("Provide us with the Image") - .setStyle(TextInputStyle.Paragraph) - .setMinLength(10) - .setMaxLength(4000) - .setRequired(false); - - const modal = new ModalBuilder() - .setCustomId(`edit-${channelId}--${messageId}-${action}`) - .setTitle("Announcements"); - const actionRows = [ - new ActionRowBuilder().addComponents(Title), - new ActionRowBuilder().addComponents(Description), - new ActionRowBuilder().addComponents(Image), - ]; - modal.addComponents(...actionRows.slice(0, action === "announce" ? 3 : 2)); - await interaction.showModal(modal); - } else if (button === "delete") { - await interaction.deferReply({ ephemeral: true }); - if (!messageId || !channelId) { - await interaction.editReply({ content: "Invalid data received" }); - return; - } - const tMsgInfo = msgCollection.get(`${channelId}-${messageId}`); - - const channel = interaction.guild.channels.cache.get(channelId); - if (!channel) return; - if (channel.type !== ChannelType.GuildText && channel.type !== ChannelType.GuildAnnouncement) { - return; - } - - const message = await channel.messages.fetch(messageId); - if (!message) { - await interaction.editReply({ content: "Message not found" }); - } else { - await message.delete(); - await interaction.editReply({ content: "Deleted Successfully" }); - } - - if (!tMsgInfo) return; - const [tMessageId, tChannelId] = tMsgInfo.split("-"); - if (!tMessageId || !tChannelId) return; - - const tchannel = interaction.guild.channels.cache.get(tChannelId); - if (!tchannel) return; - - if (tchannel.type !== ChannelType.GuildText && tchannel.type !== ChannelType.GuildAnnouncement) { - return; - } - - const tmsg = await tchannel.messages.fetch(tMessageId); - if (!tmsg) return; - - await tmsg.edit({ content: "Message has been deleted", components: [] }); - } - } - }, -}; diff --git a/src/events/handleDeleteButton.ts b/src/events/handleDeleteButton.ts new file mode 100644 index 0000000..a130abd --- /dev/null +++ b/src/events/handleDeleteButton.ts @@ -0,0 +1,64 @@ +import { Events, Interaction, ChannelType, PermissionFlagsBits, Collection } from "discord.js"; + +export const msgCollection: Collection = new Collection(); + +export default { + name: Events.InteractionCreate, + once: false, + + async execute(interaction: Interaction) { + if (interaction.isButton()) { + if (!interaction.guild) return; + if (!interaction.memberPermissions?.has(PermissionFlagsBits.ManageMessages)) { + await interaction.reply({ content: "You don't have permission to run this command", ephemeral: true }); + return; + } + const [button, _templateId, channelId, messageId] = interaction.customId.split("-"); + + if (button !== "delete") return; + await interaction.deferReply({ ephemeral: true }); + if (!messageId || !channelId) { + await interaction.editReply({ content: "Invalid data received" }); + return; + } + const tMsgInfo = msgCollection.get(`${channelId}-${messageId}`); + if (!tMsgInfo) { + interaction.editReply({ content: "Not able to fetch message. Please Delete Manually." }); + return; + } + + const channel = interaction.guild.channels.cache.get(channelId); + if (!channel) return; + if (channel.type !== ChannelType.GuildText && channel.type !== ChannelType.GuildAnnouncement) { + return; + } + const [tMessageId, tChannelId] = tMsgInfo.split("-"); + if (!tMessageId || !tChannelId) return; + + const message = await channel.messages.fetch(messageId); + if (!message) { + await interaction.editReply({ content: "Not able to fetch message. Please Delete Manually." }); + } else { + await message.delete(); + await interaction.editReply({ content: "Deleted Successfully" }); + } + + const tchannel = interaction.guild.channels.cache.get(tChannelId); + if (!tchannel) return; + + if (tchannel.type !== ChannelType.GuildText && tchannel.type !== ChannelType.GuildAnnouncement) { + return; + } + + const tmsg = await tchannel.messages.fetch(tMessageId); + if (!tmsg) return; + + if (!message) { + await tmsg.edit({ content: "Failed Attempt to delete message.", components: [] }); + } else { + await tmsg.edit({ content: "Message has been deleted.", components: [] }); + return; + } + } + }, +}; diff --git a/src/events/handleEditButton.ts b/src/events/handleEditButton.ts new file mode 100644 index 0000000..168ef8b --- /dev/null +++ b/src/events/handleEditButton.ts @@ -0,0 +1,63 @@ +import { + Events, + Interaction, + TextInputBuilder, + TextInputStyle, + ActionRowBuilder, + ModalBuilder, + PermissionFlagsBits, + Collection, +} from "discord.js"; + +export const msgCollection: Collection = new Collection(); + +export default { + name: Events.InteractionCreate, + once: false, + + async execute(interaction: Interaction) { + if (!interaction.isButton()) return; + if (!interaction.guild) return; + if (!interaction.memberPermissions?.has(PermissionFlagsBits.ManageMessages)) { + await interaction.reply({ content: "You don't have permission to run this command", ephemeral: true }); + return; + } + const [button, _templateId, channelId, messageId, action] = interaction.customId.split("-"); + if (button !== "edit") return; + if (!channelId) { + await interaction.reply({ content: "Invalid ChannelId", ephemeral: true }); + return; + } + + const Title = new TextInputBuilder() + .setCustomId("title") + .setLabel("Provide us with the Title") + .setStyle(TextInputStyle.Short) + .setMaxLength(50) + .setRequired(false); + + const Description = new TextInputBuilder() + .setCustomId("description") + .setLabel("Provide us with some Description") + .setStyle(TextInputStyle.Paragraph) + .setMaxLength(1900) + .setRequired(false); + + const Image = new TextInputBuilder() + .setCustomId("image") + .setLabel("Provide us with the Image") + .setStyle(TextInputStyle.Paragraph) + .setMinLength(10) + .setMaxLength(4000) + .setRequired(false); + + const modal = new ModalBuilder().setCustomId(`edit-${channelId}--${messageId}-${action}`).setTitle("Announcements"); + const actionRows = [ + new ActionRowBuilder().addComponents(Title), + new ActionRowBuilder().addComponents(Description), + new ActionRowBuilder().addComponents(Image), + ]; + modal.addComponents(...actionRows.slice(0, action === "announce" ? 3 : 2)); + await interaction.showModal(modal); + }, +}; diff --git a/src/events/handleModal.ts b/src/events/handleModal.ts index c8720a0..c8a9b62 100644 --- a/src/events/handleModal.ts +++ b/src/events/handleModal.ts @@ -11,29 +11,13 @@ import { Colors, } from "discord.js"; import { COLOR, FOOTER_VALUE } from "../config/constant"; -import db from "../utils/database"; -import { TemplateSchemaType } from "../types"; import { z } from "zod"; -import { msgCollection } from "./handleButton"; +import { msgCollection } from "./handleEditButton"; +import isValidImageUrl from "../utils/misc"; const isValidUrl = (url: string): boolean => z.string().url().safeParse(url).success; -async function isValidImageUrl(url: string): Promise { - try { - const response = await fetch(url, { method: "HEAD" }); - if (!response.ok) { - return false; - } - const contentType = response.headers.get("Content-Type"); - if (!contentType || !contentType.startsWith("image/")) { - return false; - } - return true; - } catch (error) { - return false; - } -} - +// TODO: Make this File more readable export default { name: Events.InteractionCreate, once: false, @@ -43,123 +27,78 @@ export default { if (!interaction.isModalSubmit()) return; const [action, channelId, mention, messageId, type] = interaction.customId.split("-"); let message: Message; + if (action === "template") return; + if (!action || !channelId) return; + + const channel = interaction.guild.channels.cache.get(channelId); - if (action === "template") { + if (!channel) { + await interaction.reply({ content: "Target Channel Not Found", ephemeral: false }); + return; + } + + if (channel.type !== ChannelType.GuildText && channel.type !== ChannelType.GuildAnnouncement) { + await interaction.reply({ content: "Invalid Channel Provided. Please Provide a text channel" }); + return; + } + const createComponent = (messageId: string): ActionRowBuilder => { + const edit_message = new ButtonBuilder() + .setCustomId(`edit--${channelId}-${messageId}-${action}`) + .setLabel("Edit") + .setStyle(ButtonStyle.Primary); + const delete_message = new ButtonBuilder() + .setCustomId(`delete--${channelId}-${messageId}`) + .setLabel("Delete") + .setStyle(ButtonStyle.Danger); + return new ActionRowBuilder().addComponents(edit_message, delete_message); + }; + + if (action === "announce") { const title = interaction.fields.getTextInputValue("title"); const description = interaction.fields.getTextInputValue("description"); - const image = interaction.fields.getTextInputValue("image") || ""; + const image = interaction.fields.getTextInputValue("image") || "none"; const images = image.split("\n"); const validUrl = images.filter(url => isValidUrl(url)); const validImages = validUrl.filter(url => isValidImageUrl(url)); - const data = await (await db()) - .collection("templates") - .find({ guildId: interaction.guildId, isDeleted: false }) - .toArray(); - if (data.length >= 25) { - return interaction.reply({ content: "You can only have max 25 templates", ephemeral: false }); - } - - const templateExists = data.some(template => template.title === title || template.description === description); - - if (templateExists) { - return interaction.reply({ - content: "Template with the same title and description already exists", - ephemeral: true, + const embeds: EmbedBuilder[] = []; + const embed = new EmbedBuilder() + .setTitle(title) + .setDescription(description) + .setColor(Colors.White) + .setTimestamp() + .setFooter({ text: FOOTER_VALUE }); + + if (image === "none") { + if (mention === "none") { + message = await channel.send({ content: `📢 Announcement`, embeds: [embed] }); + } else { + message = await channel.send({ content: `📢 Announcement ${mention}`, embeds: [embed] }); + } + msgCollection.set(`${channelId}-${message.id}`, `${message.id}-${message.channelId}-${message.guildId}`); + const button = createComponent(message.id); + await interaction.reply({ + content: `Embed sent to <#${channel.id}>`, + components: [button], + ephemeral: false, }); - } - - await (await db()).collection("templates").insertOne({ - title, - description, - guildId: interaction.guild.id, - images: validImages, - isDeleted: false, - }); - await interaction.reply({ content: "Template added to database!" }); - } else { - if (!action || !channelId) return; - - const channel = interaction.guild.channels.cache.get(channelId); - - if (!channel) { - await interaction.reply({ content: "Target Channel Not Found", ephemeral: false }); return; } - if (channel.type !== ChannelType.GuildText && channel.type !== ChannelType.GuildAnnouncement) { - await interaction.reply({ content: "Invalid Channel Provided. Please Provide a text channel" }); - return; - } - const createComponent = (messageId: string): ActionRowBuilder => { - const edit_message = new ButtonBuilder() - .setCustomId(`edit--${channelId}-${messageId}-${action}`) - .setLabel("Edit") - .setStyle(ButtonStyle.Primary); - const delete_message = new ButtonBuilder() - .setCustomId(`delete--${channelId}-${messageId}`) - .setLabel("Delete") - .setStyle(ButtonStyle.Danger); - return new ActionRowBuilder().addComponents(edit_message, delete_message); - }; - - if (action === "announce") { - const title = interaction.fields.getTextInputValue("title"); - const description = interaction.fields.getTextInputValue("description"); - const image = interaction.fields.getTextInputValue("image") || "none"; - const images = image.split("\n"); - const validUrl = images.filter(url => isValidUrl(url)); - const validImages = validUrl.filter(url => isValidImageUrl(url)); - - const embeds: EmbedBuilder[] = []; - const embed = new EmbedBuilder() - .setTitle(title) - .setDescription(description) - .setColor(COLOR.WHITE as ColorResolvable) - .setTimestamp() - .setFooter({ text: FOOTER_VALUE }); - - if (image === "none") { - if (mention === "none") { - message = await channel.send({ content: `📢 Announcement`, embeds: [embed] }); - } else { - message = await channel.send({ content: `📢 Announcement ${mention}`, embeds: [embed] }); - } - msgCollection.set(`${channelId}-${message.id}`, `${message.id}-${message.channelId}-${message.guildId}`); - const button = createComponent(message.id); - await interaction.reply({ - content: `Embed sent to <#${channel.id}>`, - components: [button], - ephemeral: false, - }); - return; + if (validImages.length > 0) { + const firstImage = validImages.shift(); + if (firstImage) { + embed.setImage(firstImage); } + } + embeds.push(embed); - if (validImages.length > 0) { - const firstImage = validImages.shift(); - if (firstImage) { - embed.setImage(firstImage); - } - } - embeds.push(embed); - - validImages.forEach(url => { - const newEmbed = new EmbedBuilder().setImage(url).setColor(COLOR.WHITE as ColorResolvable); - embeds.push(newEmbed); - }); - if (mention !== "none") { - message = await channel.send({ content: `📢 Announcement ${mention}`, embeds: embeds }); - - const tMsg = await interaction.reply({ - content: `Embed sent to <#${channel.id}>`, - components: [createComponent(message.id)], - ephemeral: true, - fetchReply: true, - }); - msgCollection.set(`${channelId}-${message.id}`, `${tMsg.id}-${tMsg.channelId}-${tMsg.guildId}`); - return; - } - message = await channel.send({ content: `📢 Announcement`, embeds: embeds }); + validImages.forEach(url => { + const newEmbed = new EmbedBuilder().setImage(url).setColor(Colors.White); + embeds.push(newEmbed); + }); + if (mention !== "none") { + message = await channel.send({ content: `📢 Announcement ${mention}`, embeds: embeds }); const tMsg = await interaction.reply({ content: `Embed sent to <#${channel.id}>`, @@ -168,23 +107,22 @@ export default { fetchReply: true, }); msgCollection.set(`${channelId}-${message.id}`, `${tMsg.id}-${tMsg.channelId}-${tMsg.guildId}`); - } else if (action === "echo") { - const title = interaction.fields.getTextInputValue("title"); - const description = interaction.fields.getTextInputValue("description"); - if (mention !== "none") { - message = await channel.send({ content: `📢 Announcement ${mention}\n# ${title}\n${description}` }); - - const tMsg = await interaction.reply({ - content: `Message sent to <#${channel.id}>`, - components: [createComponent(message.id)], - ephemeral: false, - fetchReply: true, - }); - msgCollection.set(`${channelId}-${message.id}`, `${tMsg.id}-${tMsg.channelId}-${tMsg.guildId}`); - return; - } + return; + } + message = await channel.send({ content: `📢 Announcement`, embeds: embeds }); - message = await channel.send({ content: `# ${title}\n${description}` }); + const tMsg = await interaction.reply({ + content: `Embed sent to <#${channel.id}>`, + components: [createComponent(message.id)], + ephemeral: true, + fetchReply: true, + }); + msgCollection.set(`${channelId}-${message.id}`, `${tMsg.id}-${tMsg.channelId}-${tMsg.guildId}`); + } else if (action === "echo") { + const title = interaction.fields.getTextInputValue("title"); + const description = interaction.fields.getTextInputValue("description"); + if (mention !== "none") { + message = await channel.send({ content: `📢 Announcement ${mention}\n# ${title}\n${description}` }); const tMsg = await interaction.reply({ content: `Message sent to <#${channel.id}>`, @@ -193,61 +131,70 @@ export default { fetchReply: true, }); msgCollection.set(`${channelId}-${message.id}`, `${tMsg.id}-${tMsg.channelId}-${tMsg.guildId}`); - } else if (action === "images") { - const image = interaction.fields.getTextInputValue("image") || "none"; - const images = image.split("\n"); - const imageUrls = images.filter(url => isValidUrl(url)); - const validImages = imageUrls.filter(url => isValidImageUrl(url)); - if (validImages.length > 0) { - for (const imageUrl of validImages) { - await channel.send({ content: imageUrl }); - } - await interaction.reply({ content: "Image sent successfully", ephemeral: false }); - } else { - await interaction.reply({ content: "Invalid Image", ephemeral: false }); - } - } else if (action === "edit") { - const title = interaction.fields.getTextInputValue("title") || null; - const description = interaction.fields.getTextInputValue("description") || null; - if (!messageId || !channelId || !type) { - await interaction.reply({ content: "Invalid data received", ephemeral: false }); - return; - } + return; + } - if (!title && !description) { - await interaction.reply({ content: "Both Title and Description can't be empty", ephemeral: false }); - return; - } + message = await channel.send({ content: `# ${title}\n${description}` }); - const channel = await interaction.client.channels.fetch(channelId); - if (!channel) return; - // @ts-expect-error: type issue with discord.js - message = await channel.messages.fetch(messageId); - if (type === "announce") { - const images = (interaction.fields.getTextInputValue("image") || "") - .split("\n") - .filter(url => isValidUrl(url)); - const imageUrl = images.filter(url => isValidImageUrl(url)); - const embed = new EmbedBuilder() - .setTitle(title) - .setDescription(description) - .setColor(Colors.White) - .setTimestamp() - .setFooter({ text: FOOTER_VALUE }) - .setImage(imageUrl.shift() || null); - await message.edit({ - embeds: [ - embed, - ...imageUrl.map(image => { - return new EmbedBuilder().setImage(image).setColor(Colors.White); - }), - ], - }); - } else { - await message.edit({ content: `📢 Announcement ${mention}\n# ${title}\n${description}` }); + const tMsg = await interaction.reply({ + content: `Message sent to <#${channel.id}>`, + components: [createComponent(message.id)], + ephemeral: false, + fetchReply: true, + }); + msgCollection.set(`${channelId}-${message.id}`, `${tMsg.id}-${tMsg.channelId}-${tMsg.guildId}`); + } else if (action === "images") { + const image = interaction.fields.getTextInputValue("image") || "none"; + const images = image.split("\n"); + const imageUrls = images.filter(url => isValidUrl(url)); + const validImages = imageUrls.filter(url => isValidImageUrl(url)); + if (validImages.length > 0) { + for (const imageUrl of validImages) { + await channel.send({ content: imageUrl }); } - await interaction.reply({ content: "Edited message", ephemeral: false, components: [] }); + await interaction.reply({ content: "Image sent successfully", ephemeral: false }); + } else { + await interaction.reply({ content: "Invalid Image", ephemeral: false }); + } + } else if (action === "edit") { + const title = interaction.fields.getTextInputValue("title") || null; + const description = interaction.fields.getTextInputValue("description") || null; + if (!messageId || !channelId || !type) { + await interaction.reply({ content: "Invalid data received", ephemeral: false }); + return; + } + + if (!title && !description) { + await interaction.reply({ content: "Both Title and Description can't be empty", ephemeral: false }); + return; + } + + const channel = await interaction.client.channels.fetch(channelId); + if (!channel) return; + // @ts-expect-error: type issue with discord.js + message = await channel.messages.fetch(messageId); + if (type === "announce") { + const images = (interaction.fields.getTextInputValue("image") || "").split("\n").filter(url => isValidUrl(url)); + const imageUrl = images.filter(url => isValidImageUrl(url)); + const embed = new EmbedBuilder() + .setTitle(title) + .setDescription(description) + .setColor(Colors.White) + .setTimestamp() + .setFooter({ text: FOOTER_VALUE }) + .setImage(imageUrl.shift() || null); + await message.edit({ + embeds: [ + embed, + ...imageUrl.map(image => { + return new EmbedBuilder().setImage(image).setColor(Colors.White); + }), + ], + }); + } else { + await message.edit({ content: `📢 Announcement ${mention}\n# ${title}\n${description}` }); } + await interaction.reply({ content: "Edited message", ephemeral: false, components: [] }); } }, }; diff --git a/src/events/handleTemplates.ts b/src/events/handleTemplates.ts deleted file mode 100644 index e72cd4c..0000000 --- a/src/events/handleTemplates.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { Events, Interaction, ButtonBuilder, ButtonStyle, ActionRowBuilder } from "discord.js"; -import db from "../utils/database"; -import { ObjectId } from "mongodb"; - -export default { - name: Events.InteractionCreate, - once: false, - - async execute(interaction: Interaction) { - if (interaction.isStringSelectMenu()) { - if (interaction.customId === "deleteTemplate") { - const templateId = interaction.values[0]; - - const collection = (await db()).collection("templates"); - const query = { _id: new ObjectId(templateId) }; - const update = { $set: { isDeleted: true } }; - - await collection.updateOne(query, update); - await interaction.reply("Successfully Deleted"); - } else if (interaction.customId === "chooseTemplate") { - const { templateId, channelId } = JSON.parse(interaction.values[0] || "{}"); - const announce = new ButtonBuilder() - .setCustomId(`announce-${templateId}-${channelId}`) - .setLabel("Announce") - .setStyle(ButtonStyle.Primary); - const echo = new ButtonBuilder() - .setCustomId(`echo-${templateId}-${channelId}`) - .setLabel("Echo") - .setStyle(ButtonStyle.Success); - const button = new ActionRowBuilder().addComponents(announce, echo); - await interaction.reply({ - content: "Which action would you like to perform?", - components: [button], - ephemeral: true, - }); - } - } - }, -}; diff --git a/src/events/handleTemplates/handleTAnnounce.ts b/src/events/handleTemplates/handleTAnnounce.ts new file mode 100644 index 0000000..446396d --- /dev/null +++ b/src/events/handleTemplates/handleTAnnounce.ts @@ -0,0 +1,93 @@ +import { + ChannelType, + Collection, + ColorResolvable, + Colors, + EmbedBuilder, + Events, + Interaction, + PermissionFlagsBits, +} from "discord.js"; +import { ObjectId } from "mongodb"; +import { COLOR, FOOTER_VALUE } from "../../config/constant"; +import db from "../../utils/database"; + +export const msgCollection: Collection = new Collection(); + +export default { + name: Events.InteractionCreate, + once: false, + + async execute(interaction: Interaction) { + if (!interaction.isButton()) return; + if (!interaction.guild) return; + if (!interaction.memberPermissions?.has(PermissionFlagsBits.ManageMessages)) { + await interaction.reply({ content: "You don't have permission to run this command", ephemeral: true }); + return; + } + const [button, templateId, channelId] = interaction.customId.split("-"); + if (button !== "announce") return; + if (!templateId || !channelId) { + await interaction.reply({ content: "Invalid ChannelId", ephemeral: true }); + return; + } + const channel = interaction.guild.channels.cache.get(channelId); + if (!channel) { + await interaction.reply({ content: "Target Channel Not Found", ephemeral: true }); + return; + } + + if (channel.type !== ChannelType.GuildText && channel.type !== ChannelType.GuildAnnouncement) { + await interaction.reply({ content: "Invalid Channel Provided. Please Provide a text channel" }); + return; + } + interaction.deferReply(); + + const template = await (await db()) + .collection("templates") + .findOne({ _id: new ObjectId(templateId), isDeleted: false }); + if (!template) { + interaction.editReply("Not able to find the template from the database"); + return; + } + const title = template.title; + const description = template.description; + const images = template.images; + + const embeds: EmbedBuilder[] = []; + const embed = new EmbedBuilder() + .setTitle(title) + .setDescription(description) + .setColor(Colors.White) + .setTimestamp() + .setFooter({ text: FOOTER_VALUE }); + + if (!images) { + await channel.send({ content: "📢 Announcement - <@&1221428016266219714>", embeds: [embed] }); + await interaction.editReply({ content: `Embeds sent to <#${channel.id}>` }); + return; + } + + // TODO: check if this condition works else refer the previous and revert + if (images.length < 0) { + await channel.send({ content: "📢 Announcement - <@&1221428016266219714>", embeds: [embed] }); + await interaction.editReply({ content: `Embeds sent to <#${channel.id}>` }); + return; + } + + const firstImage = images.shift(); + + if (firstImage) { + embed.setImage(firstImage); + } + + embeds.push(embed); + + images.forEach((url: string) => { + const newEmbed = new EmbedBuilder().setImage(url).setColor(Colors.White); + embeds.push(newEmbed); + }); + await channel.send({ content: "📢 Announcement - <@&1221428016266219714>", embeds: embeds }); + await interaction.editReply({ content: `Embeds sent to <#${channel.id}>` }); + }, +}; diff --git a/src/events/handleTemplates/handleTCreate.ts b/src/events/handleTemplates/handleTCreate.ts new file mode 100644 index 0000000..9c018c6 --- /dev/null +++ b/src/events/handleTemplates/handleTCreate.ts @@ -0,0 +1,53 @@ +import { Events, Interaction } from "discord.js"; +import z from "zod"; +import { TemplateSchemaType } from "../../types"; +import db from "../../utils/database"; +import isValidImageUrl from "../../utils/misc"; + +const isValidUrl = (url: string): boolean => z.string().url().safeParse(url).success; + +export default { + name: Events.InteractionCreate, + once: false, + + async execute(interaction: Interaction) { + if (!interaction.guild) return; + if (!interaction.isModalSubmit()) return; + const [action] = interaction.customId.split("-"); + + if (action !== "template") return; + const title = interaction.fields.getTextInputValue("title"); + const description = interaction.fields.getTextInputValue("description"); + const image = interaction.fields.getTextInputValue("image") || ""; + const images = image.split("\n"); + const validUrl = images.filter(url => isValidUrl(url)); + const validImages = validUrl.filter(url => isValidImageUrl(url)); + + const data = await (await db()) + .collection("templates") + .find({ guildId: interaction.guildId, isDeleted: false }) + .toArray(); + if (data.length >= 25) { + return interaction.reply({ content: "You can only have max 25 templates", ephemeral: false }); + } + + // TODO: remove check for title cause i think not required + const templateExists = data.some(template => template.title === title || template.description === description); + + if (templateExists) { + return interaction.reply({ + content: "Template with the same title and description already exists", + ephemeral: true, + }); + } + + await (await db()).collection("templates").insertOne({ + title, + description, + guildId: interaction.guild.id, + images: validImages, + isDeleted: false, + }); + await interaction.reply({ content: "Template added to database!" }); + }, +}; diff --git a/src/events/handleTemplates/handleTDelete.ts b/src/events/handleTemplates/handleTDelete.ts new file mode 100644 index 0000000..b7d1797 --- /dev/null +++ b/src/events/handleTemplates/handleTDelete.ts @@ -0,0 +1,21 @@ +import { Events, Interaction, ButtonBuilder, ButtonStyle, ActionRowBuilder } from "discord.js"; +import db from "../../utils/database"; +import { ObjectId } from "mongodb"; + +export default { + name: Events.InteractionCreate, + once: false, + + async execute(interaction: Interaction) { + if (!interaction.isStringSelectMenu()) return; + if (interaction.customId !== "deleteTemplate") return; + const templateId = interaction.values[0]; + + const collection = (await db()).collection("templates"); + const query = { _id: new ObjectId(templateId) }; + const update = { $set: { isDeleted: true } }; + + await collection.updateOne(query, update); + await interaction.reply("Successfully Deleted the template."); + }, +}; diff --git a/src/events/handleTemplates/handleTEcho.ts b/src/events/handleTemplates/handleTEcho.ts new file mode 100644 index 0000000..3cbc887 --- /dev/null +++ b/src/events/handleTemplates/handleTEcho.ts @@ -0,0 +1,53 @@ +import { ChannelType, Collection, Events, GuildMemberRoleManager, Interaction, PermissionFlagsBits } from "discord.js"; +import { ObjectId } from "mongodb"; +import db from "../../utils/database"; +import config from "../../config"; + +export const msgCollection: Collection = new Collection(); + +export default { + name: Events.InteractionCreate, + once: false, + + async execute(interaction: Interaction) { + if (!interaction.isButton()) return; + if (!interaction.guild) return; + + if (!(interaction.member?.roles as GuildMemberRoleManager).resolve(config.MOD_ROLE_ID)) { + await interaction.reply({ + content: "You do not have the required roles to execute this command.", + ephemeral: true, + }); + return; + } + + const [button, templateId, channelId] = interaction.customId.split("-"); + if (button !== "echo") return; + if (!templateId || !channelId) { + await interaction.reply({ content: "Invalid ChannelId", ephemeral: true }); + return; + } + const channel = interaction.guild.channels.cache.get(channelId); + if (!channel) { + await interaction.reply({ content: "Target Channel Not Found", ephemeral: true }); + return; + } + + if (channel.type !== ChannelType.GuildText && channel.type !== ChannelType.GuildAnnouncement) { + await interaction.reply({ content: "Invalid Channel Provided. Please Provide a text channel" }); + return; + } + const template = await (await db()) + .collection("templates") + .findOne({ _id: new ObjectId(templateId), isDeleted: false }); + if (!template) { + return; + } + const title = template.title; + const description = template.description; + + // TODO: Remove the static role mention and implement dynamic role input + await channel.send({ content: `📢 Announcement - <@&1221428016266219714>\n# ${title}\n${description}` }); + await interaction.reply({ content: `Message sent to <#${channel.id}>` }); + }, +}; diff --git a/src/events/handleTemplates/handleTList.ts b/src/events/handleTemplates/handleTList.ts new file mode 100644 index 0000000..fa486ca --- /dev/null +++ b/src/events/handleTemplates/handleTList.ts @@ -0,0 +1,26 @@ +import { Events, Interaction, ButtonBuilder, ButtonStyle, ActionRowBuilder } from "discord.js"; + +export default { + name: Events.InteractionCreate, + once: false, + + async execute(interaction: Interaction) { + if (!interaction.isStringSelectMenu()) return; + if (interaction.customId !== "chooseTemplate") return; + const { templateId, channelId } = JSON.parse(interaction.values[0] || "{}"); + const announce = new ButtonBuilder() + .setCustomId(`announce-${templateId}-${channelId}`) + .setLabel("Announce") + .setStyle(ButtonStyle.Primary); + const echo = new ButtonBuilder() + .setCustomId(`echo-${templateId}-${channelId}`) + .setLabel("Echo") + .setStyle(ButtonStyle.Success); + const button = new ActionRowBuilder().addComponents(announce, echo); + await interaction.reply({ + content: "Which action would you like to perform?", + components: [button], + ephemeral: true, + }); + }, +}; diff --git a/src/events/interactionCreate.ts b/src/events/interactionCreate.ts index 4ee190d..a331e75 100644 --- a/src/events/interactionCreate.ts +++ b/src/events/interactionCreate.ts @@ -21,7 +21,7 @@ export default { const modRoleId = env.MOD_ROLE_ID; if (command.isMod && interactionChannelId !== envChannelId) { await interaction.reply({ - content: "This command can only be executed in a specific channel.", + content: `This command can only be executed in a specific channel. <#${envChannelId}>`, ephemeral: true, }); return; @@ -29,7 +29,7 @@ export default { if (command.isMod && !(interaction.member?.roles as GuildMemberRoleManager).resolve(modRoleId)) { await interaction.reply({ - content: "You do not have the required permissions to execute this command.", + content: "You do not have the required roles to execute this command.", ephemeral: true, }); return; diff --git a/src/utils/misc.ts b/src/utils/misc.ts new file mode 100644 index 0000000..0098772 --- /dev/null +++ b/src/utils/misc.ts @@ -0,0 +1,17 @@ +// TODO: rename this file to a better name as idk what to keep... maybe shared? + +export default async function isValidImageUrl(url: string): Promise { + try { + const response = await fetch(url, { method: "HEAD" }); + if (!response.ok) { + return false; + } + const contentType = response.headers.get("Content-Type"); + if (!contentType || !contentType.startsWith("image/")) { + return false; + } + return true; + } catch (error) { + return false; + } +} From 3a2a2a1ec09c91cf9b73def2c5fdc3242167db7c Mon Sep 17 00:00:00 2001 From: Harsh Patel Date: Tue, 9 Apr 2024 18:24:48 +0530 Subject: [PATCH 2/7] fix: add missing `await` --- src/events/handleTemplates/handleTAnnounce.ts | 2 +- src/events/handleTemplates/handleTEcho.ts | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/events/handleTemplates/handleTAnnounce.ts b/src/events/handleTemplates/handleTAnnounce.ts index 446396d..b01cd05 100644 --- a/src/events/handleTemplates/handleTAnnounce.ts +++ b/src/events/handleTemplates/handleTAnnounce.ts @@ -41,7 +41,7 @@ export default { await interaction.reply({ content: "Invalid Channel Provided. Please Provide a text channel" }); return; } - interaction.deferReply(); + await interaction.deferReply(); const template = await (await db()) .collection("templates") diff --git a/src/events/handleTemplates/handleTEcho.ts b/src/events/handleTemplates/handleTEcho.ts index 3cbc887..f80518f 100644 --- a/src/events/handleTemplates/handleTEcho.ts +++ b/src/events/handleTemplates/handleTEcho.ts @@ -37,10 +37,12 @@ export default { await interaction.reply({ content: "Invalid Channel Provided. Please Provide a text channel" }); return; } + await interaction.deferReply(); const template = await (await db()) .collection("templates") .findOne({ _id: new ObjectId(templateId), isDeleted: false }); if (!template) { + interaction.editReply("Not able to find the template from the database"); return; } const title = template.title; @@ -48,6 +50,6 @@ export default { // TODO: Remove the static role mention and implement dynamic role input await channel.send({ content: `📢 Announcement - <@&1221428016266219714>\n# ${title}\n${description}` }); - await interaction.reply({ content: `Message sent to <#${channel.id}>` }); + await interaction.editReply({ content: `Message sent to <#${channel.id}>` }); }, }; From 18c006daa2373dfda2f381fc549282fb8f7175fa Mon Sep 17 00:00:00 2001 From: Harsh Patel Date: Tue, 9 Apr 2024 18:32:15 +0530 Subject: [PATCH 3/7] chore: resolve todo's --- src/events/handleTemplates/handleTAnnounce.ts | 1 - src/events/handleTemplates/handleTCreate.ts | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/events/handleTemplates/handleTAnnounce.ts b/src/events/handleTemplates/handleTAnnounce.ts index b01cd05..ed9a546 100644 --- a/src/events/handleTemplates/handleTAnnounce.ts +++ b/src/events/handleTemplates/handleTAnnounce.ts @@ -68,7 +68,6 @@ export default { return; } - // TODO: check if this condition works else refer the previous and revert if (images.length < 0) { await channel.send({ content: "📢 Announcement - <@&1221428016266219714>", embeds: [embed] }); await interaction.editReply({ content: `Embeds sent to <#${channel.id}>` }); diff --git a/src/events/handleTemplates/handleTCreate.ts b/src/events/handleTemplates/handleTCreate.ts index 9c018c6..75bfb22 100644 --- a/src/events/handleTemplates/handleTCreate.ts +++ b/src/events/handleTemplates/handleTCreate.ts @@ -31,8 +31,7 @@ export default { return interaction.reply({ content: "You can only have max 25 templates", ephemeral: false }); } - // TODO: remove check for title cause i think not required - const templateExists = data.some(template => template.title === title || template.description === description); + const templateExists = data.some(template => template.description === description); if (templateExists) { return interaction.reply({ From 0733feeab8418c81f12ff16260dac4b1052d9a68 Mon Sep 17 00:00:00 2001 From: Harsh Patel Date: Tue, 9 Apr 2024 19:38:46 +0530 Subject: [PATCH 4/7] refactor: remove `MsgCollection` --- src/events/handleDeleteButton.ts | 81 ++++++++----------- src/events/handleEditButton.ts | 20 ++--- src/events/handleModal.ts | 24 ++---- src/events/handleTemplates/handleTAnnounce.ts | 23 ++---- src/events/handleTemplates/handleTDelete.ts | 2 +- src/events/handleTemplates/handleTEcho.ts | 6 +- 6 files changed, 64 insertions(+), 92 deletions(-) diff --git a/src/events/handleDeleteButton.ts b/src/events/handleDeleteButton.ts index a130abd..d632685 100644 --- a/src/events/handleDeleteButton.ts +++ b/src/events/handleDeleteButton.ts @@ -1,64 +1,51 @@ -import { Events, Interaction, ChannelType, PermissionFlagsBits, Collection } from "discord.js"; - -export const msgCollection: Collection = new Collection(); +import { Events, Interaction, ChannelType, GuildMemberRoleManager, Message } from "discord.js"; +import config from "../config"; export default { name: Events.InteractionCreate, once: false, async execute(interaction: Interaction) { - if (interaction.isButton()) { - if (!interaction.guild) return; - if (!interaction.memberPermissions?.has(PermissionFlagsBits.ManageMessages)) { - await interaction.reply({ content: "You don't have permission to run this command", ephemeral: true }); - return; - } - const [button, _templateId, channelId, messageId] = interaction.customId.split("-"); + if (!interaction.isButton()) return; + if (!interaction.guild) return; + if (!(interaction.member?.roles as GuildMemberRoleManager).resolve(config.MOD_ROLE_ID)) { + await interaction.reply({ + content: "You do not have the required roles to execute this action.", + ephemeral: true, + }); + return; + } + const [button, , channelId, messageId] = interaction.customId.split("-"); + let message: Message; + if (button !== "delete") return; + await interaction.deferReply({ ephemeral: true }); + if (!messageId || !channelId) { + await interaction.editReply({ content: "Invalid data received" }); + return; + } - if (button !== "delete") return; - await interaction.deferReply({ ephemeral: true }); - if (!messageId || !channelId) { - await interaction.editReply({ content: "Invalid data received" }); - return; - } - const tMsgInfo = msgCollection.get(`${channelId}-${messageId}`); - if (!tMsgInfo) { - interaction.editReply({ content: "Not able to fetch message. Please Delete Manually." }); - return; - } + const channel = interaction.guild.channels.cache.get(channelId); + if (!channel) return; + if (channel.type !== ChannelType.GuildText && channel.type !== ChannelType.GuildAnnouncement) { + return; + } - const channel = interaction.guild.channels.cache.get(channelId); - if (!channel) return; - if (channel.type !== ChannelType.GuildText && channel.type !== ChannelType.GuildAnnouncement) { - return; - } - const [tMessageId, tChannelId] = tMsgInfo.split("-"); - if (!tMessageId || !tChannelId) return; + try { + message = await channel.messages.fetch(messageId); - const message = await channel.messages.fetch(messageId); if (!message) { - await interaction.editReply({ content: "Not able to fetch message. Please Delete Manually." }); + await interaction.editReply({ content: "Message not found" }); } else { await message.delete(); await interaction.editReply({ content: "Deleted Successfully" }); } - - const tchannel = interaction.guild.channels.cache.get(tChannelId); - if (!tchannel) return; - - if (tchannel.type !== ChannelType.GuildText && tchannel.type !== ChannelType.GuildAnnouncement) { - return; - } - - const tmsg = await tchannel.messages.fetch(tMessageId); - if (!tmsg) return; - - if (!message) { - await tmsg.edit({ content: "Failed Attempt to delete message.", components: [] }); - } else { - await tmsg.edit({ content: "Message has been deleted.", components: [] }); - return; - } + } catch { + await interaction.editReply({ content: "Unable to Delete." }); + } + try { + await interaction.message.edit({ content: "Message has been deleted", components: [] }); + } catch (err) { + console.log(err); } }, }; diff --git a/src/events/handleEditButton.ts b/src/events/handleEditButton.ts index 168ef8b..85c6432 100644 --- a/src/events/handleEditButton.ts +++ b/src/events/handleEditButton.ts @@ -1,15 +1,14 @@ import { + ActionRowBuilder, + Collection, Events, + GuildMemberRoleManager, Interaction, + ModalBuilder, TextInputBuilder, TextInputStyle, - ActionRowBuilder, - ModalBuilder, - PermissionFlagsBits, - Collection, } from "discord.js"; - -export const msgCollection: Collection = new Collection(); +import config from "../config"; export default { name: Events.InteractionCreate, @@ -18,11 +17,14 @@ export default { async execute(interaction: Interaction) { if (!interaction.isButton()) return; if (!interaction.guild) return; - if (!interaction.memberPermissions?.has(PermissionFlagsBits.ManageMessages)) { - await interaction.reply({ content: "You don't have permission to run this command", ephemeral: true }); + if (!(interaction.member?.roles as GuildMemberRoleManager).resolve(config.MOD_ROLE_ID)) { + await interaction.reply({ + content: "You do not have the required roles to execute this action.", + ephemeral: true, + }); return; } - const [button, _templateId, channelId, messageId, action] = interaction.customId.split("-"); + const [button, , channelId, messageId, action] = interaction.customId.split("-"); if (button !== "edit") return; if (!channelId) { await interaction.reply({ content: "Invalid ChannelId", ephemeral: true }); diff --git a/src/events/handleModal.ts b/src/events/handleModal.ts index c8a9b62..e45e477 100644 --- a/src/events/handleModal.ts +++ b/src/events/handleModal.ts @@ -1,20 +1,17 @@ import { + ActionRowBuilder, + ButtonBuilder, + ButtonStyle, ChannelType, - ColorResolvable, + Colors, EmbedBuilder, Events, Interaction, - ButtonBuilder, - ButtonStyle, - ActionRowBuilder, Message, - Colors, } from "discord.js"; -import { COLOR, FOOTER_VALUE } from "../config/constant"; import { z } from "zod"; -import { msgCollection } from "./handleEditButton"; +import { FOOTER_VALUE } from "../config/constant"; import isValidImageUrl from "../utils/misc"; - const isValidUrl = (url: string): boolean => z.string().url().safeParse(url).success; // TODO: Make this File more readable @@ -27,8 +24,8 @@ export default { if (!interaction.isModalSubmit()) return; const [action, channelId, mention, messageId, type] = interaction.customId.split("-"); let message: Message; - if (action === "template") return; if (!action || !channelId) return; + if (action !== "announce" && action !== "echo" && action !== "images" && action !== "edit") return; const channel = interaction.guild.channels.cache.get(channelId); @@ -55,7 +52,7 @@ export default { if (action === "announce") { const title = interaction.fields.getTextInputValue("title"); - const description = interaction.fields.getTextInputValue("description"); + const description = interaction.fields.getTextInputValue("description") || " "; const image = interaction.fields.getTextInputValue("image") || "none"; const images = image.split("\n"); const validUrl = images.filter(url => isValidUrl(url)); @@ -75,7 +72,6 @@ export default { } else { message = await channel.send({ content: `📢 Announcement ${mention}`, embeds: [embed] }); } - msgCollection.set(`${channelId}-${message.id}`, `${message.id}-${message.channelId}-${message.guildId}`); const button = createComponent(message.id); await interaction.reply({ content: `Embed sent to <#${channel.id}>`, @@ -106,7 +102,6 @@ export default { ephemeral: true, fetchReply: true, }); - msgCollection.set(`${channelId}-${message.id}`, `${tMsg.id}-${tMsg.channelId}-${tMsg.guildId}`); return; } message = await channel.send({ content: `📢 Announcement`, embeds: embeds }); @@ -117,10 +112,9 @@ export default { ephemeral: true, fetchReply: true, }); - msgCollection.set(`${channelId}-${message.id}`, `${tMsg.id}-${tMsg.channelId}-${tMsg.guildId}`); } else if (action === "echo") { const title = interaction.fields.getTextInputValue("title"); - const description = interaction.fields.getTextInputValue("description"); + const description = interaction.fields.getTextInputValue("description") || " "; if (mention !== "none") { message = await channel.send({ content: `📢 Announcement ${mention}\n# ${title}\n${description}` }); @@ -130,7 +124,6 @@ export default { ephemeral: false, fetchReply: true, }); - msgCollection.set(`${channelId}-${message.id}`, `${tMsg.id}-${tMsg.channelId}-${tMsg.guildId}`); return; } @@ -142,7 +135,6 @@ export default { ephemeral: false, fetchReply: true, }); - msgCollection.set(`${channelId}-${message.id}`, `${tMsg.id}-${tMsg.channelId}-${tMsg.guildId}`); } else if (action === "images") { const image = interaction.fields.getTextInputValue("image") || "none"; const images = image.split("\n"); diff --git a/src/events/handleTemplates/handleTAnnounce.ts b/src/events/handleTemplates/handleTAnnounce.ts index ed9a546..4cbf9dc 100644 --- a/src/events/handleTemplates/handleTAnnounce.ts +++ b/src/events/handleTemplates/handleTAnnounce.ts @@ -1,19 +1,9 @@ -import { - ChannelType, - Collection, - ColorResolvable, - Colors, - EmbedBuilder, - Events, - Interaction, - PermissionFlagsBits, -} from "discord.js"; +import { ChannelType, Collection, Colors, EmbedBuilder, Events, GuildMemberRoleManager, Interaction } from "discord.js"; import { ObjectId } from "mongodb"; -import { COLOR, FOOTER_VALUE } from "../../config/constant"; +import config from "../../config"; +import { FOOTER_VALUE } from "../../config/constant"; import db from "../../utils/database"; -export const msgCollection: Collection = new Collection(); - export default { name: Events.InteractionCreate, once: false, @@ -21,8 +11,11 @@ export default { async execute(interaction: Interaction) { if (!interaction.isButton()) return; if (!interaction.guild) return; - if (!interaction.memberPermissions?.has(PermissionFlagsBits.ManageMessages)) { - await interaction.reply({ content: "You don't have permission to run this command", ephemeral: true }); + if (!(interaction.member?.roles as GuildMemberRoleManager).resolve(config.MOD_ROLE_ID)) { + await interaction.reply({ + content: "You do not have the required roles to execute this action.", + ephemeral: true, + }); return; } const [button, templateId, channelId] = interaction.customId.split("-"); diff --git a/src/events/handleTemplates/handleTDelete.ts b/src/events/handleTemplates/handleTDelete.ts index b7d1797..976aa7c 100644 --- a/src/events/handleTemplates/handleTDelete.ts +++ b/src/events/handleTemplates/handleTDelete.ts @@ -1,4 +1,4 @@ -import { Events, Interaction, ButtonBuilder, ButtonStyle, ActionRowBuilder } from "discord.js"; +import { Events, Interaction } from "discord.js"; import db from "../../utils/database"; import { ObjectId } from "mongodb"; diff --git a/src/events/handleTemplates/handleTEcho.ts b/src/events/handleTemplates/handleTEcho.ts index f80518f..dcefd8e 100644 --- a/src/events/handleTemplates/handleTEcho.ts +++ b/src/events/handleTemplates/handleTEcho.ts @@ -1,10 +1,8 @@ -import { ChannelType, Collection, Events, GuildMemberRoleManager, Interaction, PermissionFlagsBits } from "discord.js"; +import { ChannelType, Collection, Events, GuildMemberRoleManager, Interaction } from "discord.js"; import { ObjectId } from "mongodb"; import db from "../../utils/database"; import config from "../../config"; -export const msgCollection: Collection = new Collection(); - export default { name: Events.InteractionCreate, once: false, @@ -15,7 +13,7 @@ export default { if (!(interaction.member?.roles as GuildMemberRoleManager).resolve(config.MOD_ROLE_ID)) { await interaction.reply({ - content: "You do not have the required roles to execute this command.", + content: "You do not have the required roles to execute this action.", ephemeral: true, }); return; From 9e6b901a0ce69c827d0ee945e814fd6b45f43375 Mon Sep 17 00:00:00 2001 From: Harsh Patel Date: Tue, 9 Apr 2024 19:46:33 +0530 Subject: [PATCH 5/7] chore: bump packages --- package.json | 20 +-- pnpm-lock.yaml | 477 ++++++++++++++++++++++++------------------------- 2 files changed, 244 insertions(+), 253 deletions(-) diff --git a/package.json b/package.json index 7428cb1..132cd07 100644 --- a/package.json +++ b/package.json @@ -16,21 +16,21 @@ }, "dependencies": { "discord.js": "^14.14.1", - "dotenv": "^16.3.1", - "glob": "^10.3.10", - "mongodb": "^6.3.0", + "dotenv": "^16.4.5", + "glob": "^10.3.12", + "mongodb": "^6.5.0", "zod": "^3.22.4" }, "devDependencies": { - "@types/node": "^20.10.4", - "@typescript-eslint/eslint-plugin": "^5.60.0", - "@typescript-eslint/parser": "^5.60.0", - "esbuild": "^0.20.0", + "@types/node": "^20.12.6", + "@typescript-eslint/eslint-plugin": "^7.6.0", + "@typescript-eslint/parser": "^7.6.0", + "esbuild": "^0.20.2", "eslint": "^8.43.0", "pre-commit": "^1.2.2", - "prettier": "^3.1.1", - "tsc-watch": "^6.0.4", - "typescript": "^5.3.3" + "prettier": "^3.2.5", + "tsc-watch": "^6.2.0", + "typescript": "^5.4.4" }, "engines": { "node": ">=18.*" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f8e6bf0..d38ba14 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,46 +9,46 @@ dependencies: specifier: ^14.14.1 version: 14.14.1 dotenv: - specifier: ^16.3.1 - version: 16.3.1 + specifier: ^16.4.5 + version: 16.4.5 glob: - specifier: ^10.3.10 - version: 10.3.10 + specifier: ^10.3.12 + version: 10.3.12 mongodb: - specifier: ^6.3.0 - version: 6.3.0 + specifier: ^6.5.0 + version: 6.5.0 zod: specifier: ^3.22.4 version: 3.22.4 devDependencies: '@types/node': - specifier: ^20.10.4 - version: 20.10.4 + specifier: ^20.12.6 + version: 20.12.6 '@typescript-eslint/eslint-plugin': - specifier: ^5.60.0 - version: 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.56.0)(typescript@5.3.3) + specifier: ^7.6.0 + version: 7.6.0(@typescript-eslint/parser@7.6.0)(eslint@8.57.0)(typescript@5.4.4) '@typescript-eslint/parser': - specifier: ^5.60.0 - version: 5.62.0(eslint@8.56.0)(typescript@5.3.3) + specifier: ^7.6.0 + version: 7.6.0(eslint@8.57.0)(typescript@5.4.4) esbuild: - specifier: ^0.20.0 - version: 0.20.0 + specifier: ^0.20.2 + version: 0.20.2 eslint: specifier: ^8.43.0 - version: 8.56.0 + version: 8.57.0 pre-commit: specifier: ^1.2.2 version: 1.2.2 prettier: - specifier: ^3.1.1 - version: 3.1.1 + specifier: ^3.2.5 + version: 3.2.5 tsc-watch: - specifier: ^6.0.4 - version: 6.0.4(typescript@5.3.3) + specifier: ^6.2.0 + version: 6.2.0(typescript@5.4.4) typescript: - specifier: ^5.3.3 - version: 5.3.3 + specifier: ^5.4.4 + version: 5.4.4 packages: @@ -125,8 +125,8 @@ packages: - utf-8-validate dev: false - /@esbuild/aix-ppc64@0.20.0: - resolution: {integrity: sha512-fGFDEctNh0CcSwsiRPxiaqX0P5rq+AqE0SRhYGZ4PX46Lg1FNR6oCxJghf8YgY0WQEgQuh3lErUFE4KxLeRmmw==} + /@esbuild/aix-ppc64@0.20.2: + resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] @@ -134,8 +134,8 @@ packages: dev: true optional: true - /@esbuild/android-arm64@0.20.0: - resolution: {integrity: sha512-aVpnM4lURNkp0D3qPoAzSG92VXStYmoVPOgXveAUoQBWRSuQzt51yvSju29J6AHPmwY1BjH49uR29oyfH1ra8Q==} + /@esbuild/android-arm64@0.20.2: + resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} engines: {node: '>=12'} cpu: [arm64] os: [android] @@ -143,8 +143,8 @@ packages: dev: true optional: true - /@esbuild/android-arm@0.20.0: - resolution: {integrity: sha512-3bMAfInvByLHfJwYPJRlpTeaQA75n8C/QKpEaiS4HrFWFiJlNI0vzq/zCjBrhAYcPyVPG7Eo9dMrcQXuqmNk5g==} + /@esbuild/android-arm@0.20.2: + resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} engines: {node: '>=12'} cpu: [arm] os: [android] @@ -152,8 +152,8 @@ packages: dev: true optional: true - /@esbuild/android-x64@0.20.0: - resolution: {integrity: sha512-uK7wAnlRvjkCPzh8jJ+QejFyrP8ObKuR5cBIsQZ+qbMunwR8sbd8krmMbxTLSrDhiPZaJYKQAU5Y3iMDcZPhyQ==} + /@esbuild/android-x64@0.20.2: + resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} engines: {node: '>=12'} cpu: [x64] os: [android] @@ -161,8 +161,8 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64@0.20.0: - resolution: {integrity: sha512-AjEcivGAlPs3UAcJedMa9qYg9eSfU6FnGHJjT8s346HSKkrcWlYezGE8VaO2xKfvvlZkgAhyvl06OJOxiMgOYQ==} + /@esbuild/darwin-arm64@0.20.2: + resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] @@ -170,8 +170,8 @@ packages: dev: true optional: true - /@esbuild/darwin-x64@0.20.0: - resolution: {integrity: sha512-bsgTPoyYDnPv8ER0HqnJggXK6RyFy4PH4rtsId0V7Efa90u2+EifxytE9pZnsDgExgkARy24WUQGv9irVbTvIw==} + /@esbuild/darwin-x64@0.20.2: + resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} engines: {node: '>=12'} cpu: [x64] os: [darwin] @@ -179,8 +179,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64@0.20.0: - resolution: {integrity: sha512-kQ7jYdlKS335mpGbMW5tEe3IrQFIok9r84EM3PXB8qBFJPSc6dpWfrtsC/y1pyrz82xfUIn5ZrnSHQQsd6jebQ==} + /@esbuild/freebsd-arm64@0.20.2: + resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] @@ -188,8 +188,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64@0.20.0: - resolution: {integrity: sha512-uG8B0WSepMRsBNVXAQcHf9+Ko/Tr+XqmK7Ptel9HVmnykupXdS4J7ovSQUIi0tQGIndhbqWLaIL/qO/cWhXKyQ==} + /@esbuild/freebsd-x64@0.20.2: + resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] @@ -197,8 +197,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm64@0.20.0: - resolution: {integrity: sha512-uTtyYAP5veqi2z9b6Gr0NUoNv9F/rOzI8tOD5jKcCvRUn7T60Bb+42NDBCWNhMjkQzI0qqwXkQGo1SY41G52nw==} + /@esbuild/linux-arm64@0.20.2: + resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} engines: {node: '>=12'} cpu: [arm64] os: [linux] @@ -206,8 +206,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm@0.20.0: - resolution: {integrity: sha512-2ezuhdiZw8vuHf1HKSf4TIk80naTbP9At7sOqZmdVwvvMyuoDiZB49YZKLsLOfKIr77+I40dWpHVeY5JHpIEIg==} + /@esbuild/linux-arm@0.20.2: + resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} engines: {node: '>=12'} cpu: [arm] os: [linux] @@ -215,8 +215,8 @@ packages: dev: true optional: true - /@esbuild/linux-ia32@0.20.0: - resolution: {integrity: sha512-c88wwtfs8tTffPaoJ+SQn3y+lKtgTzyjkD8NgsyCtCmtoIC8RDL7PrJU05an/e9VuAke6eJqGkoMhJK1RY6z4w==} + /@esbuild/linux-ia32@0.20.2: + resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -224,8 +224,8 @@ packages: dev: true optional: true - /@esbuild/linux-loong64@0.20.0: - resolution: {integrity: sha512-lR2rr/128/6svngnVta6JN4gxSXle/yZEZL3o4XZ6esOqhyR4wsKyfu6qXAL04S4S5CgGfG+GYZnjFd4YiG3Aw==} + /@esbuild/linux-loong64@0.20.2: + resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} engines: {node: '>=12'} cpu: [loong64] os: [linux] @@ -233,8 +233,8 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el@0.20.0: - resolution: {integrity: sha512-9Sycc+1uUsDnJCelDf6ZNqgZQoK1mJvFtqf2MUz4ujTxGhvCWw+4chYfDLPepMEvVL9PDwn6HrXad5yOrNzIsQ==} + /@esbuild/linux-mips64el@0.20.2: + resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] @@ -242,8 +242,8 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64@0.20.0: - resolution: {integrity: sha512-CoWSaaAXOZd+CjbUTdXIJE/t7Oz+4g90A3VBCHLbfuc5yUQU/nFDLOzQsN0cdxgXd97lYW/psIIBdjzQIwTBGw==} + /@esbuild/linux-ppc64@0.20.2: + resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] @@ -251,8 +251,8 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64@0.20.0: - resolution: {integrity: sha512-mlb1hg/eYRJUpv8h/x+4ShgoNLL8wgZ64SUr26KwglTYnwAWjkhR2GpoKftDbPOCnodA9t4Y/b68H4J9XmmPzA==} + /@esbuild/linux-riscv64@0.20.2: + resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] @@ -260,8 +260,8 @@ packages: dev: true optional: true - /@esbuild/linux-s390x@0.20.0: - resolution: {integrity: sha512-fgf9ubb53xSnOBqyvWEY6ukBNRl1mVX1srPNu06B6mNsNK20JfH6xV6jECzrQ69/VMiTLvHMicQR/PgTOgqJUQ==} + /@esbuild/linux-s390x@0.20.2: + resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -269,8 +269,8 @@ packages: dev: true optional: true - /@esbuild/linux-x64@0.20.0: - resolution: {integrity: sha512-H9Eu6MGse++204XZcYsse1yFHmRXEWgadk2N58O/xd50P9EvFMLJTQLg+lB4E1cF2xhLZU5luSWtGTb0l9UeSg==} + /@esbuild/linux-x64@0.20.2: + resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -278,8 +278,8 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64@0.20.0: - resolution: {integrity: sha512-lCT675rTN1v8Fo+RGrE5KjSnfY0x9Og4RN7t7lVrN3vMSjy34/+3na0q7RIfWDAj0e0rCh0OL+P88lu3Rt21MQ==} + /@esbuild/netbsd-x64@0.20.2: + resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -287,8 +287,8 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64@0.20.0: - resolution: {integrity: sha512-HKoUGXz/TOVXKQ+67NhxyHv+aDSZf44QpWLa3I1lLvAwGq8x1k0T+e2HHSRvxWhfJrFxaaqre1+YyzQ99KixoA==} + /@esbuild/openbsd-x64@0.20.2: + resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -296,8 +296,8 @@ packages: dev: true optional: true - /@esbuild/sunos-x64@0.20.0: - resolution: {integrity: sha512-GDwAqgHQm1mVoPppGsoq4WJwT3vhnz/2N62CzhvApFD1eJyTroob30FPpOZabN+FgCjhG+AgcZyOPIkR8dfD7g==} + /@esbuild/sunos-x64@0.20.2: + resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -305,8 +305,8 @@ packages: dev: true optional: true - /@esbuild/win32-arm64@0.20.0: - resolution: {integrity: sha512-0vYsP8aC4TvMlOQYozoksiaxjlvUcQrac+muDqj1Fxy6jh9l9CZJzj7zmh8JGfiV49cYLTorFLxg7593pGldwQ==} + /@esbuild/win32-arm64@0.20.2: + resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -314,8 +314,8 @@ packages: dev: true optional: true - /@esbuild/win32-ia32@0.20.0: - resolution: {integrity: sha512-p98u4rIgfh4gdpV00IqknBD5pC84LCub+4a3MO+zjqvU5MVXOc3hqR2UgT2jI2nh3h8s9EQxmOsVI3tyzv1iFg==} + /@esbuild/win32-ia32@0.20.2: + resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -323,8 +323,8 @@ packages: dev: true optional: true - /@esbuild/win32-x64@0.20.0: - resolution: {integrity: sha512-NgJnesu1RtWihtTtXGFMU5YSE6JyyHPMxCwBZK7a6/8d31GuSo9l0Ss7w1Jw5QnKUawG6UEehs883kcXf5fYwg==} + /@esbuild/win32-x64@0.20.2: + resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -332,13 +332,13 @@ packages: dev: true optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.56.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.56.0 + eslint: 8.57.0 eslint-visitor-keys: 3.4.3 dev: true @@ -355,7 +355,7 @@ packages: debug: 4.3.4 espree: 9.6.1 globals: 13.24.0 - ignore: 5.3.0 + ignore: 5.3.1 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 @@ -364,8 +364,8 @@ packages: - supports-color dev: true - /@eslint/js@8.56.0: - resolution: {integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==} + /@eslint/js@8.57.0: + resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true @@ -374,11 +374,11 @@ packages: engines: {node: '>=14'} dev: false - /@humanwhocodes/config-array@0.11.13: - resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} + /@humanwhocodes/config-array@0.11.14: + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} dependencies: - '@humanwhocodes/object-schema': 2.0.1 + '@humanwhocodes/object-schema': 2.0.3 debug: 4.3.4 minimatch: 3.1.2 transitivePeerDependencies: @@ -390,8 +390,8 @@ packages: engines: {node: '>=12.22'} dev: true - /@humanwhocodes/object-schema@2.0.1: - resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} + /@humanwhocodes/object-schema@2.0.3: + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} dev: true /@isaacs/cliui@8.0.2: @@ -406,8 +406,8 @@ packages: wrap-ansi-cjs: /wrap-ansi@7.0.0 dev: false - /@mongodb-js/saslprep@1.1.1: - resolution: {integrity: sha512-t7c5K033joZZMspnHg/gWPE4kandgc2OxE74aYOtGKfgB9VPuVJPix0H6fhmm2erj5PBJ21mqcx34lpIGtUCsQ==} + /@mongodb-js/saslprep@1.1.5: + resolution: {integrity: sha512-XLNOMH66KhJzUJNwT/qlMnS4WsNDWD5ASdyaSH3EtK+F4r/CFGa3jT4GNi4mfOitGvWXtdLgQJkQjxSVrio+jA==} dependencies: sparse-bitfield: 3.0.3 dev: false @@ -462,13 +462,13 @@ packages: resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} dev: true - /@types/node@20.10.4: - resolution: {integrity: sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==} + /@types/node@20.12.6: + resolution: {integrity: sha512-3KurE8taB8GCvZBPngVbp0lk5CKi8M9f9k1rsADh0Evdz5SzJ+Q+Hx9uHoFGsLnLnd1xmkDQr2hVhlA0Mn0lKQ==} dependencies: undici-types: 5.26.5 - /@types/semver@7.5.6: - resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==} + /@types/semver@7.5.8: + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} dev: true /@types/webidl-conversions@7.0.3: @@ -484,136 +484,138 @@ packages: /@types/ws@8.5.9: resolution: {integrity: sha512-jbdrY0a8lxfdTp/+r7Z4CkycbOFN8WX+IOchLJr3juT/xzbJ8URyTVSJ/hvNdadTgM1mnedb47n+Y31GsFnQlg==} dependencies: - '@types/node': 20.10.4 + '@types/node': 20.12.6 dev: false - /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/eslint-plugin@7.6.0(@typescript-eslint/parser@7.6.0)(eslint@8.57.0)(typescript@5.4.4): + resolution: {integrity: sha512-gKmTNwZnblUdnTIJu3e9kmeRRzV2j1a/LUO27KNNAnIC5zjy1aSvXSRp4rVNlmAoHlQ7HzX42NbKpcSr4jF80A==} + engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + '@typescript-eslint/parser': ^7.0.0 + eslint: ^8.56.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 5.62.0(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/utils': 5.62.0(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/parser': 7.6.0(eslint@8.57.0)(typescript@5.4.4) + '@typescript-eslint/scope-manager': 7.6.0 + '@typescript-eslint/type-utils': 7.6.0(eslint@8.57.0)(typescript@5.4.4) + '@typescript-eslint/utils': 7.6.0(eslint@8.57.0)(typescript@5.4.4) + '@typescript-eslint/visitor-keys': 7.6.0 debug: 4.3.4 - eslint: 8.56.0 + eslint: 8.57.0 graphemer: 1.4.0 - ignore: 5.3.0 - natural-compare-lite: 1.4.0 - semver: 7.5.4 - tsutils: 3.21.0(typescript@5.3.3) - typescript: 5.3.3 + ignore: 5.3.1 + natural-compare: 1.4.0 + semver: 7.6.0 + ts-api-utils: 1.3.0(typescript@5.4.4) + typescript: 5.4.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/parser@7.6.0(eslint@8.57.0)(typescript@5.4.4): + resolution: {integrity: sha512-usPMPHcwX3ZoPWnBnhhorc14NJw9J4HpSXQX4urF2TPKG0au0XhJoZyX62fmvdHONUkmyUe74Hzm1//XA+BoYg==} + engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + eslint: ^8.56.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.3.3) + '@typescript-eslint/scope-manager': 7.6.0 + '@typescript-eslint/types': 7.6.0 + '@typescript-eslint/typescript-estree': 7.6.0(typescript@5.4.4) + '@typescript-eslint/visitor-keys': 7.6.0 debug: 4.3.4 - eslint: 8.56.0 - typescript: 5.3.3 + eslint: 8.57.0 + typescript: 5.4.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/scope-manager@5.62.0: - resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/scope-manager@7.6.0: + resolution: {integrity: sha512-ngttyfExA5PsHSx0rdFgnADMYQi+Zkeiv4/ZxGYUWd0nLs63Ha0ksmp8VMxAIC0wtCFxMos7Lt3PszJssG/E6w==} + engines: {node: ^18.18.0 || >=20.0.0} dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 + '@typescript-eslint/types': 7.6.0 + '@typescript-eslint/visitor-keys': 7.6.0 dev: true - /@typescript-eslint/type-utils@5.62.0(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/type-utils@7.6.0(eslint@8.57.0)(typescript@5.4.4): + resolution: {integrity: sha512-NxAfqAPNLG6LTmy7uZgpK8KcuiS2NZD/HlThPXQRGwz6u7MDBWRVliEEl1Gj6U7++kVJTpehkhZzCJLMK66Scw==} + engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: - eslint: '*' + eslint: ^8.56.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.3.3) - '@typescript-eslint/utils': 5.62.0(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/typescript-estree': 7.6.0(typescript@5.4.4) + '@typescript-eslint/utils': 7.6.0(eslint@8.57.0)(typescript@5.4.4) debug: 4.3.4 - eslint: 8.56.0 - tsutils: 3.21.0(typescript@5.3.3) - typescript: 5.3.3 + eslint: 8.57.0 + ts-api-utils: 1.3.0(typescript@5.4.4) + typescript: 5.4.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/types@5.62.0: - resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/types@7.6.0: + resolution: {integrity: sha512-h02rYQn8J+MureCvHVVzhl69/GAfQGPQZmOMjG1KfCl7o3HtMSlPaPUAPu6lLctXI5ySRGIYk94clD/AUMCUgQ==} + engines: {node: ^18.18.0 || >=20.0.0} dev: true - /@typescript-eslint/typescript-estree@5.62.0(typescript@5.3.3): - resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/typescript-estree@7.6.0(typescript@5.4.4): + resolution: {integrity: sha512-+7Y/GP9VuYibecrCQWSKgl3GvUM5cILRttpWtnAu8GNL9j11e4tbuGZmZjJ8ejnKYyBRb2ddGQ3rEFCq3QjMJw==} + engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 + '@typescript-eslint/types': 7.6.0 + '@typescript-eslint/visitor-keys': 7.6.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.5.4 - tsutils: 3.21.0(typescript@5.3.3) - typescript: 5.3.3 + minimatch: 9.0.4 + semver: 7.6.0 + ts-api-utils: 1.3.0(typescript@5.4.4) + typescript: 5.4.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils@5.62.0(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/utils@7.6.0(eslint@8.57.0)(typescript@5.4.4): + resolution: {integrity: sha512-x54gaSsRRI+Nwz59TXpCsr6harB98qjXYzsRxGqvA5Ue3kQH+FxS7FYU81g/omn22ML2pZJkisy6Q+ElK8pBCA==} + engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + eslint: ^8.56.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@types/json-schema': 7.0.15 - '@types/semver': 7.5.6 - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.3.3) - eslint: 8.56.0 - eslint-scope: 5.1.1 - semver: 7.5.4 + '@types/semver': 7.5.8 + '@typescript-eslint/scope-manager': 7.6.0 + '@typescript-eslint/types': 7.6.0 + '@typescript-eslint/typescript-estree': 7.6.0(typescript@5.4.4) + eslint: 8.57.0 + semver: 7.6.0 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/visitor-keys@5.62.0: - resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/visitor-keys@7.6.0: + resolution: {integrity: sha512-4eLB7t+LlNUmXzfOu1VAIAdkjbu5xNSerURS9X/S5TUKWFRpXRQZbmtPqgKmYx8bj3J0irtQXSiWAOY82v+cgw==} + engines: {node: ^18.18.0 || >=20.0.0} dependencies: - '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/types': 7.6.0 eslint-visitor-keys: 3.4.3 dev: true @@ -626,16 +628,16 @@ packages: engines: {node: '>=v14.0.0', npm: '>=7.0.0'} dev: false - /acorn-jsx@5.3.2(acorn@8.11.2): + /acorn-jsx@5.3.2(acorn@8.11.3): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 8.11.2 + acorn: 8.11.3 dev: true - /acorn@8.11.2: - resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} + /acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} engines: {node: '>=0.4.0'} hasBin: true dev: true @@ -692,7 +694,6 @@ packages: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} dependencies: balanced-match: 1.0.2 - dev: false /braces@3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} @@ -701,8 +702,8 @@ packages: fill-range: 7.0.1 dev: true - /bson@6.2.0: - resolution: {integrity: sha512-ID1cI+7bazPDyL9wYy9GaQ8gEEohWvcUl/Yf0dIdutJxnmInEEyCsb4awy/OiBfall7zBA179Pahi3vCdFze3Q==} + /bson@6.6.0: + resolution: {integrity: sha512-BVINv2SgcMjL4oYbBuCQTpE3/VKOSxrOA8Cj/wQP7izSzlBGVomdm+TcUd0Pzy0ytLSSDweCKQ6X3f5veM5LQA==} engines: {node: '>=16.20.1'} dev: false @@ -823,8 +824,8 @@ packages: esutils: 2.0.3 dev: true - /dotenv@16.3.1: - resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} + /dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} dev: false @@ -844,35 +845,35 @@ packages: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} dev: false - /esbuild@0.20.0: - resolution: {integrity: sha512-6iwE3Y2RVYCME1jLpBqq7LQWK3MW6vjV2bZy6gt/WrqkY+WE74Spyc0ThAOYpMtITvnjX09CrC6ym7A/m9mebA==} + /esbuild@0.20.2: + resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - '@esbuild/aix-ppc64': 0.20.0 - '@esbuild/android-arm': 0.20.0 - '@esbuild/android-arm64': 0.20.0 - '@esbuild/android-x64': 0.20.0 - '@esbuild/darwin-arm64': 0.20.0 - '@esbuild/darwin-x64': 0.20.0 - '@esbuild/freebsd-arm64': 0.20.0 - '@esbuild/freebsd-x64': 0.20.0 - '@esbuild/linux-arm': 0.20.0 - '@esbuild/linux-arm64': 0.20.0 - '@esbuild/linux-ia32': 0.20.0 - '@esbuild/linux-loong64': 0.20.0 - '@esbuild/linux-mips64el': 0.20.0 - '@esbuild/linux-ppc64': 0.20.0 - '@esbuild/linux-riscv64': 0.20.0 - '@esbuild/linux-s390x': 0.20.0 - '@esbuild/linux-x64': 0.20.0 - '@esbuild/netbsd-x64': 0.20.0 - '@esbuild/openbsd-x64': 0.20.0 - '@esbuild/sunos-x64': 0.20.0 - '@esbuild/win32-arm64': 0.20.0 - '@esbuild/win32-ia32': 0.20.0 - '@esbuild/win32-x64': 0.20.0 + '@esbuild/aix-ppc64': 0.20.2 + '@esbuild/android-arm': 0.20.2 + '@esbuild/android-arm64': 0.20.2 + '@esbuild/android-x64': 0.20.2 + '@esbuild/darwin-arm64': 0.20.2 + '@esbuild/darwin-x64': 0.20.2 + '@esbuild/freebsd-arm64': 0.20.2 + '@esbuild/freebsd-x64': 0.20.2 + '@esbuild/linux-arm': 0.20.2 + '@esbuild/linux-arm64': 0.20.2 + '@esbuild/linux-ia32': 0.20.2 + '@esbuild/linux-loong64': 0.20.2 + '@esbuild/linux-mips64el': 0.20.2 + '@esbuild/linux-ppc64': 0.20.2 + '@esbuild/linux-riscv64': 0.20.2 + '@esbuild/linux-s390x': 0.20.2 + '@esbuild/linux-x64': 0.20.2 + '@esbuild/netbsd-x64': 0.20.2 + '@esbuild/openbsd-x64': 0.20.2 + '@esbuild/sunos-x64': 0.20.2 + '@esbuild/win32-arm64': 0.20.2 + '@esbuild/win32-ia32': 0.20.2 + '@esbuild/win32-x64': 0.20.2 dev: true /escape-string-regexp@4.0.0: @@ -880,14 +881,6 @@ packages: engines: {node: '>=10'} dev: true - /eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - dev: true - /eslint-scope@7.2.2: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -901,16 +894,16 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint@8.56.0: - resolution: {integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==} + /eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@eslint-community/regexpp': 4.10.0 '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.56.0 - '@humanwhocodes/config-array': 0.11.13 + '@eslint/js': 8.57.0 + '@humanwhocodes/config-array': 0.11.14 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 '@ungap/structured-clone': 1.2.0 @@ -931,7 +924,7 @@ packages: glob-parent: 6.0.2 globals: 13.24.0 graphemer: 1.4.0 - ignore: 5.3.0 + ignore: 5.3.1 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 @@ -952,8 +945,8 @@ packages: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.11.2 - acorn-jsx: 5.3.2(acorn@8.11.2) + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) eslint-visitor-keys: 3.4.3 dev: true @@ -971,11 +964,6 @@ packages: estraverse: 5.3.0 dev: true - /estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - dev: true - /estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} @@ -1091,8 +1079,8 @@ packages: is-glob: 4.0.3 dev: true - /glob@10.3.10: - resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + /glob@10.3.12: + resolution: {integrity: sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==} engines: {node: '>=16 || 14 >=14.17'} hasBin: true dependencies: @@ -1100,7 +1088,7 @@ packages: jackspeak: 2.3.6 minimatch: 9.0.3 minipass: 7.0.4 - path-scurry: 1.10.1 + path-scurry: 1.10.2 dev: false /glob@7.2.3: @@ -1147,6 +1135,11 @@ packages: engines: {node: '>= 4'} dev: true + /ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + dev: true + /import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} @@ -1266,8 +1259,8 @@ packages: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} dev: false - /lru-cache@10.1.0: - resolution: {integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==} + /lru-cache@10.2.0: + resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} engines: {node: 14 || >=16.14} dev: false @@ -1323,6 +1316,13 @@ packages: brace-expansion: 2.0.1 dev: false + /minimatch@9.0.4: + resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + /minipass@7.0.4: resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} engines: {node: '>=16 || 14 >=14.17'} @@ -1335,8 +1335,8 @@ packages: whatwg-url: 13.0.0 dev: false - /mongodb@6.3.0: - resolution: {integrity: sha512-tt0KuGjGtLUhLoU263+xvQmPHEGTw5LbcNC73EoFRYgSHwZt5tsoJC110hDyO1kjQzpgNrpdcSza9PknWN4LrA==} + /mongodb@6.5.0: + resolution: {integrity: sha512-Fozq68InT+JKABGLqctgtb8P56pRrJFkbhW0ux+x1mdHeyinor8oNzJqwLjV/t5X5nJGfTlluxfyMnOXNggIUA==} engines: {node: '>=16.20.1'} peerDependencies: '@aws-sdk/credential-providers': ^3.188.0 @@ -1362,8 +1362,8 @@ packages: socks: optional: true dependencies: - '@mongodb-js/saslprep': 1.1.1 - bson: 6.2.0 + '@mongodb-js/saslprep': 1.1.5 + bson: 6.6.0 mongodb-connection-string-url: 3.0.0 dev: false @@ -1371,10 +1371,6 @@ packages: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} dev: true - /natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - dev: true - /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true @@ -1441,11 +1437,11 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - /path-scurry@1.10.1: - resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + /path-scurry@1.10.2: + resolution: {integrity: sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==} engines: {node: '>=16 || 14 >=14.17'} dependencies: - lru-cache: 10.1.0 + lru-cache: 10.2.0 minipass: 7.0.4 dev: false @@ -1479,8 +1475,8 @@ packages: engines: {node: '>= 0.8.0'} dev: true - /prettier@3.1.1: - resolution: {integrity: sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==} + /prettier@3.2.5: + resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} engines: {node: '>=14'} hasBin: true dev: true @@ -1548,8 +1544,8 @@ packages: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} dev: true - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + /semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} engines: {node: '>=10'} hasBin: true dependencies: @@ -1690,12 +1686,21 @@ packages: punycode: 2.3.1 dev: false + /ts-api-utils@1.3.0(typescript@5.4.4): + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + dependencies: + typescript: 5.4.4 + dev: true + /ts-mixer@6.0.3: resolution: {integrity: sha512-k43M7uCG1AkTyxgnmI5MPwKoUvS/bRvLvUb7+Pgpdlmok8AoqmUaZxUUw8zKM5B1lqZrt41GjYgnvAi0fppqgQ==} dev: false - /tsc-watch@6.0.4(typescript@5.3.3): - resolution: {integrity: sha512-cHvbvhjO86w2aGlaHgSCeQRl+Aqw6X6XN4sQMPZKF88GoP30O+oTuh5lRIJr5pgFWrRpF1AgXnJJ2DoFEIPHyg==} + /tsc-watch@6.2.0(typescript@5.4.4): + resolution: {integrity: sha512-2LBhf9kjKXnz7KQ/puLHlozMzzUNHAdYBNMkg3eksQJ9GBAgMg8czznM83T5PmsoUvDnXzfIeQn2lNcIYDr8LA==} engines: {node: '>=12.12.0'} hasBin: true peerDependencies: @@ -1705,27 +1710,13 @@ packages: node-cleanup: 2.1.2 ps-tree: 1.2.0 string-argv: 0.3.2 - typescript: 5.3.3 - dev: true - - /tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + typescript: 5.4.4 dev: true /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} dev: false - /tsutils@3.21.0(typescript@5.3.3): - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - dependencies: - tslib: 1.14.1 - typescript: 5.3.3 - dev: true - /type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -1742,8 +1733,8 @@ packages: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} dev: true - /typescript@5.3.3: - resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} + /typescript@5.4.4: + resolution: {integrity: sha512-dGE2Vv8cpVvw28v8HCPqyb08EzbBURxDpuhJvTrusShUfGnhHBafDsLdS1EhhxyL6BJQE+2cT3dDPAv+MQ6oLw==} engines: {node: '>=14.17'} hasBin: true dev: true From fd3b686f2f938d72820060778e8d23461a520c29 Mon Sep 17 00:00:00 2001 From: Harsh Patel Date: Tue, 9 Apr 2024 19:51:29 +0530 Subject: [PATCH 6/7] chore: remove unused vars --- src/events/handleEditButton.ts | 1 - src/events/handleModal.ts | 8 ++++---- src/events/handleTemplates/handleTAnnounce.ts | 2 +- src/events/handleTemplates/handleTEcho.ts | 2 +- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/events/handleEditButton.ts b/src/events/handleEditButton.ts index 85c6432..50c35ac 100644 --- a/src/events/handleEditButton.ts +++ b/src/events/handleEditButton.ts @@ -1,6 +1,5 @@ import { ActionRowBuilder, - Collection, Events, GuildMemberRoleManager, Interaction, diff --git a/src/events/handleModal.ts b/src/events/handleModal.ts index e45e477..6ff6860 100644 --- a/src/events/handleModal.ts +++ b/src/events/handleModal.ts @@ -96,7 +96,7 @@ export default { if (mention !== "none") { message = await channel.send({ content: `📢 Announcement ${mention}`, embeds: embeds }); - const tMsg = await interaction.reply({ + await interaction.reply({ content: `Embed sent to <#${channel.id}>`, components: [createComponent(message.id)], ephemeral: true, @@ -106,7 +106,7 @@ export default { } message = await channel.send({ content: `📢 Announcement`, embeds: embeds }); - const tMsg = await interaction.reply({ + await interaction.reply({ content: `Embed sent to <#${channel.id}>`, components: [createComponent(message.id)], ephemeral: true, @@ -118,7 +118,7 @@ export default { if (mention !== "none") { message = await channel.send({ content: `📢 Announcement ${mention}\n# ${title}\n${description}` }); - const tMsg = await interaction.reply({ + await interaction.reply({ content: `Message sent to <#${channel.id}>`, components: [createComponent(message.id)], ephemeral: false, @@ -129,7 +129,7 @@ export default { message = await channel.send({ content: `# ${title}\n${description}` }); - const tMsg = await interaction.reply({ + await interaction.reply({ content: `Message sent to <#${channel.id}>`, components: [createComponent(message.id)], ephemeral: false, diff --git a/src/events/handleTemplates/handleTAnnounce.ts b/src/events/handleTemplates/handleTAnnounce.ts index 4cbf9dc..6ebce38 100644 --- a/src/events/handleTemplates/handleTAnnounce.ts +++ b/src/events/handleTemplates/handleTAnnounce.ts @@ -1,4 +1,4 @@ -import { ChannelType, Collection, Colors, EmbedBuilder, Events, GuildMemberRoleManager, Interaction } from "discord.js"; +import { ChannelType, Colors, EmbedBuilder, Events, GuildMemberRoleManager, Interaction } from "discord.js"; import { ObjectId } from "mongodb"; import config from "../../config"; import { FOOTER_VALUE } from "../../config/constant"; diff --git a/src/events/handleTemplates/handleTEcho.ts b/src/events/handleTemplates/handleTEcho.ts index dcefd8e..4695bb3 100644 --- a/src/events/handleTemplates/handleTEcho.ts +++ b/src/events/handleTemplates/handleTEcho.ts @@ -1,4 +1,4 @@ -import { ChannelType, Collection, Events, GuildMemberRoleManager, Interaction } from "discord.js"; +import { ChannelType, Events, GuildMemberRoleManager, Interaction } from "discord.js"; import { ObjectId } from "mongodb"; import db from "../../utils/database"; import config from "../../config"; From 5f79377c8a15fd2540bf2933a9c660342742dd7b Mon Sep 17 00:00:00 2001 From: Harsh Patel Date: Fri, 12 Apr 2024 19:02:26 +0530 Subject: [PATCH 7/7] chore: rename files --- src/events/handleModal.ts | 2 +- .../handleTemplates/{handleTAnnounce.ts => handleAnnounce.ts} | 0 .../handleTemplates/{handleTCreate.ts => handleCreate.ts} | 2 +- .../handleTemplates/{handleTDelete.ts => handleDelete.ts} | 0 src/events/handleTemplates/{handleTEcho.ts => handleEcho.ts} | 0 .../handleTemplates/{handleTList.ts => handleSelectMenu.ts} | 0 src/utils/{misc.ts => helper.ts} | 2 -- 7 files changed, 2 insertions(+), 4 deletions(-) rename src/events/handleTemplates/{handleTAnnounce.ts => handleAnnounce.ts} (100%) rename src/events/handleTemplates/{handleTCreate.ts => handleCreate.ts} (97%) rename src/events/handleTemplates/{handleTDelete.ts => handleDelete.ts} (100%) rename src/events/handleTemplates/{handleTEcho.ts => handleEcho.ts} (100%) rename src/events/handleTemplates/{handleTList.ts => handleSelectMenu.ts} (100%) rename src/utils/{misc.ts => helper.ts} (83%) diff --git a/src/events/handleModal.ts b/src/events/handleModal.ts index 6ff6860..8b68093 100644 --- a/src/events/handleModal.ts +++ b/src/events/handleModal.ts @@ -11,7 +11,7 @@ import { } from "discord.js"; import { z } from "zod"; import { FOOTER_VALUE } from "../config/constant"; -import isValidImageUrl from "../utils/misc"; +import isValidImageUrl from "../utils/helper"; const isValidUrl = (url: string): boolean => z.string().url().safeParse(url).success; // TODO: Make this File more readable diff --git a/src/events/handleTemplates/handleTAnnounce.ts b/src/events/handleTemplates/handleAnnounce.ts similarity index 100% rename from src/events/handleTemplates/handleTAnnounce.ts rename to src/events/handleTemplates/handleAnnounce.ts diff --git a/src/events/handleTemplates/handleTCreate.ts b/src/events/handleTemplates/handleCreate.ts similarity index 97% rename from src/events/handleTemplates/handleTCreate.ts rename to src/events/handleTemplates/handleCreate.ts index 75bfb22..41ae51c 100644 --- a/src/events/handleTemplates/handleTCreate.ts +++ b/src/events/handleTemplates/handleCreate.ts @@ -2,7 +2,7 @@ import { Events, Interaction } from "discord.js"; import z from "zod"; import { TemplateSchemaType } from "../../types"; import db from "../../utils/database"; -import isValidImageUrl from "../../utils/misc"; +import isValidImageUrl from "../../utils/helper"; const isValidUrl = (url: string): boolean => z.string().url().safeParse(url).success; diff --git a/src/events/handleTemplates/handleTDelete.ts b/src/events/handleTemplates/handleDelete.ts similarity index 100% rename from src/events/handleTemplates/handleTDelete.ts rename to src/events/handleTemplates/handleDelete.ts diff --git a/src/events/handleTemplates/handleTEcho.ts b/src/events/handleTemplates/handleEcho.ts similarity index 100% rename from src/events/handleTemplates/handleTEcho.ts rename to src/events/handleTemplates/handleEcho.ts diff --git a/src/events/handleTemplates/handleTList.ts b/src/events/handleTemplates/handleSelectMenu.ts similarity index 100% rename from src/events/handleTemplates/handleTList.ts rename to src/events/handleTemplates/handleSelectMenu.ts diff --git a/src/utils/misc.ts b/src/utils/helper.ts similarity index 83% rename from src/utils/misc.ts rename to src/utils/helper.ts index 0098772..6fe2510 100644 --- a/src/utils/misc.ts +++ b/src/utils/helper.ts @@ -1,5 +1,3 @@ -// TODO: rename this file to a better name as idk what to keep... maybe shared? - export default async function isValidImageUrl(url: string): Promise { try { const response = await fetch(url, { method: "HEAD" });