【问题标题】:messageReactionAdd can't add rolesmessageReactionAdd 无法添加角色
【发布时间】:2018-11-26 07:43:43
【问题描述】:

我正在为服务器制作一个私人不和谐机器人。我见过一些像 SweeperBot 这样的机器人,还有一些使用反应收集器来分配角色。它们中的大多数都不是 discord.js,所以我自己编写了代码。

我有messageReactionAdd 事件设置,并且整个代码块工作,我已经测试了每一行。尤其是一行,每次都出错。

exports.run = (bot, reaction, user) => {
  const rmsg = reaction.message;
  if (rmsg.channel === rmsg.guild.channels.find('name', 'rules') && rmsg.id === '457681660708651010' && reaction.emoji.name === '????') {
    const member = rmsg.guild.fetchMember(user)
    const MemberRole = rmsg.guild.roles.find('name', 'Mythical Member');
    member.addRole(MemberRole).catch(console.error);
  }
};

最后一行member.addRole(MemberRole).catch(console.error);是错误行,每次添加反应时发送TypeError: member.addRole is not a function

其他一切正常,因为我在此之前做过测试。

我已尝试测试此member 变量的不同方法,因为我知道user 不是GuildMember 对象。

我正在尝试使用const member = rmsg.guild.fetchMember(user) 将其转换为一个,它确实可以工作,返回GuildMember 对象,但是当放入addRole 行时,它会出错。我以同样的方式在许多其他命令中使用了addRole,但也许事件根本无法使用它?我只是错过了一些明显的东西吗?我已经检查了很多次文档,并在很多不和谐的服务器中询问过,但无济于事。

【问题讨论】:

    标签: javascript node.js discord.js


    【解决方案1】:

    guild.fetchMember() 不返回 GuildMember。相反,它返回一个 Promise。您需要等到获得该 Promise 的响应(它将是 GuildMember),然后再分配角色。
    有几种方法可以做到这一点:
    使用.then()

    const MemberRole = rmsg.guild.roles.find('name', 'Mythical Member');
    rmsg.guild.fetchMember(user).then(member => {
        member.addRole(MemberRole).catch(console.error);
    })
    

    或者将整个方法切换为异步:

    exports.run = async (bot, reaction, user) => {
    

    然后等到收到fetchMember的回复:

    const member = await rmsg.guild.fetchMember(user);
    

    【讨论】:

      猜你喜欢
      • 2020-11-30
      • 2017-04-24
      • 2020-01-04
      • 2020-09-09
      • 2019-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多