Как написать пинок с функцией разума для моего бота - PullRequest
0 голосов
/ 22 апреля 2019

Я пытаюсь заставить мой код бить людей по какой-то причине, а DM говорит, что их выгнали из <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);

Ответы [ 3 ]

2 голосов
/ 22 апреля 2019

Пояснение:

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

  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 голос
/ 22 апреля 2019

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

0 голосов
/ 22 апреля 2019

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

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

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

...