diff --git a/components/fork.js b/components/fork.js new file mode 100644 index 0000000..824605f --- /dev/null +++ b/components/fork.js @@ -0,0 +1,26 @@ +const user = require('../models/user'); +const { EmbedBuilder } = require("discord.js"); +const { Octokit } = require("@octokit/rest"); +module.exports = async function (interaction) { + const User = await user.findOne({ id: interaction.user.id }); + const octokit = new Octokit({ + auth: User.githubAccessToken, + }); + // fork the repo + const fork = await octokit.repos.createFork({ + owner: "is-a-dev", + repo: "register", + }); + if (!fork.status === 202) { + const sadEmbed = new EmbedBuilder() + .setDescription("Something went wrong while forking the repo!") + .setColor("#0096ff"); + return await interaction.editReply({ + embeds: [sadEmbed], + ephemeral: true, + }); + } +} + + + \ No newline at end of file diff --git a/events/ButtonEvent.js b/events/ButtonEvent.js new file mode 100644 index 0000000..d8f4bb9 --- /dev/null +++ b/events/ButtonEvent.js @@ -0,0 +1,14 @@ +const ChooseDeleteDomain = require("./buttons/ChooseDeleteDomain") +const CancelDeleteDomain = require("./buttons/CancelDelete") +const ConfirmDelete = require("./buttons/ConfirmDelete") +module.exports = async function (interaction) { + if (interaction.customId === "deleteDomain") { + await ChooseDeleteDomain(interaction); + } + if (interaction.customId === "cancel-del") { + await CancelDeleteDomain(interaction); + } + if (interaction.customId.startsWith("del-")) { + ConfirmDelete(interaction); + } +} \ No newline at end of file diff --git a/events/SelectEvent.js b/events/SelectEvent.js index 27bbc18..ffc793a 100644 --- a/events/SelectEvent.js +++ b/events/SelectEvent.js @@ -1,6 +1,11 @@ const ChooseEmail = require("./select/ChooseEmail"); +const deleteDomain = require("./select/delete"); module.exports = async function (interaction) { if (interaction.customId === "email") { await ChooseEmail(interaction); } + if (interaction.customId === "delete") { + await deleteDomain(interaction); + } + }; \ No newline at end of file diff --git a/events/buttons/CancelDelete.js b/events/buttons/CancelDelete.js new file mode 100644 index 0000000..b98f514 --- /dev/null +++ b/events/buttons/CancelDelete.js @@ -0,0 +1,10 @@ +const { EmbedBuilder } = require('discord.js'); +const Loading = require('../../components/loading'); +module.exports = async function (interaction) { + await Loading(interaction, true); + const embed = new EmbedBuilder() + .setTitle("Domain Deletion Cancelled") + .setDescription("You have cancelled the domain deletion process.") + .setColor("#0096ff"); + await interaction.editReply({ embeds: [embed] }); +} diff --git a/events/buttons/ChooseDeleteDomain.js b/events/buttons/ChooseDeleteDomain.js new file mode 100644 index 0000000..421eea9 --- /dev/null +++ b/events/buttons/ChooseDeleteDomain.js @@ -0,0 +1,58 @@ +const user = require("../../models/user"); +const loading = require('../../components/loading'); +const { StringSelectMenuBuilder, ActionRowBuilder, EmbedBuilder, ButtonBuilder, ButtonStyle } = require('discord.js'); +module.exports = async function (interaction) { + await loading(interaction, true); + const data = await user.findOne({ _id: interaction.user.id }); + if (!data) { + const embed = new EmbedBuilder() + .setDescription("You are not logged in!") + .setColor("#0096ff"); + return await interaction.editReply({ embeds: [embed] }); + } + const username = data.githubUsername; + 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) { + const sadEmbed = new EmbedBuilder() + .setDescription("You don't own any domains") + .setColor("#0096ff"); + await interaction.editReply({ embeds: [sadEmbed] }); + 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); + + const embed = new EmbedBuilder() + .setDescription("Choose the domain you want to delete") + .setColor("#0096ff"); + + // Create the text input components + await interaction.editReply({ + components: [row], + ephemeral: true, + embeds: [embed] + }); + } + }); +} \ No newline at end of file diff --git a/events/buttons/ConfirmDelete.js b/events/buttons/ConfirmDelete.js new file mode 100644 index 0000000..0e8dbf7 --- /dev/null +++ b/events/buttons/ConfirmDelete.js @@ -0,0 +1,10 @@ +const Loading = require('../../components/loading'); +const fork = require('../../components/fork'); +module.exports = async function (interaction) { + await Loading(interaction, true); + const domain = interaction.customId.slice(4); + fork(interaction); + + +} + \ No newline at end of file diff --git a/events/select/delete.js b/events/select/delete.js new file mode 100644 index 0000000..ffbc667 --- /dev/null +++ b/events/select/delete.js @@ -0,0 +1,35 @@ +const user = require("../../models/user"); +const loading = require('../../components/loading'); +const { ActionRowBuilder, EmbedBuilder, ButtonBuilder, ButtonStyle } = require('discord.js'); +module.exports = async function (interaction) { + await loading(interaction, true); + const domain = interaction.values[0]; + const data = await user.findOne({ _id: interaction.user.id }); + if (!data) { + const embed = new EmbedBuilder() + .setDescription("You are not logged in!") + .setColor("#0096ff"); + return await interaction.editReply({ embeds: [embed] }); + } + const ConfirmButton = new ButtonBuilder() + .setCustomId(`del-${domain}`) + .setLabel("Confirm Delete") + .setStyle(ButtonStyle.Danger); + + const CancelButton = new ButtonBuilder() + .setCustomId(`cancel-del`) + .setLabel("Cancel") + .setStyle(ButtonStyle.Primary); + + const row = new ActionRowBuilder().addComponents(ConfirmButton, CancelButton); + + const embed = new EmbedBuilder() + .setDescription(`Are you sure you want to delete ${domain}?`) + .setColor("#0096ff"); + + await interaction.editReply({ + components: [row], + ephemeral: true, + embeds: [embed] + }); +} diff --git a/index.js b/index.js index e4ed628..1ca02c0 100644 --- a/index.js +++ b/index.js @@ -14,6 +14,7 @@ const mongoose = require("mongoose"); const Sentry = require("@sentry/node"); const keepAlive = require("./components/webServer.js"); const HandleSelectMenu = require("./events/SelectEvent.js"); +const HandleButtonEvent = require("./events/ButtonEvent.js"); require("dotenv").config(); Sentry.init({ @@ -59,6 +60,10 @@ client.on(Events.InteractionCreate, async (interaction) => { HandleSelectMenu(interaction); return; } + if (interaction.isButton()) { + HandleButtonEvent(interaction); + return; + } if (!command) { console.error(