Discord JS, оглушить упомянутого пользователя - PullRequest
0 голосов
/ 22 октября 2019

Я, вероятно, неправильно понимаю, что именно возвращает объект members здесь, но я пытаюсь проверить команду deafen в моем боте - документация для discord.js гласит, что объект Message содержитMentions свойство, которое содержит все действительные упоминания в отправленном сообщении, оттуда я могу немного углубиться и перейти к свойству Members из Mentions - которое возвращает коллекцию GuildMembers, которые имеютбыло упомянуто в сообщении - это то, что я хочу. Проблемы возникают, когда я пытаюсь получить эти GuildMember объекты из коллекции, которую я получаю - я не совсем уверен, что я делаю неправильно, но я получаю ошибки назад. У меня есть следующий код:

module.exports = {
    name: 'deafen',
    cooldown: 5,
    description: 'Deafens mentioned user or users.',
    args: true,
    execute(message) {
        const taggedMembers = message.mentions.members;

        for(const member of taggedMembers) {
            member.setDeaf(true)
                .then(() => console.log(`Deafened ${member.displayName}`))
                .catch(console.error);
        }
    },
};

, и я получаю эту ошибку в окне терминала:

TypeError: member.setDeaf is not a function 
    at Object.execute (/home/tai/dev/FutabaBot/commands/admin/deafen.js:10:20)
    at Client.<anonymous> (/home/tai/dev/FutabaBot/FutabaBot.js:80:17)
    at Client.emit (events.js:210:5)
    at MessageCreateHandler.handle (/home/tai/dev/FutabaBot/node_modules/discord.js/src/client/websocket/packets/handlers/MessageCreate.js:9:34)     
    at WebSocketPacketManager.handle (/home/tai/dev/FutabaBot/node_modules/discord.js/src/client/websocket/packets/WebSocketPacketManager.js:105:65) 
    at WebSocketConnection.onPacket (/home/tai/dev/FutabaBot/node_modules/discord.js/src/client/websocket/WebSocketConnection.js:333:35)
    at WebSocketConnection.onMessage (/home/tai/dev/FutabaBot/node_modules/discord.js/src/client/websocket/WebSocketConnection.js:296:17)
    at WebSocket.onMessage (/home/tai/dev/FutabaBot/node_modules/ws/lib/event-target.js:120:16)
    at WebSocket.emit (events.js:210:5)
    at Receiver.receiverOnMessage (/home/tai/dev/FutabaBot/node_modules/ws/lib/websocket.js:789:20)

Я не уверен, если это необходимо, но я могу опубликоватьдругие фрагменты кода, относящиеся к этому, и документацию для discord.js можно найти здесь

1 Ответ

1 голос
/ 22 октября 2019

message.mentions.members возвращает коллекцию GuildMembers и Snowflake (некоторый уникальный идентификатор . Коллекция является расширением класса карты , где карта представляет собой массив с каждымэлемент, имеющий ключ и атрибут значения.

При циклическом перемещении по карте, как вы делаете с for(const member of taggedMembers), каждый элемент (или member в вашем случае) представляет собой пару ключ и значение. Затем вы пытаетесь вызвать метод setDeaf для этой пары, который, как вы видели, не работает.

Вам нужно только зациклить значения в коллекции. Это может легкопокончим с .forEach. Я добавлю пример кода ниже:

taggedMembers.forEach((member) => {
    member.setDeaf(true)
        .then(() => console.log(`Deafened ${member.displayName}`))
        .catch(console.error);
});

Дайте ему знать и дайте мне знать, если у вас возникнут какие-либо проблемы.

РЕДАКТИРОВАТЬ: Как указано в комментариях slothiful , использование .forEach не будет фиксировать отклонения Promise даже после добавления .catch(). Чтобы исправить это, вы можете использовать for ... of цикл, но деструктурирует пару. Это можно увидеть в следующем примере:

for (let [, member] of taggedMembers) {
    member.setDeaf(true)
        .then(() => console.log(`Deafened ${member.displayName}`))
        .catch(console.error);
}
...