Discord.js:只有一种反应

Posted

技术标签:

【中文标题】Discord.js:只有一种反应【英文标题】:Discord.js: only one reaction 【发布时间】:2020-11-06 11:13:23 【问题描述】:

我正在创建 Discord 机器人,当用户在消息上添加特定的表情符号反应时,它会赋予特定的角色。

我想让用户只选择一种反应;

如果用户选择另一个,同一用户的其他反应应该被删除。

我只找到了两种情况的代码:

    删除消息上的所有表情符号反应。
    message.reactions.cache.get('emojiId').remove()
    删除用户的反应。
    const userReactions = message.reactions.cache.filter(reaction => reaction.users.cache.has(userId));
try 
    for (const reaction of userReactions.values()) 
        await reaction.users.remove(userId);
    
 catch (error) 
    console.error('Failed to remove reactions.');

它们都不适合我,因为它们会删除对消息的所有反应。

我的代码的一部分:

client.on('messageReactionAdd', async (reaction, user) => 
    if(reaction.partial) await reaction.fetch()
    const  message  = reaction
    if (message.id === rulesMessageId) 
        const member = message.channel.guild.members.cache.get(user.id)
        if (reaction.emoji.id === emojiIds.HEAVEN ) 
          for (var i = 0 in guildRoles) 
            if (guildRoles[i] != guildRoles.HEAVEN)
            member.roles.remove(guildRoles[i])
          
          member.roles.add(guildRoles.HEAVEN)   
        

【问题讨论】:

如果您没有找到适合您的确切用例的代码,也许是时候自己编写一些代码了。 【参考方案1】:

我不知道如何在答案中使用您的部分代码,所以我自己做:

client.on("messageReactionAdd", (reaction, Member) => 
    if(Member.bot) return;
    reaction.message.reactions.cache.map(x=>
        if(x._emoji.name != reaction._emoji.name&&x.users.cache.has(Member.id)) x.users.remove(Member.id)
    )
);

我得到消息中的所有反应并将它们映射以检查用户是否有反应。我还检查该反应是否与当前仅移除其他反应的反应相同。 即使晚了10个月也希望对你有所帮助^^

【讨论】:

以上是关于Discord.js:只有一种反应的主要内容,如果未能解决你的问题,请参考以下文章

Discord Bot 读取对设置消息的反应

反应后 Discord.js 编辑消息

Discord.js:如何发送消息并从中收集反应

自动反应消息 discord.js

收到表情符号反应后的 Discord.js 消息

检测反应 Discord.js