#javascript #node.js #discord #discord.js
#javascript #node.js #Discord #discord.js
Вопрос:
Я хочу, чтобы пользователь ответил на вопрос «да или нет», используя реакции. Вот мой код ниже.
var emojiArray = ['🔥', '👍', '👎', '✅', '❌'];
client.on('message', (negotiate) => {
const listen = negotiate.content;
const userID = negotiate.author.id;
var prefix = '!';
var negotiating = false;
let mention = negotiate.mentions.user.first();
if(listen.toUpperCase().startsWith(prefix 'negotiate with '.toUpperCase()) amp;amp; (mention)) {
negotiate.channel.send(`<@${mention.id}>, do you want to negotiate with ` `<@${userID}>`)
.then(r => r.react(emojiArray[3], emojiArray[4]));
negotiating = true;
}
if(negotiating == true amp;amp; listen === 'y') {
negotiate.channel.send('Please type in the amount and then the item you are negotiating.');
} else return;
})
Как вы можете видеть, приведенный выше код позволяет пользователю помечать кого-либо и вести с ним переговоры (часть переговоров не имеет значения). Когда пользователь помечает кого-то другого, он спрашивает их, хотят ли они договориться с пользователем, который их пометил. Если пользователь говорит «да», они ведут переговоры.
Я хочу сделать это более чистым способом, используя реакции в discord. Есть ли какой-нибудь способ просто добавить смайлик с ответом «да» или «нет», и пользователю нужно будет нажать «Да» или «нет» для подтверждения?
Ответ №1:
Прежде всего, вы вроде как напортачили при получении пользовательского объекта упомянутого пользователя, так что просто, чтобы вы знали, что это negotiate.mentions.users.first()
!
Желая запросить ввод данных пользователем с помощью реакций, мы обычно хотели бы использовать одно из следующих действий:
- Ожидание реакций()
- createReactionCollector
Поскольку я лично предпочитаю awaitReactions()
, вот краткое объяснение того, как его использовать:
awaitReactions является message
расширением объекта и создает сборщик реакций на выбранное нами сообщение. Кроме того, эта функция также поставляется с возможностью добавления к ней фильтра. Вот фильтр, который я обычно люблю использовать:
const filter = (reaction, user) => {
return emojiArray.includes(reaction.emoji.name) amp;amp; user.id === mention.id;
// The first thing we wanna do is make sure the reaction is one of our desired emojis!
// The second thing we wanna do is make sure the user who reacted is the mentioned user.
};
С этого момента мы могли бы очень просто реализовать наш фильтр в нашей awaitReactions()
функции следующим образом:
message.awaitReactions(filter, {
max: 1, // Accepts only one reaction
time: 30000, // Will not work after 30 seconds
errors: ['time'] // Will display an error if using .catch()
})
.then(collected => { // the reaction object the user reacted with
const reaction = collected.first();
// Your code here! You can now use the 'reaction' variable in order to check certain if statements such as:
if (reaction.emoji.name === '🔥') console.log(`${user.username} reacted with Fire emoji!`)
Наконец, ваш код должен выглядеть следующим образом:
const filter = (reaction, user) => {
return emojiArray.includes(reaction.emoji.name) amp;amp; user.id === mention.id;
};
message.awaitReactions(filter, {
max: 1,
time: 30000,
errors: ['time']
})
.then(collected => {
const reaction = collected.first();
if (reaction.emoji.name === '🔥') console.log(`${user.username} reacted with Fire emoji!`)
Ответ №2:
вы должны использовать ReactionCollector
:
var emojiArray = ['🔥', '👍', '👎', '✅', '❌'];
const yesEmoji = '✅';
const noEmoji = '❌';
client.on('message', (negotiate) => {
const listen = negotiate.content;
const userID = negotiate.author.id;
var prefix = '!';
var negotiating = false;
let mention = negotiate.mentions.user.first();
if(listen.toUpperCase().startsWith(prefix 'negotiate with '.toUpperCase()) amp;amp; (mention)) {
negotiate.channel.send(`<@${mention.id}>, do you want to negotiate with ` `<@${userID}>`)
.then(async (m) => {
await m.react(yesEmoji);
await m.react(noEmoji);
// we want to get an answer from the mentioned user
const filter = (reaction, user) => user.id === mention.id;
const collector = negotiate.createReactionCollector(filter);
collector.on('collect', (reaction) => {
if (reaction.emoji.name === yesEmoji) {
negotiate.channel.send('The mentioned user is okay to negotiate with you!');
// add your negotiate code here
} else {
negotiate.channel.send('The mentioned user is not okay to negotiate with you...');
}
});
});
negotiating = true;
}
})
Это позволяет прослушивать новые реакции, добавленные к сообщению. Вот документация: https://discord.js.org/#/docs/main/stable/class/Message?scrollTo=createReactionCollector
Комментарии:
1. Этот код не отображает, согласен ли упомянутый пользователь на переговоры после того, как упомянутый пользователь нажмет на реакцию.