Discord Bot не отвечает после первой команды - PullRequest
0 голосов
/ 06 октября 2019

Так что у меня возникли проблемы с созданием моего бота. Все, что я пытаюсь сделать, это отслеживать список игроков, которые набирают команду «+ me», чтобы присоединиться к «списку ожидания», «-me» для удаления из списка и «? List"для отображения списка. Я планирую добавить другие команды позже.

Проблема, с которой я столкнулся, заключается в том, что команда отлично работает, чтобы добавить кого-то в список, однако после первой команды бот перестает отвечать на команды. Это оставляет меня в состоянии добавить себя в очередь, но затем не может выйти, никто не может присоединиться, не может перечислить его и т. Д. Также, если вы могли бы упомянуть способ перемещения цикла for, который я использую для отображениясписок в отдельную функцию я бы очень оценил. Я новичок в Javascript, и мои попытки почему-то терпят крах.

Exmaple of issue

const Discord = require('discord.js');
const {prefix, token} = require('./config.json');
const client = new Discord.Client();
var rankedList = []; // Initialise an empty array

client.login(token);

client.once('ready', () =>{
    console.log('Ready!');
})

client.once('message', message =>{
    // Add to queue
    if(message.content.startsWith(`${prefix}me`)){
        console.log(message.author + "added to queue.");
        message.channel.send(message.author + " added to queue.");

        var temp = message.author;
        rankedList.push(temp);  // the array will dynamically grow

        // Show queue after adding
        //for (var i = 0; i < rankedList.length; i++) {
        //  message.channel.send(i+1 + "- " + rankedList[i]);
        //}
        message.channel.send(`${rankedList.map((player,index) => `${index+1} - ${player}`).join('n')}`);
    }

    // Remove from queue
    if(message.content.startsWith(`-me`)){
        console.log(message.author + "removed from queue.");
        message.channel.send(message.author + " removed from queue.");

        for( var i = 0; i < rankedList.length; i++){ 
            if ( rankedList[i] === message.author) {
                rankedList.splice(i, 1); 
                i--;
            }
        }

        // Show queue after removing
        for (var i = 0; i < rankedList.length; i++) {
            message.channel.send(i+1 + "- " + rankedList[i]);
        }
    }

    if(message.content.startsWith(`?list`)){
        console.log(message.author + "displayed the queue.");

        // Show list
        for (var i = 0; i < rankedList.length; i++) {
            message.channel.send(i+1 + "- " + rankedList[i]);
        }
    }
})

1 Ответ

3 голосов
/ 06 октября 2019

Возможно, проблема в том, что вы использовали «один раз» вместо «вкл». Последний вызывает событие каждый раз, в то время как первый слушает один раз.

// Add to queue
client.on('message', async (message) => {

   // It's good practice to ignore other bots. This also makes your bot ignore itself and not get into a spam loop
    if(message.author.bot) return;

    if(message.content.startsWith(`${prefix}me`)){
        var temp = message.author;
        rankedList.push(temp);  // the array will dynamically grow
        console.log(message.author + "added to queue.");
        message.channel.send(`${message.author} added to queue.
        ${rankedList.map((player,index) => `${index+1} - ${player}`).join('
n')}`);
    }
});

По сути, вы отправляете все сообщение сразу. Я мог видеть, что функция send () является асинхронной [https://discord.js.org/#/docs/main/stable/class/DMChannel?scrollTo=send] и не должна быть включена в цикл for, как описано выше. Приведенный выше код также более лаконичен

Я использовал литералы шаблона [https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals] для удаления нескольких конкатенаций.

...