0
votes

I started building a Discord bot and the first function I made was kicking members. This is the code

const Discord = require("discord.js");
const { prefix, token } = require("./config.json");
const client = new Discord.Client();

client.once("ready", () => {
  console.log("Ready!");
});

client.on("message", (message) => {
  if (message.member.hasPermission(["KICK_MEMBERS", "BAN_MEMBERS"])) {
    if (message.content.startsWith(`${prefix}kick`)) {
      let member = message.mentions.members.first();
      member.kick().then((member) => {
        message.channel.send("```" + member.displayName + " has been kicked ```");
      });
    }
  }
});

client.login(token);

If someone without the kick and ban permission tries it nothing happens so this part is working. If an admin types eg. :kick @someone then someone will be kicked. But if an Admin types :kick (without someone's username) I get an error and the bot stops working until I restart it manually. This is the error:TypeError: Cannot read property 'kick' of undefined. What can I do to make this fully working?

2

2 Answers

1
votes

You'll need to check if that user exists. Try is like this:

if (message.member.hasPermission(["KICK_MEMBERS", "BAN_MEMBERS"])) {
    if (message.content.startsWith(`${prefix}kick`)) {
      let member = message.mentions.members.first();
      if(!member) return message.channel.send('Cannot find this member');
      member.kick().then((member) => {
        message.channel.send("```" + member.displayName + " has been kicked ```");
      });
    }
  }

And if you want to handle even more possible errors you'll need to use a try-catch block:

if (message.member.hasPermission(["KICK_MEMBERS", "BAN_MEMBERS"])) {
    if (message.content.startsWith(`${prefix}kick`)) {
      let member = message.mentions.members.first();
      if(!member) return message.channel.send('Cannot find this member');
      try {
        member.kick().then((member) => {
          message.channel.send("```" + member.displayName + " has been kicked ```");
        });
      } catch (error) {
        console.log(error);
        message.channel.send('An error has occured');
      }
    }
  }
0
votes

Check if the user mentioned another user before kicking the member:

const Discord = require("discord.js");
const { prefix, token } = require("./config.json");
const client = new Discord.Client();

client.once("ready", () => {
  console.log("Ready!");
});

client.on("message", (message) => {
  if (message.member.hasPermission(["KICK_MEMBERS", "BAN_MEMBERS"])) {
    if (message.content.startsWith(`${prefix}kick`)) {
      let member = message.mentions.members.first();
      if (!member)
        return;
      member.kick().then((member) => {
        message.channel.send("```" + member.displayName + " has been kicked ```");
      });
    }
  }
});

client.login(token);

You can't kick undefined.