1
votes

I'm having issues with getting reaction roles to work with custom emojis. If I use discord emojis, it embeds the message, creates the reactions and applies the role when the reaction is clicked.

However, if I use a custom emoji, it embeds the message and creates the correct reactions, however it does not provide the role when the emoji is clicked.

I've used the same coding when swapping between discord and custom emojis, the only changes made were the emoji IDs.

The full code I'm using is:

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;
            }
        });
    },
};

Any help with this would be greatly appreciated.

2

2 Answers

0
votes

You are using Emoji#name for custom emojis and default ones. The problem with this is that custom emoji's do not have the Emoji#name property ( same goes for default emojis, they do not have a Emoji#id instead).

To solve this you want to use Emoji#id for custom emojis specifically or use Emoji#identifier.

This means you can either do

  • reaction.emoji.id === heEmoji.id
  • reaction.emoji === heEmoji ( not 100% safe )
  • reaction.emoji.identifier=== heEmoji.identifier.
0
votes

If you want to use custom emojis for your bot, make sure that the bot is in a server with the custom emoji you want, I suggest making a new server dedicated to this. Next, all you need to do is put a \ before the emoji. It should then send something like this: <:emoji_name:0123456>. You're going to want to simply add that to the definition of your desired variable.