我正在为服务器制作一个私有discord机器人。我见过像SweeperBot这样的一些机器人,还有一些使用反应收集器来分配角色的机器人。其中大多数不是discord.js,因此我编写了自己的代码。
我有messageReactionAdd
事件设置,并且整个代码块都可以工作,我已经测试了每一行。特别是一行,每次都会出错。
exports.run = (bot, reaction, user) => {
const rmsg = reaction.message;
if (rmsg.channel === rmsg.guild.channels.find('name', 'rules') && rmsg.id === '457681660708651010' && reaction.emoji.name === '👌') {
const member = rmsg.guild.fetchMember(user)
const MemberRole = rmsg.guild.roles.find('name', 'Mythical Member');
member.addRole(MemberRole).catch(console.error);
}
};
最后一行
member.addRole(MemberRole).catch(console.error);
是错误的行,每次添加反应时都会发送TypeError: member.addRole is not a function
。其他一切都可以正常工作,就像我之前所做的测试一样。
我已经尝试测试此
member
变量的不同方法,因为我知道user
不是GuildMember
对象。我正在尝试使用
const member = rmsg.guild.fetchMember(user)
将其转换为一个,并且确实可以工作,返回GuildMember
对象,但是当放入addRole
行时,它会出错。我以相同的方式在许多其他命令中使用了addRole
,但也许事件根本无法使用它?我只是缺少明显的东西吗?我已经检查了很多次文档,并要求在许多不协调的服务器中使用,但无济于事。 最佳答案
guild.fetchMember()
不返回GuildMember。而是返回一个Promise。您需要等待,直到收到该Promise的响应(它将是GuildMember),然后指定角色。
您可以通过以下几种方法执行此操作:
使用.then()
:
const MemberRole = rmsg.guild.roles.find('name', 'Mythical Member');
rmsg.guild.fetchMember(user).then(member => {
member.addRole(MemberRole).catch(console.error);
})
或将整个方法切换为异步:
exports.run = async (bot, reaction, user) => {
然后等到您收到
fetchMember
的答复:const member = await rmsg.guild.fetchMember(user);