【问题标题】:discord.js - How to pick random users from reactionsdiscord.js - 如何从反应中挑选随机用户
【发布时间】:2020-06-11 03:00:08
【问题描述】:

我正在尝试从做出反应的人中随机选择一个用户

当我运行它时,它说“message.guild.members.random 不是函数”

获取随机用户的正确方法是什么?谢谢!

bot.on("messageReactionAdd", async (reaction, user) => {
  let msg = reaction.message,
    emoji = reaction.emoji;
  if (emoji.name == "❎" && user == message.author) {
    let winner = message.guild.members.random().user.id;

    message.channel.send(
      "Congraulations! <@" +
        winner +
        "> won " +
        prize +
        "\nDM <@" +
        per +
        "> to claim your prize.",
    );
  }
  if (reaction.partial) {
    try {
      await reaction.fetch();
    } catch (error) {
      console.log("error: ", error);
      return;
    }
  }
});

【问题讨论】:

    标签: javascript node.js discord.js


    【解决方案1】:

    the answer lays here

    guild.members 返回一个 GuildManager 类,然后你可以使用 fetch() 方法获取所有这些公会成员:

    let guildMembers = await message.guild.members.fetch()
    // now you can randomly get a memeber through Math.random function
    let winner = guildMembers[Math.floor(Math.random() * Math.floor(guildMembers.length)).user.id
    

    【讨论】:

    • guildMembers.length 不需要铺地板,它将是一个整数。简化为Math.floor(Math.random() * guildMembers.length),你也忘记了结束括号。
    • @Karizma 我仍然收到“TypeError:无法读取未定义的属性'用户'”的类型错误。这里有什么问题?
    • 这意味着它找不到具有该随机数的成员,这很有意义,因为它是由 ids 映射的集合。我添加了一个答案
    【解决方案2】:

    第一个错误:您使用的是 v12 的部分,并且您使用的是 message.guild.members 作为 v11 的集合。

    第二个可能的错误:您正在比较两个对象,usermsg.author,它们可能不是同一个引用,因此您应该只检查它们的 ID,user.id === msg.author.id

    假设您更新到 v12:

    由于您使用的是partials,因此可能是公会不完整,请上移reaction.partial的if语句。

    if (reaction.partial) {
        try {
          await reaction.fetch();
        } catch (error) {
          console.log("error: ", error);
          return;
        }
    }
    

    由于partials 是新的并且我没有经常使用它们,我不确定reaction.message 是否可以是partials。所以你可能也想获取它。

    之后你必须改变

    message.guild.members => message.guild.members.cache

    那么你可以使用.random

    注意:您不必将其转换为用户来获取 id,您可以这样做

    let winner = message.guild.members.cache.random().id

    您还可以通过以下任一方式简化您发送的消息:

    message.channel.send(`Congratulations! <@${winner}> won ${prize} \nDM <@${per}> to claim your prize`);
    

    let winner = message.guild.members.cache.random().user;
    message.channel.send(`Congratulations! ${winner} won ${prize} \nDM <@${per}> to claim your prize`);
    

    未来的错误:

    您允许任何用户拥有此功能,因为您没有检查 mod 角色/权限

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-29
      • 2021-07-04
      • 1970-01-01
      • 2014-11-29
      • 2020-06-01
      • 1970-01-01
      相关资源
      最近更新 更多