为 discord.js 设置嵌入的反应角色时遇到问题

Posted

技术标签:

【中文标题】为 discord.js 设置嵌入的反应角色时遇到问题【英文标题】:Having trouble setting up a reaction role embed for discord.js 【发布时间】:2021-09-02 22:05:35 【问题描述】:

我是编码新手,所以请指导我完成这个过程:)

我刚开始使用 discord.js 编写一个不和谐机器人,我目前正在设置一个反应角色嵌入。机器人将嵌入发送出去并成功对其做出反应,但只给出了指定的 5 个角色中的 2 个。

module.exports = 
name: 'pingroles',
description: 'setting up reaction role embed',
async execute(message, args, Discord, client) 
    const channel = '838758430167793674';
    const GiveawayPing = message.guild.roles.cache.get("837523359234392094");
    const EventsPing = message.guild.roles.cache.get("834707014763413506");
    const ChatRevive = message.guild.roles.cache.get("834720883800932352");
    const PartnerPing = message.guild.roles.cache.get("834703744351731782");
    const PollsPing = message.guild.roles.cache.get("837540284723757106");
    
    const guild = client.guilds.cache.get("816988982587555871");


    const GiveawayPingEmoji = guild.emojis.cache.get("855257836106678282");
    const EventsPingEmoji= '????';
    const ChatReviveEmoji = guild.emojis.cache.get("837426948489478185");
    const PartnerPingEmoji = guild.emojis.cache.get("855264361375727616")
    const PollsPingEmoji = '????'

    let embed = new Discord.MessageEmbed()
        .setColor('#add8e6')
        .setTitle ('Ping Roles')
        .setDescription ("React to get your roles\n\n"
            + `$GiveawayPingEmoji for Giveaway Ping\n`
            + `$EventsPingEmoji for Events Ping\n`
            + `$ChatReviveEmoji for Chat Revive Ping\n`
            + `$PartnerPingEmoji for Partner Ping\n`
            + `$PollsPingEmoji for Polls Ping`);


    let messageEmbed = await message.channel.send(embed);
    messageEmbed.react(GiveawayPingEmoji);
    messageEmbed.react(EventsPingEmoji);
    messageEmbed.react (ChatReviveEmoji);
    messageEmbed.react(PartnerPingEmoji);
    messageEmbed.react(PollsPingEmoji);
    
    client.on('messageReactionAdd', async (reaction, user) => 
        if (reaction.message.partial) await reaction.message.fetch();
        if (reaction.partial) await reaction.fetch();
        if (user.bot) return;
        if (!reaction.message.guild) return;

        if (reaction.message.channel.id == channel) 
            if (reaction.emoji.name === GiveawayPingEmoji) 
                await reaction.message.guild.members.cache.get(user.id).roles.add(GiveawayPing);
            
            if (reaction.emoji.name === EventsPingEmoji) 
                await reaction.message.guild.members.cache.get(user.id).roles.add(EventsPing);
            
            if (reaction.emoji.name === ChatReviveEmoji) 
                await reaction.message.guild.members.cache.get(user.id).roles.add(ChatRevive);
            
            if (reaction.emoji.name === PartnerPingEmoji) 
                await reaction.message.guild.members.cache.get(user.id).roles.add(PartnerPing);
            
            if (reaction.emoji.name === PollsPingEmoji) 
                await reaction.message.guild.members.cache.get(user.id).roles.add(PollsPing); 
            
         else 
            return;
        

    );

    client.on('messageReactionRemove', async (reaction, user) => 
        if (reaction.message.partial) await reaction.message.fetch();
        if (reaction.partial) await reaction.fetch();
        if (user.bot) return;
        if (!reaction.message.guild) return;

        if (reaction.message.channel.id == channel) 
            if (reaction.emoji.name === GiveawayPingEmoji) 
                await reaction.message.guild.members.cache.get(user.id).roles.remove(GiveawayPing);
            
            if (reaction.emoji.name === EventsPingEmoji) 
                await reaction.message.guild.members.cache.get(user.id).roles.remove(EventsPing);
            
            if (reaction.emoji.name === ChatReviveEmoji) 
                await reaction.message.guild.members.cache.get(user.id).roles.remove(ChatRevive);
            
            if (reaction.emoji.name === PartnerPingEmoji) 
                await reaction.message.guild.members.cache.get(user.id).roles.remove(PartnerPing);
            
            if (reaction.emoji.name === PollsPingEmoji) 
                await reaction.message.guild.members.cache.get(user.id).roles.remove(PollsPing); 
            
         else 
            return;
        

    );        

    

 
   

目前唯一给出的 2 个角色是事件 ping 和民意调查 ping,我真的不知道为什么机器人没有为其他反应分配角色,以及我能做些什么来让它工作。 我将代码基于我浏览过的 youtube 教程,然后对其进行了一些调整以更好地适应我的目的

提前感谢您的帮助!

编辑:我遵循了@typicalninja 的建议并观看了教程,但我意识到提供的代码与我的有点相似,我仍然无法识别问题。但是,我确实意识到受影响的角色是那些使用自定义不和谐表情符号的角色,这意味着我只能将角色分配给使用默认窗口表情符号的 2 个反应(游戏之夜和民意调查)。

我想知道是否有任何方法可以更改我的代码,以便我能够使用自定义表情符号设置反应角色(没有多少教程可以教这个.

再次感谢您!

【问题讨论】:

在任何事情之前,为什么要在命令中嵌套事件? 每次创建反应角色时添加 2 个事件侦听器 (messageReactionRemove and messageReactionAdd),并且每个事件的最大 10 个事件侦听器限制为 10,您应该使用数据库进行设置,(如果单个服务器,一个简单的就可以了)并将这些事件添加到主文件中,并检查与您的数据库的反应 @TYPICALNINJA 我已经用服务器对其进行了测试,当只有 2 个反应选项时它运行良好。只有当我开始添加超过 2 个反应时,代码才开始不起作用。 @TYPICALNINJA 关于您对嵌套事件的评论,我不太清楚您的意思,因为我几乎只是从在线教程中获取代码。请指导我完成,因为我对此有点陌生。谢谢 1# 这不是永久性的,一旦你重新启动机器人,你将无法从这些反应角色中获得一个角色,你使用这个 2# 很快,在使用这个方法并创建了几个反应角色之后,您将收到有关最大内存侦听器和“可能的内存泄漏”的警告 A 您为 1 个事件创建多个侦听器,如果可以避免,您应该为每个事件仅使用 1 个侦听器 【参考方案1】:

好吧,我想我知道你为什么会遇到问题,所以reaction.emoji.name 返回内置表情符号的 Unicode,以及自定义表情符号的名称(duh lol)

现在<something>.emojis.cache.get() 返回一个GuildEMoji 对象,(所以从这里你可以看到问题)

不管怎样,我会进一步解释

 if (reaction.emoji.name === EventsPingEmoji) 
                await reaction.message.guild.members.cache.get(user.id).roles.remove(EventsPing);
            

EventsPingEmoji 是来自 <something>.emojis.cache.get() 的 GuildEMoji 和 reaction.emoji.name 是一个字符串,所以你在这里将一个字符串与一个类(GuildEMoji 对象)进行比较

最简单的方法是将.name 添加到它作为 GuildEmoji 的属性,

上面的代码会来

 if (reaction.emoji.name === EventsPingEmoji.name) 
                await reaction.message.guild.members.cache.get(user.id).roles.remove(EventsPing);
            
reaction.emoji.name === EventsPingEmoji.name
                                        ^^^^^

现在尝试对所有 if 条件执行此操作,如果确实有效,请发表评论:)

【讨论】:

【参考方案2】:

我认为问题在于您获取自定义表情符号,我猜您期望 guild.emojis.cache.get("855257836106678282") 您返回表情符号名称,但它实际上返回 GuildEmoji 类的对象,您可以查看 here,如果你想要名字,那么你需要在 get 函数之后添加一个.name,像这样:guild.emojis.cache.get("855257836106678282").name

GuildEmoji class documentation

【讨论】:

我试过这种方法,但我得到的输出是表情符号 ID 代替嵌入中的表情符号出现

以上是关于为 discord.js 设置嵌入的反应角色时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

我的反应角色机器人编写了嵌入消息,但反应没有添加角色

Discord js v12 如果有人对嵌入做出反应,则发送消息

角色反应 Discord Bot

Discord JS //尝试通过响应消息来添加角色和删除角色

discord.js V12中根据反应赋予角色时出错

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