@ -1,17 +1,18 @@
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 < void > = > {
const dmcallback = async ( interaction : CommandInteraction , firstDescription : string , msg : Message ) : Promise < void > = > {
let closed = false ;
do {
const dbUser = await client . database . premium . fetchUser ( interaction . user . id ) ;
if ( ! dbUser ) {
await interaction . editReply ( { embeds : [
new EmojiEmbed ( )
@ -36,39 +37,58 @@ const dmcallback = async (interaction: CommandInteraction, dbUser: PremiumSchema
. setCustomId ( "currentPremium" )
. setPlaceholder ( "Select a server to remove premium from" )
. setDisabled ( premiumGuilds . length === 0 )
. addOptions ( options . map ( ( guild ) = > {
. addOptions ( options . slice ( 0 , Math . min ( options . length , 24 ) ) . map ( ( guild ) = > {
return { label : guild , value : guild }
} ) )
) ;
const removeButton = new ActionRowBuilder < ButtonBuilder > ( )
const cancel = new ActionRowBuilder < ButtonBuilder > ( )
. addComponents (
new ButtonBuilder ( )
. setCustomId ( "removePremium ")
. setLabel ( "Remove Premium ")
. setCustomId ( "cancel ")
. setLabel ( "Close ")
. setStyle ( ButtonStyle . Danger )
. setDisabled ( premiumGuilds . length === 0 )
) ;
const components : ActionRowBuilder < StringSelectMenuBuilder | ButtonBuilder > [ ] = [ cancel ] ;
if ( options . length > 0 ) components . unshift ( removeRow ) ;
await interaction . editReply (
{
embeds : [
new EmojiEmbed ( )
. setTitle ( "Premium" )
. setDescription ( ` *You have premium on the following servers:* ` + firstDescription )
. 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 : [ removeRow , removeButton ]
components : components
} ) ;
//TODO Finish this.
let i : StringSelectMenuInteraction | ButtonInteraction ;
try {
const filter = ( i : StringSelectMenuInteraction | ButtonInteraction ) = > i . user . id === interaction . user . id ;
i = await msg . awaitMessageComponent < ComponentType.StringSelect | ComponentType.Button > ( { 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 < void > = > {
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<void> => {
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 < ButtonBuilder > [ ] = [ ]
if ( level === 0 || dbMember ? . expiresAt ) {
components . push (
@ -144,7 +163,7 @@ const callback = async (interaction: CommandInteraction): Promise<void> => {
)
. setEmoji ( "NUCLEUS.LOGO" )
. setStatus ( "Danger" )
// .setImage("") //TODO: Add image
. setImage ( "https://assets.clicks.codes/ads/ads/nucleus-premium.png" )
] ,
components : components
} ) ;