woomy-v2/bot/util/handlers/messageHandler.js

113 lines
5 KiB
JavaScript
Raw Normal View History

2020-10-21 07:57:00 +00:00
class MessageHandler {
constructor (client) {
this.client = client;
}
async handle (message) {
2020-10-23 03:26:30 +00:00
// Ignore messages from bots, and messages in DM's
if (message.author.bot) return;
if (!message.channel.guild) return;
2020-10-21 07:57:00 +00:00
2020-10-23 03:25:07 +00:00
// Request all the data we need from the database
2020-10-21 07:57:00 +00:00
const data = {};
data.user = await this.client.db.getUser(message.author.id);
2020-10-23 03:25:07 +00:00
data.guild = await this.client.db.getGuild(message.channel.guild.id);
data.member = await this.client.db.getMember(message.channel.guild.id, message.author.id);
2020-10-21 07:57:00 +00:00
2020-10-23 03:26:30 +00:00
// Ignore users on the guild blocklist
if (data.guild.blacklist.includes(message.author.id)) return;
// If a user pings Woomy, respond to them with the prefixes they can use
if (message.content === `<@${this.client.user.id}>` || message.content === `<@!${this.client.user.id}>`) {
return message.channel.createMessage(
`Hi! Your personal prefix is \`${data.user.prefix}\`. You can also ping me ^-^`
);
}
2020-10-21 07:57:00 +00:00
2020-10-23 03:25:07 +00:00
// All the prefixes Woomy will respond to
const prefixes = [
data.user.prefix,
data.guild.prefix,
`<@${this.client.user.id}> `,
`<@!${this.client.user.id}> `
];
2020-10-21 07:57:00 +00:00
let prefix;
2020-10-23 03:26:30 +00:00
// Check the message content to see if it starts with one of our prefixes
2020-10-21 07:57:00 +00:00
for (const thisPrefix of prefixes) {
if (message.content.startsWith(thisPrefix)) {
prefix = thisPrefix;
break;
}
}
2020-10-23 03:26:30 +00:00
// Ignore the message if it doesn't start with a valid prefix
2020-10-21 07:57:00 +00:00
if (!prefix) return;
2020-10-23 03:26:30 +00:00
// Turn the message content into an array (excluding the prefix)
2020-10-21 07:57:00 +00:00
const args = message.content.slice(prefix.length).trim().split(/ +/g);
2020-10-23 03:26:30 +00:00
// Find the command
2020-10-21 07:57:00 +00:00
const commandName = args.shift().toLowerCase();
const command = this.client.commands.get(commandName) || this.client.commands.get(this.client.aliases.get(commandName));
2020-10-23 03:26:30 +00:00
// Return if a command (or its aliases) are not found
2020-10-21 07:57:00 +00:00
if (!command) return;
2020-10-23 03:26:30 +00:00
// Both of these blocks check if the command is disabled/in a disabled category
if (data.guild.disabledcommands.includes(command.name)) return message.channel.createMessage(
'This command has been disabled by a server administrator.'
);
2020-10-21 07:57:00 +00:00
2020-10-23 03:26:30 +00:00
if (data.guild.disabledcategories.includes(command.category)) return message.channel.createMessage(
'The category this command is apart of has been disabled by a server administrator.'
);
2020-10-21 07:57:00 +00:00
2020-10-23 03:26:30 +00:00
// Both of these blocks check the permissions of the user, and reply with missing perms if any are found
const missingUserPerms = this.client.helpers.checkPermissions(message.channel, message.author.id, command.userPerms);
if (missingUserPerms) return message.channel.createMessage(
`You can't use this command because you lack these permissions: \`${missingUserPerms.join('`, `')}\``
);
2020-10-21 07:57:00 +00:00
2020-10-23 03:26:30 +00:00
const missingBotPerms = this.client.helpers.checkPermissions(message.channel, this.client.user.id, command.botPerms);
if (missingBotPerms) return message.channel.createMessage(
`I can't run this command because I lack these permissions: \`${missingBotPerms.join('`, `')}\``
);
2020-10-21 07:57:00 +00:00
2020-10-23 03:26:30 +00:00
// Return if the command is disabled globally
if (command.enabled === false) return message.channel.createMessage(
'This command has been disabled by my developers.'
);
2020-10-21 07:57:00 +00:00
2020-10-23 03:26:30 +00:00
// Return if the command is restricted to developers (and the user is not a developer)
2020-10-21 07:57:00 +00:00
if (command.devOnly === true && this.client.helpers.isDeveloper(message.author.id) !== true) {
return message.channel.send('This command\'s usage is restricted to developers only. Sorry!');
}
2020-10-22 01:14:28 +00:00
// Cooldown
if (this.client.cooldowns.get(command.name).has(message.author.id)) {
const timestamp = this.client.cooldowns.get(command.name).get(message.author.id);
const currentTime = Date.now();
const cooldown = command.cooldown / 1000;
const timePassed = Math.floor((currentTime - timestamp) / 1000);
return message.channel.createMessage(
`⏲️ ${message.author.mention}, you need to wait ${cooldown - timePassed} seconds before using this command again.`
);
2020-10-22 01:14:28 +00:00
} else {
this.client.cooldowns.get(command.name).set(message.author.id, new Date());
setTimeout(() => {
this.client.cooldowns.get(command.name).delete(message.author.id);
}, this.client.commands.get(command.name).cooldown);
}
2020-10-21 07:57:00 +00:00
try {
command.run(this.client, message, args, data);
this.client.logger.command(`Ran ${command.name}`);
} catch (error) {
this.client.logger.error('COMMAND_EXECUTION_ERROR', `${command.name}: ${error}`);
}
}
}
module.exports = MessageHandler;