如何向对消息做出反应的用户添加特定角色

Posted

技术标签:

【中文标题】如何向对消息做出反应的用户添加特定角色【英文标题】:How can I add specific role to user who react to the message 【发布时间】:2020-07-16 21:27:25 【问题描述】:

我正在尝试创建一个机器人,该机器人可以向使用列出的表情符号对消息做出反应的用户添加特定角色。

使用下面的代码,我可以检查谁对消息做出了反应,我还可以检查他们对什么表情符号做出反应,但是当我尝试向他们添加角色时,会弹出错误说 user.addRole 不是一个函数 有没有办法解决这个问题?非常感谢!

创建嵌入消息供用户反应的代码

    let args = message.content.substring(PREFIX.length).split(" ");

    if(message.content.toLowerCase() === '?roles' && message.author.id === 'adminId' && message.channel.id === 'channel id')
        const role = new Discord.MessageEmbed()
        .setTitle("ROLES")
        .setColor('#6a0dad')
        .setDescription('???? - ROLE1\n⚔️ - ROLE2\n???? - ROLE3')
        message.channel.send(role).then(re => re.react('????'),re.react('⚔️'),re.react('????'));
        message.awaitReactions().then(collected=>
            const reaction = collected.first();
        )
    

获取响应用户并尝试添加角色的代码

const bot = new Discord.Client( partials: ['MESSAGE', 'CHANNEL', 'REACTION'] );
 bot.on('messageReactionAdd', async (reaction, user) => 
    if (reaction.partial) 
        try 
            await reaction.fetch();
         catch (error) 
            console.log('Something went wrong when fetching the message: ', error);
            return;
        
    
    if(reaction.message.id === 'id of that embed message sent')
        if(reaction.emoji.name === "????")
            //console.log('ROLE1');
            user.addRole('id of role 1');
        
        if(reaction.emoji.name === '⚔️')
            //console.log('ROLE2');
            user.addRole('id of role 2');
        if(reaction.emoji.name === '????')
            //console.log('ROLE3');
            user.addRole('id of role 3');
    
);

【问题讨论】:

【参考方案1】:

user.addRole() 需要替换为member.roles.add

【讨论】:

我已经尝试过了,但仍然收到错误 TypeError: Cannot read property 'add' of undefined 您使用的是 discord.js v11 还是 v12? 我使用的是 v12.0.2 你能登录user看看它是否正在返回用户吗? 是的,它返回一个带有 id,bot,username,disciminator,avatar,lastMessageID 和 lastMessageChannelID 的 User 对象【参考方案2】:

您似乎正在尝试将角色添加到 User。当您应该将角色添加到GuildMember 时。正如您在此处看到的:messageReactionAdd 返回User。但是用户没有.roles,只有 GuildMembers 有。但是,您有两种方法可以轻松获得 GuildMember:

这样您必须确保消息来自 TextChannel 而不是 DMchannel。if(reaction.message.type === "text") let member = reaction.message.member;

这种方式允许用户对机器人缓存的任何消息做出反应。let member = bot.guilds.get('<id of the server>').members.get(user.id);

然后你按照@Syntle 所说的去做:member.roles.resolve('<id of role>'); 如何获得会员由您选择。

【讨论】:

谢谢你的回答,我试过第一个,它说词法声明不能出现在单语句上下文中,第二个说 bot.guilds.get 不是函数。 ..... 我在简化第一个。当然,您不会在 if 语句中声明变量并在 if 语句之外使用member.roles.add。使 if 语句有括号,然后将 member.roles.add 放在带有成员声明的 if 语句内。 bot.guilds.get 是我以前在 discord.js 中编码时的记忆。试试.resolve 我试过了,没有错误弹出一切正常,但问题是if(reaction.message.type === "text") let member = reaction.message.member;返回我的机器人的对象(发送消息的人)而不是做出反应的用户我做错什么了吗? 第二个使用let member = bot.guilds.resolve('<id of the server>').members.get(user.id);解决了问题,然后member.roles.resolve('<id of role>')成功为添加反应的用户添加角色,非常感谢

以上是关于如何向对消息做出反应的用户添加特定角色的主要内容,如果未能解决你的问题,请参考以下文章

当有人对消息做出反应时,我如何让我的 discord.js 机器人添加角色?

仅当用户获​​得特定角色时的问候消息

如何获取对特定消息做出反应的用户的不和谐 ID discord.js

角色反应 Discord Bot

当用户对消息做出反应时,机器人会在 discord.js 中发送另一条消息

如何修剪没有特定角色的不和谐用户?