Как написать удар с функцией reason для моего бота

#javascript #discord #discord.js

#javascript #Discord #discord.js

Вопрос:

Я пытаюсь заставить свой код пинать людей с reason и сообщать им, что их выгнали из <server> -за <reason> . На данный момент он не отправляет причину.

Посмотрел онлайн-уроки, но безуспешно. Я также спрашивал некоторых людей, но они тоже не знали. Кажется, не многие люди используют discord.js , любая помощь была бы очень признательна. =)

Бот отправляет сообщение Сообщение, которое я отправил

 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);
  

Комментарии:

1. Выдаются ли какие-либо ошибки?

2. Мои ошибки: pastebin.com/NYwdhV8X (Я не могу вставить сюда слишком долго) @slothiful

Ответ №1:

Объяснение:

Глядя на ваши ошибки, это график проблем.

  1. Причиной всего этого является то, что бот не может отправить DM участнику из-за их настроек конфиденциальности в гильдии (здесь ). Это приводит к member.send(...) отклонению.
  2. Поскольку это отклоненное обещание не перехвачено, код продолжает .then() ничего не возвращать вместо ожидаемого message параметра.
  3. Когда вы пытаетесь прочитать displayName свойство message.member , оно выдает ошибку, потому что ваш параметр 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}'.`);
  

Комментарии:

1. Также стоит отметить, что вы должны добавить ограничение на количество символов к причине, чтобы убедиться, что сообщение reason не превышает 2000 символов.

2. Большое вам спасибо! Это сработало. Однако, когда причина содержит более 1 слова, это происходит imgur.com/a/vwKuQkf (Мой код таков pastebin.com/bJjn9MQe ) Вы знаете, как я могу это исправить?

3. Когда вы объявляете reason , вы должны добавить .join(' ') в конец.

4. Хороший ответ, кстати @WastefulGlint если вы хотите настроить хорошую структуру команд, взгляните на: discordjs.guide/command-handling/#individual-command-files

Ответ №2:

Возможно, ваш бот не сможет отправлять DM пользователям после того, как они были удалены из-за их настроек конфиденциальности. Поскольку пользователя выгнали, он больше не использует сервер совместно с ботом (если только это не очень широко используемый бот, что увеличило бы вероятность того, что пользователь находится на нескольких серверах, использующих бота), что означает, что вероятность того, что бот не сможет отправить DM этому пользователю,очень высокий.

Комментарии:

1. Он на самом деле использует member.send('msg').then((message) => { member.kick(reason)..}) so, он отправляет сообщение, а затем запускает, но вы все равно правы, пользователи могут блокировать бота / иметь свои настройки для разрешения dm только от друзей, и поэтому бот не может отправить dm

2. Я тестировал его на своем alt (невостребованная учетная запись на вкладке инкогнито), и сообщения могли отправляться между пользователем и ботом. @PLASMA

Ответ №3:

Ваш код причины должен быть:

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

число 3 представляет слово в вашей команде, с которого начинается reason .
например, >kick @ reason

так >kick будет 0 , то @<user> будет 1 и reason будет 2 , так что в основном splice — это то, на каком слове он останавливается, каждое слово после 2 будет вашей причиной, включая 2, если это имеет смысл.

Я изо всех сил старался объяснить это 🙂

Ответ №4:

ниже не ответ, у пользователя и участника есть .send()

Ошибка в вашем коде member.send() . Видите ли, member и user это две разные вещи. .send() работает только с a user , так что вы должны сделать member.user.send() , и это сработает.
Кроме того, вам понадобится catch для этого обещания, поэтому, если у этого пользователя отключены 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));
  

Имейте в виду, await это еще один способ объединения then в асинхронные функции.

Комментарии:

1. Это неправда: Член Гильдии #отправить

2. Этот код не работает. В нем отсутствуют 2 закрывающие скобки, я попытался добавить их, но это выдало следующую ошибку pastebin.com/bEPG3ji4 (Pastebin слишком длинный, чтобы публиковать его здесь)

3. Вам нужно поместить этот код в асинхронную функцию. Измените client.on('message', message => { на client.on("message", async message => { , убедитесь, что асинхронность перед сообщением.

4. Хм, похоже, все еще не срабатывало. Вот список ошибок pastebin.com/rKjQ60pU и вот мой код pastebin.com/Fy6wznag Спасибо. =)

5. Привет, я сделал так, чтобы это работало . Для меня этот новый код работает.