Как заставить бота знать, как удалять веб-хуки, которые он сделал, и по каналам упоминает - PullRequest
0 голосов
/ 05 июля 2019

Привет, я хочу создать команду Discord.JS-Commando, в которой, если вы выбираете канал, бот удаляет принадлежащий ему там веб-крючок, и если он называется Marker, и если он обнаруживает, что там нет веб-крюка, которому он владеет с именем Marker это просто return message.channel.send("Hey! There's no webhook I own in this channel!")

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

Поиск в Google ничего не дал. При удалении webhooks не было ничего, кроме discord.js docs.

const hooks1 = await message.guild.fetchWebhooks();
await hooks1.forEach(async webhook => {
    if (!watchChannel.id == webhook.channelID) return
    if (!webhook.owner.id == `595840576386236437`) return
    if (!webhook.name == `Marker`) return message.channel.send(`**${message.author.username}**, Nothing was found. You or someone else may have renamed the webhook. Please delete the webhook manually. Sorry for the inconvenience`);
    else
message.channel.send(`Deleted successfully.`).then(msg => {message.delete(4000)}).catch(error => console.log(error))
webhook.delete(`Requested per ${message.author.username}#${message.author.discriminator}`);
});

Я ожидаю, что бот будет знать, как удалить созданный веб-крючок, в указанном канале, но бот не знает, какой веб-крючок удалить.

Ответы [ 2 ]

3 голосов
/ 06 июля 2019
if (!watchChannel.id == webhook.channelID) return
if (!webhook.owner.id == `595840576386236437`) return
if (!webhook.name == `Marker`) return

Ни одна из этих строк не работает так, как вы ожидаете.

const id = '189855563893571595';

console.log(id === '189855563893571595');

console.log(id !== '1234');  // id is not equal to '1234': true
console.log(!id === '1234'); // false is equal to '1234' : false

! действует как логический оператор NOT .

Возвращает false, если его единственныйоперанд может быть преобразован в true;в противном случае возвращается true.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_Operators

!watchChannel.id - Boolean ;оно никогда не будет равно webhook.channelID, если последнее не равно false.То же самое касается всех трех условий в вашем коде.Следовательно, ваш бот удаляет веб-хуки, которые не являются его собственными, потому что операторы if неверны, когда вы ожидаете, что они будут.


!== известен как non-тождество / строгое неравенство оператор.

... [R] eturns true, если операнды не равны и / или не имеют одинаковый тип.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators

Этот оператор (или оператор неравенства != вместе с близнецами) - это оператор, который вы хотите использовать.Он будет правильно сравнивать свойства.


Улучшая ваш текущий код, мы можем ...

  • Извлекать веб-хуков только с указанного канала.
  • Отфильтруйте коллекцию 1061 * перед циклом.
  • Используйте современный цикл for...of, который будет корректно работать с асинхронным кодом.
  • Убедитесь, что перехват все отклоненные обещания.
  • Привыкайте использовать оператор идентичности === вместо оператора равенства ==.См. здесь для рассуждений.
const webhooks = await watchChannel.fetchWebhooks();
const myWebhooks = webhooks.filter(webhook => webhook.owner.id === client.user.id && webhook.name === 'Marker');

try {
  if (myWebhooks.size === 0) return await message.channel.send('I don\'t own any Webhooks there...');

  for (let [id, webhook] of myWebhooks) await webhook.delete(`Requested by ${message.author.tag}`);

  await message.channel.send('Successfully deleted all of my Webhooks from that channel.');
} catch(err) {
  console.error(err);

  await message.channel.send('Something went wrong.')
    .catch(console.error);
}
1 голос
/ 06 июля 2019

Вы смотрели документацию на discord.js?Он предоставляет все, что вам нужно знать, например, такие как объекты, классы, методы / свойства для объектов и классов и тому подобное.В любом случае, я думаю, что проблема в том, что когда вы пытаетесь удалить веб-крючок, вы используете webhook.delete, но когда вы используете delete без скобок, это означает, что вы пытаетесь получить доступ к свойству delete, а не к методу.Правильный способ сделать это - вызвать webhook.delete();, так как это вызывает метод delete() из класса Webhook.

Это прямо здесь, в документации:

Класс Webhook:https://discord.js.org/#/docs/main/stable/class/Webhook

Метод удаления: https://discord.js.org/#/docs/main/stable/class/Webhook?scrollTo=delete

...