【问题标题】:Discord.js Question about getting the user that reacted to the embed {Updated}Discord.js 关于获取对嵌入做出反应的用户的问题{更新}
【发布时间】:2021-03-26 12:21:34
【问题描述】:

有人可以帮助我吗?我正在尝试让用户/用户对我的嵌入做出反应,然后让机器人与做出反应的用户一起编辑嵌入。我是编码新手,我一直在寻找几个小时试图找出如何做到这一点,但我似乎无法做到。

 Client.on("messageReaction", async (reaction, user) => {
  if (reaction.message.partial) await reaction.message.fetch();

  if (user.Client) return;
  if(!reaction.message.guild) return;
  
  if(reaction.message.channel.id === "786271210585456670") {
    if (reaction.emoji.name === '????'){
      await reaction.message.guild.members.cache.get(username)
    }
  }
  if(reaction.message.channel.id === "786271210585456670") {
    if (reaction.emoji.name === '????'){
      await reaction.message.guild.members.cache.get(username)
    }
  }
  if(reaction.message.channel.id === "786271210585456670") {
    if (reaction.emoji.name === '????'){
      await reaction.message.guild.members.cache.get(username)
    }
  }
  if(reaction.message.channel.id === "786271210585456670") {
    if (reaction.emoji.name === '????'){
      await reaction.message.guild.members.cache.get(username)
    }
  }
  if(reaction.message.channel.id === "786271210585456670") {
    if (reaction.emoji.name === '????'){
      await reaction.message.guild.members.cache.get(username)
    }
  }
}); 

2020 年 16 月 12 日更新的代码工作

Client.on("messageReactionAdd", async (reaction, user) => {
  if (reaction.message.partial) await reaction.message.fetch();

  if (user.bot) return;
  if(!reaction.message.guild) return;
  
  if(reaction.message.channel.id === "786271210585456670") {
    if (reaction.emoji.name === '????'){
       var users = await reaction.users.fetch();
      var response = "";

      for (var u of users.map(user => user)) {
        response += `User reacted: ${u.username}\n`;
      }

      var embed = reaction.message.embeds[0];
      embed.description = response;

      reaction.message.edit(embed);
    }
  }
  if(reaction.message.channel.id === "786271210585456670") {
    if (reaction.emoji.name === '????'){
       var users = await reaction.users.fetch();
      var response = "";

      for (var u of users.map(user => user)) {
        response += `User reacted: ${u.username}\n`;
      }

      var embed = reaction.message.embeds[0];
      embed.description = response;

      reaction.message.edit(embed);
    }
  }
  if(reaction.message.channel.id === "786271210585456670") {
    if (reaction.emoji.name === '????'){
       var users = await reaction.users.fetch();
      var response = "";

      for (var u of users.map(user => user)) {
        response += `User reacted: ${u.username}\n`;
      }

      var embed = reaction.message.embeds[0];
      embed.description = response;

      reaction.message.edit(embed);
    }
  }
  if(reaction.message.channel.id === "786271210585456670") {
    if (reaction.emoji.name === '????'){
       var users = await reaction.users.fetch();
      var response = "";

      for (var u of users.map(user => user)) {
        response += `User reacted: ${u.username}\n`;
      }

      var embed = reaction.message.embeds[0];
      embed.description = response;

      reaction.message.edit(embed);
    }
  }
  if(reaction.message.channel.id === "786271210585456670") {
    if (reaction.emoji.name === '????'){
       var users = await reaction.users.fetch();
      var response = "";

      for (var u of users.map(user => user)) {
        response += `User reacted: ${u.username}\n`;
      }

      var embed = reaction.message.embeds[0];
      embed.description = response;

      reaction.message.edit(embed);
    }
  }
});

我已经更新了上述内容,您将能够看到我遇到的问题和现在正在运行的代码,并且它将与对消息/命令做出反应的用户一起编辑嵌入描述。

Client.on("messageReactionAdd", async (reaction, user) => {
  if (reaction.message.partial) await reaction.message.fetch();

  if (user.bot) return;
  if(!reaction.message.guild) return;
  
  if(reaction.message.channel.id === "786271210585456670") {
    if (reaction.emoji.name === '????'){
       var users = await reaction.users.fetch();
      var response = "";

      for (var u of users.map(user => user)) {
        response += `User reacted: ${reaction.emoji}, ${u.username}\n`;
      }

      var embed = reaction.message.embeds[0];
      embed.description = response;

      reaction.message.edit(embed);
    }
  }
  if(reaction.message.channel.id === "786271210585456670") {
    if (reaction.emoji.name === '????'){
       var users = await reaction.users.fetch();
      var response = "";

      for (var u of users.map(user => user)) {
        response += `User reacted: ${reaction.emoji}, ${u.username}\n`;
      }

      var embed = reaction.message.embeds[0];
      embed.description = response;

      reaction.message.edit(embed);
    }
  }
  if(reaction.message.channel.id === "786271210585456670") {
    if (reaction.emoji.name === '????'){
       var users = await reaction.users.fetch();
      var response = "";

      for (var u of users.map(user => user)) {
        response += `User reacted: ${reaction.emoji}, ${u.username}\n`;
      }

      var embed = reaction.message.embeds[0];
      embed.description = response;

      reaction.message.edit(embed);
    }
  }
  if(reaction.message.channel.id === "786271210585456670") {
    if (reaction.emoji.name === '????'){
       var users = await reaction.users.fetch();
      var response = "";

      for (var u of users.map(user => user)) {
        response += `User reacted: ${reaction.emoji}, ${u.username}\n`;
      }

      var embed = reaction.message.embeds[0];
      embed.description = response;

      reaction.message.edit(embed);
    }
  }
  if(reaction.message.channel.id === "786271210585456670") {
    if (reaction.emoji.name === '????'){
       var users = await reaction.users.fetch();
      var response = "";

      for (var u of users.map(user => user)) {
        response += `User reacted: ${reaction.emoji}, ${u.username}\n`;
      }

      var embed = reaction.message.embeds[0];
      embed.description = response;

      reaction.message.edit(embed);
    }
  }
});

Client.on("messageReactionRemove", async (reaction, user) => {
  if (reaction.message.partial) await reaction.message.fetch();

  if (user.bot) return;
  if(!reaction.message.guild) return;
  
  if(reaction.message.channel.id === "786271210585456670") {
    if (reaction.emoji.name === '????'){
       var users = await reaction.users.fetch();
      var response = "";

      for (var u of users.map(user => user)) {
        response += `React to this message to join the battle.`;
      }

      var embed = reaction.message.embeds[0];
      embed.description = response;

      reaction.message.edit(embed);
    }
  }
  if(reaction.message.channel.id === "786271210585456670") {
    if (reaction.emoji.name === '????'){
       var users = await reaction.users.fetch();
      var response = "";

      for (var u of users.map(user => user)) {
        response += ``;
      }

      var embed = reaction.message.embeds[0];
      embed.description = response;

      reaction.message.edit(embed);
    }
  }
  if(reaction.message.channel.id === "786271210585456670") {
    if (reaction.emoji.name === '????'){
       var users = await reaction.users.fetch();
      var response = "";

      for (var u of users.map(user => user)) {
        response += `React to this message to join the battle.`;
      }

      var embed = reaction.message.embeds[0];
      embed.description = response;

      reaction.message.edit(embed);
    }
  }
  if(reaction.message.channel.id === "786271210585456670") {
    if (reaction.emoji.name === '????'){
       var users = await reaction.users.fetch();
      var response = "";

      for (var u of users.map(user => user)) {
        response += `React to this message to join the battle.`;
      }

      var embed = reaction.message.embeds[0];
      embed.description = response;

      reaction.message.edit(embed);
    }
  }
  if(reaction.message.channel.id === "786271210585456670") {
    if (reaction.emoji.name === '????'){
       var users = await reaction.users.fetch();
      var response = "";

      for (var u of users.map(user => user)) {
        response += `React to this message to join the battle.`;
      }

      var embed = reaction.message.embeds[0];
      embed.description = response;

      reaction.message.edit(embed);
    }
  }
});

这是删除部分,我认为我可能做错了什么,但是当我在第一个帐户上删除反应时它工作正常,但是当我尝试在第二个帐户上执行此操作时,它会替换所有具有 2 倍共鸣的用户名,否则它将删除所有用户。

【问题讨论】:

    标签: javascript discord discord.js bots


    【解决方案1】:

    那么,您特别纠结于哪一个:获取对消息做出反应的用户、编辑嵌入内容,还是两者兼而有之?由于您没有明确说明您遇到了哪些问题,或者您是否同时遇到了这两个问题,我将在下面解释这两个问题。

    首先,我相信您使用了错误的事件。你应该使用messageReactionAdd 而不是messageReaction,我在文档中找不到messageReaction 事件的任何文档。

    对于获取对消息做出反应的用户,还取决于您是要获取对消息做出反应的所有用户,还是仅获取对触发messageReactionAdd 事件作出反应的用户。

    只获取刚刚做出反应的单个用户

    您使用的事件处理程序有一个user 参数,其中包含用户的所有数据,您可以直接使用它。这将获取刚刚对消息做出反应的用户:

    var username = user.username;
    

    获取所有已做出反应的用户

    reaction 参数有一个属性reaction.users,它是对消息做出反应的所有用户的集合。这将获取所有对此消息做出反应的用户。你也不需要使用.then(),因为你的函数是async,允许你使用await。你可以这样使用它:

    var users = await reaction.users.fetch();
    
    var response = "";
    
    //users is a Collection of all of the users who reacted. You can loop through it.
    for (var u of users) {
        response += `User reacted: ${u.username}\n`;
    }
    
    //'response' is now a String with all of the usernames listed
    

    获取和编辑嵌入

    通过reaction.message.embeds,我们可以获取消息中的嵌入,更改它,然后使用我们更改的嵌入编辑消息。这是一种方法:

    //Gets the embed in the message
    var embed = reaction.message.embeds[0];
    
    //Sets the embed's description to the list of users we made in the previous example
    //You can change whatever you need to change: the fields, the title, etc.
    embed.description = response;
    
    //Updates/edits the message with our new, modified embed
    reaction.message.edit(embed);
    

    把它们放在一起

    我现在将利用前两个示例向您展示您的代码的一部分可能是什么样子。为简单起见,我只是假设您想要获得所有做出反应的用户,而不仅仅是一个用户。为了简单起见,我也只会使用您的if 语句之一。这是最终结果:

    Client.on("messageReactionAdd", async (reaction, user) => {
      if (reaction.message.partial) await reaction.message.fetch();
    
      if (user.bot) return; //user.client is always 'true', use user.bot instead
      if(!reaction.message.guild) return;
      
      if(reaction.message.channel.id === "786271210585456670") {
        if (reaction.emoji.name === '?'){
          var users = await reaction.users.fetch();
          var response = "";
    
          for (var u of users.array()) {
            response += `User reacted: ${u.username}\n`;
          }
    
          var embed = reaction.message.embeds[0];
          embed.description = response;
    
          reaction.message.edit(embed);
    
        }
      }
      
    }); 
    

    请随意测试此示例,确保它按您的预期工作,并对其进行调整以最好地满足您的目的。请注意,如果您还想在有人对消息没有反应时更新嵌入,您还需要创建一个单独的事件处理程序来侦听 messageReactionRemove 事件。

    相关资源:
    https://discord.js.org/#/docs/main/stable/class/Client?scrollTo=e-messageReactionAdd https://discord.js.org/#/docs/main/stable/class/MessageReaction https://discord.js.org/#/docs/main/stable/class/User

    【讨论】:

    • 非常感谢您的帮助,但我不得不改变一些事情,我会在下面发布。 Client.on("messageReaction" 更改为 Client.on("messageReactionAdd" "for (var u of users)" 更改为 "for (var u of users.map(user => user))" 上面对我有用但是当我出于某种未知原因尝试添加 Client.on("messageReactionRemove" 时,当多个用户删除反应时,我得到双倍的反应。
    • 抱歉,我忘记在最终代码中添加messageReactionAdd。您也可以不做users.map(user => user),而只做users.array(),结果相同。我已经更新了我的答案以包括这些,感谢您指出这些。我不确定为什么messageReactionRemove 会触发两次响应,但这可能完全是一个单独的问题。
    • 谢谢你,我现在唯一的问题是删除部分。我似乎有它会删除成员的位置,它会用相同的响应 x2 替换它,或者它将删除所有用户,而不仅仅是删除反应的一个用户。
    • 嗯,我不知道为什么会这样。删除处理程序应该与添加处理程序完全相同。您的代码中可能还有其他原因导致这种情况发生。
    • 是的,我就是这么想的,要么是那个,要么是我只是愚蠢并且做错了什么。
    猜你喜欢
    • 2018-11-23
    • 1970-01-01
    • 2021-06-22
    • 2020-04-10
    • 2021-06-24
    • 2021-03-29
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    相关资源
    最近更新 更多