Discord JS - 添加反应时删除角色

Discord JS - Remove role when reaction is added

我应该知道怎么做。但是下面的代码不起作用。 目标是在用户对消息添加反应时删除角色。

client.on('messageReactionAdd', async (reaction, user) => {
  const message = await reaction.message.fetch(true);
  const channelStockSettings = '961958948976607243';
  const fundamentalPlays = '⭐️';
  const fundamentalPlaysRoleSE = message.guild.roles.cache.find(role => role.name === '⭐');
  const fundamentalPlaysRoleUS = message.guild.roles.cache.find(role => role.name === '⭐');
  const longTerm = '⛰'; 
  const longTermRoleSE = message.guild.roles.cache.find(role => role.name === '⛰'); 
  const longTermRoleUS = message.guild.roles.cache.find(role => role.name === '⛰'); 
    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 === channelStockSettings) {
    if (reaction.emoji.name === fundamentalPlays) {
        await reaction.message.guild.members.cache.get(user.id).roles.remove(fundamentalPlaysRoleSE);
        await reaction.message.guild.members.cache.get(user.id).roles.remove(fundamentalPlaysRoleUS);
      } else if (reaction.emoji.name === longTerm) {
        await reaction.message.guild.members.cache.get(user.id).roles.remove(longTermRoleSE);
        await reaction.message.guild.members.cache.get(user.id).roles.remove(longTermRoleUS);
      } else {
        return;
      }
    }
  });

这是我之前编写代码的方式。什么……错了?

我的机器人也遇到了同样的问题。您能否尝试删除嵌入消息并重新添加。然后再试一次。

测试您的代码后,问题似乎是您使用了错误的 unicode 表情,假设您正在尝试对星星和山脉使用默认的 Discord 表情。换句话说,reaction.emoji.name === fundamentalPlaysreaction.emoji.name === longTerm 都返回 false。

我不确定这是怎么发生的或者你从哪里得到这些 un​​icode 表情(也许是旧版本的 discord,或者来自 third-party 网站?),但两者都没有正确匹配 Discord unicode 表情(星星表情看起来完全一样但不相等,而山表情看起来不一样也不相等)。获得任何 Discord 表情的 unicode 形式的最佳方法是在发送 Discord 表情之前放置一个反斜杠。然后,复制它给你的 unicode 表情。

这是您的代码,已修改为具有正确的 unicode 表情。我测试了它,它对我有用:

client.on('messageReactionAdd', async (reaction, user) => {
    console.log("Reaction received");

    const message = await reaction.message.fetch(true);
    const channelStockSettings = '883731756438671391';

    const fundamentalPlays = '⭐';
    const fundamentalPlaysRoleSE = message.guild.roles.cache.find(role => role.name === 'Member');
    const fundamentalPlaysRoleUS = message.guild.roles.cache.find(role => role.name === 'Youtuber');
    const longTerm = '⛰️'; 
    const longTermRoleSE = message.guild.roles.cache.find(role => role.name === 'Testor'); 
    const longTermRoleUS = message.guild.roles.cache.find(role => role.name === 'Co-op'); 

    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 === channelStockSettings) {
        if (reaction.emoji.name === fundamentalPlays) {
            await reaction.message.guild.members.cache.get(user.id).roles.remove(fundamentalPlaysRoleSE);
            await reaction.message.guild.members.cache.get(user.id).roles.remove(fundamentalPlaysRoleUS);
        } else if (reaction.emoji.name === longTerm) {
            await reaction.message.guild.members.cache.get(user.id).roles.remove(longTermRoleSE);
            await reaction.message.guild.members.cache.get(user.id).roles.remove(longTermRoleUS);
        } else {
            return;
        }
    }
});

请注意,可能还有许多其他问题导致此代码无法正常工作,但是: a) messageReactionAdd 事件仅针对添加到缓存消息的反应触发。因此,如果您对机器人启动前发送的消息添加反应,它不会触发。如果您尝试使用此类未缓存的消息执行此操作,则需要在机器人启动时立即专门获取消息(很可能在您的 ready 事件处理程序中)。 b) 确保您有正确的接收消息和消息反应的意图。我假设你这样做了,但是 double-check,否则 messageReactionAdd 事件根本不会触发。