diff --git a/.env.example b/.env.example index f671bfd..ab76a48 100644 --- a/.env.example +++ b/.env.example @@ -2,5 +2,6 @@ DISCORD_TOKEN= DISCORD_CLIENT_ID= DISCORD_GUILD_ID= MONGO_DB= +GITHUB_ID= +GITHUB_SECRET= webhook= -SERVER_URL=register-bot.is-a.dev diff --git a/Dockerfile b/Dockerfile index 185845f..8c2a669 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,22 +1,9 @@ -FROM node:latest +FROM node:23 -# Create the directory! -RUN mkdir -p /usr/src/bot -WORKDIR /usr/src/bot +WORKDIR /app -# Copy and Install our bot -COPY package.json /usr/src/bot +COPY package*.json ./ RUN npm install +COPY . . -# For Debugging -#RUN apt-get update && apt-get install -y \ -# nano \ -# curl \ -# git \ -# && rm -rf /var/lib/apt/lists/* - -# Our precious bot -COPY . /usr/src/bot - -# Start me! -CMD ["npm", "start"] +CMD npm start diff --git a/OLD/README.md b/OLD/README.md deleted file mode 100644 index 2f6b155..0000000 --- a/OLD/README.md +++ /dev/null @@ -1,47 +0,0 @@ -

is-a.dev Discord Bot

-

- Version - - License: MIT - - - Twitter: andrewstech1 - -

- -> A Discord bot to manage is-a.dev services. - -### ๐Ÿ  [Homepage](https://is-a.dev) - -## Install - -```sh -npm i -``` - -## Usage - -```sh -npm run start -``` - -## Author - -๐Ÿ‘ค **andrewstech** - -- Website: https://andrewstech.me -- Twitter: [@andrewstech1](https://twitter.com/andrewstech1) -- Github: [@andrewstech](https://github.com/andrewstech) - -## ๐Ÿค Contributing - -Contributions, issues and feature requests are welcome!
Feel free to check [issues page](https://github.com/andrewstech/is-a-dev-discord/issues). - -## Show your support - -Give a โญ๏ธ if this project helped you! - -## ๐Ÿ“ License - -Copyright ยฉ 2023 [andrewstech1](https://github.com/andrewstech).
-This project is [MIT](https://github.com/andrewstech/is-a-dev-discord/blob/main/LICENSE) licensed. diff --git a/OLD/commands/activate.js b/OLD/commands/activate.js deleted file mode 100644 index 78b44eb..0000000 --- a/OLD/commands/activate.js +++ /dev/null @@ -1,76 +0,0 @@ -const fetch = require("node-fetch"); -const { SlashCommandBuilder } = require("discord.js"); -const { GuildID } = require("../services/guildId.js"); -const Maintainers = require("../models/maintainers.js"); - -module.exports = { - data: new SlashCommandBuilder() - .setName("activate") - .setDescription("Activate a hosts by is-a.dev domain.") - .addStringOption((option) => - option - .setName("subdomain") - .setDescription("The subdomain to activate.") - .setRequired(true), - ), - async execute(interaction) { - const subdomain = interaction.options - .getString("subdomain") - .toLowerCase(); - // get the guild id from the interaction - const guildId = interaction.guildId; - // get the guild object from the guild id - const guild = GuildID(guildId); - // if the guild object is false, then the guild is not registered - if (!guild) - return await interaction.reply({ - content: - "This guild is not registered with Domain Register Bot. Please contact the guild owner to register.", - ephemeral: true, - }); - if (!(await Maintainers.findOne({ userid: interaction.user.id }))) { - // make text appear in ephemeral message - await interaction.reply({ - content: "Only maintainers can use this command!", - ephemeral: true, - }); - return; - } - - if (subdomain.length < 2 || subdomain.length > 64) - return await interaction.reply( - "The subdomain length must be between 2 and 64 characters.", - ); - - try { - const response = await fetch( - `https://hosts.is-a.dev/api/activate?domain=${subdomain}&NOTIFY_TOKEN=${process.env.WEBHOST_TOKEN}`, - { - headers: { - "User-Agent": "is-a-dev-bot", - }, - }, - ); - - if (response.status === 200) { - await interaction.reply( - `${subdomain}.is-a.dev has been activated!`, - ); - } else { - await interaction.reply( - `Dam something went wrong. The server responded with ${response.status} speak to andrew or Danny`, - ); - } - } catch (error) { - console.error( - "Error occurred while checking domain availability:", - error, - ); - await interaction.reply({ - content: - "An error occurred while checking the domain activation. Please try again later.", - ephemeral: true, - }); - } - }, -}; diff --git a/OLD/commands/check.js b/OLD/commands/check.js deleted file mode 100644 index 0bf3d59..0000000 --- a/OLD/commands/check.js +++ /dev/null @@ -1,67 +0,0 @@ -const fetch = require("node-fetch"); -const { SlashCommandBuilder } = require("discord.js"); -const { GuildID } = require("../services/guildId.js"); - -module.exports = { - data: new SlashCommandBuilder() - .setName("check") - .setDescription("Check if a domain is available.") - .addStringOption((option) => - option - .setName("subdomain") - .setDescription("The subdomain to check.") - .setRequired(true), - ), - async execute(interaction) { - const subdomain = interaction.options - .getString("subdomain") - .toLowerCase(); - // get the guild id from the interaction - const guildId = interaction.guildId; - // get the guild object from the guild id - const guild = GuildID(guildId); - // if the guild object is false, then the guild is not registered - if (!guild) - return await interaction.reply({ - content: - "This guild is not registered with Domain Register Bot. Please contact the guild owner to register.", - ephemeral: true, - }); - - if (subdomain.length < 2 || subdomain.length > 64) - return await interaction.reply( - "The subdomain length must be between 2 and 64 characters.", - ); - - try { - const response = await fetch( - `https://api.github.com/repos/is-a-dev/register/contents/domains/${subdomain}.json`, - { - headers: { - "User-Agent": "is-a-dev-bot", - }, - }, - ); - - if (response.status === 404) { - await interaction.reply( - `Congratulations, ${subdomain}.is-a.dev is available!`, - ); - } else { - await interaction.reply( - `Sorry, ${subdomain}.is-a.dev is taken!`, - ); - } - } catch (error) { - console.error( - "Error occurred while checking domain availability:", - error, - ); - await interaction.reply({ - content: - "An error occurred while checking the domain availability. Please try again later.", - ephemeral: true, - }); - } - }, -}; diff --git a/OLD/commands/delete.js b/OLD/commands/delete.js deleted file mode 100644 index e6deded..0000000 --- a/OLD/commands/delete.js +++ /dev/null @@ -1,64 +0,0 @@ -const { - SlashCommandBuilder, - StringSelectMenuBuilder, - ActionRowBuilder, - MessageSelectMenu, -} = require("discord.js"); - -const fetch = require("node-fetch"); -const User = require("../models/user.js"); -const Maintainers = require("../models/maintainers.js"); - -module.exports = { - data: new SlashCommandBuilder() - .setName("delete") - .setDescription("Delete a domain."), - async execute(interaction) { - const githubUser = await User.findOne({ userid: interaction.user.id }); - - if (!githubUser) { - await interaction.reply("You are not logged in!"); - return; - } - - const username = githubUser.githubid; - - fetch("https://raw-api.is-a.dev") - .then((response) => response.json()) - .then(async (data) => { - let found = false; - let results = []; - for (let i = 0; i < data.length; i++) { - if ( - data[i].owner.username.toLowerCase() === - username.toLowerCase() - ) { - results.push({ - label: data[i].domain, - value: data[i].domain, - }); - found = true; - } - } - if (!found) { - await interaction.reply("You don't own any domains"); - return; - } else { - // Create a select menu - const select = new StringSelectMenuBuilder() - .setCustomId("delete") - .setPlaceholder("Choose a domain to delete!") - .addOptions(results); - - const row = new ActionRowBuilder().addComponents(select); - - // Create the text input components - await interaction.reply({ - content: "Choose the domian you want to delete", - components: [row], - ephemeral: true, - }); - } - }); - }, -}; diff --git a/OLD/commands/domains.js b/OLD/commands/domains.js deleted file mode 100644 index 858e5cb..0000000 --- a/OLD/commands/domains.js +++ /dev/null @@ -1,119 +0,0 @@ -const { - SlashCommandBuilder, - EmbedBuilder, - ButtonBuilder, - ActionRowBuilder, - ButtonStyle, -} = require("discord.js"); -const fetch = require("node-fetch"); -const auth = require("../components/auth.js"); -const User = require("../models/user.js"); -const { GuildID } = require("../services/guildId.js"); -const Maintainers = require("../models/maintainers.js"); - -module.exports = { - data: new SlashCommandBuilder() - .setName("domains") - .setDescription("Lists all domains registered by you!"), - async execute(interaction) { - const guildId = interaction.guildId; - // get the guild object from the guild id - const guild = GuildID(guildId); - console.log(guild); - // if the guild object is false, then the guild is not registereds - if (!guild) - return await interaction.reply({ - content: - "This guild is not registered with Domain Register Bot. Please contact the guild owner to register.", - ephemeral: true, - }); - const githubUser = await User.findOne({ userid: interaction.user.id }); - const maintainers = await Maintainers.findOne({ - userid: interaction.user.id, - }); - - const authUrl = auth.getAccessToken(interaction.user.id); - const loginBtn = new ActionRowBuilder().addComponents( - new ButtonBuilder() - .setStyle(ButtonStyle.Link) - .setLabel("Login with GitHub") - .setURL(authUrl), - ); - // add text reply if user is not logged in. along with login button - if (!githubUser) - return await interaction.reply({ - content: `Please login first`, - components: [loginBtn], - ephemeral: true, - }); - let found = false; - let results = []; - let staffresults = []; - if (maintainers) { - const maintainer = "is-a-dev"; - - await fetch("https://raw-api.is-a.dev") - .then((response) => response.json()) - .then(async (data) => { - for (let i = 0; i < data.length; i++) { - if ( - data[i].owner.username.toLowerCase() === - maintainer.toLowerCase() - ) { - staffresults.push(data[i].domain); - } - } - }); - } - - const username = githubUser.githubid; - - fetch("https://raw-api.is-a.dev") - .then((response) => response.json()) - .then(async (data) => { - for (let i = 0; i < data.length; i++) { - if ( - data[i].owner.username.toLowerCase() === - username.toLowerCase() - ) { - results.push(data[i].domain); - found = true; - } - } - - if (found) { - if (maintainers) { - const embed = new EmbedBuilder() - .setTitle("Your Domains") - .setDescription(results.join("\n")) - .addFields({ - name: "Staff Domains", - value: staffresults.join("\n"), - }) - .setColor("#00b0f4") - .setFooter({ - text: "is-a.dev", - iconURL: - "https://raw.githubusercontent.com/is-a-dev/register/main/media/logo.png", - }); - - await interaction.reply({ embeds: [embed] }); - } else { - const embed = new EmbedBuilder() - .setTitle("Your Domains") - .setDescription(results.join("\n")) - .setColor("#00b0f4") - .setFooter({ - text: "is-a.dev", - iconURL: - "https://raw.githubusercontent.com/is-a-dev/register/main/media/logo.png", - }); - - await interaction.reply({ embeds: [embed] }); - } - } else { - await interaction.reply("You don't own any domains."); - } - }); - }, -}; diff --git a/OLD/commands/edit.js b/OLD/commands/edit.js deleted file mode 100644 index 196d536..0000000 --- a/OLD/commands/edit.js +++ /dev/null @@ -1,71 +0,0 @@ -const { - SlashCommandBuilder, - StringSelectMenuBuilder, - ActionRowBuilder, - MessageSelectMenu, -} = require("discord.js"); - -const fetch = require("node-fetch"); -const User = require("../models/user.js"); -const Maintainers = require("../models/maintainers.js"); - -module.exports = { - data: new SlashCommandBuilder() - .setName("edit") - .setDescription("Edit a domain."), - async execute(interaction) { - const githubUser = await User.findOne({ userid: interaction.user.id }); - const maintainers = await Maintainers.findOne({ - userid: interaction.user.id, - }); - if (!maintainers) { - await interaction.reply("You are not a maintainer!"); - return; - } - - if (!githubUser) { - await interaction.reply("You are not logged in!"); - return; - } - - const username = githubUser.githubid; - - fetch("https://raw-api.is-a.dev") - .then((response) => response.json()) - .then(async (data) => { - let found = false; - let results = []; - for (let i = 0; i < data.length; i++) { - if ( - data[i].owner.username.toLowerCase() === - username.toLowerCase() - ) { - results.push({ - label: data[i].domain, - value: data[i].domain, - }); - found = true; - } - } - if (!found) { - await interaction.reply("You don't own any domains"); - return; - } else { - // Create a select menu - const select = new StringSelectMenuBuilder() - .setCustomId("edit") - .setPlaceholder("Choose a domain to edit!") - .addOptions(results); - - const row = new ActionRowBuilder().addComponents(select); - - // Create the text input components - await interaction.reply({ - content: "Choose the domian you want to edit", - components: [row], - ephemeral: true, - }); - } - }); - }, -}; diff --git a/OLD/commands/feedback.js b/OLD/commands/feedback.js deleted file mode 100644 index e16c336..0000000 --- a/OLD/commands/feedback.js +++ /dev/null @@ -1,49 +0,0 @@ -const { - SlashCommandBuilder, - ActionRowBuilder, - ModalBuilder, - TextInputBuilder, - TextInputStyle, -} = require("discord.js"); - -module.exports = { - data: new SlashCommandBuilder() - .setName("feedback") - .setDescription("Give feedback and suggestions!"), - async execute(interaction) { - const modal = new ModalBuilder() - .setCustomId("feedback") - .setTitle("Bot Feedback"); - - // Add components to modal - - // Create the text input components - const improvements = new TextInputBuilder() - .setCustomId("improve") - // The label is the prompt the user sees for this input - .setLabel("What's could be improved?") - // Short means only a single line of text - .setStyle(TextInputStyle.Short); - - const suggestions = new TextInputBuilder() - .setCustomId("suggest") - .setLabel("Do you have any suggestions?") - // Paragraph means multiple lines of text. - .setStyle(TextInputStyle.Paragraph); - - // An action row only holds one text input, - // so you need one action row per text input. - const firstActionRow = new ActionRowBuilder().addComponents( - improvements, - ); - const secondActionRow = new ActionRowBuilder().addComponents( - suggestions, - ); - - // Add inputs to the modal - modal.addComponents(firstActionRow, secondActionRow); - - // Show the modal to the user - await interaction.showModal(modal); - }, -}; diff --git a/OLD/commands/login.js b/OLD/commands/login.js deleted file mode 100644 index 1795e6a..0000000 --- a/OLD/commands/login.js +++ /dev/null @@ -1,45 +0,0 @@ -const { - SlashCommandBuilder, - ButtonBuilder, - ActionRowBuilder, - ButtonStyle, -} = require("discord.js"); - -const auth = require("../components/auth.js"); -const User = require("../models/user.js"); -const { GuildID } = require("../services/guildId.js"); - -module.exports = { - data: new SlashCommandBuilder() - .setName("login") - .setDescription("Login with GitHub."), - async execute(interaction) { - const guildId = interaction.guildId; - // get the guild object from the guild id - const guild = GuildID(guildId); - // if the guild object is false, then the guild is not registered - if (!guild) - return await interaction.reply({ - content: - "This guild is not registered with Domain Register Bot. Please contact the guild owner to register.", - ephemeral: true, - }); - if (await User.findOne({ userid: interaction.user.id })) - return await interaction.reply({ - content: "You are already logged in!", - ephemeral: true, - }); - - const authUrl = auth.getAccessToken(interaction.user.id); - - // reply with login button using ButtonBuilder - const loginBtn = new ActionRowBuilder().addComponents( - new ButtonBuilder() - .setStyle(ButtonStyle.Link) - .setLabel("Login with GitHub") - .setURL(authUrl), - ); - - await interaction.reply({ components: [loginBtn], ephemeral: true }); - }, -}; diff --git a/OLD/commands/logout.js b/OLD/commands/logout.js deleted file mode 100644 index 444bd71..0000000 --- a/OLD/commands/logout.js +++ /dev/null @@ -1,67 +0,0 @@ -const { - ActionRowBuilder, - ButtonBuilder, - ButtonStyle, - SlashCommandBuilder, -} = require("discord.js"); -const User = require("../models/user.js"); - -module.exports = { - data: new SlashCommandBuilder() - .setName("logout") - .setDescription("Logout from the bot."), - async execute(interaction) { - if (!(await User.findOne({ userid: interaction.user.id }))) - return await interaction.reply({ - content: "You are not logged in!", - ephemeral: true, - }); - - const confirm = new ButtonBuilder() - .setCustomId("confirm") - .setLabel("Confirm Logout") - .setStyle(ButtonStyle.Danger); - - const cancel = new ButtonBuilder() - .setCustomId("cancel") - .setLabel("Cancel") - .setStyle(ButtonStyle.Secondary); - - const row = new ActionRowBuilder().addComponents(cancel, confirm); - - //await User.findOneAndDelete({ userid: interaction.user.id }); - const response = await interaction.reply({ - content: `Are you sure you want to logout?`, - components: [row], - ephemeral: true, - }); - - const collectorFilter = (i) => i.user.id === interaction.user.id; - - try { - const confirmation = await response.awaitMessageComponent({ - filter: collectorFilter, - time: 60000, - }); - if (confirmation.customId === "confirm") { - await User.findOneAndDelete({ userid: interaction.user.id }); - await confirmation.update({ - content: `Logged out.`, - components: [], - }); - } else if (confirmation.customId === "cancel") { - await confirmation.update({ - content: "Action cancelled", - components: [], - }); - } - } catch (e) { - await interaction.editReply({ - content: - "Confirmation not received within 1 minute, cancelling", - components: [], - }); - return; - } - }, -}; diff --git a/OLD/commands/ping.js b/OLD/commands/ping.js deleted file mode 100644 index c2e330e..0000000 --- a/OLD/commands/ping.js +++ /dev/null @@ -1,10 +0,0 @@ -const { SlashCommandBuilder } = require("discord.js"); - -module.exports = { - data: new SlashCommandBuilder() - .setName("ping") - .setDescription("Replies with Pong!"), - async execute(interaction) { - await interaction.reply("Pong!"); - }, -}; diff --git a/OLD/commands/register.js b/OLD/commands/register.js deleted file mode 100644 index fdb2cf9..0000000 --- a/OLD/commands/register.js +++ /dev/null @@ -1,134 +0,0 @@ -const { - SlashCommandBuilder, - EmbedBuilder, - ButtonBuilder, - ActionRowBuilder, - ButtonStyle, -} = require("discord.js"); -const { fork } = require("../components/fork.js"); -const auth = require("../components/auth.js"); -const { CommitChanges } = require("../components/commit.js"); -const { OpenPR } = require("../components/pr.js"); -const User = require("../models/user.js"); -const { GuildID } = require("../services/guildId.js"); - -module.exports = { - data: new SlashCommandBuilder() - .setName("register") - .setDescription("Register an is-a.dev Subdomain!") - .addStringOption((option) => - option - .setName("subdomain") - .setDescription("Enter the subdomain") - .setRequired(true), - ) - .addStringOption((option) => - option - .setName("record_type") - .setDescription("Select the record type") - .setRequired(true) - .addChoices( - { name: "A", value: "A" }, - { name: "CNAME", value: "CNAME" }, - { name: "MX", value: "MX" }, - { name: "TXT", value: "TXT" }, - { name: "URL", value: "URL" }, - ), - ) - .addStringOption((option) => - option - .setName("content") - .setDescription("Enter the record value(s)") - .setRequired(true), - ), - async execute(interaction) { - const subdomains = interaction.options.getString("subdomain"); - const recordType = interaction.options.getString("record_type"); - const recordString = interaction.options.getString("content"); - const guildId = interaction.guildId; - // get the guild object from the guild id - const guild = GuildID(guildId); - // if the guild object is false, then the guild is not registered - if (!guild) - return await interaction.reply({ - content: - "This guild is not registered with Domain Register Bot. Please contact the guild owner to register.", - ephemeral: true, - }); - - const githubUser = await User.findOne({ userid: interaction.user.id }); - const username = githubUser.githubid; - - const authUrl = auth.getAccessToken(interaction.user.id); - const loginBtn = new ActionRowBuilder().addComponents( - new ButtonBuilder() - .setStyle(ButtonStyle.Link) - .setLabel("Login with GitHub") - .setURL(authUrl), - ); - // add text reply if user is not logged in. along with login button - if (!githubUser) - return await interaction.reply({ - content: `Please login first`, - components: [loginBtn], - ephemeral: true, - }); - - let regexPattern; - - switch (recordType) { - case "A": - regexPattern = /^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$/; - break; - case "CNAME": - regexPattern = /^[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*$/; - break; - case "MX": - regexPattern = /^[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*$/; - break; - case "TXT": - regexPattern = /^.*$/; - break; - case "URL": - regexPattern = - /^(https?:\/\/)?(www\.)?([a-zA-Z0-9-]+\.){1,}[a-zA-Z]{2,}(\/[a-zA-Z0-9-_.~:/?#[\]@!$&'()*+,;=%]*)?$/; - break; - default: - return await interaction.reply("Invalid record type."); - } - - if (!regexPattern.test(recordString)) - return await interaction.reply("Invalid record string."); - - // Embed - const subdomain = subdomains.replace(/\.is-a\.dev$/, ""); - - const embed = new EmbedBuilder() - .setTitle(`Registering ${subdomain}.is-a.dev`) - .addFields( - { name: "Forked", value: "โŒ", inline: true }, - { name: "Commited", value: "โŒ", inline: true }, - { name: "PR Opened", value: "โŒ", inline: true }, - ) - .setColor("#00b0f4") - .setFooter({ - text: "is-a.dev", - icon_url: - "https://raw.githubusercontent.com/is-a-dev/register/main/media/logo.png", - }); - - await interaction.reply({ embeds: [embed] }); - const forked = await fork(interaction.user.id, interaction, subdomain); - - // add a 3 second delay to allow the fork to complete - await new Promise((r) => setTimeout(r, 3000)); - const commit = await CommitChanges( - interaction.user.id, - subdomain, - recordType, - recordString, - interaction, - ); - if (commit === "fail") return; - }, -}; diff --git a/OLD/commands/sendemail.js b/OLD/commands/sendemail.js deleted file mode 100644 index e6a3e80..0000000 --- a/OLD/commands/sendemail.js +++ /dev/null @@ -1,82 +0,0 @@ -const { - SlashCommandBuilder, - ActionRowBuilder, - ModalBuilder, - TextInputBuilder, - TextInputStyle, -} = require("discord.js"); -const Maintainers = require("../models/maintainers.js"); - -module.exports = { - data: new SlashCommandBuilder() - .setName("send-email") - .setDescription("Maintainers send emails!") - .addStringOption((option) => - option - .setName("email") - .setDescription("Email to send to") - .setRequired(false), - ) - .addStringOption((option) => - option - .setName("subject") - .setDescription("Subject of email") - .setRequired(false), - ), - async execute(interaction) { - if (!(await Maintainers.findOne({ userid: interaction.user.id }))) { - // make text appear in ephemeral message - await interaction.reply({ - content: "Only maintainers can use this command!", - ephemeral: true, - }); - return; - } - const emailAddress = interaction.options.getString("email"); - const emailSubject = interaction.options.getString("subject"); - const modal = new ModalBuilder() - .setCustomId("sendemail") - .setTitle("Send Email"); - - if (!emailAddress) { - const emailAddress = "email"; - } - if (!emailSubject) { - const emailSubject = "subject"; - } - - // Create the text input components - const email = new TextInputBuilder() - .setCustomId("email") - // The label is the prompt the user sees for this input - .setLabel("To email?") - .setValue(emailAddress) - // Short means only a single line of text - .setStyle(TextInputStyle.Short); - - const subject = new TextInputBuilder() - .setCustomId("subject") - .setLabel("What is the email subject?") - .setValue(emailSubject) - // Paragraph means multiple lines of text. - .setStyle(TextInputStyle.Short); - - const message = new TextInputBuilder() - .setCustomId("message") - .setLabel("What's the message?") - // Paragraph means multiple lines of text. - .setStyle(TextInputStyle.Paragraph); - - // An action row only holds one text input, - // so you need one action row per text input. - const firstActionRow = new ActionRowBuilder().addComponents(email); - const secondActionRow = new ActionRowBuilder().addComponents(subject); - const thirdActionRow = new ActionRowBuilder().addComponents(message); - - // Add inputs to the modal - modal.addComponents(firstActionRow, secondActionRow, thirdActionRow); - - // Show the modal to the user - await interaction.showModal(modal); - }, -}; diff --git a/OLD/commands/staff.js b/OLD/commands/staff.js deleted file mode 100644 index aabf650..0000000 --- a/OLD/commands/staff.js +++ /dev/null @@ -1,43 +0,0 @@ -const { SlashCommandBuilder } = require("discord.js"); -const Maintainer = require("../models/maintainers.js"); - -module.exports = { - data: new SlashCommandBuilder() - .setName("maintainer") - .setDescription("Add staff controls.") - .addBooleanOption((option) => - option - .setName("add") - .setDescription("Add or remove a maintainer.") - .setRequired(true), - ) - .addUserOption((option) => - option - .setName("user") - .setDescription("The user to add or remove.") - .setRequired(true), - ), - async execute(interaction) { - if (interaction.user.id !== "598245488977903688") - return await interaction.reply( - "Only the bot owner can use this command!", - ); - - const add = interaction.options.getBoolean("add"); - const user = interaction.options.getUser("user"); - - if (add) { - await Maintainer.create({ - userid: user.id, - maintainer: true, - }); - - await interaction.reply(`Added ${user.username} as a maintainer.`); - } else { - await Maintainer.findOneAndDelete({ userid: user.id }); - await interaction.reply( - `Removed ${user.username} as a maintainer.`, - ); - } - }, -}; diff --git a/OLD/commands/template.js b/OLD/commands/template.js deleted file mode 100644 index b6221cd..0000000 --- a/OLD/commands/template.js +++ /dev/null @@ -1,89 +0,0 @@ -const { - SlashCommandBuilder, - ButtonBuilder, - ActionRowBuilder, - ButtonStyle, -} = require("discord.js"); -const User = require("../models/user.js"); -const { ForwardMailModal } = require("../templates/forwardmail/modal.js"); -const { EmailGithub } = require("../templates/forwardmail-github/modal.js"); -const { Replit } = require("../templates/replit/modal.js"); -const { HashNode } = require("../templates/hashnode/modal.js"); -const auth = require("../components/auth.js"); -const { GuildID } = require("../services/guildId.js"); - -module.exports = { - data: new SlashCommandBuilder() - .setName("template") - .setDescription("Premade domain templates!") - .addStringOption((option) => - option - .setName("templates") - .setDescription("Select a template") - .setRequired(true) - .addChoices( - { name: "Email Forwarder", value: "email-forwarder" }, - { - name: "GitHub Pages and Email Forwarder", - value: "github-pages-email-forwarder", - }, - { - name: "Replit.com with is-a.dev subdomain [CNAME]", - value: "replit", - }, - { - name: "HashNode with is-a.dev subdomain", - value: "hashnode", - }, - ), - ), - async execute(interaction) { - const guildId = interaction.guildId; - // get the guild object from the guild id - const guild = GuildID(guildId); - // if the guild object is false, then the guild is not registered - if (!guild) - return await interaction.reply({ - content: - "This guild is not registered with Domain Register Bot. Please contact the guild owner to register.", - ephemeral: true, - }); - - const githubUser = await User.findOne({ userid: interaction.user.id }); - - const authUrl = auth.getAccessToken(interaction.user.id); - const loginBtn = new ActionRowBuilder().addComponents( - new ButtonBuilder() - .setStyle(ButtonStyle.Link) - .setLabel("Login with GitHub") - .setURL(authUrl), - ); - - // add text reply if user is not logged in. along with login button - if (!githubUser) - return await interaction.reply({ - content: `Please login first`, - components: [loginBtn], - ephemeral: true, - }); - - const template = interaction.options.getString("templates"); - - switch (template) { - case "email-forwarder": - await ForwardMailModal(interaction); - break; - case "github-pages-email-forwarder": - await EmailGithub(interaction); - break; - case "replit": - await Replit(interaction); - break; - case "hashnode": - await HashNode(interaction); - break; - default: - return await interaction.reply("Invalid template."); - } - }, -}; diff --git a/OLD/commands/whois.js b/OLD/commands/whois.js deleted file mode 100644 index 58481cb..0000000 --- a/OLD/commands/whois.js +++ /dev/null @@ -1,144 +0,0 @@ -const { SlashCommandBuilder } = require("discord.js"); -const fetch = require("node-fetch"); -const Maintainers = require("../models/maintainers.js"); -const { GuildID } = require("../services/guildId.js"); - -module.exports = { - data: new SlashCommandBuilder() - .setName("whois") - .setDescription("[MAINTAINER] Lookup a domain's information.") - .addStringOption((option) => - option - .setName("domain") - .setDescription("The domain to lookup.") - .setRequired(true), - ), - - async execute(interaction) { - const guildId = interaction.guildId; - // get the guild object from the guild id - const guild = GuildID(guildId); - // if the guild object is false, then the guild is not registered - if (!guild) - return await interaction.reply({ - content: - "This guild is not registered with Domain Register Bot. Please contact the guild owner to register.", - ephemeral: true, - }); - - const domain = interaction.options - .getString("domain") - .toLowerCase() - .replace(/\.is-a\.dev$/, ""); - - if (!(await Maintainers.findOne({ userid: interaction.user.id }))) { - // make text appear in ephemeral message - await interaction.reply({ - content: "Only maintainers can use this command!", - ephemeral: true, - }); - return; - } - - try { - const response = await fetch( - `https://raw.githubusercontent.com/is-a-dev/register/main/domains/${domain}.json`, - { - headers: { - "User-Agent": "is-a-dev-bot", - }, - }, - ); - - if (response.status === 404) { - await interaction.reply( - `The domain ${domain}.is-a.dev is not registered!`, - ); - } else { - const data = await response.json(); - - const fileURL = `https://github.com/is-a-dev/register/blob/main/domains/${domain}.json`; - - const records = []; - const contact = []; - - Object.keys(data.owner).forEach((owner) => { - if (owner === "username") - return contact.push( - `**${owner}** ${data.owner[owner]}`, - ); - if (owner === "email") - return contact.push( - `**${owner}** ${data.owner[owner]}`, - ); - if (owner === "discord") - return contact.push( - `**${owner}** ${data.owner[owner]}`, - ); - if (owner === "twitter") - return contact.push( - `**${owner}** ${data.owner[owner]}`, - ); - if (owner === "reddit") - return contact.push( - `**${owner}** ${data.owner[owner]}`, - ); - if (owner === "note") - return contact.push( - `**${owner}** ${data.owner[owner]}`, - ); - }); - - Object.keys(data.record).forEach((record) => { - if (record === "A" || record === "MX") { - data.record[record].forEach((r) => { - records.push(`**${record}** ${r}`); - }); - - return; - } - - if (record === "URL") - return records.push( - `**${record}** ${data.record[record]}`, - ); - - records.push(`**${record}** ${data.record[record]}`); - }); - - const embed = { - title: `Whois: ${domain}.is-a.dev`, - url: fileURL, - fields: [ - { - name: "Contact", - value: contact.join("\n"), - inline: true, - }, - { - name: "Records", - value: records.join("\n"), - inline: true, - }, - ], - color: 0x00ffff, - timestamp: new Date(), - footer: { - text: "is-a.dev", - icon_url: - "https://raw.githubusercontent.com/is-a-dev/register/main/media/logo.png", - }, - }; - - await interaction.reply({ embeds: [embed] }); - } - } catch (error) { - console.error("Error performing whois lookup:", error); - await interaction.reply({ - content: - "An error occurred while performing the Whois lookup. Please try again later.", - ephemeral: true, - }); - } - }, -}; diff --git a/OLD/components/DeleteFile.js b/OLD/components/DeleteFile.js deleted file mode 100644 index ef5f81e..0000000 --- a/OLD/components/DeleteFile.js +++ /dev/null @@ -1,51 +0,0 @@ -const { Octokit } = require("@octokit/rest"); -const User = require("../models/user"); -const { EmbedBuilder } = require("discord.js"); -async function DeleteFile(domains, interaction) { - const id = interaction.user.id; - const githubUser = await User.findOne({ userid: id }); - const token = githubUser.gittoken; - const username = githubUser.githubid; - const octokit = new Octokit({ auth: token }); - const domain = domains.replace(/\.is-a\.dev$/, ""); - // get the file sha - const file = await fetch( - `https://api.github.com/repos/${username}/register/contents/domains/${domain}.json`, - ) - .then((res) => res.json()) - .catch((err) => { - console.log(err); - }); - // get the sha var from the json - console.log("DEBUG:"); - console.log(username); - console.log(domain); - console.log(file); - const sha = file.sha; - console.log(sha); - const deletefile = await octokit.repos.deleteFile({ - owner: githubUser.githubid, - repo: "register", - path: `domains/${domain}.json`, - message: `Delete ${domain}.is-a.dev`, - sha: sha, - }); - const embed = new EmbedBuilder() - .setTitle(`Deleting ${domain}.is-a.dev`) - .addFields( - { name: "Forked", value: "โœ…", inline: true }, - { name: "Commited", value: "โœ…", inline: true }, - { name: "PR Opened", value: "โŒ", inline: true }, - ) - .setDescription(`Please wait for a staff member to review your PR.`) - .setColor("#00b0f4") - .setFooter({ - text: "is-a.dev", - icon_url: - "https://raw.githubusercontent.com/is-a-dev/register/main/media/logo.png", - }); - - await interaction.editReply({ embeds: [embed] }); -} - -exports.DeleteFile = DeleteFile; diff --git a/OLD/components/Edit/modal.js b/OLD/components/Edit/modal.js deleted file mode 100644 index e9c044b..0000000 --- a/OLD/components/Edit/modal.js +++ /dev/null @@ -1,56 +0,0 @@ -const { - SlashCommandBuilder, - ActionRowBuilder, - ModalBuilder, - TextInputBuilder, - TextInputStyle, - fetchRecommendedShardCount, -} = require("discord.js"); -async function EditModal(interaction) { - const domains = interaction.values[0]; - const domain = domains.replace(/\.is-a\.dev$/, ""); - const response = await fetch( - `https://raw.githubusercontent.com/is-a-dev/register/main/domains/${domain}.json`, - { - headers: { - "User-Agent": "is-a-dev-bot", - }, - }, - ); - const data = await response.json(); - console.log(data); - const records = []; - Object.keys(data.record).forEach((record) => { - if (record === "A" || record === "MX") { - data.record[record].forEach((r) => { - records.push(`**${record}** ${r}`); - }); - - return; - } - - if (record === "URL") - return records.push(`**${record}** ${data.record[record]}`); - - records.push(`${data.record[record]}`); - }); - // make a modal that displays the current records - let recordsTypes = []; - if (data.record === "CNAME") { - recordsTypes.push("CNAME"); - } - if (data.record === "A") { - recordsTypes.push("A"); - } - if (data.record === "MX") { - recordsTypes.push("MX"); - } - if (data.record === "URL") { - recordsTypes.push("URL"); - } - if (data.record === "TXT") { - recordsTypes.push("TXT"); - } - console.log(recordsTypes); -} -exports.EditModal = EditModal; diff --git a/OLD/components/adminSendEmails.js b/OLD/components/adminSendEmails.js deleted file mode 100644 index 60ddf01..0000000 --- a/OLD/components/adminSendEmails.js +++ /dev/null @@ -1,36 +0,0 @@ -const sgMail = require("@sendgrid/mail"); -require("dotenv").config(); -sgMail.setApiKey(process.env.SENDGRID_API_KEY); -const adminemail = process.env.ADMIN_EMAIL; -function adminSendEmails(interaction) { - const email = interaction.fields.getTextInputValue("email"); - const subject = interaction.fields.getTextInputValue("subject"); - const message = interaction.fields.getTextInputValue("message"); - const htmlmessage = `

${message}

- -

This email was sent on behalf of Is-a.dev from ${interaction.member.user.username}

- `; - const msg = { - to: email, // Change to your recipient - from: adminemail, // Change to your verified sender - subject: subject, - text: message, - html: htmlmessage, - headers: { - "List-Unsubscribe": ``, - }, - }; - sgMail - .send(msg) - .then(async (response) => { - console.log(response[0].statusCode); - console.log(response[0].headers); - await interaction.reply({ content: "Email sent!" }); - }) - .catch(async (error) => { - console.error(error); - await interaction.reply({ content: "Email failed to send!" }); - }); -} - -exports.adminSendEmails = adminSendEmails; diff --git a/OLD/components/auth.js b/OLD/components/auth.js deleted file mode 100644 index d4f6433..0000000 --- a/OLD/components/auth.js +++ /dev/null @@ -1,11 +0,0 @@ -require("dotenv").config(); - -const GITHUB_ID = process.env.GITHUB_ID; -const SERVER_URL = process.env.SERVER_URL; - -function getAccessToken(DiscordID) { - const authUrl = `https://github.com/login/oauth/authorize?client_id=${GITHUB_ID}&scope=public_repo%20user:email&redirect_uri=https://${SERVER_URL}/auth/handler?discordId=${DiscordID}`; - return authUrl; -} - -exports.getAccessToken = getAccessToken; diff --git a/OLD/components/commit.js b/OLD/components/commit.js deleted file mode 100644 index 8d7aeb0..0000000 --- a/OLD/components/commit.js +++ /dev/null @@ -1,112 +0,0 @@ -const User = require("../models/user"); -const { Octokit } = require("@octokit/rest"); -const { OpenPR } = require("../components/pr.js"); - -require("dotenv").config(); - -const { EmbedBuilder } = require("discord.js"); - -async function CommitChanges(id, subdomain, type, data, interaction) { - let pass = "fail"; - const githubUser = await User.findOne({ userid: id }); - const token = githubUser.gittoken; - const username = githubUser.githubid; - const email = githubUser.email; - - if (process.env.DEBUG) { - console.log("COMMIT FUNCTION."); - console.log("id: " + id); - console.log("token: " + token); - console.log("username: " + username); - console.log("email: " + email); - } - - const octokit = new Octokit({ auth: token }); - - if (type === "A" || type === "MX") { - data = JSON.stringify(data.split(",").map((s) => s.trim())); - } else { - data = `"${data.trim()}"`; - } - - const ifexistsurl = `https://raw.githubusercontent.com/${username}/register/main/domains/${subdomain}.json`; - const ifexists = await fetch(ifexistsurl); - //console.log(ifexistsurl); - //console.log(ifexists.status); - - if (ifexists.status === 200) { - const ErrorEmbed = new EmbedBuilder() - .setTitle(`Registering ${subdomain}.is-a.dev`) - .setURL(ifexistsurl) - .setDescription(`This domain already exists!`) - .addFields( - { name: "Forked", value: "โœ…", inline: true }, - { name: "Commited", value: "โŒ", inline: true }, - { name: "PR Opened", value: "โŒ", inline: true }, - ) - .setColor("#FF0000") - .setFooter({ - text: "is-a.dev", - iconURL: - "https://raw.githubusercontent.com/is-a-dev/register/main/media/logo.png", - }); - - await interaction.editReply({ embeds: [ErrorEmbed] }); - return; - } - - content = `{ - "owner": { - "username": "${username}", - "email": "${email}", - "discord": "${id}" - }, - - "record": { - "${type}": ${data.toLowerCase()} - } -} -`; - - const record = Buffer.from(content).toString("base64"); - - const commit = await octokit.repos.createOrUpdateFileContents({ - owner: username, - repo: "register", - path: "domains/" + subdomain.toLowerCase() + ".json", - message: `feat(domain): ${subdomain - .toLowerCase() - .replace(/\.[^/.]+$/, "")}.is-a.dev`, - content: record, - committer: { - name: username, - email: email, - }, - author: { - name: username, - email: email, - }, - }); - - const embed = new EmbedBuilder() - .setTitle(`Registering ${subdomain}.is-a.dev`) - .addFields( - { name: "Forked", value: "โœ…", inline: true }, - { name: "Commited", value: "โœ…", inline: true }, - { name: "PR Opened", value: "โŒ", inline: true }, - ) - .setDescription(`Pushing Domain.`) - .setColor("#00b0f4") - .setFooter({ - text: "is-a.dev", - icon_url: - "https://raw.githubusercontent.com/is-a-dev/register/main/media/logo.png", - }); - - await interaction.editReply({ embeds: [embed] }); - pass = "true"; - await OpenPR(interaction.user.id, subdomain, interaction); - return pass; -} - -exports.CommitChanges = CommitChanges; diff --git a/OLD/components/delete.js b/OLD/components/delete.js deleted file mode 100644 index 218b71c..0000000 --- a/OLD/components/delete.js +++ /dev/null @@ -1,70 +0,0 @@ -const { - SlashCommandBuilder, - StringSelectMenuBuilder, - ActionRowBuilder, - ButtonBuilder, - ButtonStyle, -} = require("discord.js"); - -const { fork } = require("./delfork.js"); -const { DeleteFile } = require("./DeleteFile.js"); -const { DeletePR } = require("./deletePr.js"); - -async function DeleteDomain(interaction) { - console.log(interaction.values); - const domain = interaction.values[0]; - - console.log(domain); - console.log(interaction.user); - - const username = interaction.user.username; - const confirm = new ButtonBuilder() - .setCustomId("confirm") - .setLabel("Confirm Delete") - .setStyle(ButtonStyle.Danger); - - const cancel = new ButtonBuilder() - .setCustomId("cancel") - .setLabel("Cancel") - .setStyle(ButtonStyle.Secondary); - - const row = new ActionRowBuilder().addComponents(cancel, confirm); - - const response = await interaction.reply({ - content: `Are you sure you want to delete ${domain}?`, - components: [row], - ephemeral: true, - }); - - const collectorFilter = (i) => i.user.id === interaction.user.id; - - try { - const confirmation = await response.awaitMessageComponent({ - filter: collectorFilter, - time: 60000, - }); - - if (confirmation.customId === "confirm") { - await confirmation.update({ content: `Delete.`, components: [] }); - await fork(interaction.user.id, interaction, domain); - await new Promise((r) => setTimeout(r, 3000)); - await DeleteFile(domain, interaction); - await new Promise((r) => setTimeout(r, 3000)); - await DeletePR(interaction, domain); - } else if (confirmation.customId === "cancel") { - await confirmation.update({ - content: "Action cancelled", - components: [], - }); - } - } catch (e) { - await interaction.editReply({ - content: "Confirmation not received within 1 minute, cancelling", - components: [], - }); - - return; - } -} - -exports.DeleteDomain = DeleteDomain; diff --git a/OLD/components/deletePr.js b/OLD/components/deletePr.js deleted file mode 100644 index 4e9c3bd..0000000 --- a/OLD/components/deletePr.js +++ /dev/null @@ -1,53 +0,0 @@ -const User = require("../models/user"); -const { Octokit } = require("@octokit/rest"); - -require("dotenv").config(); - -const { - EmbedBuilder, - ActionRowBuilder, - ButtonBuilder, - ButtonStyle, -} = require("discord.js"); -async function DeletePR(interaction, subdomain) { - const id = interaction.user.id; - const githubUser = await User.findOne({ userid: id }); - const token = githubUser.gittoken; - const username = githubUser.githubid; - const email = githubUser.email; - const octokit = new Octokit({ auth: token }); - const pr = await octokit.pulls.create({ - owner: "is-a-dev", - repo: "register", - title: `BETA: Delete ${subdomain}`, - head: `${username}:main`, - base: "main", - body: `Delete ${subdomain} using the Discord bot.`, - }); - const PrUrl = pr.data.html_url; - - const embed = new EmbedBuilder() - .setTitle(`Deleteing ${subdomain}`) - .addFields( - { name: "Forked ", value: "โœ…", inline: true }, - { name: "Commited ", value: "โœ…", inline: true }, - { name: "PR Opened ", value: "โœ…", inline: true }, - ) - .setColor("#00b0f4") - .setFooter({ - text: "is-a.dev", - icon_url: - "https://raw.githubusercontent.com/is-a-dev/register/main/media/logo.png", - }); - - await interaction.editReply({ embeds: [embed] }); - const PrBtn = new ActionRowBuilder().addComponents( - new ButtonBuilder() - .setStyle(ButtonStyle.Link) - .setLabel("Pull Request") - .setURL(PrUrl), - ); - await interaction.editReply({ components: [PrBtn] }); -} - -module.exports = { DeletePR }; diff --git a/OLD/components/delfork.js b/OLD/components/delfork.js deleted file mode 100644 index fc53a6e..0000000 --- a/OLD/components/delfork.js +++ /dev/null @@ -1,67 +0,0 @@ -const User = require("../models/user"); -const { EmbedBuilder } = require("discord.js"); -const { Octokit } = require("@octokit/core"); -require("dotenv").config(); -const Sentry = require("@sentry/node"); -const { GuildID } = require("../services/guildId.js"); - -const forkRepo = async (token, guild) => { - try { - // Fork the repository - const username = guild.github; - const respository = guild.repository; - const logo = guild.logo; - const octokit = new Octokit({ - auth: token, - }); - - const forked = await octokit.request( - "POST /repos/{owner}/{repo}/forks", - { - owner: username, - repo: respository, - name: "register", - default_branch_only: true, - headers: { - "X-GitHub-Api-Version": "2022-11-28", - }, - }, - ); - const cloneResponse = forked.data.clone_url; - if (process.env.DEBUG) { - console.log("FORKED REPO: " + cloneResponse); - } - return cloneResponse; - } catch (error) { - console.log(error); - } -}; - -async function fork(id, interaction, subdomain) { - const usersguild = interaction.guildId; - const guild = await GuildID(usersguild); - const githubUser = await User.findOne({ userid: id }); - const token = githubUser.gittoken; - Sentry.setUser({ Discord: id }); - if (process.env.DEBUG) { - console.log("FORK FUNCTION."); - console.log("id: " + id); - console.log("token: " + token); - } - const responce = await forkRepo(token, guild); - const embed = new EmbedBuilder() - .setTitle(`Deleteing ${subdomain}`) - .addFields( - { name: "Forked ", value: "โœ…", inline: true }, - { name: "Commited ", value: "โŒ", inline: true }, - { name: "PR Opened ", value: "โŒ", inline: true }, - ) - .setColor("#00b0f4") - .setFooter({ - text: "is-a.dev", - icon_url: guild.logo, - }); - await interaction.editReply({ embeds: [embed] }); - return responce; -} -exports.fork = fork; diff --git a/OLD/components/fork.js b/OLD/components/fork.js deleted file mode 100644 index 2429700..0000000 --- a/OLD/components/fork.js +++ /dev/null @@ -1,67 +0,0 @@ -const User = require("../models/user"); -const { EmbedBuilder } = require("discord.js"); -const { Octokit } = require("@octokit/core"); -require("dotenv").config(); -const Sentry = require("@sentry/node"); -const { GuildID } = require("../services/guildId.js"); - -const forkRepo = async (token, guild) => { - try { - // Fork the repository - const username = guild.github; - const respository = guild.repository; - const logo = guild.logo; - const octokit = new Octokit({ - auth: token, - }); - - const forked = await octokit.request( - "POST /repos/{owner}/{repo}/forks", - { - owner: username, - repo: respository, - name: "register", - default_branch_only: true, - headers: { - "X-GitHub-Api-Version": "2022-11-28", - }, - }, - ); - const cloneResponse = forked.data.clone_url; - if (process.env.DEBUG) { - console.log("FORKED REPO: " + cloneResponse); - } - return cloneResponse; - } catch (error) { - console.log(error); - } -}; - -async function fork(id, interaction, subdomain) { - const usersguild = interaction.guildId; - const guild = await GuildID(usersguild); - const githubUser = await User.findOne({ userid: id }); - const token = githubUser.gittoken; - Sentry.setUser({ Discord: id }); - if (process.env.DEBUG) { - console.log("FORK FUNCTION."); - console.log("id: " + id); - console.log("token: " + token); - } - const responce = await forkRepo(token, guild); - const embed = new EmbedBuilder() - .setTitle(`Registering ${subdomain}.is-a.dev`) - .addFields( - { name: "Forked ", value: "โœ…", inline: true }, - { name: "Commited ", value: "โŒ", inline: true }, - { name: "PR Opened ", value: "โŒ", inline: true }, - ) - .setColor("#00b0f4") - .setFooter({ - text: "is-a.dev", - icon_url: guild.logo, - }); - await interaction.editReply({ embeds: [embed] }); - return responce; -} -exports.fork = fork; diff --git a/OLD/components/pr.js b/OLD/components/pr.js deleted file mode 100644 index abf1766..0000000 --- a/OLD/components/pr.js +++ /dev/null @@ -1,116 +0,0 @@ -const User = require("../models/user"); -const { Octokit } = require("@octokit/rest"); - -require("dotenv").config(); - -const { - EmbedBuilder, - ActionRowBuilder, - ButtonBuilder, - ButtonStyle, -} = require("discord.js"); - -async function OpenPR(id, subdomain, interaction, extra) { - const githubUser = await User.findOne({ userid: id }); - const token = githubUser.gittoken; - const username = githubUser.githubid; - const email = githubUser.email; - - if (process.env.DEBUG) { - console.log("PR FUNCTION."); - console.log("id: " + id); - console.log("token: " + token); - console.log("username: " + username); - console.log("email: " + email); - } - - const octokit = new Octokit({ auth: token }); - let existingPullRequests = await octokit.pulls.list({ - owner: "is-a-dev", - repo: "register", - state: "open", - head: `${username}:main`, - base: "main", - }); - - if (existingPullRequests.data.length > 0) { - // Pull request already exists, return an error or handle it accordingly - - const embed = new EmbedBuilder() - .setTitle(`Registering ${subdomain}.is-a.dev`) - .addFields( - { name: "Forked ", value: "โœ…", inline: true }, - { name: "Commited ", value: "โœ…", inline: true }, - { name: "PR Opened ", value: "โŒ", inline: true }, - ) - .setColor("#FF0000") - .setDescription("A pull request already exists") - .setFooter({ - text: "is-a.dev", - icon_url: - "https://raw.githubusercontent.com/is-a-dev/register/main/media/logo.png", - }); - - await interaction.editReply({ embeds: [embed] }); - return; - } - - const pr = await octokit.pulls.create({ - owner: "is-a-dev", - repo: "register", - title: `BETA: Register ${subdomain - .toLowerCase() - .replace(/\.[^/.]+$/, "")}.is-a.dev`, - head: `${username}:main`, - base: "main", - body: `Added \`${subdomain - .toLowerCase() - .replace(/\.[^/.]+$/, "")}.is-a.dev\` using the Discord bot.`, - }); - - const PrUrl = pr.data.html_url; - - const embed = new EmbedBuilder() - .setTitle(`Registering ${subdomain}.is-a.dev`) - .addFields( - { name: "Forked ", value: "โœ…", inline: true }, - { name: "Commited ", value: "โœ…", inline: true }, - { name: "PR Opened ", value: "โœ…", inline: true }, - ) - .setColor("#00b0f4") - .setDescription( - "Your domain has been generated! Please wait for a staff member to review your PR.", - ) - .setFooter({ - text: "is-a.dev", - icon_url: - "https://raw.githubusercontent.com/is-a-dev/register/main/media/logo.png", - }); - - await interaction.editReply({ embeds: [embed] }); - - if (extra) { - const PrBtn = new ActionRowBuilder().addComponents( - new ButtonBuilder() - .setStyle(ButtonStyle.Link) - .setLabel("Pull Request") - .setURL(PrUrl), - new ButtonBuilder() - .setStyle(ButtonStyle.Link) - .setLabel(extra.label) - .setURL(extra.url), - ); - await interaction.editReply({ components: [PrBtn] }); - } else { - const PrBtn = new ActionRowBuilder().addComponents( - new ButtonBuilder() - .setStyle(ButtonStyle.Link) - .setLabel("Pull Request") - .setURL(PrUrl), - ); - await interaction.editReply({ components: [PrBtn] }); - } - return pr; -} - -exports.OpenPR = OpenPR; diff --git a/OLD/components/web/CheckDomain.js b/OLD/components/web/CheckDomain.js deleted file mode 100644 index d3b99f7..0000000 --- a/OLD/components/web/CheckDomain.js +++ /dev/null @@ -1,18 +0,0 @@ -async function CheckDomain(subdomain) { - // check if domain is available - let result = false; - await fetch("https://raw-api.is-a.dev") - .then((response) => response.json()) - .then(async (data) => { - result = data.some((item) => item.domain === subdomain); - if (result) { - const da = { domain: subdomain, available: false }; - return da; - } else { - const db = { domain: subdomain, available: true }; - return db; - } - }); -} - -exports.CheckDomain = CheckDomain; diff --git a/OLD/components/web/Count.js b/OLD/components/web/Count.js deleted file mode 100644 index c2c0b7a..0000000 --- a/OLD/components/web/Count.js +++ /dev/null @@ -1,32 +0,0 @@ -async function CountDomains() { - try { - const response = await fetch("https://raw-api.is-a.dev"); - const data = await response.json(); - const results = countDomainsAndOwners(data); - return results; - } catch (error) { - console.error("Error:", error); - return null; - } -} - -function countDomainsAndOwners(jsonData) { - const parsedData = jsonData; - const subdomains = parsedData.length; - const owners = new Set(); - - parsedData.forEach((entry) => { - if (entry.owner) { - owners.add(JSON.stringify(entry.owner)); - } - }); - - const individualOwners = owners.size; - - return { - subdomains, - individualOwners, - }; -} - -exports.CountDomains = CountDomains; diff --git a/OLD/components/web/DeleteDomain.js b/OLD/components/web/DeleteDomain.js deleted file mode 100644 index 8c94549..0000000 --- a/OLD/components/web/DeleteDomain.js +++ /dev/null @@ -1,70 +0,0 @@ -const { Octokit } = require("@octokit/rest"); -async function DeleteDomain(apikey, username, email, domain) { - let sha; - let file; - try { - file = await fetch( - `https://api.github.com/repos/${username}/register/contents/domains/${domain}.json`, - ) - .then((res) => res.json()) - .catch((err) => { - console.log(err); - }); - sha = file.sha; - } catch (e) { - console.log(e); - return { error: "Can't locate file." }; - } - let octokit = new Octokit({ - auth: apikey, - }); - try { - let commit = await octokit.repos.deleteFile({ - owner: username, - repo: "register", - path: "domains/" + domain + ".json", - message: `Delete ${domain}.is-a.dev`, - sha: sha, - committer: { - name: username, - email: email, - }, - }); - } catch (e) { - console.log(e); - return { error: "Error deleting domain" }; - } - try { - let existingPullRequests = await octokit.pulls.list({ - owner: "is-a-dev", - repo: "register", - state: "open", - head: `${username}:main`, - base: "main", - }); - - if (existingPullRequests.data.length > 0) { - // Pull request already exists, return an error or handle it accordingly - return { error: "A pull request already exists." }; - } - let pr = await octokit.pulls.create({ - owner: "is-a-dev", - repo: "register", - title: `BETA: Delete ${domain - .toLowerCase() - .replace(/\.[^/.]+$/, "")}.is-a.dev`, - head: `${username}:main`, - base: "main", - body: `Deleted \`${domain - .toLowerCase() - .replace(/\.[^/.]+$/, "")}.is-a.dev\` using the site.`, - }); - let PrUrl = pr.data.html_url; - return { prurl: PrUrl }; - } catch (e) { - console.log(e); - return { error: "Error creating pull request." }; - } -} - -exports.DeleteDomain = DeleteDomain; diff --git a/OLD/components/web/DomainInfo.js b/OLD/components/web/DomainInfo.js deleted file mode 100644 index 01aff4b..0000000 --- a/OLD/components/web/DomainInfo.js +++ /dev/null @@ -1,31 +0,0 @@ -async function DomainInfo(domain) { - const domains = domain; - const response = await fetch( - `https://raw.githubusercontent.com/is-a-dev/register/main/domains/${domains}.json`, - { - headers: { - "User-Agent": "is-a-dev-bot", - }, - }, - ); - console.log(response); - if (response.status === 404) { - return { error: "Domain not found" }; - } else { - const data = await response.json(); - const record = data.record; - const records = Object.entries(record).map(([type, value]) => ({ - type, - value, - })); - const owner = data.owner; - const json = { - domain: domain, - record: records, - owner: owner, - }; - return json; - } -} - -exports.DomainInfo = DomainInfo; diff --git a/OLD/components/web/Edit.js b/OLD/components/web/Edit.js deleted file mode 100644 index e890a37..0000000 --- a/OLD/components/web/Edit.js +++ /dev/null @@ -1,96 +0,0 @@ -const { Octokit } = require("@octokit/rest"); -async function EditDomain(subdomain, username, email, apikey, records) { - let file = await fetch( - `https://api.github.com/repos/${username}/register/contents/domains/${subdomain}.json`, - ) - .then((res) => res.json()) - .catch((err) => { - console.log(err); - }); - let sha = file.sha; - let octokit = new Octokit({ - auth: apikey, - }); - let data = records; - const parsedArray = JSON.parse(data); - let content = ""; - let value = ""; - - for (let i = 0; i < parsedArray.length; i++) { - const obj = parsedArray[i]; - type = obj.type; - value = obj.value; - - console.log("Type:", type); - console.log("Value:", value); - } - - content = `{ - "owner": { - "username": "${username}", - "email": "${email}" - }, - "record": { - "${type}": "${value}" - } - } - `; - - let record = Buffer.from(content).toString("base64"); - - try { - let commit = await octokit.repos.createOrUpdateFileContents({ - owner: username, - repo: "register", - path: "domains/" + subdomain + ".json", - message: `feat(domain): ${subdomain}.is-a.dev`, - content: record, - sha: sha, - committer: { - name: username, - email: email, - }, - author: { - name: username, - email: email, - }, - }); - } catch (e) { - console.log(e); - return { error: "Error creating domain file." }; - } - - try { - let existingPullRequests = await octokit.pulls.list({ - owner: "is-a-dev", - repo: "register", - state: "open", - head: `${username}:main`, - base: "main", - }); - - if (existingPullRequests.data.length > 0) { - // Pull request already exists, return an error or handle it accordingly - return { error: "A pull request for this domain already exists." }; - } - let pr = await octokit.pulls.create({ - owner: "is-a-dev", - repo: "register", - title: `BETA: Update ${subdomain - .toLowerCase() - .replace(/\.[^/.]+$/, "")}.is-a.dev`, - head: `${username}:main`, - base: "main", - body: `Updated \`${subdomain - .toLowerCase() - .replace(/\.[^/.]+$/, "")}.is-a.dev\` using the site.`, - }); - let PrUrl = pr.data.html_url; - return { prurl: PrUrl }; - } catch (e) { - console.log(e); - return { error: "Error creating pull request." }; - } -} - -exports.EditDomain = EditDomain; diff --git a/OLD/components/web/Register.js b/OLD/components/web/Register.js deleted file mode 100644 index 21cf43c..0000000 --- a/OLD/components/web/Register.js +++ /dev/null @@ -1,108 +0,0 @@ -const { Octokit } = require("@octokit/rest"); -async function RegisterDomain( - subdomain, - type, - username, - email, - apikey, - recordString, -) { - switch (type) { - case "A": - regexPattern = /^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$/; - break; - case "CNAME": - regexPattern = /^[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*$/; - break; - case "MX": - regexPattern = /^[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*$/; - break; - case "TXT": - regexPattern = /^.*$/; - break; - case "URL": - regexPattern = - /^(https?:\/\/)?(www\.)?([a-zA-Z0-9-]+\.){1,}[a-zA-Z]{2,}(\/[a-zA-Z0-9-_.~:/?#[\]@!$&'()*+,;=%]*)?$/; - break; - default: - return { error: "Invalid record type." }; - } - if (!regexPattern.test(recordString)) - return { error: "Invalid record string." }; - let octokit = new Octokit({ - auth: apikey, - }); - let data = recordString; - if (type === "A" || type === "MX") { - data = JSON.stringify(data.split(",").map((s) => s.trim())); - } else { - data = `"${data.trim()}"`; - } - content = `{ - "owner": { - "username": "${username}", - "email": "${email}" - }, - "record": { - "${type}": ${data.toLowerCase()} - } - } - `; - - let record = Buffer.from(content).toString("base64"); - - try { - let commit = await octokit.repos.createOrUpdateFileContents({ - owner: username, - repo: "register", - path: "domains/" + subdomain + ".json", - message: `feat(domain): ${subdomain}.is-a.dev`, - content: record, - committer: { - name: username, - email: email, - }, - author: { - name: username, - email: email, - }, - }); - } catch (e) { - console.log(e); - return { error: "Error creating domain file." }; - } - - try { - let existingPullRequests = await octokit.pulls.list({ - owner: "is-a-dev", - repo: "register", - state: "open", - head: `${username}:main`, - base: "main", - }); - - if (existingPullRequests.data.length > 0) { - // Pull request already exists, return an error or handle it accordingly - return { error: "A pull request for this domain already exists." }; - } - let pr = await octokit.pulls.create({ - owner: "is-a-dev", - repo: "register", - title: `BETA: Register ${subdomain - .toLowerCase() - .replace(/\.[^/.]+$/, "")}.is-a.dev`, - head: `${username}:main`, - base: "main", - body: `Added \`${subdomain - .toLowerCase() - .replace(/\.[^/.]+$/, "")}.is-a.dev\` using the site.`, - }); - let PrUrl = pr.data.html_url; - return { prurl: PrUrl }; - } catch (e) { - console.log(e); - return { error: "Error creating pull request." }; - } -} - -exports.RegisterDomain = RegisterDomain; diff --git a/OLD/components/web/fork.js b/OLD/components/web/fork.js deleted file mode 100644 index e20bf53..0000000 --- a/OLD/components/web/fork.js +++ /dev/null @@ -1,38 +0,0 @@ -const { Octokit } = require("@octokit/core"); -require("dotenv").config(); -const Sentry = require("@sentry/node"); - -const forkRepo = async (token) => { - let forked; - try { - // Fork the repository - const respository = "is-a-dev"; - const octokit = new Octokit({ - auth: token, - }); - - forked = await octokit.request("POST /repos/{owner}/{repo}/forks", { - owner: "is-a-dev", - repo: "register", - name: "register", - default_branch_only: true, - headers: { - "X-GitHub-Api-Version": "2022-11-28", - }, - }); - const cloneResponse = forked.data.html_url; - if (process.env.DEBUG) { - console.log("FORKED REPO: " + cloneResponse); - } - return cloneResponse; - } catch (error) { - console.log("ERROR: " + error); - return error; - } -}; - -async function WebFork(apikey) { - const responce = await forkRepo(apikey); - return responce; -} -exports.WebFork = WebFork; diff --git a/OLD/components/web/listDomains.js b/OLD/components/web/listDomains.js deleted file mode 100644 index 9b23148..0000000 --- a/OLD/components/web/listDomains.js +++ /dev/null @@ -1,39 +0,0 @@ -async function ListDomains(username) { - let results = []; - - // Assuming 'username' is defined and assigned a value - - // Assuming 'fetch' is a valid function that retrieves data from a given URL - await fetch("https://raw-api.is-a.dev") - .then((response) => response.json()) - .then(async (data) => { - // Code inside the fetch promise handler - // It receives the response and parses it as JSON data - - for (let i = 0; i < data.length; i++) { - // Iterates over each element in the data array - - if (data[i].owner.username === username) { - // Checks if the username (case-insensitive) matches the current data record's owner - - const record = data[i].record; - const arr = Object.entries(record).map(([type, value]) => ({ - type, - value, - })); - // Extracts the record property from the current data record - // Converts the record object to an array of objects with 'type' and 'value' keys - - results.push({ domain: data[i].domain, record: arr }); - // Adds a new object to the results array - // The object contains the domain and the converted record array - - found = true; - // Sets a variable 'found' to true - } - } - }); - - return results; -} -exports.ListDomains = ListDomains; diff --git a/OLD/components/webserver.js b/OLD/components/webserver.js deleted file mode 100644 index 756da25..0000000 --- a/OLD/components/webserver.js +++ /dev/null @@ -1,368 +0,0 @@ -const express = require("express"); -var cors = require("cors"); -const multer = require("multer"); -const fetch = require("node-fetch"); -const { Octokit } = require("@octokit/rest"); -const User = require("../models/user.js"); -const Prdata = require("../models/prdata.js"); -const Activation = require("../models/activation.js"); -const prdata = require("../models/prdata.js"); -const { ListDomains } = require("./web/listDomains.js"); -const { CheckDomain } = require("./web/CheckDomain.js"); -const { CountDomains } = require("./web/Count.js"); -const { DomainInfo } = require("./web/DomainInfo.js"); -const { WebFork } = require("./web/fork.js"); -const { RegisterDomain } = require("./web/Register.js"); -const { EditDomain } = require("./web/Edit.js"); -const { DeleteDomain } = require("./web/DeleteDomain.js"); -require("dotenv").config(); -const controller = require("../models/control.js"); - -const GITHUB_ID = process.env.GITHUB_ID; -const GITHUB_SECRET = process.env.GITHUB_SECRET; - -const upload = multer(); -const server = express(); -server.set("view engine", "ejs"); -server.use(cors()); - -server.get("/auth/handler", async (req, res) => { - const code = req.query.code; - const discordId = req.query.discordId; - - const response = await fetch( - `https://github.com/login/oauth/access_token?client_id=${GITHUB_ID}&client_secret=${GITHUB_SECRET}&code=${code}`, - { - method: "POST", - headers: { - "Content-Type": "application/json", - Accept: "application/json", - }, - }, - ); - - const data = await response.json(); - - const accessToken = data.access_token; - - // get user info - const userResponse = await fetch("https://api.github.com/user", { - headers: { - Accept: "application/json", - Authorization: `Bearer ${accessToken}`, - }, - }); - - const userData = await userResponse.json(); - const username = userData.login; - - // get user email - const emailResponse = await fetch("https://api.github.com/user/emails", { - headers: { - Accept: "application/json", - Authorization: `Bearer ${accessToken}`, - }, - }); - - const emailData = await emailResponse.json(); - const email = emailData[0].email; - - if (await User.findOne({ userid: discordId })) { - await User.replaceOne({ userid: discordId }, { gittoken: accessToken }); - - res.send("You are already logged in!"); - return; - } - - await User.create({ - userid: discordId, - githubid: username, - email: email, - gittoken: accessToken, - }); - - res.render("logged-in", { username }); -}); - -server.get("/guides/forwarder", (req, res) => { - // get query params from url and store in variables - const email = req.query.email; - const subdomain = req.query.domain; - res.render("email-forwarder", { email, subdomain }); -}); - -server.get("/guides/replit", (req, res) => { - // get query param - const replurl = req.query.repl; - const subdomain = req.query.domain; - res.render("replit", { replurl, subdomain }); -}); - -server.get("/api/domains", async (req, res) => { - const domain = req.query.domain; - const username = req.query.username; - if (!domain && !username) { - res.send("No domain or username provided."); - return; - } - if (domain) { - let domains = await DomainInfo(domain); - if (domains.error) { - res.status(404).send(domains); - return; - } else { - res.send(domains); - return; - } - } - if (username) { - const domains = await ListDomains(username); - res.send(domains); - return; - } - const domains = await ListDomains(username); - res.send(domains); -}); - -server.get("/api/check-domain", async (req, res) => { - const domain = req.query.domain; - const result = await CheckDomain(domain); - res.send(result); -}); - -server.get("/api/count-domains", async (req, res) => { - const result = await CountDomains(); - res.json(result); -}); - -server.post("/api/email", upload.none(), (req, res) => { - const body = req.body; - - console.log(`From: ${body.from}`); - console.log(`To: ${body.to}`); - console.log(`Subject: ${body.subject}`); - console.log(`Text: ${body.text}`); - const text = body.from; - const emailRegex = /<([^>]+)>/; - const match = text.match(emailRegex); - let emailAddress; - - if (match && match[1]) { - emailAddress = match[1]; - console.log(emailAddress); - } else { - console.log("No email address found."); - } - // send to discord webhook - // send to discord channel #email without webhook (for now) - const channel = client.channels.cache.get("1134982019345035354"); - channel.send( - `**From:** ${body.from}\n**To:** ${body.to}\n**Subject:** ${body.subject}\n**Text:** ${body.text}`, - ); - - return res.status(200).send(); -}); - -server.get("/api/fork", async (req, res) => { - //const DisableFork = await controller.findOne({ name: "DisableFork" }); - //if (DisableFork.status === "true") { - // res.status(500).json({ "ERROR": "This endpoint is currently disabled." }); - // return; - //} - const apikey = req.query.apikey; - if (!apikey) { - res.json({ Error: "No Apikey provided" }); - return; - } - const result = await WebFork(apikey); - res.send(result); -}); - -server.get("/api/register", upload.none(), async (req, res) => { - //if (DisableRegister.status === "true") { - // res.status(500).json({ "ERROR": "This endpoint is currently disabled." }); - // return; - //} - console.log("Got query:", req.query); - if (!req.query.username || !req.query.apikey || !req.query.subdomain) { - res.send("No username, apikey, or subdomain provided."); - return; - } - const type = req.query.type; - const content = req.query.content; - const username = req.query.username; - const apikey = req.query.apikey; - const email = req.query.email; - const subdomain = req.query.subdomain; - - //res.status(500).send({"ERROR": "This endpoint is currently disabled."}); - //return; - - const result = await RegisterDomain( - subdomain, - type, - username, - email, - apikey, - content, - ); - // if result json contains ERROR, send error - if (result.error) { - res.status(500).send(result); - return; - } else { - res.status(202).send(result); - return; - } - //send response and status code - // - //res.send("body: " + JSON.stringify(body) + "\nusername: " + username + "\napikey: " + apikey + "\nemail: " + email + "\nsubdomain: " + subdomain); -}); - -server.get("/api/edit", upload.none(), async (req, res) => { - //if (DisableRegister.status === "true") { - // res.status(500).json({ "ERROR": "This endpoint is currently disabled." }); - // return; - //} - console.log("Got query:", req.query); - if (!req.query.username || !req.query.apikey || !req.query.subdomain) { - res.send("No username, apikey, or subdomain provided."); - return; - } - let records = req.query.records; - let username = req.query.username; - let apikey = req.query.apikey; - let email = req.query.email; - let subdomain = req.query.subdomain; - - //res.status(500).send({"ERROR": "This endpoint is currently disabled."}); - //return; - - const result = await EditDomain( - subdomain, - username, - email, - apikey, - records, - ); - // if result json contains ERROR, send error - if (result.error) { - res.status(500).send(result); - return; - } else { - res.status(202).send(result); - return; - } - //send response and status code - // - //res.send("body: " + JSON.stringify(body) + "\nusername: " + username + "\napikey: " + apikey + "\nemail: " + email + "\nsubdomain: " + subdomain); -}); - -server.get("/api/delete", upload.none(), async (req, res) => { - //if (DisableRegister.status === "true") { - // res.status(500).json({ "ERROR": "This endpoint is currently disabled." }); - // return; - //} - console.log("Got query:", req.query); - if (!req.query.username || !req.query.apikey || !req.query.subdomain) { - res.send("No username, apikey, or subdomain provided."); - return; - } - let username = req.query.username; - let apikey = req.query.apikey; - let email = req.query.email; - let subdomain = req.query.subdomain; - - let result = await DeleteDomain(apikey, username, email, subdomain); - // if result json contains ERROR, send error - if (result.error) { - res.status(500).send(result); - return; - } else { - res.status(202).send(result); - return; - } -}); - -server.get("/api/preregister", async function (req, res) { - let pr = req.query.pr; - let domain = req.query.domain; - let activation_code = req.query.activation_code; - let token = req.query.token; - if (!pr || !domain || !activation_code || !token) { - res.send("No pr, domain, activation_code, or token provided."); - return; - } - if (token !== process.env.WEBHOST_TOKEN) { - res.send("Invalid token."); - return; - } - await Activation.create({ - prid: pr, - domain: domain, - activation_code: activation_code, - }); - res.send("OK"); -}); - -// Notify API -server.get("/pr/merged/:pr", async function (req, res) { - var pr = req.params.pr; - - const BOT_TOKEN = process.env.BOT_TOKEN; - - const octokit = new Octokit({ - auth: BOT_TOKEN, - }); - - const PRDATA = await Prdata.findOne({ prid: pr }); - const Activate = await Activation.findOne({ prid: pr }); - - if (!PRDATA) { - await fetch( - "https://raw.githubusercontent.com/is-a-dev/team-docs/main/pr-merged.md", - ) - .then((response) => response.text()) - .then((data) => { - // Do something with your data - console.log(data); - octokit.request( - "POST /repos/{owner}/{repo}/issues/{issue_number}/comments", - { - owner: "is-a-dev", - repo: "register", - issue_number: pr, - body: data, - }, - ); - }); - if (Activate) { - let activation_code = Activate.activation_code; - let domain = Activate.domain; - await fetch( - `https://hosts.is-a.dev/api/activate?domain=${domain}&activation_code=${activation_code}&NOTIFY_TOKEN=${process.env.WEBHOST_TOKEN}`, - ); - } - - await prdata.create({ - prid: pr, - merged: true, - }); - - res.send("PR Not Found, Created PR Data"); - } else { - res.send("PR Found, Checking Status"); - } -}); - -server.all("*", (req, res) => { - res.redirect("https://manage.is-a.dev/"); -}); - -function keepAlive(client) { - server.listen(3000, () => { - console.log("Server is ready."); - }); -} - -module.exports = keepAlive; diff --git a/OLD/index.js b/OLD/index.js deleted file mode 100644 index c868eda..0000000 --- a/OLD/index.js +++ /dev/null @@ -1,178 +0,0 @@ -const fs = require("node:fs"); -const path = require("node:path"); - -const { - Client, - Collection, - Events, - GatewayIntentBits, - EmbedBuilder, - ActivityType, -} = require("discord.js"); -const mongoose = require("mongoose"); -const Sentry = require("@sentry/node"); -const keepAlive = require("./components/webserver.js"); -const { ForwardMailGen } = require("./templates/forwardmail/gen.js"); -const { EmailGithubGen } = require("./templates/forwardmail-github/gen.js"); -const { ReplitGen } = require("./templates/replit/gen.js"); -const { HashnodeGen } = require("./templates/hashnode/gen.js"); -const { adminSendEmails } = require("./components/adminSendEmails.js"); -const { DeleteDomain } = require("./components/delete.js"); -const { EditModal } = require("./components/Edit/modal.js"); - -require("dotenv").config(); - -// Sentry -Sentry.init({ - dsn: "https://2854c55af6ab42ffb6f840091e3b235c@o575799.ingest.sentry.io/4505311662309376", - - // Set tracesSampleRate to 1.0 to capture 100% - // of transactions for performance monitoring. - // We recommend adjusting this value in production - tracesSampleRate: 1.0, -}); - -const mongoDB = process.env.MONGO_DB; - -const token = process.env.DISCORD_TOKEN; -// Create a new client instance -const client = new Client({ intents: [GatewayIntentBits.Guilds] }); - -client.commands = new Collection(); - -const commandsPath = path.join(__dirname, "commands"); -const commandFiles = fs - .readdirSync(commandsPath) - .filter((file) => file.endsWith(".js")); - -for (const file of commandFiles) { - const filePath = path.join(commandsPath, file); - const command = require(filePath); - - // Set a new item in the Collection with the key as the command name and the value as the exported module - if ("data" in command && "execute" in command) { - client.commands.set(command.data.name, command); - } else { - console.log( - `[WARNING] The command at ${filePath} is missing a required "data" or "execute" property.`, - ); - } -} - -client.on(Events.InteractionCreate, async (interaction) => { - //if (!interaction.isChatInputCommand()) return; - if (interaction.customId === "feedback") { - // Get the values from the interaction - const improve = interaction.fields.getTextInputValue("improve"); - const suggest = interaction.fields.getTextInputValue("suggest"); - const username = interaction.user.username; - - // Send the values to the channel #feedback - const channel = interaction.guild.channels.cache.find( - (channel) => channel.name === "bot-feedback", - ); - const embed = new EmbedBuilder() - .setTitle("Feedback") - .setDescription(`Improvements: ${improve}\nSuggestions: ${suggest}`) - .setColor("#00FF00") - .setFooter({ text: `Feedback from ${username}` }) - .setTimestamp(); - channel.send({ embeds: [embed] }); - // Send a reply to the user - await interaction.reply({ - content: "Your submission was received successfully!", - }); - } - - if (interaction.customId === "emailforward") { - ForwardMailGen(interaction); - } - if (interaction.customId === "EmailGithub") { - EmailGithubGen(interaction); - } - if (interaction.customId === "Replit") { - ReplitGen(interaction); - } - if (interaction.customId === "hashnode") { - HashnodeGen(interaction); - } - if (interaction.customId === "sendemail") { - adminSendEmails(interaction); - } - if ( - interaction.user.id !== "598245488977903688" && - interaction.user.id !== "853158265466257448" - ) { - await interaction.reply({ - content: "You are not authorized to use this command!", - ephemeral: true, - }); - return; - } - - if (interaction.customId === "delete") { - DeleteDomain(interaction); - } - if (interaction.customId === "edit") { - EditModal(interaction); - } - - const command = interaction.client.commands.get(interaction.commandName); - console.log(interaction.commandName); - - if (!command) { - console.error( - `No command matching ${interaction.commandName} was found.`, - ); - return; - } - - try { - await command.execute(interaction); - } catch (error) { - console.error(error); - if (interaction.replied || interaction.deferred) { - await interaction.followUp({ - content: "There was an error while executing this command!", - ephemeral: true, - }); - } else { - await interaction.reply({ - content: "There was an error while executing this command!", - ephemeral: true, - }); - } - } -}); - -// When the client is ready, run this code (only once) -// We use 'c' for the event parameter to keep it separate from the already defined 'client' -client.once(Events.ClientReady, (c) => { - client.user.setPresence({ - activities: [ - { name: `Registering Subdomains`, type: ActivityType.Watching }, - ], - status: "online", - }); - - console.log(`Ready! Logged in as ${c.user.tag}`); -}); - -mongoose - .connect(mongoDB, { - useNewUrlParser: true, - useUnifiedTopology: true, - dbName: "is-a-dev", - }) - .then(() => { - console.log("Connected to the database"); - }) - .catch((error) => { - console.error("Error connecting to the database:", error); - }); - -//SMTP(); off for now -keepAlive(client); - -// Log in to Discord with your client's token -client.login(token); diff --git a/OLD/models/activation.js b/OLD/models/activation.js deleted file mode 100644 index 5200824..0000000 --- a/OLD/models/activation.js +++ /dev/null @@ -1,12 +0,0 @@ -const mongoose = require("mongoose"); - -const userSchema = new mongoose.Schema( - { - prid: String, - activation_code: String, - domain: String, - }, - { collection: "activation" }, -); - -module.exports = mongoose.model("activation", userSchema); diff --git a/OLD/models/control.js b/OLD/models/control.js deleted file mode 100644 index 1ba2fa4..0000000 --- a/OLD/models/control.js +++ /dev/null @@ -1,13 +0,0 @@ -const mongoose = require("mongoose"); - -// William Keep out of this file, you don't need to touch it. - -const userSchema = new mongoose.Schema( - { - DisableRegister: Boolean, - fork: Boolean, - }, - { collection: "controller" }, -); - -module.exports = mongoose.model("controller", userSchema); diff --git a/OLD/models/maintainers.js b/OLD/models/maintainers.js deleted file mode 100644 index 59036b4..0000000 --- a/OLD/models/maintainers.js +++ /dev/null @@ -1,11 +0,0 @@ -const mongoose = require("mongoose"); - -const userSchema = new mongoose.Schema( - { - userid: String, - maintainer: Boolean, - }, - { collection: "maintainer" }, -); - -module.exports = mongoose.model("maintainer", userSchema); diff --git a/OLD/models/prdata.js b/OLD/models/prdata.js deleted file mode 100644 index e49ce6b..0000000 --- a/OLD/models/prdata.js +++ /dev/null @@ -1,11 +0,0 @@ -const mongoose = require("mongoose"); - -const userSchema = new mongoose.Schema( - { - prid: String, - merged: Boolean, - }, - { collection: "prdata" }, -); - -module.exports = mongoose.model("prdata", userSchema); diff --git a/OLD/models/user.js b/OLD/models/user.js deleted file mode 100644 index 07632e9..0000000 --- a/OLD/models/user.js +++ /dev/null @@ -1,15 +0,0 @@ -const mongoose = require("mongoose"); - -const userSchema = new mongoose.Schema( - { - userid: String, - githubid: String, - email: String, - gittoken: String, - betatester: Boolean, - maintainer: Boolean, - }, - { collection: "userdata" }, -); - -module.exports = mongoose.model("userdata", userSchema); diff --git a/OLD/package-lock.json b/OLD/package-lock.json deleted file mode 100644 index f0a063a..0000000 --- a/OLD/package-lock.json +++ /dev/null @@ -1,2028 +0,0 @@ -{ - "name": "is-a-dev-discord", - "version": "2.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "is-a-dev-discord", - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "@octokit/core": "^4.2.1", - "@octokit/rest": "^19.0.11", - "@sendgrid/mail": "^7.7.0", - "@sentry/node": "^7.54.0", - "cors": "^2.8.5", - "discord.js": "^14.11.0", - "dotenv": "^16.0.3", - "ejs": "^3.1.9", - "express": "^4.18.2", - "mongoose": "^7.2.1", - "multer": "^1.4.5-lts.1", - "node-fetch": "^2.6.7", - "pretty-ms": "^7.0.1", - "smtp-server": "^3.12.0" - } - }, - "node_modules/@discordjs/builders": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.6.3.tgz", - "integrity": "sha512-CTCh8NqED3iecTNuiz49mwSsrc2iQb4d0MjMdmS/8pb69Y4IlzJ/DIy/p5GFlgOrFbNO2WzMHkWKQSiJ3VNXaw==", - "dependencies": { - "@discordjs/formatters": "^0.3.1", - "@discordjs/util": "^0.3.1", - "@sapphire/shapeshift": "^3.8.2", - "discord-api-types": "^0.37.41", - "fast-deep-equal": "^3.1.3", - "ts-mixer": "^6.0.3", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=16.9.0" - } - }, - "node_modules/@discordjs/collection": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.5.1.tgz", - "integrity": "sha512-aWEc9DCf3TMDe9iaJoOnO2+JVAjeRNuRxPZQA6GVvBf+Z3gqUuWYBy2NWh4+5CLYq5uoc3MOvUQ5H5m8CJBqOA==", - "engines": { - "node": ">=16.9.0" - } - }, - "node_modules/@discordjs/formatters": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.3.1.tgz", - "integrity": "sha512-M7X4IGiSeh4znwcRGcs+49B5tBkNDn4k5bmhxJDAUhRxRHTiFAOTVUNQ6yAKySu5jZTnCbSvTYHW3w0rAzV1MA==", - "dependencies": { - "discord-api-types": "^0.37.41" - }, - "engines": { - "node": ">=16.9.0" - } - }, - "node_modules/@discordjs/rest": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-1.7.1.tgz", - "integrity": "sha512-Ofa9UqT0U45G/eX86cURQnX7gzOJLG2oC28VhIk/G6IliYgQF7jFByBJEykPSHE4MxPhqCleYvmsrtfKh1nYmQ==", - "dependencies": { - "@discordjs/collection": "^1.5.1", - "@discordjs/util": "^0.3.0", - "@sapphire/async-queue": "^1.5.0", - "@sapphire/snowflake": "^3.4.2", - "discord-api-types": "^0.37.41", - "file-type": "^18.3.0", - "tslib": "^2.5.0", - "undici": "^5.22.0" - }, - "engines": { - "node": ">=16.9.0" - } - }, - "node_modules/@discordjs/util": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@discordjs/util/-/util-0.3.1.tgz", - "integrity": "sha512-HxXKYKg7vohx2/OupUN/4Sd02Ev3PBJ5q0gtjdcvXb0ErCva8jNHWfe/v5sU3UKjIB/uxOhc+TDOnhqffj9pRA==", - "engines": { - "node": ">=16.9.0" - } - }, - "node_modules/@discordjs/ws": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/@discordjs/ws/-/ws-0.8.3.tgz", - "integrity": "sha512-hcYtppanjHecbdNyCKQNH2I4RP9UrphDgmRgLYrATEQF1oo4sYSve7ZmGsBEXSzH72MO2tBPdWSThunbxUVk0g==", - "dependencies": { - "@discordjs/collection": "^1.5.1", - "@discordjs/rest": "^1.7.1", - "@discordjs/util": "^0.3.1", - "@sapphire/async-queue": "^1.5.0", - "@types/ws": "^8.5.4", - "@vladfrangu/async_event_emitter": "^2.2.1", - "discord-api-types": "^0.37.41", - "tslib": "^2.5.0", - "ws": "^8.13.0" - }, - "engines": { - "node": ">=16.9.0" - } - }, - "node_modules/@octokit/auth-token": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.3.tgz", - "integrity": "sha512-/aFM2M4HVDBT/jjDBa84sJniv1t9Gm/rLkalaz9htOm+L+8JMj1k9w0CkUdcxNyNxZPlTxKPVko+m1VlM58ZVA==", - "dependencies": { - "@octokit/types": "^9.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/core": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.1.tgz", - "integrity": "sha512-tEDxFx8E38zF3gT7sSMDrT1tGumDgsw5yPG6BBh/X+5ClIQfMH/Yqocxz1PnHx6CHyF6pxmovUTOfZAUvQ0Lvw==", - "dependencies": { - "@octokit/auth-token": "^3.0.0", - "@octokit/graphql": "^5.0.0", - "@octokit/request": "^6.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/endpoint": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.5.tgz", - "integrity": "sha512-LG4o4HMY1Xoaec87IqQ41TQ+glvIeTKqfjkCEmt5AIwDZJwQeVZFIEYXrYY6yLwK+pAScb9Gj4q+Nz2qSw1roA==", - "dependencies": { - "@octokit/types": "^9.0.0", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/graphql": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.6.tgz", - "integrity": "sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==", - "dependencies": { - "@octokit/request": "^6.0.0", - "@octokit/types": "^9.0.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/openapi-types": { - "version": "17.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-17.2.0.tgz", - "integrity": "sha512-MazrFNx4plbLsGl+LFesMo96eIXkFgEtaKbnNpdh4aQ0VM10aoylFsTYP1AEjkeoRNZiiPe3T6Gl2Hr8dJWdlQ==" - }, - "node_modules/@octokit/plugin-paginate-rest": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.2.tgz", - "integrity": "sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==", - "dependencies": { - "@octokit/tsconfig": "^1.0.2", - "@octokit/types": "^9.2.3" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "@octokit/core": ">=4" - } - }, - "node_modules/@octokit/plugin-request-log": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", - "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", - "peerDependencies": { - "@octokit/core": ">=3" - } - }, - "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.1.2.tgz", - "integrity": "sha512-R0oJ7j6f/AdqPLtB9qRXLO+wjI9pctUn8Ka8UGfGaFCcCv3Otx14CshQ89K4E88pmyYZS8p0rNTiprML/81jig==", - "dependencies": { - "@octokit/types": "^9.2.3", - "deprecation": "^2.3.1" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "@octokit/core": ">=3" - } - }, - "node_modules/@octokit/request": { - "version": "6.2.5", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.5.tgz", - "integrity": "sha512-z83E8UIlPNaJUsXpjD8E0V5o/5f+vJJNbNcBwVZsX3/vC650U41cOkTLjq4PKk9BYonQGOnx7N17gvLyNjgGcQ==", - "dependencies": { - "@octokit/endpoint": "^7.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/request-error": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz", - "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==", - "dependencies": { - "@octokit/types": "^9.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/rest": { - "version": "19.0.11", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.11.tgz", - "integrity": "sha512-m2a9VhaP5/tUw8FwfnW2ICXlXpLPIqxtg3XcAiGMLj/Xhw3RSBfZ8le/466ktO1Gcjr8oXudGnHhxV1TXJgFxw==", - "dependencies": { - "@octokit/core": "^4.2.1", - "@octokit/plugin-paginate-rest": "^6.1.2", - "@octokit/plugin-request-log": "^1.0.4", - "@octokit/plugin-rest-endpoint-methods": "^7.1.2" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/tsconfig": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@octokit/tsconfig/-/tsconfig-1.0.2.tgz", - "integrity": "sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==" - }, - "node_modules/@octokit/types": { - "version": "9.2.3", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.2.3.tgz", - "integrity": "sha512-MMeLdHyFIALioycq+LFcA71v0S2xpQUX2cw6pPbHQjaibcHYwLnmK/kMZaWuGfGfjBJZ3wRUq+dOaWsvrPJVvA==", - "dependencies": { - "@octokit/openapi-types": "^17.2.0" - } - }, - "node_modules/@sapphire/async-queue": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.0.tgz", - "integrity": "sha512-JkLdIsP8fPAdh9ZZjrbHWR/+mZj0wvKS5ICibcLrRI1j84UmLMshx5n9QmL8b95d4onJ2xxiyugTgSAX7AalmA==", - "engines": { - "node": ">=v14.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/@sapphire/shapeshift": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.9.0.tgz", - "integrity": "sha512-iJpHmjAdwX9aSL6MvFpVyo+tkokDtInmSjoJHbz/k4VJfnim3DjvG0hgGEKWtWZgCu45RaLgcoNgR1fCPdIz3w==", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "lodash": "^4.17.21" - }, - "engines": { - "node": ">=v14.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/@sapphire/snowflake": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.5.1.tgz", - "integrity": "sha512-BxcYGzgEsdlG0dKAyOm0ehLGm2CafIrfQTZGWgkfKYbj+pNNsorZ7EotuZukc2MT70E0UbppVbtpBrqpzVzjNA==", - "engines": { - "node": ">=v14.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/@sendgrid/client": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@sendgrid/client/-/client-7.7.0.tgz", - "integrity": "sha512-SxH+y8jeAQSnDavrTD0uGDXYIIkFylCo+eDofVmZLQ0f862nnqbC3Vd1ej6b7Le7lboyzQF6F7Fodv02rYspuA==", - "dependencies": { - "@sendgrid/helpers": "^7.7.0", - "axios": "^0.26.0" - }, - "engines": { - "node": "6.* || 8.* || >=10.*" - } - }, - "node_modules/@sendgrid/helpers": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@sendgrid/helpers/-/helpers-7.7.0.tgz", - "integrity": "sha512-3AsAxfN3GDBcXoZ/y1mzAAbKzTtUZ5+ZrHOmWQ279AuaFXUNCh9bPnRpN504bgveTqoW+11IzPg3I0WVgDINpw==", - "dependencies": { - "deepmerge": "^4.2.2" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/@sendgrid/mail": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@sendgrid/mail/-/mail-7.7.0.tgz", - "integrity": "sha512-5+nApPE9wINBvHSUxwOxkkQqM/IAAaBYoP9hw7WwgDNQPxraruVqHizeTitVtKGiqWCKm2mnjh4XGN3fvFLqaw==", - "dependencies": { - "@sendgrid/client": "^7.7.0", - "@sendgrid/helpers": "^7.7.0" - }, - "engines": { - "node": "6.* || 8.* || >=10.*" - } - }, - "node_modules/@sentry-internal/tracing": { - "version": "7.54.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.54.0.tgz", - "integrity": "sha512-JsyhZ0wWZ+VqbHJg+azqRGdYJDkcI5R9+pnkO6SzbzxrRewqMAIwzkpPee3oI7vG99uhMEkOkMjHu0nQGwkOQw==", - "dependencies": { - "@sentry/core": "7.54.0", - "@sentry/types": "7.54.0", - "@sentry/utils": "7.54.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@sentry-internal/tracing/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@sentry/core": { - "version": "7.54.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.54.0.tgz", - "integrity": "sha512-MAn0E2EwgNn1pFQn4qxhU+1kz6edullWg6VE5wCmtpXWOVw6sILBUsQpeIG5djBKMcneJCdOlz5jeqcKPrLvZQ==", - "dependencies": { - "@sentry/types": "7.54.0", - "@sentry/utils": "7.54.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@sentry/core/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@sentry/node": { - "version": "7.54.0", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.54.0.tgz", - "integrity": "sha512-k8P7WD6lra3JF3H/y9GO+twBV8qQilj3X3d8PpaVPBHHwOA9AfdBVF18qgrdlZKghKtgALapZzrQQVnTOm34rw==", - "dependencies": { - "@sentry-internal/tracing": "7.54.0", - "@sentry/core": "7.54.0", - "@sentry/types": "7.54.0", - "@sentry/utils": "7.54.0", - "cookie": "^0.4.1", - "https-proxy-agent": "^5.0.0", - "lru_map": "^0.3.3", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@sentry/node/node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@sentry/node/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@sentry/types": { - "version": "7.54.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.54.0.tgz", - "integrity": "sha512-D+i9xogBeawvQi2r0NOrM7zYcUaPuijeME4O9eOTrDF20tj71hWtJLilK+KTGLYFtpGg1h+9bPaz7OHEIyVopg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@sentry/utils": { - "version": "7.54.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.54.0.tgz", - "integrity": "sha512-3Yf5KlKjIcYLddOexSt2ovu2TWlR4Fi7M+aCK8yUTzwNzf/xwFSWOstHlD/WiDy9HvfhWAOB/ukNTuAeJmtasw==", - "dependencies": { - "@sentry/types": "7.54.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@sentry/utils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@tokenizer/token": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", - "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" - }, - "node_modules/@types/node": { - "version": "20.2.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.2.5.tgz", - "integrity": "sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==" - }, - "node_modules/@types/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog==" - }, - "node_modules/@types/whatwg-url": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz", - "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==", - "dependencies": { - "@types/node": "*", - "@types/webidl-conversions": "*" - } - }, - "node_modules/@types/ws": { - "version": "8.5.4", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", - "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@vladfrangu/async_event_emitter": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@vladfrangu/async_event_emitter/-/async_event_emitter-2.2.2.tgz", - "integrity": "sha512-HIzRG7sy88UZjBJamssEczH5q7t5+axva19UbZLO6u0ySbYPrwzWiXBcC0WuHyhKKoeCyneH+FvYzKQq/zTtkQ==", - "engines": { - "node": ">=v14.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/agent-base/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/agent-base/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/append-field": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", - "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "node_modules/async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" - }, - "node_modules/axios": { - "version": "0.26.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", - "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", - "dependencies": { - "follow-redirects": "^1.14.8" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/base32.js": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/base32.js/-/base32.js-0.1.0.tgz", - "integrity": "sha512-n3TkB02ixgBOhTvANakDb4xaMXnYUVkNoRFJjQflcqMQhyEKxEHdj3E6N8t8sUQ0mjH/3/JxzlXuz3ul/J90pQ==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/before-after-hook": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", - "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==" - }, - "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/bson": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/bson/-/bson-5.3.0.tgz", - "integrity": "sha512-ukmCZMneMlaC5ebPHXIkP8YJzNl5DC41N5MAIvKDqLggdao342t4McltoJBQfQya/nHBWAcSsYRqlXPoQkTJag==", - "engines": { - "node": ">=14.20.1" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==" - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/discord-api-types": { - "version": "0.37.42", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.42.tgz", - "integrity": "sha512-1Huaj9cQ1W7/uryS8MZs/tZemnoKB94thM1cE40lep3rpU3q7WHqkdjN/veX0prTkYlPhcyLd/DeF/pBO8X8oQ==" - }, - "node_modules/discord.js": { - "version": "14.11.0", - "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.11.0.tgz", - "integrity": "sha512-CkueWYFQ28U38YPR8HgsBR/QT35oPpMbEsTNM30Fs8loBIhnA4s70AwQEoy6JvLcpWWJO7GY0y2BUzZmuBMepQ==", - "dependencies": { - "@discordjs/builders": "^1.6.3", - "@discordjs/collection": "^1.5.1", - "@discordjs/formatters": "^0.3.1", - "@discordjs/rest": "^1.7.1", - "@discordjs/util": "^0.3.1", - "@discordjs/ws": "^0.8.3", - "@sapphire/snowflake": "^3.4.2", - "@types/ws": "^8.5.4", - "discord-api-types": "^0.37.41", - "fast-deep-equal": "^3.1.3", - "lodash.snakecase": "^4.1.1", - "tslib": "^2.5.0", - "undici": "^5.22.0", - "ws": "^8.13.0" - }, - "engines": { - "node": ">=16.9.0" - } - }, - "node_modules/dotenv": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", - "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", - "engines": { - "node": ">=12" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/ejs": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", - "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/file-type": { - "version": "18.4.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-18.4.0.tgz", - "integrity": "sha512-o6MQrZKTAK6WpvmQk3jqTVUmqxYBxW5bloUfrdH1ZnRFDvvAPNr+l+rgOxM3nkqWT+3khaj3FRMDydWe0xhu+w==", - "dependencies": { - "readable-web-to-node-stream": "^3.0.2", - "strtok3": "^7.0.0", - "token-types": "^5.0.1" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/file-type?sponsor=1" - } - }, - "node_modules/filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/https-proxy-agent/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/https-proxy-agent/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/ipv6-normalize": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ipv6-normalize/-/ipv6-normalize-1.0.1.tgz", - "integrity": "sha512-Bm6H79i01DjgGTCWjUuCjJ6QDo1HB96PT/xCYuyJUP9WFbVDrLSbG4EZCvOCun2rNswZb0c3e4Jt/ws795esHA==" - }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/jake": { - "version": "10.8.7", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", - "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", - "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.4", - "minimatch": "^3.1.2" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/kareem": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.5.1.tgz", - "integrity": "sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash.snakecase": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", - "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==" - }, - "node_modules/lru_map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", - "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==" - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memory-pager": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", - "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", - "optional": true - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/mongodb": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-5.5.0.tgz", - "integrity": "sha512-XgrkUgAAdfnZKQfk5AsYL8j7O99WHd4YXPxYxnh8dZxD+ekYWFRA3JktUsBnfg+455Smf75/+asoU/YLwNGoQQ==", - "dependencies": { - "bson": "^5.3.0", - "mongodb-connection-string-url": "^2.6.0", - "socks": "^2.7.1" - }, - "engines": { - "node": ">=14.20.1" - }, - "optionalDependencies": { - "saslprep": "^1.0.3" - }, - "peerDependencies": { - "@aws-sdk/credential-providers": "^3.201.0", - "mongodb-client-encryption": ">=2.3.0 <3", - "snappy": "^7.2.2" - }, - "peerDependenciesMeta": { - "@aws-sdk/credential-providers": { - "optional": true - }, - "mongodb-client-encryption": { - "optional": true - }, - "snappy": { - "optional": true - } - } - }, - "node_modules/mongodb-connection-string-url": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz", - "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==", - "dependencies": { - "@types/whatwg-url": "^8.2.1", - "whatwg-url": "^11.0.0" - } - }, - "node_modules/mongoose": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-7.2.1.tgz", - "integrity": "sha512-c2OOl+ch9NlmPeJw7UjSb2jHNjoOw1XXHyzwygIf4z1GmaBx1OYb8OYqHkYPivvEmfY/vUWZFCgePsDqZgFn2w==", - "dependencies": { - "bson": "^5.3.0", - "kareem": "2.5.1", - "mongodb": "5.5.0", - "mpath": "0.9.0", - "mquery": "5.0.0", - "ms": "2.1.3", - "sift": "16.0.1" - }, - "engines": { - "node": ">=14.20.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mongoose" - } - }, - "node_modules/mongoose/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/mpath": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", - "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mquery": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz", - "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==", - "dependencies": { - "debug": "4.x" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/mquery/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/mquery/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/multer": { - "version": "1.4.5-lts.1", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz", - "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==", - "dependencies": { - "append-field": "^1.0.0", - "busboy": "^1.0.0", - "concat-stream": "^1.5.2", - "mkdirp": "^0.5.4", - "object-assign": "^4.1.1", - "type-is": "^1.6.4", - "xtend": "^4.0.0" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/node-fetch": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", - "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/nodemailer": { - "version": "6.9.2", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.2.tgz", - "integrity": "sha512-4+TYaa/e1nIxQfyw/WzNPYTEZ5OvHIDEnmjs4LPmIfccPQN+2CYKmGHjWixn/chzD3bmUTu5FMfpltizMxqzdg==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/parse-ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", - "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, - "node_modules/peek-readable": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0.tgz", - "integrity": "sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==", - "engines": { - "node": ">=14.16" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/pretty-ms": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz", - "integrity": "sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==", - "dependencies": { - "parse-ms": "^2.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/readable-web-to-node-stream": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", - "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", - "dependencies": { - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/readable-web-to-node-stream/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/saslprep": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", - "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", - "optional": true, - "dependencies": { - "sparse-bitfield": "^3.0.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/sift": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz", - "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==" - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/smtp-server": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/smtp-server/-/smtp-server-3.12.0.tgz", - "integrity": "sha512-y8gxURoUv2BrnEsVRbJ9tqbDxp1hLd2l7e5tXp/XscC0EueFjvSQLrpayedYa1mMQgnlhQuGtS1fj9ULfefAkw==", - "dependencies": { - "base32.js": "0.1.0", - "ipv6-normalize": "1.0.1", - "nodemailer": "6.9.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", - "dependencies": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/sparse-bitfield": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", - "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", - "optional": true, - "dependencies": { - "memory-pager": "^1.0.2" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/strtok3": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0.tgz", - "integrity": "sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==", - "dependencies": { - "@tokenizer/token": "^0.3.0", - "peek-readable": "^5.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/token-types": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/token-types/-/token-types-5.0.1.tgz", - "integrity": "sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==", - "dependencies": { - "@tokenizer/token": "^0.3.0", - "ieee754": "^1.2.1" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/ts-mixer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.3.tgz", - "integrity": "sha512-k43M7uCG1AkTyxgnmI5MPwKoUvS/bRvLvUb7+Pgpdlmok8AoqmUaZxUUw8zKM5B1lqZrt41GjYgnvAi0fppqgQ==" - }, - "node_modules/tslib": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.2.tgz", - "integrity": "sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==" - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" - }, - "node_modules/undici": { - "version": "5.22.1", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.22.1.tgz", - "integrity": "sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==", - "dependencies": { - "busboy": "^1.6.0" - }, - "engines": { - "node": ">=14.0" - } - }, - "node_modules/universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==" - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", - "dependencies": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "engines": { - "node": ">=0.4" - } - } - } -} diff --git a/OLD/package.json b/OLD/package.json deleted file mode 100644 index e2f4e8d..0000000 --- a/OLD/package.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "name": "is-a-dev-discord", - "version": "2.1.0", - "description": "Discord bot to manage the creation of is-a-dev records", - "main": "index.js", - "scripts": { - "register": "node registerCommands.js", - "start": "node registerCommands.js && node index.js" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/andrewstech/is-a-dev-discord.git" - }, - "keywords": [ - "Discord" - ], - "author": "andrewstech", - "license": "MIT", - "bugs": { - "url": "https://github.com/andrewstech/is-a-dev-discord/issues" - }, - "homepage": "https://github.com/andrewstech/is-a-dev-discord#readme", - "dependencies": { - "@octokit/core": "^4.2.1", - "@octokit/rest": "^19.0.11", - "@sendgrid/mail": "^7.7.0", - "@sentry/node": "^7.54.0", - "cors": "^2.8.5", - "discord.js": "^14.11.0", - "dotenv": "^16.0.3", - "ejs": "^3.1.9", - "express": "^4.18.2", - "mongoose": "^7.2.1", - "multer": "^1.4.5-lts.1", - "node-fetch": "^2.6.7", - "pretty-ms": "^7.0.1", - "smtp-server": "^3.12.0" - } -} diff --git a/OLD/private-commands/# b/OLD/private-commands/# deleted file mode 100644 index e69de29..0000000 diff --git a/OLD/private-commands/about.js b/OLD/private-commands/about.js deleted file mode 100644 index ac6ad6f..0000000 --- a/OLD/private-commands/about.js +++ /dev/null @@ -1,35 +0,0 @@ -const { SlashCommandBuilder, EmbedBuilder } = require("discord.js"); -const prettyMilliseconds = require("pretty-ms"); - -module.exports = { - data: new SlashCommandBuilder() - .setName("about") - .setDescription("About the bot!"), - async execute(interaction) { - const uptime = prettyMilliseconds(interaction.client.uptime, { - verbose: true, - secondsDecimalDigits: 0, - }); - // Create embed - const embed = `{ - "id": 538289175, - "fields": [ - { - "id": 449247638, - "name": "Uptime", - "value": "${uptime}", - "inline": false - } - ], - "author": { - "name": "Domain Registration Bot" - }, - "title": "About", - "footer": { - "text": "ยฉPixelsLTD" - }, - "color": 16762624 - }`; - await interaction.reply({ embeds: [embed] }); - }, -}; diff --git a/OLD/registerCommands.js b/OLD/registerCommands.js deleted file mode 100644 index ea34f93..0000000 --- a/OLD/registerCommands.js +++ /dev/null @@ -1,61 +0,0 @@ -const { REST, Routes } = require("discord.js"); -const fs = require("node:fs"); -const path = require("node:path"); -require("dotenv").config(); - -const token = process.env.DISCORD_TOKEN; -const clientId = process.env.DISCORD_CLIENT_ID; -const guildId = process.env.DISCORD_GUILD_ID; - -const commands = []; -const GuildCommands = []; - -// Grab all the command folders from the commands directory you created earlier -const commandsPath = path.join(__dirname, "commands"); -const commandFiles = fs - .readdirSync(commandsPath) - .filter((file) => file.endsWith(".js")); - -for (const file of commandFiles) { - const filePath = path.join(commandsPath, file); - const command = require(filePath); - - if ("data" in command && "execute" in command) { - commands.push(command.data.toJSON()); - } else { - console.log( - `[WARNING] The command at ${filePath} is missing a required "data" or "execute" property.`, - ); - } -} - -// Construct and prepare an instance of the REST module -const rest = new REST().setToken(token); - -// and deploy your commands! -(async () => { - try { - console.log( - `Started refreshing ${commands.length} application (/) commands.`, - ); - - // The put method is used to fully refresh all commands - const guilddata = await rest.put( - Routes.applicationGuildCommands(clientId, guildId), - { body: GuildCommands }, - ); - const data = await rest.put(Routes.applicationCommands(clientId), { - body: commands, - }); - - console.log( - `Successfully reloaded Guild ${guilddata.length} application (/) commands.`, - ); - console.log( - `Successfully reloaded ${data.length} application (/) commands.`, - ); - } catch (error) { - // And of course, make sure you catch and log any errors! - console.error(error); - } -})(); diff --git a/OLD/services/guildId.js b/OLD/services/guildId.js deleted file mode 100644 index da98762..0000000 --- a/OLD/services/guildId.js +++ /dev/null @@ -1,9 +0,0 @@ -const { isADev } = require("./is-a-dev.js"); -function GuildID(id) { - if (isADev.guildID === id) { - return isADev; - } else { - return false; - } -} -module.exports = { GuildID }; diff --git a/OLD/services/is-a-dev.js b/OLD/services/is-a-dev.js deleted file mode 100644 index 26b502e..0000000 --- a/OLD/services/is-a-dev.js +++ /dev/null @@ -1,22 +0,0 @@ -const isADev = { - domains: ["is-a.dev"], - name: "is-a.dev", - github: "is-a-dev", - repository: "register", - logo: "https://raw.githubusercontent.com/is-a-dev/register/main/media/logo.png", - description: "A free domain registration service for developers.", - guildID: "830872854677422150", - record: { - owner: { - username: "${username}", - email: "${email}", - }, - - record: { - "${type}": "${data.toLowerCase()}", - }, - }, - recordtypes: ["A", "CNAME", "MX", "TXT"], -}; - -module.exports = { isADev }; diff --git a/OLD/services/test.js b/OLD/services/test.js deleted file mode 100644 index 9cba3c4..0000000 --- a/OLD/services/test.js +++ /dev/null @@ -1,4 +0,0 @@ -const { GuildID } = require("./guildId.js"); - -const guild = GuildID("830872854677422150"); -console.log(guild); diff --git a/OLD/templates/forwardmail-github/gen.js b/OLD/templates/forwardmail-github/gen.js deleted file mode 100644 index 77dfa9f..0000000 --- a/OLD/templates/forwardmail-github/gen.js +++ /dev/null @@ -1,125 +0,0 @@ -const User = require("../../models/user.js"); -const { fork } = require("../../components/fork.js"); -const { OpenPR } = require("../../components/pr.js"); -const { Octokit } = require("@octokit/rest"); -const { EmbedBuilder } = require("discord.js"); - -async function EmailGithubGen(interaction) { - const ForwardEmail = interaction.fields.getTextInputValue("emailaddress"); - const subdomain = interaction.fields.getTextInputValue("subdomain"); - - const embeds = new EmbedBuilder() - .setTitle(`Registering ${subdomain}.is-a.dev`) - .addFields( - { name: "Forked", value: "โŒ", inline: true }, - { name: "Commited", value: "โŒ", inline: true }, - { name: "PR Opened", value: "โŒ", inline: true }, - ) - .setColor("#00b0f4") - .setFooter({ - text: "is-a.dev", - icon_url: - "https://raw.githubusercontent.com/is-a-dev/register/main/media/logo.png", - }); - - await interaction.reply({ embeds: [embeds] }); - await fork(interaction.user.id, interaction, subdomain); - const githubUser = await User.findOne({ userid: interaction.user.id }); - const token = githubUser.gittoken; - const username = githubUser.githubid; - const email = githubUser.email; - const id = interaction.user.id; - const octokit = new Octokit({ auth: token }); - content = `{ - "owner": { - "username": "${username}", - "email": "${email}", - "note": "This record was created by is-a.dev Discord bot via discord id: ${id}" - }, - - "record": { - "A": [ - "185.199.108.153", - "185.199.109.153", - "185.199.110.153", - "185.199.111.153" - ], - - "MX": ["mx1.forwardemail.net", "mx2.forwardemail.net"], - - "TXT": "forward-email=${ForwardEmail}" - } -} -`; - - // add a 3 second delay to allow the fork to complete - await new Promise((r) => setTimeout(r, 3000)); - - const ifexistsurl = `https://raw.githubusercontent.com/${username}/register/main/domains/${subdomain}.json`; - const ifexists = await fetch(ifexistsurl); - - if (ifexists.status === 200) { - const ErrorEmbed = new EmbedBuilder() - .setTitle(`Registering ${subdomain}.is-a.dev`) - .setURL(ifexistsurl) - .setDescription(`This domain already exists!`) - .addFields( - { name: "Forked", value: "โœ…", inline: true }, - { name: "Commited", value: "โŒ", inline: true }, - { name: "PR Opened", value: "โŒ", inline: true }, - ) - .setColor("#FF0000") - .setFooter({ - text: "is-a.dev", - iconURL: - "https://raw.githubusercontent.com/is-a-dev/register/main/media/logo.png", - }); - - await interaction.editReply({ embeds: [ErrorEmbed] }); - return; - } - - const record = Buffer.from(content).toString("base64"); - - const commit = await octokit.repos.createOrUpdateFileContents({ - owner: username, - repo: "register", - path: `domains/${subdomain.toLowerCase()}.json`, - message: `feat(domain): ${subdomain}.is-a.dev`, - content: record, - committer: { - name: username, - email: email, - }, - author: { - name: username, - email: email, - }, - }); - - if (process.env.DEBUG) { - console.log(commit); - } - - const embed = new EmbedBuilder() - .setTitle(`Registering ${subdomain}.is-a.dev`) - .addFields( - { name: "Forked", value: "โœ…", inline: true }, - { name: "Commited", value: "โœ…", inline: true }, - { name: "PR Opened", value: "โŒ", inline: true }, - ) - .setDescription( - `Your domain has been generated! Please wait for a staff member to review your PR.`, - ) - .setColor("#00b0f4") - .setFooter({ - text: "is-a.dev", - icon_url: - "https://raw.githubusercontent.com/is-a-dev/register/main/media/logo.png", - }); - - await interaction.editReply({ embeds: [embed] }); - await OpenPR(interaction.user.id, subdomain, interaction); -} - -exports.EmailGithubGen = EmailGithubGen; diff --git a/OLD/templates/forwardmail-github/modal.js b/OLD/templates/forwardmail-github/modal.js deleted file mode 100644 index c4df8e3..0000000 --- a/OLD/templates/forwardmail-github/modal.js +++ /dev/null @@ -1,40 +0,0 @@ -const { - ActionRowBuilder, - ModalBuilder, - TextInputBuilder, - TextInputStyle, -} = require("discord.js"); - -async function EmailGithub(interaction) { - const modal = new ModalBuilder() - .setCustomId("EmailGithub") - .setTitle("Email Forwarder and Github Pages"); - - // Add components to modal - const subdomain = new TextInputBuilder() - .setCustomId("subdomain") - .setLabel("What subdomain do you want?") - .setPlaceholder("subdomain") - .setMinLength(3) - .setMaxLength(20) - .setRequired(true) - .setStyle(TextInputStyle.Short); - - // Create the text input components - const email = new TextInputBuilder() - .setCustomId("emailaddress") - // The label is the prompt the user sees for this input - .setLabel("What's the email to forward to?") - // Short means only a single line of text - .setStyle(TextInputStyle.Short); - - const firstActionRow = new ActionRowBuilder().addComponents(email); - const secondActionRow = new ActionRowBuilder().addComponents(subdomain); - - modal.addComponents(firstActionRow, secondActionRow); - - // Show the modal to the user - await interaction.showModal(modal); -} - -exports.EmailGithub = EmailGithub; diff --git a/OLD/templates/forwardmail/gen.js b/OLD/templates/forwardmail/gen.js deleted file mode 100644 index 781c53f..0000000 --- a/OLD/templates/forwardmail/gen.js +++ /dev/null @@ -1,123 +0,0 @@ -const User = require("../../models/user.js"); -const { fork } = require("../../components/fork.js"); -const { OpenPR } = require("../../components/pr.js"); -const { Octokit } = require("@octokit/rest"); -const { EmbedBuilder } = require("discord.js"); - -async function ForwardMailGen(interaction) { - const ForwardEmail = interaction.fields.getTextInputValue("emailaddress"); - const subdomain = interaction.fields.getTextInputValue("subdomain"); - - const embeds = new EmbedBuilder() - .setTitle(`Registering ${subdomain}.is-a.dev`) - .addFields( - { name: "Forked", value: "โŒ", inline: true }, - { name: "Commited", value: "โŒ", inline: true }, - { name: "PR Opened", value: "โŒ", inline: true }, - ) - .setColor("#00b0f4") - .setFooter({ - text: "is-a.dev", - icon_url: - "https://raw.githubusercontent.com/is-a-dev/register/main/media/logo.png", - }); - - await interaction.reply({ embeds: [embeds] }); - await fork(interaction.user.id, interaction, subdomain); - - const githubUser = await User.findOne({ userid: interaction.user.id }); - const token = githubUser.gittoken; - const username = githubUser.githubid; - const email = githubUser.email; - const id = interaction.user.id; - const octokit = new Octokit({ auth: token }); - - content = `{ - "owner": { - "username": "${username}", - "email": "${email}", - "note": "This record was created by is-a.dev Discord bot via discord id: ${id}" - }, - - "record": { - "MX": ["mx1.forwardemail.net", "mx2.forwardemail.net"], - "TXT": "forward-email=${ForwardEmail}" - - } -} -`; - // add a 3 second delay to allow the fork to complete - await new Promise((r) => setTimeout(r, 3000)); - - const ifexistsurl = `https://raw.githubusercontent.com/${username}/register/main/domains/${subdomain}.json`; - const ifexists = await fetch(ifexistsurl); - - if (ifexists.status === 200) { - const ErrorEmbed = new EmbedBuilder() - .setTitle(`Registering ${subdomain}.is-a.dev`) - .setURL(ifexistsurl) - .setDescription(`This domain already exists!`) - .addFields( - { name: "Forked", value: "โœ…", inline: true }, - { name: "Commited", value: "โŒ", inline: true }, - { name: "PR Opened", value: "โŒ", inline: true }, - ) - .setColor("#FF0000") - .setFooter({ - text: "is-a.dev", - iconURL: - "https://raw.githubusercontent.com/is-a-dev/register/main/media/logo.png", - }); - - await interaction.editReply({ embeds: [ErrorEmbed] }); - return; - } - const record = Buffer.from(content).toString("base64"); - - const commit = await octokit.repos.createOrUpdateFileContents({ - owner: username, - repo: "register", - path: `domains/${subdomain.toLowerCase()}.json`, - message: `feat(domain): ${subdomain}.is-a.dev`, - content: record, - committer: { - name: username, - email: email, - }, - author: { - name: username, - email: email, - }, - }); - - if (process.env.DEBUG) { - console.log(commit); - } - - const embed = new EmbedBuilder() - .setTitle(`Registering ${subdomain}.is-a.dev`) - .addFields( - { name: "Forked", value: "โœ…", inline: true }, - { name: "Commited", value: "โœ…", inline: true }, - { name: "PR Opened", value: "โŒ", inline: true }, - ) - .setDescription( - `Your domain has been generated! Please wait for a staff member to review your PR.`, - ) - .setColor("#00b0f4") - .setFooter({ - text: "is-a.dev", - icon_url: - "https://raw.githubusercontent.com/is-a-dev/register/main/media/logo.png", - }); - - await interaction.editReply({ embeds: [embed] }); - let extra = { - label: "Info", - url: `https://register-bot.is-a.dev/guides/forwarder?email=${ForwardEmail}&domain=${subdomain}`, - }; - - await OpenPR(interaction.user.id, subdomain, interaction, extra); -} - -exports.ForwardMailGen = ForwardMailGen; diff --git a/OLD/templates/forwardmail/modal.js b/OLD/templates/forwardmail/modal.js deleted file mode 100644 index 6c30428..0000000 --- a/OLD/templates/forwardmail/modal.js +++ /dev/null @@ -1,40 +0,0 @@ -const { - ActionRowBuilder, - ModalBuilder, - TextInputBuilder, - TextInputStyle, -} = require("discord.js"); - -async function ForwardMailModal(interaction) { - const modal = new ModalBuilder() - .setCustomId("emailforward") - .setTitle("Email Forwarder"); - - // Add components to modal - const subdomain = new TextInputBuilder() - .setCustomId("subdomain") - .setLabel("What subdomain do you want?") - .setPlaceholder("subdomain") - .setMinLength(3) - .setMaxLength(20) - .setRequired(true) - .setStyle(TextInputStyle.Short); - - // Create the text input components - const email = new TextInputBuilder() - .setCustomId("emailaddress") - // The label is the prompt the user sees for this input - .setLabel("What's the email to forward to?") - // Short means only a single line of text - .setStyle(TextInputStyle.Short); - - const firstActionRow = new ActionRowBuilder().addComponents(email); - const secondActionRow = new ActionRowBuilder().addComponents(subdomain); - - modal.addComponents(firstActionRow, secondActionRow); - - // Show the modal to the user - await interaction.showModal(modal); -} - -exports.ForwardMailModal = ForwardMailModal; diff --git a/OLD/templates/hashnode/gen.js b/OLD/templates/hashnode/gen.js deleted file mode 100644 index 2c95b1c..0000000 --- a/OLD/templates/hashnode/gen.js +++ /dev/null @@ -1,122 +0,0 @@ -const User = require("../../models/user.js"); -const { fork } = require("../../components/fork.js"); -const { OpenPR } = require("../../components/pr.js"); -const { Octokit } = require("@octokit/rest"); -const { EmbedBuilder } = require("discord.js"); - -async function HashnodeGen(interaction) { - const subdomain = interaction.fields.getTextInputValue("subdomain"); - - const embeds = new EmbedBuilder() - .setTitle(`Registering ${subdomain}.is-a.dev`) - .addFields( - { name: "Forked", value: "โŒ", inline: true }, - { name: "Commited", value: "โŒ", inline: true }, - { name: "PR Opened", value: "โŒ", inline: true }, - ) - .setColor("#00b0f4") - .setFooter({ - text: "is-a.dev", - icon_url: - "https://raw.githubusercontent.com/is-a-dev/register/main/media/logo.png", - }); - - await interaction.reply({ embeds: [embeds] }); - await fork(interaction.user.id, interaction, subdomain); - - const githubUser = await User.findOne({ userid: interaction.user.id }); - const token = githubUser.gittoken; - const username = githubUser.githubid; - const email = githubUser.email; - const id = interaction.user.id; - const octokit = new Octokit({ auth: token }); - - content = `{ - "owner": { - "username": "${username}", - "email": "${email}", - "note": "This record was created by is-a.dev Discord bot via discord id: ${id}" - }, - - "record": { - "CNAME": "hashnode.network" - - } -} -`; - // add a 3 second delay to allow the fork to complete - await new Promise((r) => setTimeout(r, 3000)); - - const ifexistsurl = `https://raw.githubusercontent.com/${username}/register/main/domains/${subdomain}.json`; - const ifexists = await fetch(ifexistsurl); - - if (ifexists.status === 200) { - const ErrorEmbed = new EmbedBuilder() - .setTitle(`Registering ${subdomain}.is-a.dev`) - .setURL(ifexistsurl) - .setDescription(`This domain already exists!`) - .addFields( - { name: "Forked", value: "โœ…", inline: true }, - { name: "Commited", value: "โŒ", inline: true }, - { name: "PR Opened", value: "โŒ", inline: true }, - ) - .setColor("#FF0000") - .setFooter({ - text: "is-a.dev", - iconURL: - "https://raw.githubusercontent.com/is-a-dev/register/main/media/logo.png", - }); - - await interaction.editReply({ embeds: [ErrorEmbed] }); - return; - } else { - const record = Buffer.from(content).toString("base64"); - - const commit = await octokit.repos.createOrUpdateFileContents({ - owner: username, - repo: "register", - path: `domains/${subdomain.toLowerCase()}.json`, - message: `feat(domain): ${subdomain}.is-a.dev`, - content: record, - committer: { - name: username, - email: email, - }, - author: { - name: username, - email: email, - }, - }); - - if (process.env.DEBUG) { - console.log(commit); - } - - const embed = new EmbedBuilder() - .setTitle(`Registering ${subdomain}.is-a.dev`) - .addFields( - { name: "Forked", value: "โœ…", inline: true }, - { name: "Commited", value: "โœ…", inline: true }, - { name: "PR Opened", value: "โŒ", inline: true }, - ) - .setDescription( - `Your domain has been generated! Please wait for a staff member to review your PR.`, - ) - .setColor("#00b0f4") - .setFooter({ - text: "is-a.dev", - icon_url: - "https://raw.githubusercontent.com/is-a-dev/register/main/media/logo.png", - }); - - await interaction.editReply({ embeds: [embed] }); - let extra = { - label: "Info", - url: `https://support.hashnode.com/en/articles/5755362-how-to-map-a-custom-domain`, - }; - - await OpenPR(interaction.user.id, subdomain, interaction, extra); - } -} - -exports.HashnodeGen = HashnodeGen; diff --git a/OLD/templates/hashnode/modal.js b/OLD/templates/hashnode/modal.js deleted file mode 100644 index a49b6d1..0000000 --- a/OLD/templates/hashnode/modal.js +++ /dev/null @@ -1,33 +0,0 @@ -const { - ActionRowBuilder, - ModalBuilder, - TextInputBuilder, - TextInputStyle, -} = require("discord.js"); - -async function HashNode(interaction) { - const modal = new ModalBuilder() - .setCustomId("hashnode") - .setTitle("HashNode with is-a.dev subdomain"); - - // Add components to modal - const subdomain = new TextInputBuilder() - .setCustomId("subdomain") - .setLabel("What subdomain do you want?") - .setPlaceholder("subdomain") - .setMinLength(3) - .setMaxLength(20) - .setRequired(true) - .setStyle(TextInputStyle.Short); - - // Create the text input components - - const secondActionRow = new ActionRowBuilder().addComponents(subdomain); - - modal.addComponents(secondActionRow); - - // Show the modal to the user - await interaction.showModal(modal); -} - -exports.HashNode = HashNode; diff --git a/OLD/templates/replit/gen.js b/OLD/templates/replit/gen.js deleted file mode 100644 index c4775f2..0000000 --- a/OLD/templates/replit/gen.js +++ /dev/null @@ -1,123 +0,0 @@ -const User = require("../../models/user.js"); -const { fork } = require("../../components/fork.js"); -const { OpenPR } = require("../../components/pr.js"); -const { Octokit } = require("@octokit/rest"); -const { EmbedBuilder } = require("discord.js"); - -async function ReplitGen(interaction) { - const replurl = interaction.fields.getTextInputValue("replurl"); - const subdomain = interaction.fields.getTextInputValue("subdomain"); - - const embeds = new EmbedBuilder() - .setTitle(`Registering ${subdomain}.is-a.dev`) - .addFields( - { name: "Forked", value: "โŒ", inline: true }, - { name: "Commited", value: "โŒ", inline: true }, - { name: "PR Opened", value: "โŒ", inline: true }, - ) - .setColor("#00b0f4") - .setFooter({ - text: "is-a.dev", - icon_url: - "https://raw.githubusercontent.com/is-a-dev/register/main/media/logo.png", - }); - - await interaction.reply({ embeds: [embeds] }); - await fork(interaction.user.id, interaction, subdomain); - - const githubUser = await User.findOne({ userid: interaction.user.id }); - const token = githubUser.gittoken; - const username = githubUser.githubid; - const email = githubUser.email; - const id = interaction.user.id; - const octokit = new Octokit({ auth: token }); - - content = `{ - "owner": { - "username": "${username}", - "email": "${email}", - "note": "This record was created by is-a.dev Discord bot via discord id: ${id}" - }, - - "record": { - "CNAME": "${replurl}" - - } -} -`; - // add a 3 second delay to allow the fork to complete - await new Promise((r) => setTimeout(r, 3000)); - - const ifexistsurl = `https://raw.githubusercontent.com/${username}/register/main/domains/${subdomain}.json`; - const ifexists = await fetch(ifexistsurl); - - if (ifexists.status === 200) { - const ErrorEmbed = new EmbedBuilder() - .setTitle(`Registering ${subdomain}.is-a.dev`) - .setURL(ifexistsurl) - .setDescription(`This domain already exists!`) - .addFields( - { name: "Forked", value: "โœ…", inline: true }, - { name: "Commited", value: "โŒ", inline: true }, - { name: "PR Opened", value: "โŒ", inline: true }, - ) - .setColor("#FF0000") - .setFooter({ - text: "is-a.dev", - iconURL: - "https://raw.githubusercontent.com/is-a-dev/register/main/media/logo.png", - }); - - await interaction.editReply({ embeds: [ErrorEmbed] }); - return; - } else { - const record = Buffer.from(content).toString("base64"); - - const commit = await octokit.repos.createOrUpdateFileContents({ - owner: username, - repo: "register", - path: `domains/${subdomain.toLowerCase()}.json`, - message: `feat(domain): ${subdomain}.is-a.dev`, - content: record, - committer: { - name: username, - email: email, - }, - author: { - name: username, - email: email, - }, - }); - - if (process.env.DEBUG) { - console.log(commit); - } - - const embed = new EmbedBuilder() - .setTitle(`Registering ${subdomain}.is-a.dev`) - .addFields( - { name: "Forked", value: "โœ…", inline: true }, - { name: "Commited", value: "โœ…", inline: true }, - { name: "PR Opened", value: "โŒ", inline: true }, - ) - .setDescription( - `Your domain has been generated! Please wait for a staff member to review your PR.`, - ) - .setColor("#00b0f4") - .setFooter({ - text: "is-a.dev", - icon_url: - "https://raw.githubusercontent.com/is-a-dev/register/main/media/logo.png", - }); - - await interaction.editReply({ embeds: [embed] }); - let extra = { - label: "Info", - url: `https://register-bot.is-a.dev/guides/replit?repl=${replurl}`, - }; - - await OpenPR(interaction.user.id, subdomain, interaction, extra); - } -} - -exports.ReplitGen = ReplitGen; diff --git a/OLD/templates/replit/modal.js b/OLD/templates/replit/modal.js deleted file mode 100644 index 4d22bec..0000000 --- a/OLD/templates/replit/modal.js +++ /dev/null @@ -1,40 +0,0 @@ -const { - ActionRowBuilder, - ModalBuilder, - TextInputBuilder, - TextInputStyle, -} = require("discord.js"); - -async function Replit(interaction) { - const modal = new ModalBuilder() - .setCustomId("Replit") - .setTitle("Replit with is-a.dev subdomain [CNAME]"); - - // Add components to modal - const subdomain = new TextInputBuilder() - .setCustomId("subdomain") - .setLabel("What subdomain do you want?") - .setPlaceholder("subdomain") - .setMinLength(3) - .setMaxLength(20) - .setRequired(true) - .setStyle(TextInputStyle.Short); - - // Create the text input components - const replurl = new TextInputBuilder() - .setCustomId("replurl") - // The label is the prompt the user sees for this input - .setLabel("What's the address to point the subdomain to?") - // Short means only a single line of text - .setStyle(TextInputStyle.Short); - - const firstActionRow = new ActionRowBuilder().addComponents(replurl); - const secondActionRow = new ActionRowBuilder().addComponents(subdomain); - - modal.addComponents(firstActionRow, secondActionRow); - - // Show the modal to the user - await interaction.showModal(modal); -} - -exports.Replit = Replit; diff --git a/OLD/testweb.js b/OLD/testweb.js deleted file mode 100644 index b29cd2f..0000000 --- a/OLD/testweb.js +++ /dev/null @@ -1,2 +0,0 @@ -const keepAlive = require("./components/webserver.js"); -keepAlive(); diff --git a/OLD/views/email-forwarder.ejs b/OLD/views/email-forwarder.ejs deleted file mode 100644 index a25c136..0000000 --- a/OLD/views/email-forwarder.ejs +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - Email Forwarding | is-a.dev Discord Bot - - - - - - - - - -
-

Email Forwarding

-

<%= subdomain %>.is-a.dev forwards to: <%= email %>

- -
    -
  1. *@<%= subdomain %>.is-a.dev โžก๏ธ <%= email %>
  2. -
- - -
- - diff --git a/OLD/views/logged-in.ejs b/OLD/views/logged-in.ejs deleted file mode 100644 index 45fcd06..0000000 --- a/OLD/views/logged-in.ejs +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - Logged In | is-a.dev Discord Bot - - - - - - - - - -
- -

Logged in as: <%= username %>

- - -
- - diff --git a/OLD/views/replit.ejs b/OLD/views/replit.ejs deleted file mode 100644 index 0844daf..0000000 --- a/OLD/views/replit.ejs +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - Replit | is-a.dev Discord Bot - - - - - - - - - -
-

Email Forwarding

-

<%= subdomain %>.is-a.dev has a CNAME record pointing to: <%= replurl %>

- -
    -
  1. *@<%= subdomain %>.is-a.dev โžก๏ธ <%= replurl %> [CNAME]
  2. -
- - -
- - diff --git a/commands/sendemail.js b/commands/sendemail.js deleted file mode 100644 index a857218..0000000 --- a/commands/sendemail.js +++ /dev/null @@ -1,59 +0,0 @@ -const { - SlashCommandBuilder, - ActionRowBuilder, - ModalBuilder, - TextInputBuilder, - TextInputStyle, - -} = require("discord.js"); -const staff = require("../models/staff"); -const Loading = require("../components/loading"); - -module.exports = { - data: new SlashCommandBuilder() - .setName("send-email") - .setDescription("Maintainers send emails!"), - async execute(interaction) { - if (!(await staff.findOne({ _id: interaction.user.id }))) { - const embed = new EmbedBuilder() - .setDescription("Only staff can use this command!") - .setColor("#0096ff"); - return await interaction.editReply({ embeds: [embed], ephemeral: true }); - } - const modal = new ModalBuilder() - .setCustomId("sendemail") - .setTitle("Send Email"); - - // Create the text input components - const email = new TextInputBuilder() - .setCustomId("email") - // The label is the prompt the user sees for this input - .setLabel("To email?") - // Short means only a single line of text - .setStyle(TextInputStyle.Short); - - const subject = new TextInputBuilder() - .setCustomId("subject") - .setLabel("What is the email subject?") - // Paragraph means multiple lines of text. - .setStyle(TextInputStyle.Short); - - const message = new TextInputBuilder() - .setCustomId("message") - .setLabel("What's the message?") - // Paragraph means multiple lines of text. - .setStyle(TextInputStyle.Paragraph); - - // An action row only holds one text input, - // so you need one action row per text input. - const firstActionRow = new ActionRowBuilder().addComponents(email); - const secondActionRow = new ActionRowBuilder().addComponents(subject); - const thirdActionRow = new ActionRowBuilder().addComponents(message); - - // Add inputs to the modal - modal.addComponents(firstActionRow, secondActionRow, thirdActionRow); - - // Show the modal to the user - await interaction.showModal(modal); - }, -}; diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index 9af6e5e..0000000 --- a/docker-compose.yml +++ /dev/null @@ -1,25 +0,0 @@ -services: - is-a-dev: - container_name: is-a-dev-bot - deploy: - replicas: 1 - restart_policy: - condition: on-failure - environment: - DISCORD_TOKEN: "2" - DISCORD_CLIENT_ID: "1" - DISCORD_GUILD_ID: "3" - MONGO_DB: "4" - GITHUB_ID: "5" - GITHUB_SECRET: "6" - webhook: "7" - SERVER_URL: "8" - image: ghcr.io/andrewstech/is-a-dev-discord:main - labels: - generated: by 8gwifi.org -version: "3" - -networks: - default: - external: true - name: scoobydoo diff --git a/events/modal.js b/events/modal.js index 93d2b6e..92304e4 100644 --- a/events/modal.js +++ b/events/modal.js @@ -1,6 +1,5 @@ const RegisterDomain = require('./modals/RegisterDomain'); const Confirm = require('./modals/Confirm'); -const SendEmail = require('./modals/SendMail'); module.exports = async function (interaction) { if (interaction.customId === "regiserDomain") { await RegisterDomain(interaction); @@ -8,7 +7,4 @@ module.exports = async function (interaction) { if (interaction.customId.startsWith("Content-")) { await Confirm(interaction); } - if (interaction.customId === "sendemail") { - await SendEmail(interaction); - } } diff --git a/events/modals/SendMail.js b/events/modals/SendMail.js deleted file mode 100644 index a6b401a..0000000 --- a/events/modals/SendMail.js +++ /dev/null @@ -1,45 +0,0 @@ -const Loading = require('../../components/loading'); -const sgMail = require('@sendgrid/mail'); -sgMail.setApiKey(process.env.SENDGRID_API_KEY); -const { EmbedBuilder, ModalBuilder, TextInputBuilder, TextInputStyle, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require('discord.js'); -module.exports = async function (interaction) { - await Loading(interaction, true); - const to = interaction.fields.getTextInputValue("email"); - const subject = interaction.fields.getTextInputValue("subject"); - const message = interaction.fields.getTextInputValue("message"); - const post = { - "598245488977903688": "andrew@maintainers.is-a.dev", - "853158265466257448": "william@maintainers.is-a.dev", - "757296951925538856": "dibster@maintainers.is-a.dev", - "914452175839723550": "vaibhav@maintainers.is-a.dev", - "716134528409665586": "maskduck@maintainers.is-a.dev", - "763767239018938368": "mahir@maintainers.is-a.dev" - }; - - let from = post[interaction.user.id] || "hello@maintainers.is-a.dev"; - - const msg = { - to, // Change to your recipient - from, // Change to your verified sender - subject: subject, - templateId: 'd-d69e1a5daf3f4fb9a3028dd65957de18', - dynamic_template_data: { - message: message - }, - headers: { - "List-Unsubscribe": `` - } - }; - sgMail.send(msg) - .then(async (response) => { - console.log(response[0].statusCode); - console.log(response[0].headers); - await interaction.editReply({ content: `The following has been sent\n\n${message}`, ephemeral: false }); - }) - .catch(async (error) => { - console.error(error); - await interaction.editReply({ content: "Email failed to send!", ephemeral: false }); - }); - return; -} -