165 lines
5.1 KiB
JavaScript
165 lines
5.1 KiB
JavaScript
|
/* eslint-disable comma-dangle */
|
||
|
// dotenv for handling environment variables
|
||
|
const dotenv = require('dotenv');
|
||
|
dotenv.config();
|
||
|
const isDev = process.env.isDev;
|
||
|
const ownerId = process.env.ownerId;
|
||
|
|
||
|
// filesystem
|
||
|
const fs = require('fs');
|
||
|
|
||
|
// Discord.js
|
||
|
const Discord = require('discord.js');
|
||
|
|
||
|
// Various imports from other files
|
||
|
const config = require('./config.json');
|
||
|
const strings = require('./strings.json');
|
||
|
const slashCommandFiles = fs.readdirSync('./slash-commands/').filter(file => file.endsWith('.js'));
|
||
|
const dotCommandFiles = fs.readdirSync('./dot-commands/').filter(file => file.endsWith('.js'));
|
||
|
|
||
|
const functions = {
|
||
|
// Functions for managing and creating Collections
|
||
|
collections: {
|
||
|
// Create the collection of slash commands
|
||
|
slashCommands(client) {
|
||
|
if (!client.slashCommands) client.slashCommands = new Discord.Collection();
|
||
|
client.slashCommands.clear();
|
||
|
for (const file of slashCommandFiles) {
|
||
|
const slashCommand = require(`./slash-commands/${file}`);
|
||
|
if (slashCommand.data != undefined) {
|
||
|
client.slashCommands.set(slashCommand.data.name, slashCommand);
|
||
|
}
|
||
|
}
|
||
|
if (isDev) console.log('Slash Commands Collection Built');
|
||
|
},
|
||
|
setvalidCommands(client) {
|
||
|
for (const entry of client.dotCommands.map(command => command)) {
|
||
|
config.validCommands.push(entry.name);
|
||
|
if (Array.isArray(entry.alias)) {
|
||
|
entry.alias.forEach(element => {
|
||
|
config.validCommands.push(element);
|
||
|
});
|
||
|
} else if (entry.alias != undefined) {
|
||
|
config.validCommands.push(entry.alias);
|
||
|
}
|
||
|
}
|
||
|
if (isDev) console.log(`Valid Commands Added to Config\n${config.validCommands}`);
|
||
|
},
|
||
|
dotCommands(client) {
|
||
|
if (!client.dotCommands) client.dotCommands = new Discord.Collection();
|
||
|
client.dotCommands.clear();
|
||
|
for (const file of dotCommandFiles) {
|
||
|
const dotCommand = require(`./dot-commands/${file}`);
|
||
|
client.dotCommands.set(dotCommand.name, dotCommand);
|
||
|
if (Array.isArray(dotCommand.alias)) {
|
||
|
dotCommand.alias.forEach(element => {
|
||
|
client.dotCommands.set(element, dotCommand);
|
||
|
});
|
||
|
} else if (dotCommand.alias != undefined) {
|
||
|
client.dotCommands.set(dotCommand.alias, dotCommand);
|
||
|
}
|
||
|
}
|
||
|
if (isDev) console.log('Dot Commands Collection Built');
|
||
|
},
|
||
|
},
|
||
|
dot: {
|
||
|
getCommandData(message) {
|
||
|
const commandData = {};
|
||
|
// Split the message content at the final instance of a period
|
||
|
const finalPeriod = message.content.lastIndexOf('.');
|
||
|
if(isDev) console.log(message.content);
|
||
|
// If the final period is the last character, or doesn't exist
|
||
|
if (finalPeriod < 0) {
|
||
|
if (isDev) console.log(finalPeriod);
|
||
|
commandData.isCommand = false;
|
||
|
return commandData;
|
||
|
}
|
||
|
commandData.isCommand = true;
|
||
|
// Get the first part of the message, everything leading up to the final period
|
||
|
commandData.args = message.content.slice(0,finalPeriod).toLowerCase();
|
||
|
// Get the last part of the message, everything after the final period
|
||
|
commandData.command = message.content.slice(finalPeriod).replace('.','').toLowerCase();
|
||
|
commandData.author = `${message.author.username}#${message.author.discriminator}`;
|
||
|
return this.checkCommand(commandData);
|
||
|
},
|
||
|
checkCommand(commandData) {
|
||
|
if (commandData.isCommand) {
|
||
|
const validCommands = require('./config.json').validCommands;
|
||
|
commandData.isValid = validCommands.includes(commandData.command);
|
||
|
// Add exceptions for messages that contain only a link
|
||
|
if (commandData.args.startsWith('http')) commandData.isValid = false;
|
||
|
}
|
||
|
else {
|
||
|
commandData.isValid = false;
|
||
|
console.error('Somehow a non-command made it to checkCommands()');
|
||
|
}
|
||
|
return commandData;
|
||
|
}
|
||
|
},
|
||
|
embeds: {
|
||
|
help(interaction) {
|
||
|
// Construct the Help Embed
|
||
|
const helpEmbed = new Discord.MessageEmbed()
|
||
|
.setColor('BLUE')
|
||
|
.setAuthor('Help Page')
|
||
|
.setDescription(strings.help.description)
|
||
|
.setThumbnail(strings.urls.avatar);
|
||
|
|
||
|
// Construct the Slash Commands help
|
||
|
|
||
|
let slashCommandsFields = [];
|
||
|
|
||
|
const slashCommandsMap = interaction.client.slashCommands.map(e => {
|
||
|
return {
|
||
|
name: e.data.name,
|
||
|
description: e.data.description
|
||
|
};
|
||
|
})
|
||
|
|
||
|
for (const e of slashCommandsMap) {
|
||
|
slashCommandsFields.push({
|
||
|
name: `- /${e.name}`,
|
||
|
value: e.description,
|
||
|
inline: false,
|
||
|
});
|
||
|
}
|
||
|
|
||
|
// Construct the Dot Commands Help
|
||
|
let dotCommandsFields = [];
|
||
|
|
||
|
const dotCommandsMap = interaction.client.dotCommands.map(e => {
|
||
|
return {
|
||
|
name: e.name,
|
||
|
description: e.description,
|
||
|
usage: e.usage
|
||
|
};
|
||
|
});
|
||
|
|
||
|
for (const e of dotCommandsMap) {
|
||
|
dotCommandsFields.push({
|
||
|
name: `- .${e.name}`,
|
||
|
value: `${e.description}\nUsage: ${e.usage}`,
|
||
|
inline: false,
|
||
|
});
|
||
|
}
|
||
|
|
||
|
helpEmbed.addField('Slash Commands', strings.help.slash);
|
||
|
helpEmbed.addFields(slashCommandsFields);
|
||
|
helpEmbed.addField('Dot Commands', strings.help.dot);
|
||
|
helpEmbed.addFields(dotCommandsFields);
|
||
|
|
||
|
return { embeds: [
|
||
|
helpEmbed
|
||
|
], ephemeral: true };
|
||
|
},
|
||
|
text(commandData) {
|
||
|
return { embeds: [new Discord.MessageEmbed()
|
||
|
.setAuthor(commandData.command)
|
||
|
.setDescription(commandData.content)
|
||
|
.setTimestamp()
|
||
|
.setFooter(commandData.author)]};
|
||
|
},
|
||
|
},
|
||
|
};
|
||
|
|
||
|
module.exports = functions;
|