带有自定义表情符号的反应角色

Posted

技术标签:

【中文标题】带有自定义表情符号的反应角色【英文标题】:Reaction Roles with Custom emojis 【发布时间】:2021-05-15 17:43:34 【问题描述】:

我在让反应角色与自定义表情符号一起工作时遇到问题。如果我使用不和谐的表情符号,它会嵌入消息、创建反应并在单击反应时应用角色。

但是,如果我使用自定义表情符号,它会嵌入消息并创建正确的反应,但它不会在单击表情符号时提供角色。

在不和谐和自定义表情符号之间切换时,我使用了相同的编码,唯一的更改是表情符号 ID。

我使用的完整代码是:

const  MessageReaction  = require("discord.js");

module.exports = 
    name: "reactionrole",
    description: "Sets up a reaction role message!",
    async execute(message, args, Discord, client) 
        const channel = "764347631081881660";
        const sheRole = message.guild.roles.cache.find((role) => role.name === "She/Her");
        const heRole = message.guild.roles.cache.find((role) => role.name === "He/Him");
        const theyRole = message.guild.roles.cache.find((role) => role.name === "They/Them");

        const sheEmoji = client.emojis.cache.get("805419160497946634");
        const heEmoji = client.emojis.cache.get("795488864721829928");
        const theyEmoji = client.emojis.cache.get("795871326446419968");

        let embed = new Discord.MessageEmbed()
            .setColor("#e42643")
            .setTitle("Self Assignable Roles")
            .setDescription(
                "To Join one of our self-assignable roles, click/tap the reaction with the appropriate emoji for that role. (Note that this is purely for fun and for helpful tags & inclusivity.) By doing this we are hoping to better assist everyone in how they can address others. This also adds helpful knowledge of when someone may be on for trades, events etc.This is also not mandatory but highly recommended. isaheart \n\n" +
                    `List of corresponding emojis & roles:\n\n` +
                    `Identify yourself:\n` +
                    `:judy: She/Her\n` +
                    `:raymond: He/Him\n` +
                    `:zucker: They/Them\n\n` +
                    `Removing your reaction will also remove the role from yourself. You can have multiple roles so go ahead and choose one from each category ^^If you have any questions please feel free to reach out to any of our Admin`
            );

        let messageEmbed = await message.channel.send(embed);
        messageEmbed.react(sheEmoji);
        messageEmbed.react(heEmoji);
        messageEmbed.react(theyEmoji);

        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 === sheEmoji) 
                    await reaction.message.guild.members.cache.get(user.id).roles.add(sheRole);
                
                if (reaction.emoji.name === heEmoji) 
                    await reaction.message.guild.members.cache.get(user.id).roles.add(heRole);
                
                if (reaction.emoji.name === theyEmoji) 
                    await reaction.message.guild.members.cache.get(user.id).roles.add(theyRole);
                
             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 === sheEmoji) 
                    await reaction.message.guild.members.cache.get(user.id).roles.remove(sheRole);
                
                if (reaction.emoji.name === heEmoji) 
                    await reaction.message.guild.members.cache.get(user.id).roles.remove(heRole);
                
                if (reaction.emoji.name === theyEmoji) 
                    await reaction.message.guild.members.cache.get(user.id).roles.remove(theyRole);
                
             else 
                return;
            
        );
    ,
;

对此的任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

您将Emoji#name 用于自定义表情符号和默认表情符号。问题在于自定义表情符号没有Emoji#name 属性(默认表情符号也是如此,它们没有Emoji#id)。

要解决此问题,您需要专门针对自定义表情符号使用 Emoji#id 或使用 Emoji#identifier

这意味着你可以这样做

reaction.emoji.id === heEmoji.id reaction.emoji === heEmoji(不是 100% 安全的) reaction.emoji.identifier=== heEmoji.identifier

【讨论】:

我将表情符号行更改为if (reaction.emoji.id === heEmoji.id),但它仍然没有给出我手动添加角色测试的角色,并且从消息中删除反应会删除角色。不知道为什么它不会添加。 嗯,因为两者都使用相同的代码,它应该可以工作。 是的,它向我强调它会删除角色但不会添加它们,除了添加/删除之外,代码完全相同。我不知道从这里去哪里。 你能把更新后的代码上传到paste.gg 这样我可以看看吗? 我已经上传到这里srcb.in/FrEhjbuglw 非常感谢您的帮助!【参考方案2】:

如果您想为您的机器人使用自定义表情符号,请确保该机器人位于具有您想要的自定义表情符号的服务器中,我建议创建一个专门用于此的新服务器。接下来,您需要做的就是在表情符号前加上\。然后它应该发送如下内容:<:emoji_name:0123456>。您只需将其添加到所需变量的定义中即可。

【讨论】:

我已经做到了 - 表情符号出现在嵌入的帖子中。问题是点击表情符号时它不会赋予角色

以上是关于带有自定义表情符号的反应角色的主要内容,如果未能解决你的问题,请参考以下文章

您如何让机器人使用自定义表情符号添加反应?

对表情符号 discord.py 做出反应时添加角色

Discord bot 添加对消息 discord.py 的反应(无自定义表情符号)

带有肤色的表情符号如何在内部表示? [关闭]

[使用message.content.startswith时如何使Discord机器人对服务器表情符号做出反应

Discord Bot 嵌入自定义表情符号