如何为我的机器人编写带有原因功能的踢球

How to write a kick with reason function for my bot

我试图让我的代码有理由地踢人,并私信他们说他们因 <reason> 被踢出了 <server>。目前它没有发送原因。

查看了在线教程,但没有成功。我也问过一些人,他们也不知道。似乎没有多少人使用 discord.js,任何帮助将不胜感激。 =)

Message Bot Sends Message I Sent

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

client.once('ready', () => {
  console.log('Bot loaded!');
  client.user.setActivity('SUPPORT: !info', {
    type: 'PLAYING'
  });
})


client.on('message', message => {

  if (message.content === `${prefix}ping`) {
    message.channel.send('Pong.');
    console.log(`COMMAND: ${message.member.displayName} issued ping command.`);
  } else if (message.content === `${prefix}info`) {
    message.channel.send(`This server's name is: ${message.guild.name}
It has ${message.guild.memberCount} total members.
It is running **WastefulBot** by **USER HIDDEN**
For support please join LINK HIDDEN`);
    console.log(`COMMAND: ${message.member.displayName} issued info command.`);
  } else if (message.content === `${prefix}help`) {
    console.log(`COMMAND: ${message.member.displayName} issued help command.`);
    message.delete();
    message.channel.send('Please check your dm\'s.');
    message.member.send(`__**WastefulBot Help**__
!ping | Pong.
!info | Returns information on the server and how to get support for the bot.
!donate | Get information on how to donate.
!help | Shows this information.
__**Administration Commands**__
(Please note these commands require corresponding permissions)
!kick <@user> | Kicks the specified user.
!ban <@user> | Bans the specified user.
__**Management Commands**__
(Please note these commands require corresponding permissions)
!staff | Grants a user staff. (WIP - May not work on most servers.)
`);
  }

  if (message.content === (`${prefix}setlog`)) {
    if (message.member.hasPermission("MANAGE_CHANNEL")) {
      message.channel.send('Sorry. This command is currently WIP.');
      console.log(`WARNING: ${message.member.displayName} issued setlog command, this command is WIP and does not work.`);
    }
  }

  if (message.content === (`${prefix}donate`)) {
    message.channel.send('You can donate at ``https://www.patreon.com/wasteful_development``');
  }

  //KICK COMMAND STARTS HERE
  else if (message.content.startsWith(`${prefix}kick`)) {

    if (message.member.hasPermission("KICK_MEMBERS")) {
      if (!message.mentions.users.size) {
        return message.reply('You must tag 1 user.');
      } else {
        let member = message.mentions.members.first();
        let reason = message.content.split(" ").slice(22);
        if (member.kickable == false) {
          message.channel.send("That user cannot be kicked!");
          return;
        } else {
          member.send(`You have been kicked from \`\`${message.guild.name}\`\` for the reason ${reason}.`).then((message) => {
            member.kick(reason).then((member) => {
              message.channel.send(" " + member.displayName + " has been kicked!");
              console.log(`KICK: ${message.member.displayName} successfully executed kick command.`);
            });
          });
        }
      }
    } else {
      message.channel.send("You do not have permission to use kick.");
      return;
    }
  }

  //End of kick mthd
  else if (message.content.startsWith(`${prefix}staff`)) {
    if (message.member.hasPermission("MANAGE_ROLES")) {
      if (!message.mentions.users.size) {
        return message.reply('You must tag 1 user.');
      } else {
        let member = message.mentions.members.first();
        member.addRole("569174153337503804");
        message.channel.send(`Granted ${member.displayName} staff!`);
        message.channel.send(`Warning this command will not have worked on most servers as it is WIP.`);
        console.log(`STAFF: ${message.member.displayName} successfully granted ${member.displayName} staff .`);
      }

    } else {
      message.channel.send("**You do not have permission to grant users staff.**");
      return;
    }
  }

});

client.login(token);

由于用户的隐私设置而被踢出后,您的机器人可能无法向用户发送 DM。因为用户被踢了,他们不再与机器人共享服务器(除非它是一个非常全球使用的机器人,这会增加用户在使用该机器人的多个服务器中的几率),这意味着该机器人的可能性无法向该用户发送 DM,是非常高的。

以下不是答案,用户和会员都有.send()

您的代码中的错误是 member.send()。你看,member and user 是两个不同的东西。 .send() 仅适用于 user, so you should do member.user.send(),它会起作用。
此外,您将需要捕获该承诺,因此如果该用户禁用了 DM,因为如果禁用了该机器人,则机器人无法 DM 用户。类似于:

await member.user.send(`You have been kicked!`)
  .catch(() => message.channel.send("User seems to have DMs disabled!"));
await member.kick("reason")
  .then(member => message.channel.send(`${member.displayName} has been kicked!`))
  .catch(e => console.error(e.stack));

请记住,awaitanother way 异步函数中的链接 then

解释:

查看您的错误,这是问题的时间表。

  1. 这一切的根源在于,由于公会 (here) 中的隐私设置,机器人无法向成员发送 DM。这导致 member.send(...) 被拒绝。
  2. 由于没有捕获到这个被拒绝的承诺,代码继续 .then() 没有返回预期的 message 参数。
  3. 当您尝试读取 message.memberdisplayName 属性 时,它会抛出错误,因为您的参数 message 从未返回。

解决方案:

实施 .catch() 方法来 处理拒绝承诺的可能性

请记住,您必须将函数声明为异步才能使用 await:

client.on('message', async message => { // ES6

然后,在你的命令中:

await member.send(`You have been kicked from \`${message.guild.name}\`. Reason: \`${reason}\``)
  .catch(err => message.channel.send(`⚠ Unable to alert ${member} of reason.`));

await member.kick(reason);
await message.channel.send(` ${member} has been kicked!`);

console.log(`${message.author.tag} kicked ${member.user.tag} from '${message.guild.name}'.`);

您的原因代码应该是:

const reason = message.content.split(' ').splice(2)

数字 3 代表命令中原因开始的单词。 例如>踢@原因

因此 >kick 将变为 0,然后 @<user> 将变为 1,而 reason 将变为 2, 所以基本上 splice 是它停止的词,2 之后的每个词都是你的原因,如果有意义的话包括 2。

我尽力解释了:)