#javascript #discord #discord.js
#javascript #Discord #discord.js
Вопрос:
Я использую ${reaction.message.author}
, чтобы бот упоминал человека, который нажал на реакцию после этого. Но бот упоминает о себе.
Как сделать так, чтобы бот упоминал пользователя, который нажал на реакцию после бота?
===Код===
client.on('message', (message) => {
const args = message.content.slice(prefix.length).trim().split(/ /g);
const command = args.shift().toLowerCase();
if (message.content.startsWith(prefix 'Interpol')) {
const response = args.join(' ');
message.channel
.send({
content: '<@amp;776034311245660200>',
embed: {
color: 3447003,
title: 'Новый вызов',
timestamp: new Date(),
},
})
.then((sentMessage) => {
sentMessage.react('1️⃣');
message.delete({ timeout: 100 });
const filter = (reaction, user) => {
return ['1️⃣'].includes(reaction.emoji.name);
};
sentMessage
.awaitReactions(filter, {
max: 2,
time: 60000,
errors: ['time'],
})
.then((collected) => {
const reaction = collected.first();
if (reaction.emoji.name === '1️⃣') {
console.log(reaction.message.author);
message.author.send({
embed: {
color: 3447003,
title: 'Вызов принят',
description: `**Сотрудник:** ${reaction.message.author}`,
timestamp: new Date(),
},
});
}
});
});
}
});
Ответ №1:
Вы можете обновить свой фильтр, чтобы отфильтровывать реакции, если user
это бот. Таким образом, первая реакция будет от участника:
const filter = (reaction, user) => {
return ['1️⃣'].includes(reaction.emoji.name) amp;amp; !user.bot;
};
Обновление: итак, вы хотите найти первого участника, который отреагировал на сообщение и не является ботом. Проблема в том, что вы отправляете DM с reaction.message.author
. reaction.message
это сообщение, к которому относится эта реакция, так sentMessage
что в вашем случае и author
это сообщение — это сам бот.
Вы можете .find()
указать первого участника, который отреагировал на сообщение, проверив reaction.users.cache
. reaction.users
является менеджером пользователей, которые дали эту реакцию (включая бота). Используя .find()
, вы можете вернуть одного участника:
message.channel
.send({
content: '<@amp;776034311245660200>',
embed: {
color: 3447003,
title: 'Новый вызов',
timestamp: new Date(),
},
})
.then((sentMessage) => {
sentMessage.react('1️⃣');
message.delete({ timeout: 100 });
const filter = (reaction, user) => {
return !user.bot amp;amp; ['1️⃣'].includes(reaction.emoji.name);
};
sentMessage
.awaitReactions(filter, {
max: 1,
time: 60000,
// errors: ['time'],
})
.then((collected) => {
const reaction = collected.first();
if (reaction.emoji.name === '1️⃣') {
// find the first member who reacted and is not a bot
const member = reaction.users.cache.find((user) => !user.bot);
message.author.send({
embed: {
color: 3447003,
title: 'Вызов принят',
description: `**Сотрудник:** ${member}`,
timestamp: new Date(),
},
});
}
})
.catch(console.log);
});
Комментарии:
1. Я попробовал, но бот перестал отвечать. Раньше он просто упоминал себя, но теперь ничего
2. Я думаю, потому что вы добавили
errors: ['time']
иmax: 2
. Если только один участник нажмет на реакцию, время ожидания истечет через 60 секунд, и это должно бытьcatch
отредактировано. Попробуйте уменьшитьmax
значение до 1 или удалитьerrors
параметр.3. Сделал, бот продолжает упоминать себя.
Ответ №2:
Если я не ошибаюсь, вам просто не хватает фильтра. Это обычное явление, когда при попытке что-то собрать бот выбирает для себя собственное сообщение / реакцию.
Чтобы исправить это, все, что вам нужно добавить в вашу функцию фильтра. amp;amp; user.id === message.author.id;
Итак: return ['1️⃣'].includes(reaction.emoji.name) amp;amp; user.id === message.author.id;
Это в основном проверяет, был ли пользователь, который отреагировал, также отправителем сообщения, который, как я предполагаю, является ботом. Иначе нет, тогда вы могли бы просто !user.bot
проверить, не бот ли ответил, как сказал Жолт.