首页 > 解决方案 > Discord.js 通过对消息做出反应来添加角色

问题描述

下面的代码不会像我预期的那样工作。我希望用户用复选标记做出反应,然后在控制台中记录一些内容。而不是机器人自己激活该功能,然后该功能再也不会被调用。

client.once('ready', () => {

    console.log('Ready!');

    const exampleEmbed = <unimportant>;

    client.channels.cache.get("771041812638728235").send(exampleEmbed).then((message) => {
        message.react('✅');
        message.createReactionCollector(r => r.emoji.name == '✅')
        .on('collect', r => {
            console.log("nice");
        });
    });

});

标签: javascriptdiscord.js

解决方案


这可能是因为反应收集器是在message.react()方法完成执行之前创建的,导致它自己激活。您可以使用async/awaitthen()回调来确保反应已完成,或者只需添加一行以确保用户不是收集器过滤器中的机器人。

// method 1:
client.channels.cache
 .get('771041812638728235')
 .send(exampleEmbed)
 .then(async (message) => {
  //   ^^^^^
  // make sure the function is async
  await message.react('✅');
  message
   .createReactionCollector((r) => r.emoji.name == '✅')
   .on('collect', (r) => {
    console.log('nice');
   });
 });


// method 2:
client.channels.cache
 .get('771041812638728235')
 .send(exampleEmbed)
 .then(message) => {
  // .then() callback
  message.react('✅').then(() =>
  message
   .createReactionCollector((r) => r.emoji.name == '✅')
   .on('collect', (r) => {
    console.log('nice');
   }););
 });


// method 3:
client.channels.cache
 .get('771041812638728235')
 .send(exampleEmbed)
 .then((message) => {
  message.react('✅');
  message
   // make sure the user who reacted isn't a bot
   .createReactionCollector((r, u) => r.emoji.name == '✅' && !user.bot)
   .on('collect', (r) => {
    console.log('nice');
   });
 });


推荐阅读