mirror of
https://github.com/TheShadowEevee/Konpeki-Discord-Bot.git
synced 2025-01-11 22:38:50 -06:00
Add a help command
This commit is contained in:
parent
64936b95cd
commit
8addf9fe02
1 changed files with 250 additions and 0 deletions
250
commands/help.js
Normal file
250
commands/help.js
Normal file
|
@ -0,0 +1,250 @@
|
||||||
|
/*
|
||||||
|
* Konpeki Discord Bot - Slash Command Definition File
|
||||||
|
* help.js - Uses generated help text file to provide a help command
|
||||||
|
*/
|
||||||
|
|
||||||
|
const { ActionRowBuilder, ButtonBuilder, ButtonStyle, SlashCommandBuilder } = require('discord.js');
|
||||||
|
|
||||||
|
const fs = require('fs');
|
||||||
|
|
||||||
|
let helpFile = '';
|
||||||
|
|
||||||
|
// Import help text file
|
||||||
|
if (fs.existsSync('./data/help-text.json')) {
|
||||||
|
helpFile = JSON.parse(fs.readFileSync('./data/help-text.json', 'utf8'));
|
||||||
|
}
|
||||||
|
|
||||||
|
// List of all commands, by category
|
||||||
|
// Command help, listing options.
|
||||||
|
module.exports = {
|
||||||
|
data: new SlashCommandBuilder()
|
||||||
|
.setName('help')
|
||||||
|
.setDescription('Provides information on avalible commands'),
|
||||||
|
async execute(interaction) {
|
||||||
|
|
||||||
|
let pageNumber = 1;
|
||||||
|
const commandsPerPage = 5;
|
||||||
|
let commandsThisPage = 0;
|
||||||
|
|
||||||
|
const numberOfCommands = Object.keys(helpFile).length;
|
||||||
|
const pageTotal = String(Math.ceil(numberOfCommands / commandsPerPage));
|
||||||
|
|
||||||
|
let embedPartOne = {
|
||||||
|
color: 0x0099ff,
|
||||||
|
title: 'Help Text',
|
||||||
|
description: `Page ${pageNumber} of ${pageTotal}`,
|
||||||
|
};
|
||||||
|
|
||||||
|
if (pageNumber != pageTotal) {
|
||||||
|
commandsThisPage = commandsPerPage;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
commandsThisPage = numberOfCommands % commandsPerPage;
|
||||||
|
}
|
||||||
|
|
||||||
|
let embedPartTwo = '';
|
||||||
|
|
||||||
|
embedPartTwo += '{"fields": [';
|
||||||
|
for (let i = 0; i < commandsThisPage; i++) {
|
||||||
|
|
||||||
|
const currentCommandName = Object.keys(helpFile)[i + (commandsPerPage * (pageNumber - 1))];
|
||||||
|
|
||||||
|
embedPartTwo += '{';
|
||||||
|
|
||||||
|
embedPartTwo += ' "name": "/' + currentCommandName + '",',
|
||||||
|
embedPartTwo += ' "value": "' + helpFile[currentCommandName].description + '"',
|
||||||
|
|
||||||
|
embedPartTwo += '},';
|
||||||
|
}
|
||||||
|
embedPartTwo = embedPartTwo.substring(0, embedPartTwo.length - 1) + ']}';
|
||||||
|
|
||||||
|
let buttonList = '';
|
||||||
|
|
||||||
|
// Change buttons based on page number. Is there an easier/shorter way to do this?
|
||||||
|
if (pageNumber == 1) {
|
||||||
|
buttonList = new ActionRowBuilder()
|
||||||
|
.addComponents(
|
||||||
|
new ButtonBuilder()
|
||||||
|
.setCustomId('back')
|
||||||
|
.setLabel('Previous')
|
||||||
|
.setStyle(ButtonStyle.Secondary)
|
||||||
|
.setDisabled(true),
|
||||||
|
)
|
||||||
|
.addComponents(
|
||||||
|
new ButtonBuilder()
|
||||||
|
.setCustomId('page')
|
||||||
|
.setLabel(`${pageNumber}/${pageTotal}`)
|
||||||
|
.setStyle(ButtonStyle.Secondary)
|
||||||
|
.setDisabled(true),
|
||||||
|
)
|
||||||
|
.addComponents(
|
||||||
|
new ButtonBuilder()
|
||||||
|
.setCustomId('next')
|
||||||
|
.setLabel('Next')
|
||||||
|
.setStyle(ButtonStyle.Primary),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else if (pageNumber == pageTotal) {
|
||||||
|
buttonList = new ActionRowBuilder()
|
||||||
|
.addComponents(
|
||||||
|
new ButtonBuilder()
|
||||||
|
.setCustomId('back')
|
||||||
|
.setLabel('Previous')
|
||||||
|
.setStyle(ButtonStyle.Primary),
|
||||||
|
)
|
||||||
|
.addComponents(
|
||||||
|
new ButtonBuilder()
|
||||||
|
.setCustomId('page')
|
||||||
|
.setLabel(`${pageNumber}/${pageTotal}`)
|
||||||
|
.setStyle(ButtonStyle.Secondary)
|
||||||
|
.setDisabled(true),
|
||||||
|
)
|
||||||
|
.addComponents(
|
||||||
|
new ButtonBuilder()
|
||||||
|
.setCustomId('next')
|
||||||
|
.setLabel('Next')
|
||||||
|
.setStyle(ButtonStyle.Secondary)
|
||||||
|
.setDisabled(true),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
buttonList = new ActionRowBuilder()
|
||||||
|
.addComponents(
|
||||||
|
new ButtonBuilder()
|
||||||
|
.setCustomId('back')
|
||||||
|
.setLabel('Previous')
|
||||||
|
.setStyle(ButtonStyle.Primary),
|
||||||
|
)
|
||||||
|
.addComponents(
|
||||||
|
new ButtonBuilder()
|
||||||
|
.setCustomId('page')
|
||||||
|
.setLabel(`${pageNumber}/${pageTotal}`)
|
||||||
|
.setStyle(ButtonStyle.Secondary)
|
||||||
|
.setDisabled(true),
|
||||||
|
)
|
||||||
|
.addComponents(
|
||||||
|
new ButtonBuilder()
|
||||||
|
.setCustomId('next')
|
||||||
|
.setLabel('Next')
|
||||||
|
.setStyle(ButtonStyle.Primary),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Button code
|
||||||
|
const collector = interaction.channel.createMessageComponentCollector({ time: 30000 });
|
||||||
|
|
||||||
|
collector.on('collect', async i => {
|
||||||
|
|
||||||
|
if (i.customId === 'next') {
|
||||||
|
pageNumber += 1;
|
||||||
|
}
|
||||||
|
if (i.customId === 'back') {
|
||||||
|
pageNumber -= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Replicate the above code to remake the help model for the new page. Again, there has to be an easier way to do this.
|
||||||
|
embedPartOne = {
|
||||||
|
color: 0x0099ff,
|
||||||
|
title: 'Help Text',
|
||||||
|
description: `Page ${pageNumber} of ${pageTotal}`,
|
||||||
|
};
|
||||||
|
|
||||||
|
embedPartTwo = '';
|
||||||
|
|
||||||
|
if (pageNumber != pageTotal) {
|
||||||
|
commandsThisPage = commandsPerPage;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
commandsThisPage = numberOfCommands % commandsPerPage;
|
||||||
|
}
|
||||||
|
|
||||||
|
embedPartTwo += '{"fields": [';
|
||||||
|
for (let j = 0; j < commandsThisPage; j++) {
|
||||||
|
|
||||||
|
const currentCommandName = Object.keys(helpFile)[j + (commandsPerPage * (pageNumber - 1))];
|
||||||
|
|
||||||
|
embedPartTwo += '{';
|
||||||
|
|
||||||
|
embedPartTwo += ' "name": "/' + currentCommandName + '",',
|
||||||
|
embedPartTwo += ' "value": "' + helpFile[currentCommandName].description + '"',
|
||||||
|
|
||||||
|
embedPartTwo += '},';
|
||||||
|
}
|
||||||
|
embedPartTwo = embedPartTwo.substring(0, embedPartTwo.length - 1) + ']}';
|
||||||
|
|
||||||
|
// Change buttons based on page number. Is there an easier/shorter way to do this?
|
||||||
|
if (pageNumber == 1) {
|
||||||
|
buttonList = new ActionRowBuilder()
|
||||||
|
.addComponents(
|
||||||
|
new ButtonBuilder()
|
||||||
|
.setCustomId('back')
|
||||||
|
.setLabel('Previous')
|
||||||
|
.setStyle(ButtonStyle.Secondary)
|
||||||
|
.setDisabled(true),
|
||||||
|
)
|
||||||
|
.addComponents(
|
||||||
|
new ButtonBuilder()
|
||||||
|
.setCustomId('page')
|
||||||
|
.setLabel(`${pageNumber}/${pageTotal}`)
|
||||||
|
.setStyle(ButtonStyle.Secondary)
|
||||||
|
.setDisabled(true),
|
||||||
|
)
|
||||||
|
.addComponents(
|
||||||
|
new ButtonBuilder()
|
||||||
|
.setCustomId('next')
|
||||||
|
.setLabel('Next')
|
||||||
|
.setStyle(ButtonStyle.Primary),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else if (pageNumber == pageTotal) {
|
||||||
|
buttonList = new ActionRowBuilder()
|
||||||
|
.addComponents(
|
||||||
|
new ButtonBuilder()
|
||||||
|
.setCustomId('back')
|
||||||
|
.setLabel('Previous')
|
||||||
|
.setStyle(ButtonStyle.Primary),
|
||||||
|
)
|
||||||
|
.addComponents(
|
||||||
|
new ButtonBuilder()
|
||||||
|
.setCustomId('page')
|
||||||
|
.setLabel(`${pageNumber}/${pageTotal}`)
|
||||||
|
.setStyle(ButtonStyle.Secondary)
|
||||||
|
.setDisabled(true),
|
||||||
|
)
|
||||||
|
.addComponents(
|
||||||
|
new ButtonBuilder()
|
||||||
|
.setCustomId('next')
|
||||||
|
.setLabel('Next')
|
||||||
|
.setStyle(ButtonStyle.Secondary)
|
||||||
|
.setDisabled(true),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
buttonList = new ActionRowBuilder()
|
||||||
|
.addComponents(
|
||||||
|
new ButtonBuilder()
|
||||||
|
.setCustomId('back')
|
||||||
|
.setLabel('Previous')
|
||||||
|
.setStyle(ButtonStyle.Primary),
|
||||||
|
)
|
||||||
|
.addComponents(
|
||||||
|
new ButtonBuilder()
|
||||||
|
.setCustomId('page')
|
||||||
|
.setLabel(`${pageNumber}/${pageTotal}`)
|
||||||
|
.setStyle(ButtonStyle.Secondary)
|
||||||
|
.setDisabled(true),
|
||||||
|
)
|
||||||
|
.addComponents(
|
||||||
|
new ButtonBuilder()
|
||||||
|
.setCustomId('next')
|
||||||
|
.setLabel('Next')
|
||||||
|
.setStyle(ButtonStyle.Primary),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
await i.update({ embeds: [Object.assign({}, embedPartOne, JSON.parse(embedPartTwo))], components: [ buttonList ], ephemeral: true });
|
||||||
|
});
|
||||||
|
|
||||||
|
await interaction.reply({ embeds: [Object.assign({}, embedPartOne, JSON.parse(embedPartTwo))], components: [ buttonList ], ephemeral: true });
|
||||||
|
},
|
||||||
|
};
|
Loading…
Reference in a new issue