Попытка удалить сообщение Discord-бота в Discord. js 5 секунд после отправки, выдает ошибку - PullRequest
0 голосов
/ 28 мая 2020

Во-первых, я новичок в программировании, это в пределах моих первых 3 часов.

Как я уже сказал, я пытаюсь заставить бота удалить свое сообщение «очистить» через несколько секунд после его произнесения. Вот как я это пробовал:

if (msg.member.hasPermission("ADMINISTRATOR") || msg.member.roles.cache.find(r => r.name === "Clear Perm")) {
  if (!args[1] || args[1] > 99 || args[1] < 1) {
    msg.channel.send('Invalid Argument Given, Please Provide An Amount Of Messages Between 1-99 To Be Deleted')
  } else {
    var BD = parseInt(args[1]) + 1;

    function DelCount() {
      msg.channel.send("`I Have Deleted " + args[1] + " Message(s)`");
    }

    msg.channel.bulkDelete(BD);
    setTimeout(DelCount, 10);
    setTimeout(() => msg.delete(msg.content.includes('I Have Deleted')), 5000)
  }
  if (!msg.member.hasPermission("ADMINISTRATOR") && !msg.member.roles.cache.find(r => r.name === "Clear Perm")) {
    msg.channel.send("You Do Not Have Permission To Clear Chat");
  }
}

Когда я делаю это вот так, я получаю следующую ошибку:

C:\Users\Rick\Desktop\Discord Bot\KendanK\node_modules\discord.js\src\structures\Message.js:501
    if (typeof options !== 'object') throw new TypeError('INVALID_TYPE', 'options', 'object', true);
                                     ^

TypeError [INVALID_TYPE]: Supplied options is not an object.
    at Message.delete (C:\Users\Rick\Desktop\Discord Bot\KendanK\node_modules\discord.js\src\structures\Message.js:501:44)
    at Timeout._onTimeout (C:\Users\Rick\Desktop\Discord Bot\KendanK\index.js:170:48)
    at listOnTimeout (internal/timers.js:549:17)
    at processTimers (internal/timers.js:492:7) {
  [Symbol(code)]: 'INVALID_TYPE'
}

Кто-нибудь знает, что я делаю не так и что мне делать вместо этого?

1 Ответ

0 голосов
/ 28 мая 2020

Проблема возникает из этой строки:

setTimeout(() => msg.delete(msg.content.includes('I Have Deleted')), 5000)

Вы передаете msg.delete(msg.content.includes('I Have Deleted') в качестве аргумента для Message.delete(), который ожидает некоторые параметры, пока вы передача логического значения.
Кроме того, я думаю, вам следует использовать Promises вместо того, чтобы полагаться на тайм-ауты.

Вот как бы я это сделал:

var BD = parseInt(args[1]) + 1

msg.channel.bulkDelete(BD)
  .then(async (deleted) => { // Use .then to run when the Promise is resolved

    // Save the response message directly from the .send method (using await)
    let response = await msg.channel.send(`${deleted.size} messages deleted.`)

    // There's a built-in timeout option, you don't need to set it up by yourself
    reponse.delete({ timeout: 5000 }) 
  })

Если вам сложно понять обещания, async / await и тому подобное, вы можете прочитать что-нибудь по этим ссылкам:

...