2023-10-31 02:39:28 +01:00
const {
EmbedBuilder ,
Client ,
CommandInteraction ,
ActionRowBuilder ,
StringSelectMenuBuilder ,
ComponentType ,
} = require ( "discord.js" ) ;
const Utils = require ( "../../util/functions/function" ) ;
module . exports = {
name : "help" ,
usage : "(Command/Category)" ,
description : "Shows all available bot commands" ,
category : "Information" ,
options : [
{
type : 3 ,
name : "command" ,
description : "The command you want to see" ,
required : false ,
} ,
] ,
/ * *
*
* @ param { Client } client
* @ param { CommandInteraction } interaction
* @ param { String [ ] } args
* @ param { Utils } utils
* /
run : async ( client , interaction , args , utils ) => {
if ( ! args [ 0 ] ) {
await interaction . deleteReply ( ) ;
const emoji = {
CODM : "<a:codm:897030768793104385>" ,
APEX : "🎆" ,
Config : "<a:config:896990033561669762>" ,
Information : "<a:information:894962394932064346>" ,
Utilities : "<a:utilites:897233087941988392>" ,
} ;
const directories = [
... new Set ( client . slashCommands . map ( cmd => cmd . directory ) ) ,
] ;
const categories = directories . map ( dir => {
if ( dir == "Owner" ) return ;
const getCmds = client . slashCommands
. filter ( c => c . directory == dir )
. map ( cmd => {
return {
name : cmd . name || "No command name" ,
} ;
} ) ;
return {
directory : dir ,
commands : getCmds ,
} ;
} ) ;
const embed = new EmbedBuilder ( )
. setTitle ( ` **NYX's Commands** ` )
. setDescription ( ` Please choose a category in the dropdown menu ` )
. setColor ( client . color )
. setTimestamp ( )
. addFields (
{
name : ":link: **Invite Me**" ,
value : ` [Click Here]( ${ utils . inviteLink ( client . user . id ) } ) ` ,
inline : true ,
} ,
{
name : "<:support1:867093614403256350> **Need Help ?**" ,
value : ` [Support Server]( ${ client . invite } ) ` ,
inline : true ,
} ,
{
name : "<:YouTube:841186450497339412> **Video Guide**" ,
value : ` [How to use Slash Coammands](https://youtu.be/YSKDu1gKntY) ` ,
inline : true ,
} ,
{
name : ` <:nyx_description:897379659665264650> Documentation ` ,
value : ` [Click here]( ${ client . docs } ) ` ,
inline : true ,
} ,
{
name : "<a:booster:896527475063025704> **Premium**" ,
value : ` You can either boost support server or subscribe to developer's team [Ko-Fi](https://ko-fi.com/cathteam) or gift a nitro to one of the developer team. ` ,
inline : false ,
}
)
. setURL ( client . docs )
. setThumbnail (
"https://media.discordapp.net/attachments/896078559293104128/896392631565828146/nyx_logo_transparent.webp"
)
. setFooter ( {
text : ` Requested by ${ interaction . user . tag } ` ,
iconURL : interaction . user . displayAvatarURL ( { dynamic : true } ) ,
} ) ;
const components = state => [
new ActionRowBuilder ( ) . addComponents (
new StringSelectMenuBuilder ( )
. setCustomId ( "help-menu" )
. setPlaceholder ( ` Please select a category ` )
. setDisabled ( state )
. addOptions (
categories . map ( cmd => {
return {
label : cmd . directory ,
value : cmd . directory ,
description : ` Commands from ${ cmd . directory } category ` ,
emoji : emoji [ cmd . directory ] || null ,
} ;
} )
)
) ,
] ;
const msg = await interaction . channel . send ( {
embeds : [ embed ] ,
components : components ( false ) ,
} ) ;
const filter = m => m . user . id === interaction . user . id ;
const collector = interaction . channel . createMessageComponentCollector ( {
filter ,
componentType : ComponentType . StringSelect ,
time : 60000 ,
} ) ;
collector . on ( "collect" , async interaction => {
const [ directory ] = interaction . values ;
const category = categories . find ( u => u . directory === directory ) ;
const newembed = new EmbedBuilder ( )
. setTitle (
` ${ emoji [ directory ] } ${ directory } Commands ${ emoji [ directory ] } `
)
. setTimestamp ( )
. setColor ( client . color )
. setFooter ( {
text : ` Please use /help (Command Name) for more details ` ,
} )
. setDescription (
category . commands
. map ( cmd => {
return [ ` \` ${ cmd . name } \` ` ] ;
} )
. join ( ", " )
) ;
interaction . reply ( { embeds : [ newembed ] } ) ;
} ) ;
collector . on ( "end" , ( ) => msg . edit ( { components : components ( true ) } ) ) ;
} else {
const command = client . slashCommands . get ( args [ 0 ] . toLowerCase ( ) ) ;
if ( ! command ) {
interaction . editReply ( {
content : ` There isn't any command named " ${ args [ 0 ] } " ` ,
} ) ;
} else {
if ( command . UserPerms && Array . isArray ( command . UserPerms ) ) {
UserPermissions = command . UserPerms ;
} else {
UserPermissions = [ command . UserPerms ? command . UserPerms : "" ] ;
}
const fields = [ ] ;
const embed = new EmbedBuilder ( )
. setTitle ( ` " ${ command . name } " command details ` )
. addFields ( [
{
name : "**Command**:" ,
value : command . name ? ` \` ${ command . name } \` ` : "N/A" ,
} ,
] ) ;
if ( command . usage )
fields . push ( {
name : "**Usage**:" ,
value : ` \` / ${ command . name } ${ command . usage } \` ` ,
} ) ;
else
fields . push ( {
name : "**Usage**:" ,
value : ` \` / ${ command . name } \` ` ,
} ) ;
if ( command . description )
fields . push ( {
name : "**Description**:" ,
value : command . description ,
} ) ;
if ( command . timeout )
fields . push ( {
name : "**Cooldown**:" ,
value : utils . timer ( command . timeout ) ,
} ) ;
embed
. setFooter ( {
text : ` Requested by ${ interaction . user . tag } ` ,
iconURL : interaction . user . displayAvatarURL ( { dynamic : true } ) ,
} )
. setTimestamp ( )
. addFields ( fields )
. setURL ( client . web )
. setColor ( client . color ) ;
interaction . followUp ( { embeds : [ embed ] } ) ;
}
}
} ,
} ;