2023-04-02 14:12:53 +02:00
const {
EmbedBuilder ,
Client ,
CommandInteraction ,
ActionRowBuilder ,
StringSelectMenuBuilder ,
ComponentType ,
} = require ( "discord.js" ) ;
const Utils = require ( "../../util/functions/function" ) ;
2021-09-06 12:38:25 +02:00
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 ,
} ,
] ,
2023-04-02 14:12:53 +02:00
/ * *
*
* @ param { Client } client
* @ param { CommandInteraction } interaction
* @ param { String [ ] } args
* @ param { Utils } utils
* /
2021-09-06 12:38:25 +02:00
run : async ( client , interaction , args , utils ) => {
if ( ! args [ 0 ] ) {
await interaction . deleteReply ( ) ;
const emoji = {
2021-11-18 18:56:42 +01:00
CODM : "<a:codm:897030768793104385>" ,
2023-04-02 14:12:53 +02:00
APEX : "🎆" ,
2021-11-18 18:56:42 +01:00
Config : "<a:config:896990033561669762>" ,
Information : "<a:information:894962394932064346>" ,
Utilities : "<a:utilites:897233087941988392>" ,
2021-09-06 12:38:25 +02:00
} ;
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 ,
} ;
} ) ;
2023-04-02 14:12:53 +02:00
const embed = new EmbedBuilder ( )
2021-11-18 18:56:42 +01:00
. setTitle ( ` **NYX's Commands** ` )
2021-09-06 12:38:25 +02:00
. setDescription ( ` Please choose a category in the dropdown menu ` )
. setColor ( client . color )
. setTimestamp ( )
2021-11-18 18:56:42 +01:00
. addFields (
{
name : ":link: **Invite Me**" ,
2023-04-02 14:12:53 +02:00
value : ` [Click Here]( ${ utils . inviteLink ( client . user . id ) } ) ` ,
2021-11-18 18:56:42 +01:00
inline : true ,
} ,
{
name : "<:support1:867093614403256350> **Need Help ?**" ,
2023-04-02 14:12:53 +02:00
value : ` [Support Server]( ${ client . invite } ) ` ,
2021-11-18 18:56:42 +01:00
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 ,
}
2021-09-06 12:38:25 +02:00
)
2021-11-18 18:56:42 +01:00
. setURL ( client . docs )
. setThumbnail (
"https://media.discordapp.net/attachments/896078559293104128/896392631565828146/nyx_logo_transparent.webp"
2021-09-06 12:38:25 +02:00
)
2022-03-19 17:45:19 +01:00
. setFooter ( {
text : ` Requested by ${ interaction . user . tag } ` ,
iconURL : interaction . user . displayAvatarURL ( { dynamic : true } ) ,
} ) ;
2021-09-06 12:38:25 +02:00
const components = state => [
2023-04-02 14:12:53 +02:00
new ActionRowBuilder ( ) . addComponents (
new StringSelectMenuBuilder ( )
2021-09-06 12:38:25 +02:00
. 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 ,
2023-04-02 14:12:53 +02:00
componentType : ComponentType . StringSelect ,
2021-09-06 12:38:25 +02:00
time : 60000 ,
} ) ;
collector . on ( "collect" , async interaction => {
const [ directory ] = interaction . values ;
const category = categories . find ( u => u . directory === directory ) ;
2023-04-02 14:12:53 +02:00
const newembed = new EmbedBuilder ( )
2021-09-06 12:38:25 +02:00
. setTitle (
2021-11-18 18:56:42 +01:00
` ${ emoji [ directory ] } ${ directory } Commands ${ emoji [ directory ] } `
2021-09-06 12:38:25 +02:00
)
. setTimestamp ( )
. setColor ( client . color )
2022-03-02 15:37:01 +01:00
. setFooter ( {
text : ` Please use /help (Command Name) for more details ` ,
} )
2021-09-06 12:38:25 +02:00
. 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 ) {
2023-04-02 14:12:53 +02:00
interaction . editReply ( {
content : ` There isn't any command named " ${ args [ 0 ] } " ` ,
2021-09-06 12:38:25 +02:00
} ) ;
} else {
2021-09-21 01:51:56 +02:00
if ( command . UserPerms && Array . isArray ( command . UserPerms ) ) {
UserPermissions = command . UserPerms ;
2021-11-18 18:56:42 +01:00
} else {
UserPermissions = [ command . UserPerms ? command . UserPerms : "" ] ;
}
2021-09-21 01:51:56 +02:00
if ( command . BotPerms && Array . isArray ( command . BotPerms ) ) {
BotPermissions = command . BotPerms ;
2021-11-18 18:56:42 +01:00
} else {
BotPermissions = [ command . BotPerms ? command . BotPerms : "" ] ;
}
2021-09-06 12:38:25 +02:00
const BotPerms = BotPermissions . map ( x =>
x
. split ( "_" )
. map ( y => y [ 0 ] + y . substring ( 1 , y . length ) . toLowerCase ( ) )
. join ( " " )
) . join ( ", " ) ;
const UserPerms = UserPermissions . map ( x =>
x
. split ( "_" )
. map ( y => y [ 0 ] + y . substring ( 1 , y . length ) . toLowerCase ( ) )
. join ( " " )
) . join ( ", " ) ;
2023-04-02 14:12:53 +02:00
const fields = [ ] ;
const embed = new EmbedBuilder ( )
2021-09-06 12:38:25 +02:00
. setTitle ( ` " ${ command . name } " command details ` )
2023-04-02 14:12:53 +02:00
. addFields ( [
{
name : "**Command**:" ,
value : command . name ? ` \` ${ command . name } \` ` : "N/A" ,
} ,
] ) ;
2022-03-02 15:37:01 +01:00
if ( command . usage )
2023-04-02 14:12:53 +02:00
fields . push ( {
name : "**Usage**:" ,
value : ` \` / ${ command . name } ${ command . usage } \` ` ,
} ) ;
else
fields . push ( {
name : "**Usage**:" ,
value : ` \` / ${ command . name } \` ` ,
} ) ;
2022-03-02 15:37:01 +01:00
if ( command . description )
2023-04-02 14:12:53 +02:00
fields . push ( {
name : "**Description**:" ,
value : command . description ,
} ) ;
2022-03-02 15:37:01 +01:00
if ( command . timeout )
2023-04-02 14:12:53 +02:00
fields . push ( {
name : "**Cooldown**:" ,
value : utils . timer ( command . timeout ) ,
} ) ;
2022-03-02 15:37:01 +01:00
if ( command . UserPerms )
2023-04-02 14:12:53 +02:00
fields . push ( {
name : "**Required User Permission**:" ,
value : UserPerms ,
} ) ;
2022-03-02 15:37:01 +01:00
if ( command . BotPerms )
2023-04-02 14:12:53 +02:00
fields . push ( {
name : "**Required Bot Permission**:" ,
value : BotPerms ,
} ) ;
2021-09-06 12:38:25 +02:00
embed
2022-03-02 15:37:01 +01:00
. setFooter ( {
text : ` Requested by ${ interaction . user . tag } ` ,
iconURL : interaction . user . displayAvatarURL ( { dynamic : true } ) ,
} )
2021-09-06 12:38:25 +02:00
. setTimestamp ( )
2023-04-02 14:12:53 +02:00
. addFields ( fields )
2021-09-06 12:38:25 +02:00
. setURL ( client . web )
. setColor ( client . color ) ;
2023-04-02 14:12:53 +02:00
interaction . editReply ( { embeds : [ embed ] } ) ;
2021-09-06 12:38:25 +02:00
}
}
} ,
} ;