EventEmitter Javascript проблема ограничения с Discord. js - PullRequest
2 голосов
/ 22 января 2020

Доброе утро всем. Я колебался, прежде чем приехать сюда, но ответы, которые я нашел, не соответствовали моей конкретной проблеме c.

Я кодирую Bot Discord в Javascript, и я занимаюсь обслуживанием системы. Для этого я даю точную роль всем игрокам, которая предотвращает любые действия с их стороны во время обслуживания. Единственная проблема с этим заключается в том, что сервер, на котором я работаю, содержит около ста игроков, и еще больше будет. Поэтому я ищу решение этой проблемы: когда я даю одинаковую роль всем игрокам, Node.js имеет блокировку, которая останавливает событие «добавить роль» 11 раз.

Вот фрагмент ошибки с тем же кодом, который повторяется столько раз, сколько есть игроков.

Click here to see the image

Код, над которым я работаю, следующий :

...
} else if (args[0] == 'maintenanceon') {
            if (message.member.roles.find(r => r.name === "•?•Développeur") || message.member.roles.find(r => r.name === "•?•ADMINISTRATEUR")) {
                var membersWithRole1 = message.guild.roles.get("666026501472518167").members;
                var membersWithRole2 = message.guild.roles.get("666051237543673877").members;
                var membersWithRole3 = message.guild.roles.get("667770156730155028").members;
                var membersWithRole4 = message.guild.roles.get("661281161334620181").members;
                var membersWithRole5 = message.guild.roles.get("665287396740300810").members;
                var membersWithRole6 = message.guild.roles.get("667038859149705219").members;
                var membersWithRole7 = message.guild.roles.get("664966379954241545").members;
                var membersWithRole8 = message.guild.roles.get("665306076610035723").members;
                var membersWithRole9 = message.guild.roles.get("661900218102448160").members;
                var membersWithRole10 = message.guild.roles.get("661286020599382018").members;

                membersWithRole1.forEach((member, key) => member.addRole("661944276564836363"));
                membersWithRole2.forEach((member, key) => member.addRole("661944276564836363"));
                membersWithRole3.forEach((member, key) => member.addRole("661944276564836363"));
                membersWithRole4.forEach((member, key) => member.addRole("661944276564836363"));
                membersWithRole5.forEach((member, key) => member.addRole("661944276564836363"));
                membersWithRole6.forEach((member, key) => member.addRole("661944276564836363"));
                membersWithRole7.forEach((member, key) => member.addRole("661944276564836363"));
                membersWithRole8.forEach((member, key) => member.addRole("661944276564836363"));
                membersWithRole9.forEach((member, key) => member.addRole("661944276564836363"));
                membersWithRole10.forEach((member, key) => member.addRole("661944276564836363"));
            }

        } else if (args[0] == 'maintenanceoff') {
            if (message.member.roles.find(r => r.name === "•?•Développeur") || message.member.roles.find(r => r.name === "•?•ADMINISTRATEUR")) {
                var membersWithRole = message.guild.roles.get("661944276564836363").members;

                membersWithRole.forEach((member, key) => member.removeRole("661944276564836363"));
            }
        }

Я уже пытался решить проблему, ища такие вещи:

const EventEmitter = require('events');
const emitter = new EventEmitter();
emitter.setMaxListeners(0);

Но ничего, что я пробовал, не работает, и я безнадежен. Спасибо за чтение, и я надеюсь, что я скоро решу эту проблему.

- Макс.

1 Ответ

0 голосов
/ 22 января 2020

Я думаю, что это можно исправить, добавив блок .catch() или await.

И если вы выберете лучший способ для команды maintenanceon, получите всех участников, у которых есть одна из ваших ролей, а затем дайте им ваша роль.

} else if (args[0] == 'maintenanceon') {
            if (message.member.roles.find(r => r.name === "•?•Développeur") || message.member.roles.find(r => r.name === "•?•ADMINISTRATEUR")) {
                let membersIncludeRole = message.guild.members.filter(member =>  {
                    member.roles.some(r=>["666026501472518167", "666051237543673877", "667770156730155028", "661281161334620181","665287396740300810","667038859149705219","664966379954241545","665306076610035723","661900218102448160","661286020599382018"].includes(r.id))
                })
                let targetRole = message.guild.roles.get('661944276564836363')
                membersIncludeRole.map(member => {
                    if(!member.roles.some(role => role.id === '661944276564836363')) {
                        await member.addRole(targetRole).catch()
                    }
                })
            }

        } else if (args[0] == 'maintenanceoff') {
            if (message.member.roles.find(r => r.name === "•?•Développeur") || message.member.roles.find(r => r.name === "•?•ADMINISTRATEUR")) {
                var membersWithRole = message.guild.roles.get("661944276564836363").members;

                membersWithRole.forEach((member, key) => await member.removeRole("661944276564836363").catch());
            }
        }
...