Search code examples
discorddiscord.js

Problem with webhooks and the role/permissions idea


I develop a bot with discord.js that uses things like msg.member.hasPermission("ADMINISTRATOR") or msg.member.roles.cache.has(teacherRoleID). Everything worked fine until I tried webhooks. By adding these two lines :

client.on('ready', () => {
  client.user.setStatus("online")
  client.user.setActivity("!help", {
    type: "PLAYING",
  });
  superConsole(`Logged in as ${client.user.tag} in ${client.guilds.size} guilds!`);


    const hook = new Discord.WebhookClient("ID", "secret token"); // THESE
    hook.send("I am now alive!");                                 // LINES

  });

(btw superConsole is a function) Since then, the program did not work any more and always returned the same errors: (node:20736) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'hasPermission' of null & (node:20736) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'roles' of null

When I delete these 2 lines for the webhook, it works again. Why? I don't understand.

The permission and role things are in a message listener:

client.on('message', async msg => {
if (msg.member.hasPermission('ADMINISTRATOR') {
// some stuff here
}
if (msg.member.roles.cache.has(teacherRoleID) {
// some stuff here
}
});

Solution

  • The issue is that when you send a message from hook, it triggers the client's message event. Because a webhook isn't a guild member, msg.member will get undefined for messages sent from a webhook.

    You would have to use something like this:

    if (msg.member) {
      if (msg.member.permissions.has('ADMINISTRATOR') {
        // some stuff here
      }
      if (msg.member.roles.cache.has(teacherRoleID) {
      // some stuff here
      }
    }