“TypeError [EMOJI_TYPE]: Emoji must be a string or GuildEmoji/ReactionEmoji”同时为 Discord Bot 编码反应角色

我一直在关注 Worn Off Keys Discord.JS 指南以更好地了解 discord.js,尽管我对 JS 相当了解。但是在编码反应角色时我遇到了一个问题。我从 WOK Discord JS 存储库中克隆了一个特殊文件的代码。我通常克隆文件,然后根据我的喜好调整它们,添加和删除一些部分。但是这一次,当我运行代码来测试基本克隆时,我收到一条错误消息,说 TypeError [EMOJI_TYPE]: Emoji must be a string or GuildEmoji/ReactionEmoji 我找不到任何可以解决此问题的地方,因为它在教程视频中使用完全相同的代码工作.

这是我的特殊反应角色文件的代码:

const firstMessage = require('./first-message')

module.exports = (client) => {
    const channelId = '870818745109585920'

    const getEmoji = (emojiName) => client.emojis.cache.find((emoji) => emoji.name === emojiName)

    const emojis = {
        red_circle: 'CrackShot / sniper',orange_circle: 'Scrambler / Shotgun',yellow_circle: 'Whipper / P90',green_circle: 'RPEGG / RPG',blue_circle: 'Free Ranger / Semi-Auto',purple_circle: 'EGG-K / AK-47',white_circle: 'TriHard / AUG',black_circle: 'Cluck-9mm / Pistol'
    }

    const reactions = []

    let emojiText = '**GUN ROLES**\n\n'
    for (const key in emojis) {
        const emoji = getEmoji(key)
        reactions.push(emoji)

        const role = emojis[key]
        emojiText += `${emoji} = ${role}\n`
    }

    firstMessage(client,channelId,emojiText,reactions)

    const handleReaction = (reaction,user,add) => {
        if (user.id === '869698265698947102') {
            return
        }
        const emoji = reaction._emoji.name

        const { guild } = reaction.message

        const roleName = emojis[emoji]
        if(!roleName) {
            return
        }

        const role = guild.roles.cache.find((role) => role.name === roleName)
        const member = guild.members.cache.find((member) => member.id === user.id)

        if (add) {
            member.roles.add(role)
        } else {
            member.roles.remove(role)
        }
    }

    client.on('messageReactionAdd',(reaction,user) => {
        if (reaction.message.channel.id === channelId) {
            handleReaction(reaction,true)
        }
    })

    client.on('messageReactionRemove',false)
        }
    })
}

您看到的 first-message 文件是:

const addReactions = (message,reactions) => {
    message.react(reactions[0])
    reactions.shift()
    if (reactions.length > 0) {
        setTimeout(() => addReactions(message,reactions),750)
    }
}

module.exports = async (client,id,text,reactions = []) => {
    const channel = await client.channels.fetch(id)

    channel.messages.fetch().then((messages) => {
        if (messages.size === 0) {
            channel.send(text).then((message) => {
                addReactions(message,reactions)
            })
        } else {
            for (const message of messages) {
                message[1].edit(text)
                addReactions(message[1],reactions)
            }
        }
    })
}

我从这些文件添加到主 index.js 文件的所有内容是 const roleclaim = require('./role-claim') 以及后来的 client.on(ready) 等。我添加了 roleclaim(client) 来运行机器人代码。有什么建议么?对不起,大量的文字。请帮忙。

zxcvbnmasdfghjkl1236 回答:“TypeError [EMOJI_TYPE]: Emoji must be a string or GuildEmoji/ReactionEmoji”同时为 Discord Bot 编码反应角色

问题是您没有名称如 red_circleorange_circle 等的表情符号。client.emojis.cache 仅包含机器人可以访问的自定义表情符号。

因此,当您使用 getEmoji() 获取表情符号时,您将收到 undefined。您无需检查该函数内的 emoji 值,而只需将其添加到数组 (reactions.push(emoji)) 中。稍后,当您尝试添加反应 (addReactions()) 时,您尝试使用 undefined 进行反应。由于它不是表情符号,因此您会收到错误消息。

一个解决方案是使用可用的表情符号,你也可以简化 for 循环

let emojis = {
  '?': 'CrackShot / Sniper','?': 'Scrambler / Shotgun','?': 'Whipper / P90','?': 'RPEGG / RPG','?': 'Free Ranger / Semi-Auto','?': 'EGG-K / AK-47',};
let emojiText = '**GUN ROLES**\n\n';
let reactions = [];

Object.entries(emojis).forEach(([emoji,role]) => {
  reactions.push(emoji);
  emojiText += `${emoji} = ${role}\n`;
});

console.log(emojiText)
console.log(reactions)

module.exports = (client) => {
  let channelId = '870818745109585920';
  let emojis = {
    '?': 'CrackShot / Sniper',};

  let reactions = [];
  let emojiText = '**GUN ROLES**\n\n';
  Object.entries(emojis).forEach(([emoji,role]) => {
    reactions.push(emoji);
    emojiText += `${emoji} = ${role}\n`;
  });

  firstMessage(client,channelId,emojiText,reactions);

  function handleReaction(reaction,user,add) {
    if (user.id === '869698265698947102') return;

    let emoji = reaction._emoji.name;
    let { guild } = reaction.message;
    let roleName = emojis[emoji];
    
    if (!roleName) return;

    let role = guild.roles.cache.find((role) => role.name === roleName);
    let member = guild.members.cache.find((member) => member.id === user.id);
    // TODO: check if role and member exist
    if (add) {
      member.roles.add(role);
    } else {
      member.roles.remove(role);
    }
  }

  client.on('messageReactionAdd',(reaction,user) => {
    if (reaction.message.channel.id === channelId) {
      handleReaction(reaction,true);
    }
  });

  client.on('messageReactionRemove',false);
    }
  });
};
本文链接:https://www.f2er.com/6436.html

大家都在问