#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. Нет, ничего не выводится, оно не достигает этой строки.