Reputation: 21
So I'm trying to have all my events in separate files. Events like "ready" and "messageCreate" are working just fine, but I can't figure this one out. Can someone please help me?
const { MessageEmbed } = require("discord.js")
module.exports = {
name: "guildMemberAdd",
run: async (member) => {
const welcome = new MessageEmbed()
.setDescription(`
<:nezuko_peek:974066160108732517> — New friend just showed up: <@${member.user.id}>
Welcome fellow adventurer in **Cozy corner**! What brings you in these sides? <:girl_love:973968823449436190> Here, go to <#972618593294512128> to introduce yourself and talk with us in <#971800237507248158>!
`)
.setImage("https://64.media.tumblr.com/01a9f72f062feaafa60cdbf80f9ba729/tumblr_inline_orgoyznIM51sd5e91_500.gif")
.setColor("#F7DF79")
.setFooter({ text: "Thank you for joining and enjoy your stay!" })
const channel = member.guild.channels.cache.get("971800237507248158")
channel.send({ content: `<@&974343947105206382>`, embeds: [welcome] })
}
}
This event called "guildMemberAdd" should be working and execute itself when member joins the server. Here's my event handler:
const { getFiles } = require("../util/functions")
module.exports = (bot, reload) => {
const {client} = bot
let events = getFiles("./events/", ".js")
if (events.length === 0){
console.log("No events to load")
}
events.forEach((f, i) => {
if (reload)
delete require.cache[require.resolve(`../events/${f}`)]
const event = require(`../events/${f}`)
client.events.set(event.name, event)
if (!reload)
console.log (`${i + 1}. ${f} loaded`)
})
if (!reload)
initEvents(bot)
}
function triggerEventHandler(bot, event, ...args){
const {client} = bot
try {
if (client.events.has(event))
client.events.get(event).run(bot, ...args)
else
throw new Error(`Event ${event} does not exist`)
}
catch(err){
console.error(err)
}
}
function initEvents(bot) {
const {client} = bot
client.on("ready", () => {
triggerEventHandler(bot, "ready")
})
client.on("messageCreate", (message) => {
triggerEventHandler(bot, "messageCreate", message)
})
client.on("guildMemberAdd", (member) => {
triggerEventHandler(bot, "guildMemberAdd", member)
})
}
But for some reason it's not working and I got error: TypeError: Cannot read property 'id' of undefined
Upvotes: 0
Views: 230
Reputation: 2337
When you are calling your command, you are passing two arguments bot
and ...args
while in your exported command, it is only expecting ...args
. So you have two options: either change the order of the arguments you are passing so that it is something like this: client.events.get(event).run(...args, bot)
, or remove the bot argument as you are not using it in the command anyway. Your final code in your event handler might look something like this:
const { getFiles } = require("../util/functions");
module.exports = (bot, reload) => {
const { client } = bot;
let events = getFiles("./events/", ".js");
if (events.length === 0) {
console.log("No events to load");
}
events.forEach((f, i) => {
if (reload) delete require.cache[require.resolve(`../events/${f}`)];
const event = require(`../events/${f}`);
client.events.set(event.name, event);
if (!reload) console.log(`${i + 1}. ${f} loaded`);
});
if (!reload) initEvents(bot);
};
function triggerEventHandler(bot, event, ...args) {
const { client } = bot;
try {
if (client.events.has(event)) client.events.get(event).run(...args);
else throw new Error(`Event ${event} does not exist`);
} catch (err) {
console.error(err);
}
}
function initEvents(bot) {
const { client } = bot;
client.on("ready", () => {
triggerEventHandler(bot, "ready");
});
client.on("messageCreate", (message) => {
triggerEventHandler(bot, "messageCreate", message);
});
client.on("guildMemberAdd", (member) => {
triggerEventHandler(bot, "guildMemberAdd", member);
});
}
Upvotes: 2