Как работает функция .awaitmessage в discord js?

#javascript #discord #discord.js #bots

#javascript #Discord #discord.js #боты

Вопрос:

я пытаюсь создать команду, в которой один пользователь может бросить вызов другому пользователю, чтобы заработать монеты. Я сделал это таким образом, чтобы человек, который хочет бросить вызов, был p1, а человек, которого он @ s, был p2. Как я могу дождаться сообщения от этого конкретного (p2), чтобы проверить, принимает ли он или отрицает? Вот мой код на данный момент.

 
    name: "duel",
    description: "Challenge a player to win extra <:kcoin:810191130385317913>",
    type: "Shop",
    minArgs: 2,
    maxArgs: 2,
    argsError: `<@user> <amount>`,
    callback: async (message, args) => {
        
        if (args < minArgs || args > maxArgs){

            message.channel.send(argsError)
            return
        }
        
        if (message.mentions.members.first() == undefined){

            message.channel.send("**Challenge someone by @ them.**")
            return
        }
        
        if (isNaN(args[1])){

            message.channel.send("**Use a number for the amount.**")
            return
        }
        
        const p1id = message.author.id 
        const p2id = message.mentions.members.first().user.id
        const amount = args[1]

        message.channel.send(`**<@${p1id}> has challenged <@${p2id}> to a duel for ${amount*2}** <:kcoin:810191130385317913>`)

        message.channel.awaitMessages({})
    }
}
 

Ответ №1:

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

В этом случае фильтр, который вы должны реализовать, прост. Чтобы просто отфильтровать, от второго лица сообщение или нет, вы можете просто сделать:

 const filter = response => {
    //this checks whether the person who wrote the message is the @ person
    return response.author.id === p2id;
};
 

Это всего лишь упрощенный фильтр, есть и другие вещи, которые вы можете проверить, например, правильно ли отформатировал его целевой пользователь, и вы можете ответить.

Что касается реализации awaitMessages , вы можете следить за форматированием discord.js руководство предоставило.

Код:

 const filter = response => {
    //this checks whether the person who wrote the message is the @ person
    return response.author.id === p2id;
};

message.channel.send(`**<@${p1id}> has challenged <@${p2id}> to a duel for ${amount*2}** <:kcoin:810191130385317913>`).then(() => {
    //this sets a time constraint, you can remove it, it's not required
    message.channel.awaitMessages(filter, { time: 30000 /* time is in ms */, errors: ['time'] })
        .then(collected => {
            //responds back to channel that the user has responded
            message.channel.send(`${collected.first().author.username} has responded!`);
        })
        .catch(collected => {
            message.channel.send("Time to respond timed out.")
        });
});
 

Комментарии:

1. Я сделал это, и время ожидания работает, что полезно, но когда я отвечаю, собранный message.channel.send(`${collected.author.username} has responded!`); не работает

2. Выдает ли это ошибку? Я отредактировал код так, чтобы вместо того, чтобы просто collected использовать collected.first()

3. Я не получаю ошибок, и даже при таком изменении кода он просто не запускает код в .then

4. В строке перед message.channel.send(`${collected.first()author.username} has responded!`); можете ли вы добавить console.log(collected.content); и посмотреть, есть ли что-нибудь в консоли, что выводится на печать?

5. Нет, ничего не выводится, оно не достигает этой строки.