【问题标题】:How to write a kick with reason function for my bot如何为我的机器人编写带原因函数的踢球
【发布时间】:2019-09-11 05:30:11
【问题描述】:

我试图让我的代码有理由踢人,然后私信他们说他们已经从<server> 踢出<reason>。目前它没有发送原因。

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

Message Bot SendsMessage 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);

【问题讨论】:

  • 是否抛出任何错误?
  • 我的错误:pastebin.com/NYwdhV8X(我不能在这里粘贴太长)@slothiful

标签: javascript discord discord.js


【解决方案1】:

说明:

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

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

解决办法:

实现一个.catch() 方法来处理被拒绝的promise的可能性

请记住,您必须将您的函数声明为异步才能使用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}'.`);

【讨论】:

  • 另外值得注意的是,您应该在原因中添加字符限制,以确保原因消息不超过 2,000 个字符。
  • 非常感谢!这行得通。但是,当原因包含超过 1 个单词时,会发生这种情况 imgur.com/a/vwKuQkf(我的代码是 pastebin.com/bJjn9MQe)你知道我该如何解决这个问题吗?
  • 声明reason时,应在末尾添加.join(' ')
  • 不错的答案,顺便说一句 @WastefulGlint 如果你想设置一个很好的命令结构,请查看:discordjs.guide/command-handling/#individual-command-files
【解决方案2】:

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

【讨论】:

  • 他实际上使用member.send('msg').then((message) =&gt; { member.kick(reason)..}),所以它发送消息然后踢,但你仍然是对的,用户可以阻止机器人/将他们的设置设置为只允许来自朋友的dms,所以机器人不能发送dm
  • 我在我的 alt(隐身标签上无人认领的帐户)上对其进行了测试,并且可以在用户和机器人之间发送消息。 @PLASMA
【解决方案3】:

您的原因代码应该是:

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

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

所以&gt;kick 将是0,然后@&lt;user&gt; 将是1reason 将是2,所以基本上 splice 是它停止的单词,每个单词在 2 之后将是你的理由,包括 2 如果这是有道理的。

我尽力解释了:)

【讨论】:

    【解决方案4】:

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

    您的代码中的错误是member.send()。你看,memberuser 是两个不同的东西。 .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

    【讨论】:

    • 这不是真的:GuildMember#send
    • 此代码不起作用。它缺少 2 个右括号,我尝试添加这些,但它给出了以下错误 pastebin.com/bEPG3ji4(Pastebin 太长,无法在此处发布)
    • 您需要将此代码放在异步函数中。将client.on('message', message =&gt; { 更改为client.on("message", async message =&gt; {,确保异步在消息之前。
    • 嗯似乎仍然没有工作。这是错误pastebin.com/rKjQ60pU 的粘贴箱,这是我的代码pastebin.com/Fy6wznag 谢谢。 =)
    • 您好,I made it so it works。对我来说,这个新代码有效。
    猜你喜欢
    • 2021-02-24
    • 2021-04-03
    • 2020-12-23
    • 1970-01-01
    • 2019-04-25
    • 2020-09-22
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    相关资源
    最近更新 更多