file layout changes + interaction passoff
This commit is contained in:
parent
dfc1978368
commit
b94fc32f46
3 changed files with 200 additions and 7 deletions
68
bot/event_modules/eventHandler.js
Normal file
68
bot/event_modules/eventHandler.js
Normal file
|
@ -0,0 +1,68 @@
|
|||
/* eslint-disable indent */
|
||||
|
||||
class EventHandler {
|
||||
constructor (client) {
|
||||
this.client = client;
|
||||
}
|
||||
|
||||
handle (wsEvent, param_1, param_2) {
|
||||
switch (wsEvent) {
|
||||
case 'ready': {
|
||||
const readyModules = this.client.eventModules.filter(module => module.wsEvent === 'ready');
|
||||
readyModules.forEach(module => module.run(this.client));
|
||||
break;
|
||||
}
|
||||
|
||||
// param_1 - error message
|
||||
case 'error': {
|
||||
const errorModules = this.client.eventModules.filter(module => module.wsEvent === 'error');
|
||||
errorModules.forEach(module => module.run(this.client, param_1));
|
||||
break;
|
||||
}
|
||||
|
||||
// param_1 - message object
|
||||
case 'messageCreate': {
|
||||
const mCreateModules = this.client.eventModules.filter(module => module.wsEvent === 'messageCreate');
|
||||
mCreateModules.forEach(module => module.run(this.client, param_1));
|
||||
break;
|
||||
}
|
||||
|
||||
// param_1 - guild object
|
||||
case 'guildCreate': {
|
||||
const gCreateModules = this.client.eventModules.filter(module => module.wsEvent === 'guildCreate');
|
||||
gCreateModules.forEach(module => module.run(this.client, param_1));
|
||||
break;
|
||||
}
|
||||
|
||||
// param_1 - guild object
|
||||
case 'guildDelete': {
|
||||
const gDeleteModules = this.client.eventModules.filter(module => module.wsEvent === 'guildDelete');
|
||||
gDeleteModules.forEach(module => module.run(this.client, param_1));
|
||||
break;
|
||||
}
|
||||
|
||||
// param_1 - guild object | param_2 - member object
|
||||
case 'guildMemberAdd': {
|
||||
const gMemberAddModules = this.client.eventModules.filter(module => module.wsEvent === 'guildMemberAdd');
|
||||
gMemberAddModules.forEach(module => module.run(this.client, param_1, param_2));
|
||||
break;
|
||||
}
|
||||
|
||||
// param_1 - guild object | param_2 - member object
|
||||
case 'guildMemberRemove': {
|
||||
const gMemberRemoveModules = this.client.eventModules.filter(module => module.wsEvent === 'guildMemberRemove');
|
||||
gMemberRemoveModules.forEach(module => module.run(this.client, param_1, param_2));
|
||||
break;
|
||||
}
|
||||
|
||||
// param_1 - old voice state | param_2 - new voice state
|
||||
case 'voiceStateUpdate': {
|
||||
const vStateUpdateModules = this.client.eventModules.filter(module => module.wsEvent === 'voiceStateUpdate');
|
||||
vStateUpdateModules.forEach(module => module.run(this.client));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = EventHandler;
|
121
bot/event_modules/interactionCreate/messageHandler.js
Normal file
121
bot/event_modules/interactionCreate/messageHandler.js
Normal file
|
@ -0,0 +1,121 @@
|
|||
class MessageHandler {
|
||||
constructor (client) {
|
||||
this.client = client;
|
||||
}
|
||||
|
||||
async handle (message) {
|
||||
// Ignore messages from bots, and messages in DM's
|
||||
if (message.author.bot) return;
|
||||
if (!message.guild) return;
|
||||
|
||||
// Request all the data we need from the database
|
||||
const data = {};
|
||||
data.user = await this.client.db.getUser(message.author.id);
|
||||
data.guild = await this.client.db.getGuild(message.guild.id);
|
||||
data.member = await this.client.db.getMember(message.guild.id, message.author.id);
|
||||
|
||||
// Ignore users on the guild blocklist
|
||||
if (data.guild.blocklist.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.send(
|
||||
`Hi! The prefix for this server is \`${data.guild.prefix}\`, and your personal prefix is \`${data.user.prefix}\`. You can also ping me ^-^`
|
||||
);
|
||||
}
|
||||
|
||||
// All the prefixes Woomy will respond to
|
||||
const prefixes = [
|
||||
data.user.prefix,
|
||||
data.guild.prefix,
|
||||
`<@${this.client.user.id}> `,
|
||||
`<@!${this.client.user.id}> `
|
||||
];
|
||||
|
||||
let prefix;
|
||||
|
||||
// Check the message content to see if it starts with one of our prefixes
|
||||
for (const thisPrefix of prefixes) {
|
||||
if (message.content.startsWith(thisPrefix)) {
|
||||
prefix = thisPrefix;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Ignore the message if it doesn't start with a valid prefix
|
||||
if (!prefix) return;
|
||||
|
||||
// Save prefix so we can use it later (mostly for help command)
|
||||
if (prefix === `<@${this.client.user.id}> ` || prefix === `<@!${this.client.user.id}> `) {
|
||||
message.prefix = '@Woomy ';
|
||||
} else (message.prefix = prefix);
|
||||
|
||||
// Turn the message content into an array (excluding the prefix)
|
||||
const args = message.content.slice(prefix.length).trim().split(/ +/g);
|
||||
|
||||
// Find the command
|
||||
const commandName = args.shift().toLowerCase();
|
||||
const command = this.client.commands.get(commandName) || this.client.commands.get(this.client.aliases.get(commandName));
|
||||
|
||||
// Return if a command (or its aliases) are not found
|
||||
if (!command) return;
|
||||
|
||||
// Both of these blocks check if the command is disabled/in a disabled category
|
||||
if (data.guild.disabledcommands.includes(command.name)) return message.channel.send(
|
||||
this.client.config.emojis.permError + ' This command has been disabled by a server administrator.'
|
||||
);
|
||||
|
||||
if (data.guild.disabledcategories.includes(command.category)) return message.channel.send(
|
||||
this.client.config.emojis.permError + ' The category this command is apart of has been disabled by a server administrator.'
|
||||
);
|
||||
|
||||
// Both of these blocks check the permissions of the user, and reply with missing perms if any are found
|
||||
const missingUserPerms = this.client.functions.checkPermissions(message.channel, message.author.id, command.userPerms);
|
||||
if (missingUserPerms) return message.channel.send(
|
||||
`${this.client.config.emojis.permError} You can't use this command because you lack these permissions: \`${missingUserPerms.join('`, `')}\``
|
||||
);
|
||||
|
||||
const missingBotPerms = this.client.functions.checkPermissions(message.channel, this.client.user.id, command.botPerms);
|
||||
if (missingBotPerms) return message.channel.send(
|
||||
`${this.client.config.emojis.permError} I can't run this command because I lack these permissions: \`${missingBotPerms.join('`, `')}\``
|
||||
);
|
||||
|
||||
// Return if the command is disabled globally
|
||||
if (command.enabled === false) return message.channel.send(
|
||||
this.client.config.emojis.permError + ' This command has been disabled by my developers.'
|
||||
);
|
||||
|
||||
// Return if the command is restricted to developers (and the user is not a developer)
|
||||
if (command.devOnly === true && this.client.config.ownerIDs.includes(message.author.id) !== true) {
|
||||
return message.channel.send(
|
||||
`${this.client.config.emojis.permError} ${message.author.username} is not in the sudoers file. This incident will be reported.`
|
||||
);
|
||||
}
|
||||
|
||||
// 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.send(
|
||||
`${this.client.config.emojis.wait} ${message.author.mention}, you need to wait ${cooldown - timePassed} seconds before using this command again.`
|
||||
);
|
||||
} 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);
|
||||
}
|
||||
|
||||
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.stack}`);
|
||||
message.channel.send(`${this.client.config.emojis.botError} An error occured when I was trying to run this command. I've sent through the details of the error to my developers.`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = MessageHandler;
|
18
bot/index.js
18
bot/index.js
|
@ -3,10 +3,10 @@
|
|||
const Discord = require('discord.js');
|
||||
const CommandLoader = require('./util/commandLoader');
|
||||
const EventLoader = require('./util/eventLoader');
|
||||
const EventHandler = require('./util/handlers/eventHandler');
|
||||
const MessageHandler = require('./util/handlers/messageHandler');
|
||||
const EventHandler = require('./event_modules/eventHandler');
|
||||
const MessageHandler = require('./event_modules/interactionCreate/messageHandler');
|
||||
const Functions = require('./util/functions');
|
||||
// const Database = require('./util/database');
|
||||
const Database = require('./util/database');
|
||||
const Logger = require('./util/logger');
|
||||
const sentry = require('@sentry/node');
|
||||
const config = require('../botconfig.json');
|
||||
|
@ -23,7 +23,7 @@ class WoomyClient extends Discord.Client {
|
|||
// Essential modules
|
||||
this.logger = Logger;
|
||||
this.MessageEmbed = Discord.MessageEmbed;
|
||||
//this.db = new Database(this);
|
||||
this.db = new Database(this);
|
||||
this.functions = new Functions(this);
|
||||
this.commandLoader = new CommandLoader(this);
|
||||
this.eventLoader = new EventLoader(this);
|
||||
|
@ -41,7 +41,8 @@ class WoomyClient extends Discord.Client {
|
|||
createEventListeners () {
|
||||
this.on('ready', this.runReadyModules);
|
||||
this.on('error', this.runErrorModules);
|
||||
this.on('messageCreate', this.runMessageCreateModules);
|
||||
this.on('interactionCreate', this.runInteractionModules);
|
||||
/// this.on('messageCreate', this.runMessageCreateModules);
|
||||
this.on('guildCreate', this.runGuildCreateModules);
|
||||
this.on('guildDelete', this.runGuildDeleteModules);
|
||||
this.on('guildMemberAdd', this.runGuildMemberAddModules);
|
||||
|
@ -67,8 +68,11 @@ class WoomyClient extends Discord.Client {
|
|||
this.mainEventListener('error', error);
|
||||
}
|
||||
|
||||
runInteractionCreateModules (interaction) {
|
||||
this.mainEventListener('interactionCreate', interaction);
|
||||
}
|
||||
|
||||
runMessageCreateModules (message) {
|
||||
this.messageHandler.handle(message);
|
||||
this.mainEventListener('messageCreate', message);
|
||||
}
|
||||
|
||||
|
@ -142,7 +146,7 @@ process.on('unhandledRejection', err => {
|
|||
client.logger.error('UNHANDLED_PROMISE_ERROR', err.stack);
|
||||
});
|
||||
|
||||
// Shut down gracefully when SIGINT is recieved
|
||||
// Shut down gracefully when SIGINT is received
|
||||
process.on('SIGINT', () => {
|
||||
client.functions.shutdown();
|
||||
});
|
Loading…
Reference in a new issue