Проблема с пользователями DM: не удается прочитать свойство getMaxListeners из undefined - PullRequest
1 голос
/ 14 июля 2020

Перед тем как я начну, я хотел бы заявить, что я новичок в кодировании, а не эксперт по кодированию, поэтому, пожалуйста, извините, если в моем коде есть какие-либо ошибки, поскольку я все еще учусь. Любая критика приветствуется, так как это улучшит мою работу:

Итак, как упоминается в заголовке, я хочу, чтобы пользователь для этого примера ввел "& test", и мой бот сделает это. DM пользователю, сказав что-то вроде «Пожалуйста, введите ответ отдыха», запустите сборщик сообщений, затем, когда пользователь ответит чем-то вроде «test», сборщик завершится и отправит ответ «test» на указанный канал. МНЕ БЫ. Я хотел бы реализовать эту функцию, так как ее текущая цель - отправить обновление о том, какие предметы находятся с кем (на сервере minecraft, да, я знаю, но мы довольно большая группа). Я недавно подумал добавить это in, когда я понял, что любой может ответить на любую команду пользователя, и сборщик просто остановился бы на этом, поэтому они продолжали наводнять канал ответа бесполезными вставками. Вот текущий код (без попыток реализации):

client.on('message', async message => {

    if(message.author.bot) return;
    if(message.content.toLowerCase() === '&reserveupdate') {
        
        message.channel.send('**Please inform us on what you are doing with the reserve down below. Remember, don\'t take more than half of the current reserve:**');
        let filter = m => !m.author.bot;
        let counter = 0;
        let collector = new discord.MessageCollector(message.channel, filter);
        let destination = client.channels.cache.get('my channel id');
        collector.on('collect', (m, col) => {
            console.log("Collected message: " + m.content);
            counter++;
            if(counter === 1) {
               message.channel.send("**Thanks for updating us on the Token Reserve!**");
                collector.stop();   
            }
            if(destination) {
                if(m.content.toLowerCase() === '&stop' && (message.author.id === m.author.id)) {
                    console.log("Stopping collector.");
                    
                    collector.stop();
                }
                else {
                    let embed = new discord.MessageEmbed()
                        .setTitle("**Reserve Update.**")
                        .setDescription(m.content)
                        .setTimestamp()
                        .setAuthor(m.author.tag, m.author.displayAvatarURL)
                        .setColor('#ada228')
                        .setFooter("The Unb. 9 Bot. Developed by: Alduin#0010")
                        destination.send(embed);
                        
                }
            }
        });
        collector.on('end', collected => {
            console.log("Messages collected: " + collected.size);
        }); 
    }
});

А вот пример кода, с которым я играл, чтобы переключить его на DM, собрать ответ, а затем отправить ответ пользователя. на указанный c идентификатор канала:

client.on('message', async message => {

    if(message.author.bot) return;
    if(message.content.toLowerCase() === '&reserveupdate') {
        
        message.channel.send('**Please inform us on what you are doing with the reserve down below. Remember, don\'t take more than half of the current reserve:**');
        let filter = m => !m.author.bot;
        let counter = 0;
        let collector = new discord.MessageCollector(discord.DMChannel, m => m.author.id, filter);
        let destination = client.channels.cache.get('my channel id');
        collector.on('collect', (m, col) => {
            console.log("Collected message: " + author.content);
            counter++;
            if(counter === 1) {
               message.channel.send("**Thanks for updating us on the Reserve!**");
                collector.stop();   
            }
            if(destination) {
                if(m.content.toLowerCase() === '&stop' && (message.author.id === m.author.id)) {
                    console.log("Stopping collector.");
                    
                    collector.stop();
                }
                else {
                    let embed = new discord.MessageEmbed()
                        .setTitle("**Reserve Update.**")
                        .setDescription(m.content)
                        .setTimestamp()
                        .setAuthor(m.author.tag, m.author.displayAvatarURL)
                        .setColor('#ada228')
                        .setFooter("The Unb. 9 Bot. Developed by: Alduin#0010")
                        destination.send(embed);
                        
                }
            }
        });
        collector.on('end', collected => {
            console.log("Messages collected: " + collected.size);
        }); 
    }
});

Бот успешно отправляет DM пользователю с ответом при вводе команды, однако всякий раз, когда команда выполняется, журнал Powershell сообщает:

"(node:4540) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'getMaxListeners' of undefined
    at new MessageCollector"

Кто-нибудь может мне подсказать? Какие изменения я должен внести в свой код? Это функция, которую я хотел бы реализовать, поскольку я считаю, что это будет полезно для нашей группы и уменьшит беспорядок и спам. Мы очень ценим любой ответ!

1 Ответ

0 голосов
/ 14 июля 2020

Вы пытаетесь присоединить слушателя к классу discord.DMChannel, но это неверно.

Вам необходимо присоединить слушателя к определенному c каналу dm, который вы хотите прослушать, в данном случае автор сообщения (обратите внимание, как User реализует TextBasedChannel https://discord.js.org/# / docs / main / stable / class / User )

Попробуйте

let collector = new discord.MessageCollector(message.author, m => m.author.id, filter);
...