Я делаю бонуса частного разлада для сервера. Я видел несколько ботов, таких как 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. Вместо этого он возвращает обещание. Вам нужно подождать, пока вы не ответите на это обещание (это будет гильдия), а затем выполните роль.
Пара способов сделать это:
Использование .then()
:
const MemberRole = rmsg.guild.roles.find('name', 'Mythical Member');
rmsg.guild.fetchMember(user).then(member => {
member.addRole(MemberRole).catch(console.error);
})
Или переключите весь метод на async:
exports.run = async (bot, reaction, user) => {
И затем подождите, пока вы не получите ответ от fetchMember
:
const member = await rmsg.guild.fetchMember(user);