From 8d577fa079c60f4095ae6e261e8e1b3db94b06b9 Mon Sep 17 00:00:00 2001 From: TheCodedProf Date: Wed, 1 Mar 2023 13:06:40 -0500 Subject: [PATCH] made minor fixes --- src/commands/mod/nick.ts | 1 - src/commands/nucleus/premium.ts | 131 ++++++++++++++++++-------------- src/utils/database.ts | 2 +- 3 files changed, 76 insertions(+), 58 deletions(-) diff --git a/src/commands/mod/nick.ts b/src/commands/mod/nick.ts index ae4f446..0bd7849 100644 --- a/src/commands/mod/nick.ts +++ b/src/commands/mod/nick.ts @@ -11,7 +11,6 @@ import getEmojiByName from "../../utils/getEmojiByName.js"; const command = (builder: SlashCommandSubcommandBuilder) => builder .setName("nick") - // .setNameLocalizations({"ru": "name", "zh-CN": "nickname"}) .setDescription("Changes a users nickname") .addUserOption((option) => option.setName("user").setDescription("The user to change").setRequired(true)) .addStringOption((option) => diff --git a/src/commands/nucleus/premium.ts b/src/commands/nucleus/premium.ts index 325c360..c431c8e 100644 --- a/src/commands/nucleus/premium.ts +++ b/src/commands/nucleus/premium.ts @@ -1,74 +1,94 @@ -import { ActionRowBuilder, ButtonBuilder, ButtonInteraction, ButtonStyle, CommandInteraction, StringSelectMenuBuilder } from "discord.js"; +import { ActionRowBuilder, ButtonBuilder, ButtonInteraction, ButtonStyle, CommandInteraction, ComponentType, Message, StringSelectMenuBuilder, StringSelectMenuInteraction } from "discord.js"; import type { SlashCommandSubcommandBuilder } from "discord.js"; import EmojiEmbed from "../../utils/generateEmojiEmbed.js"; import client from "../../utils/client.js"; import { LoadingEmbed } from "../../utils/defaults.js"; import getEmojiByName from "../../utils/getEmojiByName.js"; -import type { PremiumSchema } from "../../utils/database.js"; const command = (builder: SlashCommandSubcommandBuilder) => builder.setName("premium").setDescription("Information about Nucleus Premium"); //TODO: Allow User to remove Premium -const dmcallback = async (interaction: CommandInteraction, dbUser: PremiumSchema | null, firstDescription: string): Promise => { - - if(!dbUser) { - await interaction.editReply({embeds: [ - new EmojiEmbed() - .setTitle("Premium") - .setDescription(`*You do not have premium! You can't activate premium on any servers.*` + firstDescription) - .setEmoji("NUCLEUS.LOGO") - .setStatus("Danger") - ]}); - return; - } - const premiumGuilds = dbUser.appliesTo.map((guildID) => { - const guild = client.guilds.cache.get(guildID); - if(!guild) return undefined; - return guild.name; - }); +const dmcallback = async (interaction: CommandInteraction, firstDescription: string, msg: Message): Promise => { + let closed = false; + do { + const dbUser = await client.database.premium.fetchUser(interaction.user.id); + if(!dbUser) { + await interaction.editReply({embeds: [ + new EmojiEmbed() + .setTitle("Premium") + .setDescription(`*You do not have premium! You can't activate premium on any servers.*` + firstDescription) + .setEmoji("NUCLEUS.LOGO") + .setStatus("Danger") + ]}); + return; + } + const premiumGuilds = dbUser.appliesTo.map((guildID) => { + const guild = client.guilds.cache.get(guildID); + if(!guild) return undefined; + return guild.name; + }); - const options = premiumGuilds.filter((guild) => guild !== undefined) as string[]; + const options = premiumGuilds.filter((guild) => guild !== undefined) as string[]; - const removeRow = new ActionRowBuilder() - .addComponents( - new StringSelectMenuBuilder() - .setCustomId("currentPremium") - .setPlaceholder("Select a server to remove premium from") - .setDisabled(premiumGuilds.length === 0) - .addOptions(options.map((guild) => { - return {label: guild, value: guild} - })) - ); - const removeButton = new ActionRowBuilder() - .addComponents( - new ButtonBuilder() - .setCustomId("removePremium") - .setLabel("Remove Premium") - .setStyle(ButtonStyle.Danger) - .setDisabled(premiumGuilds.length === 0) - ); - - await interaction.editReply( - { - embeds: [ - new EmojiEmbed() - .setTitle("Premium") - .setDescription(`*You have premium on the following servers:*` + firstDescription) - .setEmoji("NUCLEUS.LOGO") - .setStatus("Success") - ], - components: [removeRow, removeButton] - }); - - //TODO Finish this. + const removeRow = new ActionRowBuilder() + .addComponents( + new StringSelectMenuBuilder() + .setCustomId("currentPremium") + .setPlaceholder("Select a server to remove premium from") + .setDisabled(premiumGuilds.length === 0) + .addOptions(options.slice(0, Math.min(options.length, 24)).map((guild) => { + return {label: guild, value: guild} + })) + ); + const cancel = new ActionRowBuilder() + .addComponents( + new ButtonBuilder() + .setCustomId("cancel") + .setLabel("Close") + .setStyle(ButtonStyle.Danger) + ); + const components: ActionRowBuilder[] = [cancel]; + if(options.length > 0) components.unshift(removeRow); + await interaction.editReply( + { + embeds: [ + new EmojiEmbed() + .setTitle("Premium") + .setDescription( + `*You have premium on the following servers:*\n\n` + + (options.length > 0 ? options.join(', ') : `You have not activated premium in any guilds`) + + firstDescription) + .setEmoji("NUCLEUS.LOGO") + .setStatus("Success") + ], + components: components + }); + let i: StringSelectMenuInteraction | ButtonInteraction; + try { + const filter = (i: StringSelectMenuInteraction | ButtonInteraction) => i.user.id === interaction.user.id; + i = await msg.awaitMessageComponent({time: 300000, filter}) + } catch (e) { + await interaction.deleteReply(); + closed = true; + break; + } + await i.deferUpdate(); + if(i.isButton()) { + closed = true; + } else { + const response = client.database.premium.removePremium(interaction.user.id, i.values[0]!); + console.log(response) + } + } while (!closed); + await interaction.deleteReply(); } const callback = async (interaction: CommandInteraction): Promise => { if (interaction.guild) client.database.premium.hasPremium(interaction.guild.id).finally(() => {}); - await interaction.reply({embeds: LoadingEmbed, ephemeral: true}) + const m = await interaction.reply({embeds: LoadingEmbed, ephemeral: true, fetchReply: true}) const member = await (await interaction.client.guilds.fetch("684492926528651336")).members.fetch(interaction.user.id).catch(() => { interaction.editReply({ embeds: [ new EmojiEmbed() @@ -103,14 +123,13 @@ const callback = async (interaction: CommandInteraction): Promise => { premium = `**You can't give servers premium anymore because your subscription ended or was cancelled.** To get premium again please subscribe in the Clicks server` count = 0; } - if(!interaction.guild) return await dmcallback(interaction, dbMember, firstDescription); + if(!interaction.guild) return await dmcallback(interaction, firstDescription, m); const hasPremium = await client.database.premium.hasPremium(interaction.guild!.id); let premiumGuild = "" if (hasPremium) { premiumGuild = `**This server has premium! It was ${hasPremium[2] === 3 && hasPremium[3] ? `automatically applied by <@${hasPremium[1]}>` : `given by <@${hasPremium[1]}>`}**\n\n` } - const components: ActionRowBuilder[] = [] if (level === 0 || dbMember?.expiresAt) { components.push( @@ -144,7 +163,7 @@ const callback = async (interaction: CommandInteraction): Promise => { ) .setEmoji("NUCLEUS.LOGO") .setStatus("Danger") - // .setImage("") //TODO: Add image + .setImage("https://assets.clicks.codes/ads/ads/nucleus-premium.png") ], components: components }); diff --git a/src/utils/database.ts b/src/utils/database.ts index 88efc70..0688888 100644 --- a/src/utils/database.ts +++ b/src/utils/database.ts @@ -7,7 +7,7 @@ import * as crypto from "crypto"; const mongoClient = new MongoClient(config.mongoUrl); await mongoClient.connect(); -const database = mongoClient.db("Nucleus"); +const database = mongoClient.db(); export class Guilds { guilds: Collection;